Parcourir la source

Introduced consolidated object table template

Jeremy Stretch il y a 9 ans
Parent
commit
149720d18a

+ 3 - 0
netbox/ipam/views.py

@@ -159,6 +159,7 @@ def aggregate(request, pk):
     child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes)
 
     prefix_table = PrefixTable(child_prefixes)
+    prefix_table.model = Prefix
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
         prefix_table.base_columns['pk'].visible = True
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
@@ -262,6 +263,7 @@ def prefix(request, pk):
     if child_prefixes:
         child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes)
     child_prefix_table = PrefixTable(child_prefixes)
+    child_prefix_table.model = Prefix
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
         child_prefix_table.base_columns['pk'].visible = True
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
@@ -337,6 +339,7 @@ def prefix_ipaddresses(request, pk):
         .select_related('vrf', 'interface__device', 'primary_for')
 
     ip_table = IPAddressTable(ipaddresses)
+    ip_table.model = IPAddress
     if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
         ip_table.base_columns['pk'].visible = True
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\

+ 1 - 1
netbox/templates/ipam/aggregate.html

@@ -71,7 +71,7 @@
 </div>
 <div class="row">
     <div class="col-md-12">
-        {% include 'ipam/inc/prefix_table.html' with table=prefix_table table_template='panel_table.html' heading='Child Prefixes' %}
+        {% include 'utilities/obj_table.html' with table=prefix_table table_template='panel_table.html' heading='Child Prefixes' bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' %}
 	</div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/ipam/aggregate_list.html

@@ -28,7 +28,7 @@
 <h1>Aggregates</h1>
 <div class="row">
 	<div class="col-md-9">
-        {% include 'ipam/inc/aggregate_table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:aggregate_bulk_edit' bulk_delete_url='ipam:aggregate_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
 		{% include 'inc/filter_panel.html' %}

+ 0 - 22
netbox/templates/ipam/inc/aggregate_table.html

@@ -1,22 +0,0 @@
-{% load render_table from django_tables2 %}
-{% if perms.ipam.change_aggregate or perms.ipam.delete_aggregate %}
-    <form method="post" class="form form-horizontal">
-        {% csrf_token %}
-        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
-        {% render_table table table_template|default:'table.html' %}
-        {% if perms.ipam.change_aggregate %}
-            <button type="submit" name="_edit" formaction="{% url 'ipam:aggregate_bulk_edit' %}" class="btn btn-warning btn-sm">
-                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-                Edit Selected
-            </button>
-        {% endif %}
-        {% if perms.ipam.delete_aggregate %}
-            <button type="submit" name="_delete" formaction="{% url 'ipam:aggregate_bulk_delete' %}" class="btn btn-danger btn-sm">
-                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                Delete Selected
-            </button>
-        {% endif %}
-    </form>
-{% else %}
-    {% render_table table table_template|default:'table.html' %}
-{% endif %}

+ 0 - 22
netbox/templates/ipam/inc/ipaddress_table.html

@@ -1,22 +0,0 @@
-{% load render_table from django_tables2 %}
-{% if perms.ipam.change_ipaddress or perms.ipam.delete_ipaddress %}
-    <form method="post" class="form form-horizontal">
-        {% csrf_token %}
-        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
-        {% render_table table table_template|default:'table.html' %}
-        {% if perms.ipam.change_ipaddress %}
-            <button type="submit" name="_edit" formaction="{% url 'ipam:ipaddress_bulk_edit' %}" class="btn btn-warning btn-sm">
-                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-                Edit Selected
-            </button>
-        {% endif %}
-        {% if perms.ipam.delete_ipaddress %}
-            <button type="submit" name="_delete" formaction="{% url 'ipam:ipaddress_bulk_delete' %}" class="btn btn-danger btn-sm">
-                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                Delete Selected
-            </button>
-        {% endif %}
-    </form>
-{% else %}
-    {% render_table table table_template|default:'table.html' %}
-{% endif %}

+ 0 - 22
netbox/templates/ipam/inc/prefix_table.html

@@ -1,22 +0,0 @@
-{% load render_table from django_tables2 %}
-{% if perms.ipam.change_prefix or perms.ipam.delete_prefix %}
-    <form method="post" class="form form-horizontal">
-        {% csrf_token %}
-        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
-        {% render_table table table_template|default:'table.html' %}
-        {% if perms.ipam.change_prefix %}
-            <button type="submit" name="_edit" formaction="{% url 'ipam:prefix_bulk_edit' %}" class="btn btn-warning btn-sm">
-                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-                Edit Selected
-            </button>
-        {% endif %}
-        {% if perms.ipam.delete_prefix %}
-            <button type="submit" name="_delete" formaction="{% url 'ipam:prefix_bulk_delete' %}" class="btn btn-danger btn-sm">
-                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                Delete Selected
-            </button>
-        {% endif %}
-    </form>
-{% else %}
-    {% render_table table table_template|default:'table.html' %}
-{% endif %}

+ 0 - 14
netbox/templates/ipam/inc/rir_table.html

@@ -1,14 +0,0 @@
-{% load render_table from django_tables2 %}
-{% if perms.ipam.delete_rir %}
-    <form method="post" class="form form-horizontal">
-        {% csrf_token %}
-        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
-        {% render_table table table_template|default:'table.html' %}
-        <button type="submit" name="_delete" formaction="{% url 'ipam:rir_bulk_delete' %}" class="btn btn-danger btn-sm">
-            <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-            Delete Selected
-        </button>
-    </form>
-{% else %}
-    {% render_table table table_template|default:'table.html' %}
-{% endif %}

+ 0 - 22
netbox/templates/ipam/inc/vlan_table.html

@@ -1,22 +0,0 @@
-{% load render_table from django_tables2 %}
-{% if perms.ipam.change_vlan or perms.ipam.delete_vlan %}
-    <form method="post" class="form form-horizontal">
-        {% csrf_token %}
-        <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
-        {% render_table table table_template|default:'table.html' %}
-        {% if perms.ipam.change_vlan %}
-            <button type="submit" name="_edit" formaction="{% url 'ipam:vlan_bulk_edit' %}" class="btn btn-warning btn-sm">
-                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
-                Edit Selected
-            </button>
-        {% endif %}
-        {% if perms.ipam.delete_vlan %}
-            <button type="submit" name="_delete" formaction="{% url 'ipam:vlan_bulk_delete' %}" class="btn btn-danger btn-sm">
-                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
-                Delete Selected
-            </button>
-        {% endif %}
-    </form>
-{% else %}
-    {% render_table table table_template|default:'table.html' %}
-{% endif %}

+ 1 - 1
netbox/templates/ipam/ipaddress_list.html

@@ -33,7 +33,7 @@
 <h1>IP Addresses</h1>
 <div class="row">
 	<div class="col-md-9">
-        {% include 'ipam/inc/ipaddress_table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:ipaddress_bulk_edit' bulk_delete_url='ipam:ipaddress_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
 		<div class="panel panel-default">

+ 1 - 1
netbox/templates/ipam/prefix.html

@@ -97,7 +97,7 @@
 <div class="row">
 	<div class="col-md-12">
         {% if child_prefix_table.rows %}
-            {% include 'ipam/inc/prefix_table.html' with table=child_prefix_table table_template='panel_table.html' heading='Child Prefixes' parent=prefix %}
+            {% include 'utilities/obj_table.html' with table=child_prefix_table table_template='panel_table.html' heading='Child Prefixes' parent=prefix bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' %}
         {% elif prefix.new_subnet %}
             <a href="{% url 'ipam:prefix_add' %}?prefix={{ prefix.new_subnet }}{% if prefix.vrf %}&vrf={{ prefix.vrf.pk }}{% endif %}{% if prefix.site %}&site={{ prefix.site.pk }}{% endif %}" class="btn btn-success">
                 <i class="glyphicon glyphicon-plus" aria-hidden="true"></i> Add Child Prefix

+ 1 - 1
netbox/templates/ipam/prefix_ipaddresses.html

@@ -7,7 +7,7 @@
 {% include 'ipam/inc/prefix_header.html' with active_tab='ip-addresses' %}
 <div class="row">
 	<div class="col-md-12">
-        {% include 'ipam/inc/ipaddress_table.html' with table=ip_table table_template='panel_table.html' heading='IP Addresses' %}
+        {% include 'utilities/obj_table.html' with table=ip_table table_template='panel_table.html' heading='IP Addresses' bulk_edit_url='ipam:ipaddress_bulk_edit' bulk_delete_url='ipam:ipaddress_bulk_delete' %}
     </div>
 </div>
 {% endblock %}

+ 3 - 3
netbox/templates/ipam/prefix_list.html

@@ -7,11 +7,11 @@
 {% block content %}
 <div class="pull-right">
     {% if perms.ipam.add_prefix %}
-		<a href="{% url 'ipam:prefix_add' %}" class="btn btn-primary">
+		<a href="{{ action_urls.add }}" class="btn btn-primary">
 			<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
 			Add a prefix
 		</a>
-		<a href="{% url 'ipam:prefix_import' %}" class="btn btn-info">
+		<a href="{{ action_urls.import }}" class="btn btn-info">
 			<span class="glyphicon glyphicon-import" aria-hidden="true"></span>
 			Import prefixes
 		</a>
@@ -33,7 +33,7 @@
 <h1>Prefixes</h1>
 <div class="row">
 	<div class="col-md-9">
-        {% include 'ipam/inc/prefix_table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
 		<div class="panel panel-default">

+ 1 - 1
netbox/templates/ipam/rir_list.html

@@ -15,7 +15,7 @@
 <h1>RIRs</h1>
 <div class="row">
 	<div class="col-md-12">
-        {% include 'ipam/inc/rir_table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_delete_url='ipam:rir_bulk_delete' %}
     </div>
 </div>
 {% endblock %}

+ 1 - 1
netbox/templates/ipam/vlan_list.html

@@ -33,7 +33,7 @@
 <h1>VLANs</h1>
 <div class="row">
 	<div class="col-md-9">
-        {% include 'ipam/inc/vlan_table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vlan_bulk_edit' bulk_delete_url='ipam:vlan_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
 		<div class="panel panel-default">

+ 1 - 1
netbox/templates/ipam/vrf_list.html

@@ -33,7 +33,7 @@
 <h1>VRFs</h1>
 <div class="row">
 	<div class="col-md-9">
-        {% include 'ipam/inc/vrf_table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_edit_url='ipam:vrf_bulk_edit' bulk_delete_url='ipam:vrf_bulk_delete' %}
 	</div>
 	<div class="col-md-3">
 		<div class="panel panel-default">

+ 6 - 5
netbox/templates/ipam/inc/vrf_table.html

@@ -1,17 +1,18 @@
 {% load render_table from django_tables2 %}
-{% if perms.ipam.change_vrf or perms.ipam.delete_vrf %}
+{% load helpers %}
+{% if table.model|user_can_change:request.user or table.model|user_can_delete:request.user %}
     <form method="post" class="form form-horizontal">
         {% csrf_token %}
         <input type="hidden" name="redirect_url" value="{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" />
         {% render_table table table_template|default:'table.html' %}
-        {% if perms.ipam.change_vrf %}
-            <button type="submit" name="_edit" formaction="{% url 'ipam:vrf_bulk_edit' %}" class="btn btn-warning btn-sm">
+        {% if bulk_edit_url and table.model|user_can_change:request.user %}
+            <button type="submit" name="_edit" formaction="{% url bulk_edit_url %}" class="btn btn-warning btn-sm">
                 <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
                 Edit Selected
             </button>
         {% endif %}
-        {% if perms.ipam.delete_vrf %}
-            <button type="submit" name="_delete" formaction="{% url 'ipam:vrf_bulk_delete' %}" class="btn btn-danger btn-sm">
+        {% if bulk_delete_url and table.model|user_can_delete:request.user %}
+            <button type="submit" name="_delete" formaction="{% url bulk_delete_url %}" class="btn btn-danger btn-sm">
                 <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
                 Delete Selected
             </button>

+ 22 - 4
netbox/utilities/templatetags/helpers.py

@@ -11,7 +11,7 @@ register = template.Library()
 # Filters
 #
 
-@register.filter(name='oneline')
+@register.filter()
 def oneline(value):
     """
     Replace each line break with a single space
@@ -19,7 +19,7 @@ def oneline(value):
     return value.replace('\n', ' ')
 
 
-@register.filter(name='getlist')
+@register.filter()
 def getlist(value, arg):
     """
     Return all values of a QueryDict key
@@ -27,7 +27,7 @@ def getlist(value, arg):
     return value.getlist(arg)
 
 
-@register.filter(name='gfm', is_safe=True)
+@register.filter(is_safe=True)
 def gfm(value):
     """
     Render text as GitHub-Flavored Markdown
@@ -36,11 +36,29 @@ def gfm(value):
     return mark_safe(html)
 
 
+@register.filter()
+def user_can_add(model, user):
+    perm_name = '{}:add_{}'.format(model._meta.app_label, model.__class__.__name__.lower())
+    return user.has_perm(perm_name)
+
+
+@register.filter()
+def user_can_change(model, user):
+    perm_name = '{}:change_{}'.format(model._meta.app_label, model.__class__.__name__.lower())
+    return user.has_perm(perm_name)
+
+
+@register.filter()
+def user_can_delete(model, user):
+    perm_name = '{}:delete_{}'.format(model._meta.app_label, model.__class__.__name__.lower())
+    return user.has_perm(perm_name)
+
+
 #
 # Tags
 #
 
-@register.simple_tag(name='querystring_toggle')
+@register.simple_tag()
 def querystring_toggle(request, multi=True, page_key='page', **kwargs):
     """
     Add or remove a parameter in the HTTP GET query string

+ 5 - 5
netbox/utilities/views.py

@@ -2,7 +2,7 @@ from django.conf import settings
 from django.contrib import messages
 from django.contrib.admin.views.decorators import staff_member_required
 from django.contrib.contenttypes.models import ContentType
-from django.core.urlresolvers import reverse
+from django.core.urlresolvers import reverse, NoReverseMatch
 from django.db import transaction, IntegrityError
 from django.db.models import ProtectedError
 from django.http import HttpResponseRedirect
@@ -31,7 +31,8 @@ class ObjectListView(View):
 
     def get(self, request, *args, **kwargs):
 
-        object_ct = ContentType.objects.get_for_model(self.queryset.model)
+        model = self.queryset.model
+        object_ct = ContentType.objects.get_for_model(model)
 
         if self.filter:
             self.queryset = self.filter(request.GET, self.queryset).qs
@@ -58,17 +59,16 @@ class ObjectListView(View):
 
         # Construct the table based on the user's permissions
         table = self.table(self.queryset)
+        table.model = model
         if 'pk' in table.base_columns and any([request.user.has_perm(perm) for perm in self.edit_permissions]):
             table.base_columns['pk'].visible = True
         RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
             .configure(table)
 
-        export_templates = ExportTemplate.objects.filter(content_type=object_ct)
-
         return render(request, self.template_name, {
             'table': table,
             'filter_form': self.filter_form(request.GET, label_suffix='') if self.filter_form else None,
-            'export_templates': export_templates,
+            'export_templates': ExportTemplate.objects.filter(content_type=object_ct),
         })
 
     def alter_queryset(self, request):