diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 9a0f53414..bec993762 100644 --- a/netbox/ipam/views.py +++ b/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})\ diff --git a/netbox/templates/ipam/aggregate.html b/netbox/templates/ipam/aggregate.html index 51f57a458..6c939056d 100644 --- a/netbox/templates/ipam/aggregate.html +++ b/netbox/templates/ipam/aggregate.html @@ -71,7 +71,7 @@
- {% 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' %}
{% endblock %} diff --git a/netbox/templates/ipam/aggregate_list.html b/netbox/templates/ipam/aggregate_list.html index 477c8b981..0945b136b 100644 --- a/netbox/templates/ipam/aggregate_list.html +++ b/netbox/templates/ipam/aggregate_list.html @@ -28,7 +28,7 @@

Aggregates

- {% 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' %}
{% include 'inc/filter_panel.html' %} diff --git a/netbox/templates/ipam/inc/aggregate_table.html b/netbox/templates/ipam/inc/aggregate_table.html deleted file mode 100644 index ecbe4b2f4..000000000 --- a/netbox/templates/ipam/inc/aggregate_table.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load render_table from django_tables2 %} -{% if perms.ipam.change_aggregate or perms.ipam.delete_aggregate %} -
- {% csrf_token %} - - {% render_table table table_template|default:'table.html' %} - {% if perms.ipam.change_aggregate %} - - {% endif %} - {% if perms.ipam.delete_aggregate %} - - {% endif %} -
-{% else %} - {% render_table table table_template|default:'table.html' %} -{% endif %} \ No newline at end of file diff --git a/netbox/templates/ipam/inc/ipaddress_table.html b/netbox/templates/ipam/inc/ipaddress_table.html deleted file mode 100644 index 4033c3020..000000000 --- a/netbox/templates/ipam/inc/ipaddress_table.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load render_table from django_tables2 %} -{% if perms.ipam.change_ipaddress or perms.ipam.delete_ipaddress %} -
- {% csrf_token %} - - {% render_table table table_template|default:'table.html' %} - {% if perms.ipam.change_ipaddress %} - - {% endif %} - {% if perms.ipam.delete_ipaddress %} - - {% endif %} -
-{% else %} - {% render_table table table_template|default:'table.html' %} -{% endif %} \ No newline at end of file diff --git a/netbox/templates/ipam/inc/prefix_table.html b/netbox/templates/ipam/inc/prefix_table.html deleted file mode 100644 index 2abbfadc7..000000000 --- a/netbox/templates/ipam/inc/prefix_table.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load render_table from django_tables2 %} -{% if perms.ipam.change_prefix or perms.ipam.delete_prefix %} -
- {% csrf_token %} - - {% render_table table table_template|default:'table.html' %} - {% if perms.ipam.change_prefix %} - - {% endif %} - {% if perms.ipam.delete_prefix %} - - {% endif %} -
-{% else %} - {% render_table table table_template|default:'table.html' %} -{% endif %} diff --git a/netbox/templates/ipam/inc/rir_table.html b/netbox/templates/ipam/inc/rir_table.html deleted file mode 100644 index d39eb1e97..000000000 --- a/netbox/templates/ipam/inc/rir_table.html +++ /dev/null @@ -1,14 +0,0 @@ -{% load render_table from django_tables2 %} -{% if perms.ipam.delete_rir %} -
- {% csrf_token %} - - {% render_table table table_template|default:'table.html' %} - -
-{% else %} - {% render_table table table_template|default:'table.html' %} -{% endif %} diff --git a/netbox/templates/ipam/inc/vlan_table.html b/netbox/templates/ipam/inc/vlan_table.html deleted file mode 100644 index 0770c1c55..000000000 --- a/netbox/templates/ipam/inc/vlan_table.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load render_table from django_tables2 %} -{% if perms.ipam.change_vlan or perms.ipam.delete_vlan %} -
- {% csrf_token %} - - {% render_table table table_template|default:'table.html' %} - {% if perms.ipam.change_vlan %} - - {% endif %} - {% if perms.ipam.delete_vlan %} - - {% endif %} -
-{% else %} - {% render_table table table_template|default:'table.html' %} -{% endif %} diff --git a/netbox/templates/ipam/ipaddress_list.html b/netbox/templates/ipam/ipaddress_list.html index 28b6f7e56..93954cbdb 100644 --- a/netbox/templates/ipam/ipaddress_list.html +++ b/netbox/templates/ipam/ipaddress_list.html @@ -33,7 +33,7 @@

