Collapsed EditTables into primary table for each object

This commit is contained in:
Jeremy Stretch 2016-05-13 11:51:50 -04:00
parent ffb1e7beb5
commit 062e64a34d
9 changed files with 82 additions and 230 deletions

View File

@ -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')

View File

@ -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_permissions = ['circuits.change_provider', 'circuits.delete_provider']
edit_table_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_permissions = ['circuits.change_circuit', 'circuits.delete_circuit']
edit_table_permissions = ['circuits.change_circuit', 'circuits.delete_circuit']
template_name = 'circuits/circuit_list.html' template_name = 'circuits/circuit_list.html'

View File

@ -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')

View File

@ -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, \ from .tables import SiteTable, RackGroupTable, RackTable, DeviceTypeTable, DeviceRoleTable, DeviceTable, \
DeviceTypeBulkEditTable, DeviceRoleTable, DeviceRoleBulkEditTable, DeviceTable, DeviceBulkEditTable, \
DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable, InterfaceConnectionTable, \ DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable, InterfaceConnectionTable, \
ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable, PowerOutletTemplateTable, \ ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable, PowerOutletTemplateTable, \
InterfaceTemplateTable, ConsolePortTemplateBulkDeleteTable, ConsoleServerPortTemplateBulkDeleteTable, \ InterfaceTemplateTable
PowerPortTemplateBulkDeleteTable, PowerOutletTemplateBulkDeleteTable, InterfaceTemplateBulkDeleteTable
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_permissions = ['dcim.change_rackgroup', 'dcim.delete_rackgroup']
edit_table_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_permissions = ['dcim.change_rack', 'dcim.delete_rack']
edit_table_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_permissions = ['dcim.change_devicetype', 'dcim.delete_devicetype']
edit_table_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)) consoleport_table.base_columns['pk'].visible = True
consoleserverport_table = ConsoleServerPortTemplateBulkDeleteTable(ConsoleServerPortTemplate.objects.filter(device_type=devicetype)) consoleserverport_table.base_columns['pk'].visible = True
powerport_table = PowerPortTemplateBulkDeleteTable(PowerPortTemplate.objects.filter(device_type=devicetype)) powerport_table.base_columns['pk'].visible = True
poweroutlet_table = PowerOutletTemplateBulkDeleteTable(PowerOutletTemplate.objects.filter(device_type=devicetype)) poweroutlet_table.base_columns['pk'].visible = True
interface_table = InterfaceTemplateBulkDeleteTable(InterfaceTemplate.objects.filter(device_type=devicetype)) interface_table.base_columns['pk'].visible = True
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))
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_permissions = ['dcim.change_devicerole', 'dcim.delete_devicerole']
edit_table_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_permissions = ['dcim.change_device', 'dcim.delete_device']
edit_table_permissions = ['dcim.change_device', 'dcim.delete_device']
template_name = 'dcim/device_list.html' template_name = 'dcim/device_list.html'

View File

@ -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')

View File

@ -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 .models import VRF, Aggregate, Prefix, IPAddress, VLAN
from .tables import AggregateTable, AggregateBulkEditTable, PrefixTable, PrefixBriefTable, PrefixBulkEditTable,\ from .tables import AggregateTable, PrefixTable, PrefixBriefTable, IPAddressBriefTable, IPAddressTable, VLANTable,\
IPAddress, IPAddressBriefTable, IPAddressTable, IPAddressBulkEditTable, VLANTable, VLANBulkEditTable, VRFTable,\ VRFTable
VRFBulkEditTable
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_permissions = ['ipam.change_vrf', 'ipam.delete_vrf']
edit_table_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_permissions = ['ipam.change_aggregate', 'ipam.delete_aggregate']
edit_table_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) prefix_table.base_columns['pk'].visible = True
else:
prefix_table = PrefixTable(child_prefixes)
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_permissions = ['ipam.change_prefix', 'ipam.delete_prefix']
edit_table_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) child_prefix_table.base_columns['pk'].visible = True
else:
child_prefix_table = PrefixTable(child_prefixes)
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) ip_table.base_columns['pk'].visible = True
else:
ip_table = IPAddressTable(ipaddresses)
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_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress']
edit_table_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_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
edit_table_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
template_name = 'ipam/vlan_list.html' template_name = 'ipam/vlan_list.html'

View File

@ -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')

View File

@ -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_permissions = ['secrets.change_secret', 'secrets.delete_secret']
edit_table_permissions = ['secrets.change_secret', 'secrets.delete_secret']
template_name = 'secrets/secret_list.html' template_name = 'secrets/secret_list.html'

View File

@ -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_permissions = []
edit_table_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.table(self.queryset)
table = self.edit_table(self.queryset) if 'pk' in table.base_columns and any([request.user.has_perm(perm) for perm in self.edit_permissions]):
else: table.base_columns['pk'].visible = True
table = self.table(self.queryset)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\ RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
.configure(table) .configure(table)