Browse Source

Collapsed EditTables into primary table for each object

Jeremy Stretch 9 years ago
parent
commit
062e64a34d

+ 4 - 18
netbox/circuits/tables.py

@@ -9,32 +9,26 @@ from .models import Circuit, Provider
 #
 #
 
 
 class ProviderTable(tables.Table):
 class ProviderTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     name = tables.LinkColumn('circuits:provider', args=[Accessor('slug')], verbose_name='Name')
     name = tables.LinkColumn('circuits:provider', args=[Accessor('slug')], verbose_name='Name')
     asn = tables.Column(verbose_name='ASN')
     asn = tables.Column(verbose_name='ASN')
     circuit_count = tables.Column(accessor=Accessor('count_circuits'), verbose_name='Circuits')
     circuit_count = tables.Column(accessor=Accessor('count_circuits'), verbose_name='Circuits')
 
 
     class Meta:
     class Meta:
         model = Provider
         model = Provider
-        fields = ('name', 'asn', 'circuit_count')
+        fields = ('pk', 'name', 'asn', 'circuit_count')
         empty_text = "No providers found."
         empty_text = "No providers found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class ProviderBulkEditTable(ProviderTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(ProviderTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name', 'asn', 'circuit_count')
-
-
 #
 #
 # Circuits
 # Circuits
 #
 #
 
 
 class CircuitTable(tables.Table):
 class CircuitTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     cid = tables.LinkColumn('circuits:circuit', args=[Accessor('pk')], verbose_name='ID')
     cid = tables.LinkColumn('circuits:circuit', args=[Accessor('pk')], verbose_name='ID')
     type = tables.Column(verbose_name='Type')
     type = tables.Column(verbose_name='Type')
     provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')], verbose_name='Provider')
     provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')], verbose_name='Provider')
@@ -44,16 +38,8 @@ class CircuitTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = Circuit
         model = Circuit
-        fields = ('cid', 'type', 'provider', 'site', 'port_speed', 'commit_rate')
+        fields = ('pk', 'cid', 'type', 'provider', 'site', 'port_speed', 'commit_rate')
         empty_text = "No circuits found."
         empty_text = "No circuits found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
