mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
add api urls and signals interface for detail route buttons
This commit is contained in:
0
netbox/extras/plugins/__init__.py
Normal file
0
netbox/extras/plugins/__init__.py
Normal file
34
netbox/extras/plugins/signals.py
Normal file
34
netbox/extras/plugins/signals.py
Normal file
@ -0,0 +1,34 @@
|
||||
import django.dispatch
|
||||
from django.dispatch.dispatcher import NO_RECEIVERS
|
||||
|
||||
|
||||
class PluginSignal(django.dispatch.Signal):
|
||||
|
||||
def _sorted_receivers(self, sender):
|
||||
orig_list = self._live_receivers(sender)
|
||||
sorted_list = sorted(
|
||||
orig_list,
|
||||
key=lambda receiver: (
|
||||
receiver.__module__,
|
||||
receiver.__name__,
|
||||
)
|
||||
)
|
||||
return sorted_list
|
||||
|
||||
def send(self, sender, **kwargs):
|
||||
responses = []
|
||||
if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:
|
||||
return responses
|
||||
|
||||
for receiver in self._sorted_receivers(sender):
|
||||
response = receiver(signal=self, sender=sender, **kwargs)
|
||||
responses.append((receiver, response))
|
||||
return responses
|
||||
|
||||
|
||||
"""
|
||||
This signal collects templates which render buttons for object detail pages
|
||||
"""
|
||||
register_detail_page_buttons = PluginSignal(
|
||||
providing_args=[]
|
||||
)
|
0
netbox/extras/plugins/templatetags/__init__.py
Normal file
0
netbox/extras/plugins/templatetags/__init__.py
Normal file
27
netbox/extras/templatetags/plugins.py
Normal file
27
netbox/extras/templatetags/plugins.py
Normal file
@ -0,0 +1,27 @@
|
||||
from django import template as template_
|
||||
from django.template.loader import get_template
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from extras.plugins.signals import register_detail_page_buttons
|
||||
|
||||
|
||||
register = template_.Library()
|
||||
|
||||
|
||||
@register.simple_tag()
|
||||
def plugin_buttons(obj):
|
||||
"""
|
||||
Fire signal to collect all buttons registered by plugins
|
||||
"""
|
||||
html = ''
|
||||
responses = register_detail_page_buttons.send(obj)
|
||||
for receiver, response in responses:
|
||||
if not isinstance(response, list):
|
||||
response = [response]
|
||||
for template in response:
|
||||
if isinstance(template, str):
|
||||
template_text = get_template(template).render({'obj': obj})
|
||||
html += template_text
|
||||
|
||||
return mark_safe(html)
|
||||
|
Reference in New Issue
Block a user