IP Addresses

- {% 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' %}
diff --git a/netbox/templates/ipam/prefix.html b/netbox/templates/ipam/prefix.html index b72d837ca..51c9f4f80 100644 --- a/netbox/templates/ipam/prefix.html +++ b/netbox/templates/ipam/prefix.html @@ -97,7 +97,7 @@
{% 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 %} Add Child Prefix diff --git a/netbox/templates/ipam/prefix_ipaddresses.html b/netbox/templates/ipam/prefix_ipaddresses.html index eaba0a614..621bb2f22 100644 --- a/netbox/templates/ipam/prefix_ipaddresses.html +++ b/netbox/templates/ipam/prefix_ipaddresses.html @@ -7,7 +7,7 @@ {% include 'ipam/inc/prefix_header.html' with active_tab='ip-addresses' %}
- {% 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' %}
{% endblock %} diff --git a/netbox/templates/ipam/prefix_list.html b/netbox/templates/ipam/prefix_list.html index e465055bf..863cde278 100644 --- a/netbox/templates/ipam/prefix_list.html +++ b/netbox/templates/ipam/prefix_list.html @@ -7,11 +7,11 @@ {% block content %}
{% if perms.ipam.add_prefix %} - + Add a prefix - + Import prefixes @@ -33,7 +33,7 @@

Prefixes

- {% 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' %}
diff --git a/netbox/templates/ipam/rir_list.html b/netbox/templates/ipam/rir_list.html index 8c2ca0e09..a7abcaf2f 100644 --- a/netbox/templates/ipam/rir_list.html +++ b/netbox/templates/ipam/rir_list.html @@ -15,7 +15,7 @@

RIRs

- {% include 'ipam/inc/rir_table.html' %} + {% include 'utilities/obj_table.html' with bulk_delete_url='ipam:rir_bulk_delete' %}
{% endblock %} diff --git a/netbox/templates/ipam/vlan_list.html b/netbox/templates/ipam/vlan_list.html index 2d34ba253..f10e2dc15 100644 --- a/netbox/templates/ipam/vlan_list.html +++ b/netbox/templates/ipam/vlan_list.html @@ -33,7 +33,7 @@

VLANs

- {% 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' %}
diff --git a/netbox/templates/ipam/vrf_list.html b/netbox/templates/ipam/vrf_list.html index 72117d65a..cb59fa3d6 100644 --- a/netbox/templates/ipam/vrf_list.html +++ b/netbox/templates/ipam/vrf_list.html @@ -33,7 +33,7 @@

VRFs

- {% 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' %}
diff --git a/netbox/templates/ipam/inc/vrf_table.html b/netbox/templates/utilities/obj_table.html similarity index 69% rename from netbox/templates/ipam/inc/vrf_table.html rename to netbox/templates/utilities/obj_table.html index 4deca2df0..dc14e0169 100644 --- a/netbox/templates/ipam/inc/vrf_table.html +++ b/netbox/templates/utilities/obj_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 %}
{% csrf_token %} {% render_table table table_template|default:'table.html' %} - {% if perms.ipam.change_vrf %} - {% endif %} - {% if perms.ipam.delete_vrf %} - diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index f7b785284..aa17728b7 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/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 diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index d3ca27563..d170bb5c0 100644 --- a/netbox/utilities/views.py +++ b/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):