-
-
-class CircuitBulkEditTable(CircuitTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(CircuitTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'cid', 'type', 'provider', 'site', 'port_speed', 'commit_rate')

+ 3 - 5
netbox/circuits/views.py

@@ -10,7 +10,7 @@ from .filters import CircuitFilter
 from .forms import CircuitForm, CircuitImportForm, CircuitBulkEditForm, CircuitBulkDeleteForm, CircuitFilterForm,\
 from .forms import CircuitForm, CircuitImportForm, CircuitBulkEditForm, CircuitBulkDeleteForm, CircuitFilterForm,\
     ProviderForm, ProviderImportForm, ProviderBulkEditForm, ProviderBulkDeleteForm
     ProviderForm, ProviderImportForm, ProviderBulkEditForm, ProviderBulkDeleteForm
 from .models import Circuit, Provider
 from .models import Circuit, Provider
-from .tables import CircuitTable, CircuitBulkEditTable, ProviderTable, ProviderBulkEditTable
+from .tables import CircuitTable, ProviderTable
 
 
 
 
 #
 #
@@ -20,8 +20,7 @@ from .tables import CircuitTable, CircuitBulkEditTable, ProviderTable, ProviderB
 class ProviderListView(ObjectListView):
 class ProviderListView(ObjectListView):
     queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
     queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
     table = ProviderTable
     table = ProviderTable
-    edit_table = ProviderBulkEditTable
-    edit_table_permissions = ['circuits.change_provider', 'circuits.delete_provider']
+    edit_permissions = ['circuits.change_provider', 'circuits.delete_provider']
     template_name = 'circuits/provider_list.html'
     template_name = 'circuits/provider_list.html'
 
 
 
 
@@ -99,8 +98,7 @@ class CircuitListView(ObjectListView):
     filter = CircuitFilter
     filter = CircuitFilter
     filter_form = CircuitFilterForm
     filter_form = CircuitFilterForm
     table = CircuitTable
     table = CircuitTable
-    edit_table = CircuitBulkEditTable
-    edit_table_permissions = ['circuits.change_circuit', 'circuits.delete_circuit']
+    edit_permissions = ['circuits.change_circuit', 'circuits.delete_circuit']
     template_name = 'circuits/circuit_list.html'
     template_name = 'circuits/circuit_list.html'
 
 
 
 

+ 24 - 94
netbox/dcim/tables.py

@@ -9,11 +9,11 @@ DEVICE_LINK = """
 """
 """
 
 
 RACKGROUP_EDIT_LINK = """
 RACKGROUP_EDIT_LINK = """
-<a href="{% url 'dcim:rackgroup_edit' pk=record.pk %}">Edit</a>
+{% if perms.dcim.change_rackgroup %}<a href="{% url 'dcim:rackgroup_edit' pk=record.pk %}">Edit</a>{% endif %}
 """
 """
 
 
 DEVICEROLE_EDIT_LINK = """
 DEVICEROLE_EDIT_LINK = """
-<a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>
+{% if perms.dcim.change_devicerole %}<a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>{% endif %}
 """
 """
 
 
 STATUS_ICON = """
 STATUS_ICON = """
@@ -49,34 +49,28 @@ class SiteTable(tables.Table):
 #
 #
 
 
 class RackGroupTable(tables.Table):
 class RackGroupTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     name = tables.LinkColumn(verbose_name='Name')
     name = tables.LinkColumn(verbose_name='Name')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     rack_count = tables.Column(verbose_name='Racks')
     rack_count = tables.Column(verbose_name='Racks')
     slug = tables.Column(verbose_name='Slug')
     slug = tables.Column(verbose_name='Slug')
+    edit = tables.TemplateColumn(template_code=RACKGROUP_EDIT_LINK, verbose_name='')
 
 
     class Meta:
     class Meta:
         model = RackGroup
         model = RackGroup
-        fields = ('name', 'site', 'rack_count', 'slug')
+        fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'edit')
         empty_text = "No rack groups were found."
         empty_text = "No rack groups were found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class RackGroupBulkEditTable(RackGroupTable):
-    pk = tables.CheckBoxColumn()
-    edit = tables.TemplateColumn(template_code=RACKGROUP_EDIT_LINK, verbose_name='')
-
-    class Meta(RackGroupTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'edit')
-
-
 #
 #
 # Racks
 # Racks
 #
 #
 
 
 class RackTable(tables.Table):
 class RackTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     name = tables.LinkColumn('dcim:rack', args=[Accessor('pk')], verbose_name='Name')
     name = tables.LinkColumn('dcim:rack', args=[Accessor('pk')], verbose_name='Name')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
     group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
@@ -86,54 +80,40 @@ class RackTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = Rack
         model = Rack
-        fields = ('name', 'site', 'group', 'facility_id', 'u_height')
+        fields = ('pk', 'name', 'site', 'group', 'facility_id', 'u_height')
         empty_text = "No racks were found."
         empty_text = "No racks were found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class RackBulkEditTable(RackTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(RackTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name', 'site', 'group', 'facility_id', 'u_height')
-
-
 #
 #
 # Device types
 # Device types
 #
 #
 
 
 class DeviceTypeTable(tables.Table):
 class DeviceTypeTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     model = tables.LinkColumn('dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type')
     model = tables.LinkColumn('dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type')
 
 
     class Meta:
     class Meta:
         model = DeviceType
         model = DeviceType
-        fields = ('model', 'manufacturer', 'u_height')
+        fields = ('pk', 'model', 'manufacturer', 'u_height')
         empty_text = "No device types were found."
         empty_text = "No device types were found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class DeviceTypeBulkEditTable(DeviceTypeTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(DeviceTypeTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'model', 'manufacturer', 'u_height')
-
-
 #
 #
 # Device type components
 # Device type components
 #
 #
 
 
 class ConsolePortTemplateTable(tables.Table):
 class ConsolePortTemplateTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
 
 
     class Meta:
     class Meta:
         model = ConsolePortTemplate
         model = ConsolePortTemplate
-        fields = ('name',)
+        fields = ('pk', 'name')
         empty_text = "None"
         empty_text = "None"
         show_header = False
         show_header = False
         attrs = {
         attrs = {
@@ -141,19 +121,12 @@ class ConsolePortTemplateTable(tables.Table):
         }
         }
 
 
 
 
-class ConsolePortTemplateBulkDeleteTable(ConsolePortTemplateTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(ConsolePortTemplateTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name')
-
-
 class ConsoleServerPortTemplateTable(tables.Table):
 class ConsoleServerPortTemplateTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
 
 
     class Meta:
     class Meta:
         model = ConsoleServerPortTemplate
         model = ConsoleServerPortTemplate
-        fields = ('name',)
+        fields = ('pk', 'name')
         empty_text = "None"
         empty_text = "None"
         show_header = False
         show_header = False
         attrs = {
         attrs = {
@@ -161,19 +134,12 @@ class ConsoleServerPortTemplateTable(tables.Table):
         }
         }
 
 
 
 
-class ConsoleServerPortTemplateBulkDeleteTable(ConsoleServerPortTemplateTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(ConsoleServerPortTemplateTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name')
-
-
 class PowerPortTemplateTable(tables.Table):
 class PowerPortTemplateTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
 
 
     class Meta:
     class Meta:
         model = PowerPortTemplate
         model = PowerPortTemplate
-        fields = ('name',)
+        fields = ('pk', 'name')
         empty_text = "None"
         empty_text = "None"
         show_header = False
         show_header = False
         attrs = {
         attrs = {
@@ -181,19 +147,12 @@ class PowerPortTemplateTable(tables.Table):
         }
         }
 
 
 
 
-class PowerPortTemplateBulkDeleteTable(PowerPortTemplateTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(PowerPortTemplateTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name')
-
-
 class PowerOutletTemplateTable(tables.Table):
 class PowerOutletTemplateTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
 
 
     class Meta:
     class Meta:
         model = PowerOutletTemplate
         model = PowerOutletTemplate
-        fields = ('name',)
+        fields = ('pk', 'name')
         empty_text = "None"
         empty_text = "None"
         show_header = False
         show_header = False
         attrs = {
         attrs = {
@@ -201,19 +160,12 @@ class PowerOutletTemplateTable(tables.Table):
         }
         }
 
 
 
 
-class PowerOutletTemplateBulkDeleteTable(PowerOutletTemplateTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(PowerOutletTemplateTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name')
-
-
 class InterfaceTemplateTable(tables.Table):
 class InterfaceTemplateTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
 
 
     class Meta:
     class Meta:
         model = InterfaceTemplate
         model = InterfaceTemplate
-        fields = ('name',)
+        fields = ('pk', 'name')
         empty_text = "None"
         empty_text = "None"
         show_header = False
         show_header = False
         attrs = {
         attrs = {
@@ -221,47 +173,33 @@ class InterfaceTemplateTable(tables.Table):
         }
         }
 
 
 
 
-class InterfaceTemplateBulkDeleteTable(InterfaceTemplateTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(InterfaceTemplateTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name')
-
-
 #
 #
 # Device roles
 # Device roles
 #
 #
 
 
 class DeviceRoleTable(tables.Table):
 class DeviceRoleTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     name = tables.LinkColumn(verbose_name='Name')
     name = tables.LinkColumn(verbose_name='Name')
     device_count = tables.Column(verbose_name='Devices')
     device_count = tables.Column(verbose_name='Devices')
     slug = tables.Column(verbose_name='Slug')
     slug = tables.Column(verbose_name='Slug')
     color = tables.Column(verbose_name='Color')
     color = tables.Column(verbose_name='Color')
+    edit = tables.TemplateColumn(template_code=DEVICEROLE_EDIT_LINK, verbose_name='')
 
 
     class Meta:
     class Meta:
         model = DeviceRole
         model = DeviceRole
-        fields = ('name', 'device_count', 'slug', 'color')
+        fields = ('pk', 'name', 'device_count', 'slug', 'color')
         empty_text = "No device roles were found."
         empty_text = "No device roles were found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class DeviceRoleBulkEditTable(DeviceRoleTable):
-    pk = tables.CheckBoxColumn()
-    edit = tables.TemplateColumn(template_code=DEVICEROLE_EDIT_LINK, verbose_name='')
-
-    class Meta(DeviceRoleTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name', 'device_count', 'slug', 'color')
-
-
 #
 #
 # Devices
 # Devices
 #
 #
 
 
 class DeviceTable(tables.Table):
 class DeviceTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     status = tables.TemplateColumn(template_code=STATUS_ICON, verbose_name='')
     status = tables.TemplateColumn(template_code=STATUS_ICON, verbose_name='')
     name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
     name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
     site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site')
     site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site')
@@ -272,21 +210,13 @@ class DeviceTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = Device
         model = Device
-        fields = ('name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
+        fields = ('pk', 'name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
         empty_text = "No devices were found."
         empty_text = "No devices were found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class DeviceBulkEditTable(DeviceTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(DeviceTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
-
-
 class DeviceImportTable(tables.Table):
 class DeviceImportTable(tables.Table):
     name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
     name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name')
     site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site')
     site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site')

+ 19 - 27
netbox/dcim/views.py

@@ -36,12 +36,10 @@ from .forms import SiteForm, SiteImportForm, RackGroupForm, RackGroupFilterForm,
 from .models import Site, RackGroup, Rack, DeviceType, DeviceRole, ConsolePortTemplate, ConsoleServerPortTemplate, \
 from .models import Site, RackGroup, Rack, DeviceType, DeviceRole, ConsolePortTemplate, ConsoleServerPortTemplate, \
     PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, Device, ConsolePort, ConsoleServerPort, PowerPort, \
     PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, Device, ConsolePort, ConsoleServerPort, PowerPort, \
     PowerOutlet, Interface, InterfaceConnection, Module, CONNECTION_STATUS_CONNECTED
     PowerOutlet, Interface, InterfaceConnection, Module, CONNECTION_STATUS_CONNECTED
-from .tables import SiteTable, RackGroupTable, RackGroupBulkEditTable, RackTable, RackBulkEditTable, DeviceTypeTable, \
-    DeviceTypeBulkEditTable, DeviceRoleTable, DeviceRoleBulkEditTable, DeviceTable, DeviceBulkEditTable, \
+from .tables import SiteTable, RackGroupTable, RackTable, DeviceTypeTable, DeviceRoleTable, DeviceTable, \
     DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable, InterfaceConnectionTable, \
     DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable, InterfaceConnectionTable, \
     ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable, PowerOutletTemplateTable, \
     ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable, PowerOutletTemplateTable, \
-    InterfaceTemplateTable, ConsolePortTemplateBulkDeleteTable, ConsoleServerPortTemplateBulkDeleteTable, \
-    PowerPortTemplateBulkDeleteTable, PowerOutletTemplateBulkDeleteTable, InterfaceTemplateBulkDeleteTable
+    InterfaceTemplateTable
 
 
 
 
 EXPANSION_PATTERN = '\[(\d+-\d+)\]'
 EXPANSION_PATTERN = '\[(\d+-\d+)\]'
@@ -137,8 +135,7 @@ class RackGroupListView(ObjectListView):
     filter = RackGroupFilter
     filter = RackGroupFilter
     filter_form = RackGroupFilterForm
     filter_form = RackGroupFilterForm
     table = RackGroupTable
     table = RackGroupTable
-    edit_table = RackGroupBulkEditTable
-    edit_table_permissions = ['dcim.change_rackgroup', 'dcim.delete_rackgroup']
+    edit_permissions = ['dcim.change_rackgroup', 'dcim.delete_rackgroup']
     template_name = 'dcim/rackgroup_list.html'
     template_name = 'dcim/rackgroup_list.html'
 
 
 
 
@@ -172,8 +169,7 @@ class RackListView(ObjectListView):
     filter = RackFilter
     filter = RackFilter
     filter_form = RackFilterForm
     filter_form = RackFilterForm
     table = RackTable
     table = RackTable
-    edit_table = RackBulkEditTable
-    edit_table_permissions = ['dcim.change_rack', 'dcim.delete_rack']
+    edit_permissions = ['dcim.change_rack', 'dcim.delete_rack']
     template_name = 'dcim/rack_list.html'
     template_name = 'dcim/rack_list.html'
 
 
 
 
@@ -258,8 +254,7 @@ class DeviceTypeListView(ObjectListView):
     filter = DeviceTypeFilter
     filter = DeviceTypeFilter
     filter_form = DeviceTypeFilterForm
     filter_form = DeviceTypeFilterForm
     table = DeviceTypeTable
     table = DeviceTypeTable
-    edit_table = DeviceTypeBulkEditTable
-    edit_table_permissions = ['dcim.change_devicetype', 'dcim.delete_devicetype']
+    edit_permissions = ['dcim.change_devicetype', 'dcim.delete_devicetype']
     template_name = 'dcim/devicetype_list.html'
     template_name = 'dcim/devicetype_list.html'
 
 
 
 
@@ -268,18 +263,17 @@ def devicetype(request, pk):
     devicetype = get_object_or_404(DeviceType, pk=pk)
     devicetype = get_object_or_404(DeviceType, pk=pk)
 
 
     # Component tables
     # Component tables
+    consoleport_table = ConsolePortTemplateTable(ConsolePortTemplate.objects.filter(device_type=devicetype))
+    consoleserverport_table = ConsoleServerPortTemplateTable(ConsoleServerPortTemplate.objects.filter(device_type=devicetype))
+    powerport_table = PowerPortTemplateTable(PowerPortTemplate.objects.filter(device_type=devicetype))
+    poweroutlet_table = PowerOutletTemplateTable(PowerOutletTemplate.objects.filter(device_type=devicetype))
+    interface_table = InterfaceTemplateTable(InterfaceTemplate.objects.filter(device_type=devicetype))
     if request.user.has_perm('dcim.change_devicetype'):
     if request.user.has_perm('dcim.change_devicetype'):
-        consoleport_table = ConsolePortTemplateBulkDeleteTable(ConsolePortTemplate.objects.filter(device_type=devicetype))
-        consoleserverport_table = ConsoleServerPortTemplateBulkDeleteTable(ConsoleServerPortTemplate.objects.filter(device_type=devicetype))
-        powerport_table = PowerPortTemplateBulkDeleteTable(PowerPortTemplate.objects.filter(device_type=devicetype))
-        poweroutlet_table = PowerOutletTemplateBulkDeleteTable(PowerOutletTemplate.objects.filter(device_type=devicetype))
-        interface_table = InterfaceTemplateBulkDeleteTable(InterfaceTemplate.objects.filter(device_type=devicetype))
-    else:
-        consoleport_table = ConsolePortTemplateTable(ConsolePortTemplate.objects.filter(device_type=devicetype))
-        consoleserverport_table = ConsoleServerPortTemplateTable(ConsoleServerPortTemplate.objects.filter(device_type=devicetype))
-        powerport_table = PowerPortTemplateTable(PowerPortTemplate.objects.filter(device_type=devicetype))
-        poweroutlet_table = PowerOutletTemplateTable(PowerOutletTemplate.objects.filter(device_type=devicetype))
-        interface_table = InterfaceTemplateTable(InterfaceTemplate.objects.filter(device_type=devicetype))
+        consoleport_table.base_columns['pk'].visible = True
+        consoleserverport_table.base_columns['pk'].visible = True
+        powerport_table.base_columns['pk'].visible = True
+        poweroutlet_table.base_columns['pk'].visible = True
+        interface_table.base_columns['pk'].visible = True
 
 
     return render(request, 'dcim/devicetype.html', {
     return render(request, 'dcim/devicetype.html', {
         'devicetype': devicetype,
         'devicetype': devicetype,
@@ -343,7 +337,7 @@ class ComponentTemplateCreateView(View):
     model = None
     model = None
     form = None
     form = None
 
 
-    def get(self, request, pk, *args, **kwargs):
+    def get(self, request, pk):
 
 
         devicetype = get_object_or_404(DeviceType, pk=pk)
         devicetype = get_object_or_404(DeviceType, pk=pk)
 
 
@@ -354,7 +348,7 @@ class ComponentTemplateCreateView(View):
             'cancel_url': reverse('dcim:devicetype', kwargs={'pk': devicetype.pk}),
             'cancel_url': reverse('dcim:devicetype', kwargs={'pk': devicetype.pk}),
         })
         })
 
 
-    def post(self, request, pk, *args, **kwargs):
+    def post(self, request, pk):
 
 
         devicetype = get_object_or_404(DeviceType, pk=pk)
         devicetype = get_object_or_404(DeviceType, pk=pk)
 
 
@@ -459,8 +453,7 @@ def component_template_delete(request, pk, model):
 class DeviceRoleListView(ObjectListView):
 class DeviceRoleListView(ObjectListView):
     queryset = DeviceRole.objects.annotate(device_count=Count('devices'))
     queryset = DeviceRole.objects.annotate(device_count=Count('devices'))
     table = DeviceRoleTable
     table = DeviceRoleTable
-    edit_table = DeviceRoleBulkEditTable
-    edit_table_permissions = ['dcim.change_devicerole', 'dcim.delete_devicerole']
+    edit_permissions = ['dcim.change_devicerole', 'dcim.delete_devicerole']
     template_name = 'dcim/devicerole_list.html'
     template_name = 'dcim/devicerole_list.html'
 
 
 
 
@@ -495,8 +488,7 @@ class DeviceListView(ObjectListView):
     filter = DeviceFilter
     filter = DeviceFilter
     filter_form = DeviceFilterForm
     filter_form = DeviceFilterForm
     table = DeviceTable
     table = DeviceTable
-    edit_table = DeviceBulkEditTable
-    edit_table_permissions = ['dcim.change_device', 'dcim.delete_device']
+    edit_permissions = ['dcim.change_device', 'dcim.delete_device']
     template_name = 'dcim/device_list.html'
     template_name = 'dcim/device_list.html'
 
 
 
 

+ 10 - 45
netbox/ipam/tables.py

@@ -45,32 +45,26 @@ STATUS_LABEL = """
 #
 #
 
 
 class VRFTable(tables.Table):
 class VRFTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name')
     name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name')
     rd = tables.Column(verbose_name='RD')
     rd = tables.Column(verbose_name='RD')
     description = tables.Column(sortable=False, verbose_name='Description')
     description = tables.Column(sortable=False, verbose_name='Description')
 
 
     class Meta:
     class Meta:
         model = VRF
         model = VRF
-        fields = ('name', 'rd', 'description')
+        fields = ('pk', 'name', 'rd', 'description')
         empty_text = "No VRFs found."
         empty_text = "No VRFs found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class VRFBulkEditTable(VRFTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(VRFTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'name', 'rd', 'description')
-
-
 #
 #
 # Aggregates
 # Aggregates
 #
 #
 
 
 class AggregateTable(tables.Table):
 class AggregateTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate')
     prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate')
     rir = tables.Column(verbose_name='RIR')
     rir = tables.Column(verbose_name='RIR')
     child_count = tables.Column(verbose_name='Prefixes')
     child_count = tables.Column(verbose_name='Prefixes')
@@ -80,26 +74,19 @@ class AggregateTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = Aggregate
         model = Aggregate
-        fields = ('prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
+        fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
         empty_text = "No aggregates found."
         empty_text = "No aggregates found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
 
 
 
 
-class AggregateBulkEditTable(AggregateTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(AggregateTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description')
-
-
 #
 #
 # Prefixes
 # Prefixes
 #
 #
 
 
 class PrefixTable(tables.Table):
 class PrefixTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
     status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
     prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix')
     prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix')
     vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
     vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
@@ -109,7 +96,7 @@ class PrefixTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = Prefix
         model = Prefix
-        fields = ('prefix', 'status', 'vrf', 'site', 'role', 'description')
+        fields = ('pk', 'prefix', 'status', 'vrf', 'site', 'role', 'description')
         empty_text = "No prefixes found."
         empty_text = "No prefixes found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
@@ -131,19 +118,12 @@ class PrefixBriefTable(tables.Table):
         }
         }
 
 
 
 
-class PrefixBulkEditTable(PrefixTable):
-    pk = tables.CheckBoxColumn(default='')
-
-    class Meta(PrefixTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'prefix', 'status', 'vrf', 'site', 'role', 'description')
-
-
 #
 #
 # IPAddresses
 # IPAddresses
 #
 #
 
 
 class IPAddressTable(tables.Table):
 class IPAddressTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
     address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
     vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
     vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
     device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False, verbose_name='Device')
     device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False, verbose_name='Device')
