Просмотр исходного кода

Introduce a common template for object list views

Jeremy Stretch 6 лет назад
Родитель
Сommit
c5f74cce80

+ 28 - 0
netbox/templates/utilities/obj_list.html

@@ -0,0 +1,28 @@
+{% extends '_base.html' %}
+{% load buttons %}
+{% load helpers %}
+
+{% block content %}
+<div class="pull-right noprint">
+    {% if permissions.add %}
+        {% add_button content_type.model_class|url_name:"add" %}
+        {% import_button content_type.model_class|url_name:"import" %}
+    {% endif %}
+    {% export_button content_type %}
+</div>
+<h1>{% block title %}{{ content_type.model_class|model_name_plural|bettertitle }}{% endblock %}</h1>
+<div class="row">
+    {% if filter_form %}
+        <div class="col-md-9">
+            {% include 'utilities/obj_table.html' with bulk_edit_url=content_type.model_class|url_name:"bulk_edit" bulk_delete_url=content_type.model_class|url_name:"bulk_delete" %}
+        </div>
+        <div class="col-md-3 noprint">
+            {% include 'inc/search_panel.html' %}
+        </div>
+    {% else %}
+        <div class="col-md-12">
+            {% include 'utilities/obj_table.html' with bulk_edit_url=content_type.model_class|url_name:"bulk_edit" bulk_delete_url=content_type.model_class|url_name:"bulk_delete" %}
+        </div>
+    {% endif %}
+</div>
+{% endblock %}

+ 17 - 2
netbox/utilities/templatetags/helpers.py

@@ -1,9 +1,10 @@
 import datetime
 import json
 import re
-import yaml
 
+import yaml
 from django import template
+from django.urls import NoReverseMatch, reverse
 from django.utils.html import strip_tags
 from django.utils.safestring import mark_safe
 from markdown import markdown
@@ -11,7 +12,6 @@ from markdown import markdown
 from utilities.choices import unpack_grouped_choices
 from utilities.utils import foreground_color
 
-
 register = template.Library()
 
 
@@ -101,6 +101,21 @@ def model_name_plural(obj):
     return obj._meta.verbose_name_plural
 
 
+@register.filter()
+def url_name(model, action):
+    """
+    Return the URL name for the given model and action, or None if invalid.
+    """
+    url_name = '{}:{}_{}'.format(model._meta.app_label, model._meta.model_name, action)
+    try:
+        # Validate and return the URL name. We don't return the actual URL yet because many of the templates
+        # are written to pass a name to {% url %}.
+        reverse(url_name)
+        return url_name
+    except NoReverseMatch:
+        return None
+
+
 @register.filter()
 def contains(value, arg):
     """

+ 6 - 4
netbox/utilities/views.py

@@ -71,7 +71,7 @@ class ObjectListView(View):
     filterset = None
     filterset_form = None
     table = None
-    template_name = None
+    template_name = 'utilities/obj_list.html'
 
     def queryset_to_yaml(self):
         """
@@ -156,9 +156,11 @@ class ObjectListView(View):
         # Provide a hook to tweak the queryset based on the request immediately prior to rendering the object list
         self.queryset = self.alter_queryset(request)
 
-        # Compile user model permissions for access from within the template
-        perm_base_name = '{}.{{}}_{}'.format(model._meta.app_label, model._meta.model_name)
-        permissions = {p: request.user.has_perm(perm_base_name.format(p)) for p in ['add', 'change', 'delete']}
+        # Compile a dictionary indicating which permissions are available to the current user for this model
+        permissions = {}
+        for action in ('add', 'change', 'delete', 'view'):
+            perm_name = '{}.{}_{}'.format(model._meta.app_label, action, model._meta.model_name)
+            permissions[action] = request.user.has_perm(perm_name)
 
         # Construct the table based on the user's permissions
         table = self.table(self.queryset)