1
0
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:
John Anderson
2020-03-01 03:24:17 -05:00
parent a17c22746d
commit 71a8a13644
8 changed files with 87 additions and 9 deletions

View File

View 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=[]
)

View 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)