@@ -152,7 +132,7 @@ class IPAddressTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = IPAddress
         model = IPAddress
-        fields = ('address', 'vrf', 'device', 'interface', 'description')
+        fields = ('pk', 'address', 'vrf', 'device', 'interface', 'description')
         empty_text = "No IP addresses found."
         empty_text = "No IP addresses found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
@@ -174,19 +154,12 @@ class IPAddressBriefTable(tables.Table):
         }
         }
 
 
 
 
-class IPAddressBulkEditTable(IPAddressTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(IPAddressTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'address', 'vrf', 'device', 'interface', 'description')
-
-
 #
 #
 # VLANs
 # VLANs
 #
 #
 
 
 class VLANTable(tables.Table):
 class VLANTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
     vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     name = tables.Column(verbose_name='Name')
     name = tables.Column(verbose_name='Name')
@@ -195,16 +168,8 @@ class VLANTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = VLAN
         model = VLAN
-        fields = ('vid', 'site', 'name', 'status', 'role')
+        fields = ('pk', 'vid', 'site', 'name', 'status', 'role')
         empty_text = "No VLANs found."
         empty_text = "No VLANs found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
-
-
-class VLANBulkEditTable(VLANTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(VLANTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'vid', 'site', 'name', 'status', 'role')

+ 14 - 23
netbox/ipam/views.py

@@ -17,10 +17,9 @@ from .forms import AggregateForm, AggregateImportForm, AggregateBulkEditForm, Ag
     IPAddressForm, IPAddressImportForm, IPAddressBulkEditForm, IPAddressBulkDeleteForm, IPAddressFilterForm, VLANForm,\
     IPAddressForm, IPAddressImportForm, IPAddressBulkEditForm, IPAddressBulkDeleteForm, IPAddressFilterForm, VLANForm,\
     VLANImportForm, VLANBulkEditForm, VLANBulkDeleteForm, VRFForm, VRFImportForm, VRFBulkEditForm, VRFBulkDeleteForm,\
     VLANImportForm, VLANBulkEditForm, VLANBulkDeleteForm, VRFForm, VRFImportForm, VRFBulkEditForm, VRFBulkDeleteForm,\
     VLANFilterForm
     VLANFilterForm
-from .models import VRF, Aggregate, Prefix, VLAN
-from .tables import AggregateTable, AggregateBulkEditTable, PrefixTable, PrefixBriefTable, PrefixBulkEditTable,\
-    IPAddress, IPAddressBriefTable, IPAddressTable, IPAddressBulkEditTable, VLANTable, VLANBulkEditTable, VRFTable,\
-    VRFBulkEditTable
+from .models import VRF, Aggregate, Prefix, IPAddress, VLAN
+from .tables import AggregateTable, PrefixTable, PrefixBriefTable, IPAddressBriefTable, IPAddressTable, VLANTable,\
+    VRFTable
 
 
 
 
 def add_available_prefixes(parent, prefix_list):
 def add_available_prefixes(parent, prefix_list):
@@ -47,8 +46,7 @@ class VRFListView(ObjectListView):
     queryset = VRF.objects.all()
     queryset = VRF.objects.all()
     filter = VRFFilter
     filter = VRFFilter
     table = VRFTable
     table = VRFTable
-    edit_table = VRFBulkEditTable
-    edit_table_permissions = ['ipam.change_vrf', 'ipam.delete_vrf']
+    edit_permissions = ['ipam.change_vrf', 'ipam.delete_vrf']
     template_name = 'ipam/vrf_list.html'
     template_name = 'ipam/vrf_list.html'
 
 
 
 
@@ -126,8 +124,7 @@ class AggregateListView(ObjectListView):
     filter = AggregateFilter
     filter = AggregateFilter
     filter_form = AggregateFilterForm
     filter_form = AggregateFilterForm
     table = AggregateTable
     table = AggregateTable
-    edit_table = AggregateBulkEditTable
-    edit_table_permissions = ['ipam.change_aggregate', 'ipam.delete_aggregate']
+    edit_permissions = ['ipam.change_aggregate', 'ipam.delete_aggregate']
     template_name = 'ipam/aggregate_list.html'
     template_name = 'ipam/aggregate_list.html'
 
 
 
 
@@ -140,10 +137,9 @@ def aggregate(request, pk):
         .select_related('site', 'status', 'role').annotate_depth(limit=0)
         .select_related('site', 'status', 'role').annotate_depth(limit=0)
     child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes)
     child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes)
 
 
