2
0
Эх сурвалжийг харах

4751 Enable plugins to inject content within object list views (#10901)

* 4751 add plugin buttons to list templates

* 4751 add plugin buttons to list templates

* 4751 add documentation

* 4751 fix object reference

* 4751 update docs
Arthur Hanson 3 жил өмнө
parent
commit
27bf7b4a9a

+ 6 - 1
docs/plugins/development/views.md

@@ -187,11 +187,16 @@ Plugins can inject custom content into certain areas of the detail views of appl
 * `full_width_page()` - Inject content across the entire bottom of the page
 * `buttons()` - Add buttons to the top of the page
 
+Plugins can also inject custom content into certain areas of the list views of applicable models using the same subclass of `PluginTemplateExtension`. One method is available:
+
+* `list_buttons()` - Add buttons to the top of the list view page
+
 Additionally, a `render()` method is available for convenience. This method accepts the name of a template to render, and any additional context data you want to pass. Its use is optional, however.
 
 When a PluginTemplateExtension is instantiated, context data is assigned to `self.context`. Available data include:
 
-* `object` - The object being viewed
+* `object` - The object being viewed (for detail views only)
+* `model` - The model of the list view (for list views only)
 * `request` - The current request
 * `settings` - Global NetBox settings
 * `config` - Plugin-specific configuration parameters

+ 8 - 0
netbox/extras/plugins/templates.py

@@ -63,3 +63,11 @@ class PluginTemplateExtension:
         automatically handled.
         """
         raise NotImplementedError
+
+    def list_buttons(self):
+        """
+        Buttons that will be rendered and added to the existing list of buttons on the list view. Content
+        should be returned as an HTML string. Note that content does not need to be marked as safe because this is
+        automatically handled.
+        """
+        raise NotImplementedError

+ 8 - 0
netbox/extras/templatetags/plugins.py

@@ -73,3 +73,11 @@ def plugin_full_width_page(context, obj):
     Render all full width page content registered by plugins
     """
     return _get_registered_content(obj, 'full_width_page', context)
+
+
+@register.simple_tag(takes_context=True)
+def plugin_list_buttons(context, model):
+    """
+    Render all list buttons registered by plugins
+    """
+    return _get_registered_content(model, 'list_buttons', context)

+ 3 - 0
netbox/extras/tests/dummy_plugin/template_content.py

@@ -16,5 +16,8 @@ class SiteContent(PluginTemplateExtension):
     def buttons(self):
         return "SITE CONTENT - BUTTONS"
 
+    def list_buttons(self):
+        return "SITE CONTENT - LIST BUTTONS"
+
 
 template_extensions = [SiteContent]

+ 3 - 0
netbox/templates/generic/object_list.html

@@ -1,6 +1,7 @@
 {% extends 'base/layout.html' %}
 {% load buttons %}
 {% load helpers %}
+{% load plugins %}
 {% load render_table from django_tables2 %}
 {% load static %}
 
@@ -24,6 +25,8 @@ Context:
 {% block controls %}
   <div class="controls">
     <div class="control-group">
+      {% plugin_list_buttons model %}
+
       {% block extra_controls %}{% endblock %}
       {% if 'add' in actions %}
           {% add_button model %}