+    prefix_table = PrefixTable(child_prefixes)
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
-        prefix_table = PrefixBulkEditTable(child_prefixes)
-    else:
-        prefix_table = PrefixTable(child_prefixes)
+        prefix_table.base_columns['pk'].visible = True
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
         .configure(prefix_table)
         .configure(prefix_table)
 
 
@@ -214,8 +210,7 @@ class PrefixListView(ObjectListView):
     filter = PrefixFilter
     filter = PrefixFilter
     filter_form = PrefixFilterForm
     filter_form = PrefixFilterForm
     table = PrefixTable
     table = PrefixTable
-    edit_table = PrefixBulkEditTable
-    edit_table_permissions = ['ipam.change_prefix', 'ipam.delete_prefix']
+    edit_permissions = ['ipam.change_prefix', 'ipam.delete_prefix']
     template_name = 'ipam/prefix_list.html'
     template_name = 'ipam/prefix_list.html'
 
 
     def alter_queryset(self, request):
     def alter_queryset(self, request):
@@ -251,10 +246,9 @@ def prefix(request, pk):
         .select_related('site', 'status', 'role').annotate_depth(limit=0)
         .select_related('site', 'status', 'role').annotate_depth(limit=0)
     if child_prefixes:
     if child_prefixes:
         child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes)
         child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes)
+    child_prefix_table = PrefixTable(child_prefixes)
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
     if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
-        child_prefix_table = PrefixBulkEditTable(child_prefixes)
-    else:
-        child_prefix_table = PrefixTable(child_prefixes)
+        child_prefix_table.base_columns['pk'].visible = True
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
         .configure(child_prefix_table)
         .configure(child_prefix_table)
 
 
@@ -333,10 +327,9 @@ def prefix_ipaddresses(request, pk):
     ipaddresses = IPAddress.objects.filter(address__net_contained_or_equal=str(prefix.prefix))\
     ipaddresses = IPAddress.objects.filter(address__net_contained_or_equal=str(prefix.prefix))\
         .select_related('vrf', 'interface__device', 'primary_for')
         .select_related('vrf', 'interface__device', 'primary_for')
 
 
+    ip_table = IPAddressTable(ipaddresses)
     if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
     if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
-        ip_table = IPAddressBulkEditTable(ipaddresses)
-    else:
-        ip_table = IPAddressTable(ipaddresses)
+        ip_table.base_columns['pk'].visible = True
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
     RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
         .configure(ip_table)
         .configure(ip_table)
 
 
@@ -355,8 +348,7 @@ class IPAddressListView(ObjectListView):
     filter = IPAddressFilter
     filter = IPAddressFilter
     filter_form = IPAddressFilterForm
     filter_form = IPAddressFilterForm
     table = IPAddressTable
     table = IPAddressTable
-    edit_table = IPAddressBulkEditTable
-    edit_table_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress']
+    edit_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress']
     template_name = 'ipam/ipaddress_list.html'
     template_name = 'ipam/ipaddress_list.html'
 
 
 
 
@@ -455,8 +447,7 @@ class VLANListView(ObjectListView):
     filter = VLANFilter
     filter = VLANFilter
     filter_form = VLANFilterForm
     filter_form = VLANFilterForm
     table = VLANTable
     table = VLANTable
-    edit_table = VLANBulkEditTable
-    edit_table_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
+    edit_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
     template_name = 'ipam/vlan_list.html'
     template_name = 'ipam/vlan_list.html'
 
 
 
 

+ 2 - 9
netbox/secrets/tables.py

@@ -9,6 +9,7 @@ from .models import Secret
 #
 #
 
 
 class SecretTable(tables.Table):
 class SecretTable(tables.Table):
+    pk = tables.CheckBoxColumn(visible=False, default='')
     device = tables.LinkColumn('secrets:secret', args=[Accessor('pk')], verbose_name='Device')
     device = tables.LinkColumn('secrets:secret', args=[Accessor('pk')], verbose_name='Device')
     role = tables.Column(verbose_name='Role')
     role = tables.Column(verbose_name='Role')
     name = tables.Column(verbose_name='Name')
     name = tables.Column(verbose_name='Name')
@@ -16,16 +17,8 @@ class SecretTable(tables.Table):
 
 
     class Meta:
     class Meta:
         model = Secret
         model = Secret
-        fields = ('device', 'role', 'name', 'last_modified')
+        fields = ('pk', 'device', 'role', 'name', 'last_modified')
         empty_text = "No secrets found."
         empty_text = "No secrets found."
         attrs = {
         attrs = {
             'class': 'table table-hover',
             'class': 'table table-hover',
         }
         }
-
-
-class SecretBulkEditTable(SecretTable):
-    pk = tables.CheckBoxColumn()
-
-    class Meta(SecretTable.Meta):
-        model = None  # django_tables2 bugfix
-        fields = ('pk', 'device', 'role', 'name')

+ 2 - 3
netbox/secrets/views.py

@@ -13,7 +13,7 @@ from .decorators import userkey_required
 from .filters import SecretFilter
 from .filters import SecretFilter
 from .forms import SecretForm, SecretImportForm, SecretBulkEditForm, SecretBulkDeleteForm, SecretFilterForm
 from .forms import SecretForm, SecretImportForm, SecretBulkEditForm, SecretBulkDeleteForm, SecretFilterForm
 from .models import Secret, UserKey
 from .models import Secret, UserKey
-from .tables import SecretTable, SecretBulkEditTable
+from .tables import SecretTable
 
 
 
 
 #
 #
@@ -26,8 +26,7 @@ class SecretListView(ObjectListView):
     filter = SecretFilter
     filter = SecretFilter
     filter_form = SecretFilterForm
     filter_form = SecretFilterForm
     table = SecretTable
     table = SecretTable
-    edit_table = SecretBulkEditTable
-    edit_table_permissions = ['secrets.change_secret', 'secrets.delete_secret']
+    edit_permissions = ['secrets.change_secret', 'secrets.delete_secret']
     template_name = 'secrets/secret_list.html'
     template_name = 'secrets/secret_list.html'
 
 
 
 

+ 4 - 6
netbox/utilities/views.py

@@ -25,8 +25,7 @@ class ObjectListView(View):
     filter = None
     filter = None
     filter_form = None
     filter_form = None
     table = None
     table = None
-    edit_table = None
-    edit_table_permissions = []
+    edit_permissions = []
     template_name = None
     template_name = None
     redirect_on_single_result = True
     redirect_on_single_result = True
 
 
@@ -58,10 +57,9 @@ class ObjectListView(View):
         self.queryset = self.alter_queryset(request)
         self.queryset = self.alter_queryset(request)
 
 
         # Construct the table based on the user's permissions
         # Construct the table based on the user's permissions
-        if any([request.user.has_perm(perm) for perm in self.edit_table_permissions]):
-            table = self.edit_table(self.queryset)
-        else:
-            table = self.table(self.queryset)
+        table = self.table(self.queryset)
+        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})\
         RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
             .configure(table)
             .configure(table)