1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Merge 'detail' tables into primaries for each model

This commit is contained in:
jeremystretch
2021-09-17 13:55:32 -04:00
parent 84f3ab90df
commit 5e29679968
8 changed files with 67 additions and 112 deletions

View File

@ -10,7 +10,6 @@ from utilities.tables import (
__all__ = ( __all__ = (
'RackTable', 'RackTable',
'RackDetailTable',
'RackReservationTable', 'RackReservationTable',
'RackRoleTable', 'RackRoleTable',
) )
@ -56,17 +55,6 @@ class RackTable(BaseTable):
template_code="{{ record.u_height }}U", template_code="{{ record.u_height }}U",
verbose_name='Height' verbose_name='Height'
) )
class Meta(BaseTable.Meta):
model = Rack
fields = (
'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', 'type',
'width', 'u_height',
)
default_columns = ('pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'u_height')
class RackDetailTable(RackTable):
comments = MarkdownColumn() comments = MarkdownColumn()
device_count = LinkedCountColumn( device_count = LinkedCountColumn(
viewname='dcim:device_list', viewname='dcim:device_list',
@ -85,7 +73,8 @@ class RackDetailTable(RackTable):
url_name='dcim:rack_list' url_name='dcim:rack_list'
) )
class Meta(RackTable.Meta): class Meta(BaseTable.Meta):
model = Rack
fields = ( fields = (
'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', 'type', 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', 'type',
'width', 'u_height', 'comments', 'device_count', 'get_utilization', 'get_power_utilization', 'tags', 'width', 'u_height', 'comments', 'device_count', 'get_utilization', 'get_power_utilization', 'tags',

View File

@ -455,6 +455,8 @@ class RackRoleView(generic.ObjectView):
racks_table = tables.RackTable(racks) racks_table = tables.RackTable(racks)
racks_table.columns.hide('role') racks_table.columns.hide('role')
racks_table.columns.hide('get_utilization')
racks_table.columns.hide('get_power_utilization')
paginate_table(racks_table, request) paginate_table(racks_table, request)
return { return {
@ -505,7 +507,7 @@ class RackListView(generic.ObjectListView):
) )
filterset = filtersets.RackFilterSet filterset = filtersets.RackFilterSet
filterset_form = forms.RackFilterForm filterset_form = forms.RackFilterForm
table = tables.RackDetailTable table = tables.RackTable
class RackElevationListView(generic.ObjectListView): class RackElevationListView(generic.ObjectListView):

View File

@ -215,13 +215,6 @@ class AggregateTable(BaseTable):
format="Y-m-d", format="Y-m-d",
verbose_name='Added' verbose_name='Added'
) )
class Meta(BaseTable.Meta):
model = Aggregate
fields = ('pk', 'prefix', 'rir', 'tenant', 'date_added', 'description')
class AggregateDetailTable(AggregateTable):
child_count = tables.Column( child_count = tables.Column(
verbose_name='Prefixes' verbose_name='Prefixes'
) )
@ -233,7 +226,8 @@ class AggregateDetailTable(AggregateTable):
url_name='ipam:aggregate_list' url_name='ipam:aggregate_list'
) )
class Meta(AggregateTable.Meta): class Meta(BaseTable.Meta):
model = Aggregate
fields = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description', 'tags') fields = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description', 'tags')
default_columns = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description') default_columns = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description')
@ -332,20 +326,6 @@ class PrefixTable(BaseTable):
mark_utilized = BooleanColumn( mark_utilized = BooleanColumn(
verbose_name='Marked Utilized' verbose_name='Marked Utilized'
) )
class Meta(BaseTable.Meta):
model = Prefix
fields = (
'pk', 'prefix', 'prefix_flat', 'status', 'depth', 'children', 'vrf', 'tenant', 'site', 'vlan', 'role',
'is_pool', 'mark_utilized', 'description',
)
default_columns = ('pk', 'prefix', 'status', 'vrf', 'tenant', 'site', 'vlan', 'role', 'description')
row_attrs = {
'class': lambda record: 'success' if not record.pk else '',
}
class PrefixDetailTable(PrefixTable):
utilization = PrefixUtilizationColumn( utilization = PrefixUtilizationColumn(
accessor='get_utilization', accessor='get_utilization',
orderable=False orderable=False
@ -354,7 +334,8 @@ class PrefixDetailTable(PrefixTable):
url_name='ipam:prefix_list' url_name='ipam:prefix_list'
) )
class Meta(PrefixTable.Meta): class Meta(BaseTable.Meta):
model = Prefix
fields = ( fields = (
'pk', 'prefix', 'prefix_flat', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role', 'pk', 'prefix', 'prefix_flat', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role',
'is_pool', 'mark_utilized', 'description', 'tags', 'is_pool', 'mark_utilized', 'description', 'tags',
@ -362,6 +343,9 @@ class PrefixDetailTable(PrefixTable):
default_columns = ( default_columns = (
'pk', 'prefix', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role', 'description', 'pk', 'prefix', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role', 'description',
) )
row_attrs = {
'class': lambda record: 'success' if not record.pk else '',
}
# #
@ -427,25 +411,11 @@ class IPAddressTable(BaseTable):
orderable=False, orderable=False,
verbose_name='Device/VM' verbose_name='Device/VM'
) )
class Meta(BaseTable.Meta):
model = IPAddress
fields = (
'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'assigned_object', 'assigned_object_parent', 'dns_name',
'description',
)
row_attrs = {
'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
}
class IPAddressDetailTable(IPAddressTable):
nat_inside = tables.Column( nat_inside = tables.Column(
linkify=True, linkify=True,
orderable=False, orderable=False,
verbose_name='NAT (Inside)' verbose_name='NAT (Inside)'
) )
tenant = TenantColumn()
assigned = BooleanColumn( assigned = BooleanColumn(
accessor='assigned_object_id', accessor='assigned_object_id',
verbose_name='Assigned' verbose_name='Assigned'
@ -454,14 +424,18 @@ class IPAddressDetailTable(IPAddressTable):
url_name='ipam:ipaddress_list' url_name='ipam:ipaddress_list'
) )
class Meta(IPAddressTable.Meta): class Meta(BaseTable.Meta):
model = IPAddress
fields = ( fields = (
'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'assigned', 'dns_name', 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'assigned', 'dns_name', 'description',
'description', 'tags', 'tags',
) )
default_columns = ( default_columns = (
'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'assigned', 'dns_name', 'description', 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'assigned', 'dns_name', 'description',
) )
row_attrs = {
'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
}
class IPAddressAssignTable(BaseTable): class IPAddressAssignTable(BaseTable):
@ -554,29 +528,22 @@ class VLANTable(BaseTable):
role = tables.TemplateColumn( role = tables.TemplateColumn(
template_code=VLAN_ROLE_LINK template_code=VLAN_ROLE_LINK
) )
class Meta(BaseTable.Meta):
model = VLAN
fields = ('pk', 'vid', 'name', 'site', 'group', 'tenant', 'status', 'role', 'description')
row_attrs = {
'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
}
class VLANDetailTable(VLANTable):
prefixes = tables.TemplateColumn( prefixes = tables.TemplateColumn(
template_code=VLAN_PREFIXES, template_code=VLAN_PREFIXES,
orderable=False, orderable=False,
verbose_name='Prefixes' verbose_name='Prefixes'
) )
tenant = TenantColumn()
tags = TagColumn( tags = TagColumn(
url_name='ipam:vlan_list' url_name='ipam:vlan_list'
) )
class Meta(VLANTable.Meta): class Meta(BaseTable.Meta):
model = VLAN
fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags') fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags')
default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description') default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
row_attrs = {
'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
}
class VLANMembersTable(BaseTable): class VLANMembersTable(BaseTable):

View File

@ -158,6 +158,7 @@ class RIRView(generic.ObjectView):
aggregates_table = tables.AggregateTable(aggregates) aggregates_table = tables.AggregateTable(aggregates)
aggregates_table.columns.hide('rir') aggregates_table.columns.hide('rir')
aggregates_table.columns.hide('utilization')
paginate_table(aggregates_table, request) paginate_table(aggregates_table, request)
return { return {
@ -207,7 +208,7 @@ class AggregateListView(generic.ObjectListView):
) )
filterset = filtersets.AggregateFilterSet filterset = filtersets.AggregateFilterSet
filterset_form = forms.AggregateFilterForm filterset_form = forms.AggregateFilterForm
table = tables.AggregateDetailTable table = tables.AggregateTable
class AggregateView(generic.ObjectView): class AggregateView(generic.ObjectView):
@ -227,7 +228,7 @@ class AggregateView(generic.ObjectView):
if request.GET.get('show_available', 'true') == 'true': if request.GET.get('show_available', 'true') == 'true':
child_prefixes = add_available_prefixes(instance.prefix, child_prefixes) child_prefixes = add_available_prefixes(instance.prefix, child_prefixes)
prefix_table = tables.PrefixDetailTable(child_prefixes) prefix_table = tables.PrefixTable(child_prefixes, exclude=('utilization',))
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.columns.show('pk') prefix_table.columns.show('pk')
paginate_table(prefix_table, request) paginate_table(prefix_table, request)
@ -296,8 +297,7 @@ class RoleView(generic.ObjectView):
role=instance role=instance
) )
prefixes_table = tables.PrefixTable(prefixes) prefixes_table = tables.PrefixTable(prefixes, exclude=('role', 'utilization'))
prefixes_table.columns.hide('role')
paginate_table(prefixes_table, request) paginate_table(prefixes_table, request)
return { return {
@ -340,7 +340,7 @@ class PrefixListView(generic.ObjectListView):
queryset = Prefix.objects.all() queryset = Prefix.objects.all()
filterset = filtersets.PrefixFilterSet filterset = filtersets.PrefixFilterSet
filterset_form = forms.PrefixFilterForm filterset_form = forms.PrefixFilterForm
table = tables.PrefixDetailTable table = tables.PrefixTable
template_name = 'ipam/prefix_list.html' template_name = 'ipam/prefix_list.html'
@ -363,8 +363,11 @@ class PrefixView(generic.ObjectView):
).prefetch_related( ).prefetch_related(
'site', 'role' 'site', 'role'
) )
parent_prefix_table = tables.PrefixTable(list(parent_prefixes), orderable=False) parent_prefix_table = tables.PrefixTable(
parent_prefix_table.exclude = ('vrf',) list(parent_prefixes),
exclude=('vrf', 'utilization'),
orderable=False
)
# Duplicate prefixes table # Duplicate prefixes table
duplicate_prefixes = Prefix.objects.restrict(request.user, 'view').filter( duplicate_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
@ -374,8 +377,11 @@ class PrefixView(generic.ObjectView):
).prefetch_related( ).prefetch_related(
'site', 'role' 'site', 'role'
) )
duplicate_prefix_table = tables.PrefixTable(list(duplicate_prefixes), orderable=False) duplicate_prefix_table = tables.PrefixTable(
duplicate_prefix_table.exclude = ('vrf',) list(duplicate_prefixes),
exclude=('vrf', 'utilization'),
orderable=False
)
return { return {
'aggregate': aggregate, 'aggregate': aggregate,
@ -398,7 +404,7 @@ class PrefixPrefixesView(generic.ObjectView):
if child_prefixes and request.GET.get('show_available', 'true') == 'true': if child_prefixes and request.GET.get('show_available', 'true') == 'true':
child_prefixes = add_available_prefixes(instance.prefix, child_prefixes) child_prefixes = add_available_prefixes(instance.prefix, child_prefixes)
table = tables.PrefixDetailTable(child_prefixes, user=request.user) table = tables.PrefixTable(child_prefixes, user=request.user, exclude=('utilization',))
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'):
table.columns.show('pk') table.columns.show('pk')
paginate_table(table, request) paginate_table(table, request)
@ -601,7 +607,7 @@ class IPAddressListView(generic.ObjectListView):
queryset = IPAddress.objects.all() queryset = IPAddress.objects.all()
filterset = filtersets.IPAddressFilterSet filterset = filtersets.IPAddressFilterSet
filterset_form = forms.IPAddressFilterForm filterset_form = forms.IPAddressFilterForm
table = tables.IPAddressDetailTable table = tables.IPAddressTable
class IPAddressView(generic.ObjectView): class IPAddressView(generic.ObjectView):
@ -615,8 +621,11 @@ class IPAddressView(generic.ObjectView):
).prefetch_related( ).prefetch_related(
'site', 'role' 'site', 'role'
) )
parent_prefixes_table = tables.PrefixTable(list(parent_prefixes), orderable=False) parent_prefixes_table = tables.PrefixTable(
parent_prefixes_table.exclude = ('vrf',) list(parent_prefixes),
exclude=('vrf', 'utilization'),
orderable=False
)
# Duplicate IPs table # Duplicate IPs table
duplicate_ips = IPAddress.objects.restrict(request.user, 'view').filter( duplicate_ips = IPAddress.objects.restrict(request.user, 'view').filter(
@ -767,11 +776,9 @@ class VLANGroupView(generic.ObjectView):
vlans_count = vlans.count() vlans_count = vlans.count()
vlans = add_available_vlans(vlans, vlan_group=instance) vlans = add_available_vlans(vlans, vlan_group=instance)
vlans_table = tables.VLANDetailTable(vlans) vlans_table = tables.VLANTable(vlans, exclude=('site', 'group', 'prefixes'))
if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'): if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'):
vlans_table.columns.show('pk') vlans_table.columns.show('pk')
vlans_table.columns.hide('site')
vlans_table.columns.hide('group')
paginate_table(vlans_table, request) paginate_table(vlans_table, request)
# Compile permissions list for rendering the object table # Compile permissions list for rendering the object table
@ -828,7 +835,7 @@ class VLANListView(generic.ObjectListView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
filterset = filtersets.VLANFilterSet filterset = filtersets.VLANFilterSet
filterset_form = forms.VLANFilterForm filterset_form = forms.VLANFilterForm
table = tables.VLANDetailTable table = tables.VLANTable
class VLANView(generic.ObjectView): class VLANView(generic.ObjectView):
@ -838,8 +845,7 @@ class VLANView(generic.ObjectView):
prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=instance).prefetch_related( prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=instance).prefetch_related(
'vrf', 'site', 'role' 'vrf', 'site', 'role'
) )
prefix_table = tables.PrefixTable(list(prefixes), orderable=False) prefix_table = tables.PrefixTable(list(prefixes), exclude=('vlan', 'utilization'), orderable=False)
prefix_table.exclude = ('vlan',)
return { return {
'prefix_table': prefix_table, 'prefix_table': prefix_table,

View File

@ -21,7 +21,7 @@ from tenancy.tables import TenantTable
from utilities.utils import count_related from utilities.utils import count_related
from virtualization.filtersets import ClusterFilterSet, VirtualMachineFilterSet from virtualization.filtersets import ClusterFilterSet, VirtualMachineFilterSet
from virtualization.models import Cluster, VirtualMachine from virtualization.models import Cluster, VirtualMachine
from virtualization.tables import ClusterTable, VirtualMachineDetailTable from virtualization.tables import ClusterTable, VirtualMachineTable
SEARCH_MAX_RESULTS = 15 SEARCH_MAX_RESULTS = 15
SEARCH_TYPES = OrderedDict(( SEARCH_TYPES = OrderedDict((
@ -130,7 +130,7 @@ SEARCH_TYPES = OrderedDict((
'cluster', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'cluster', 'tenant', 'platform', 'primary_ip4', 'primary_ip6',
), ),
'filterset': VirtualMachineFilterSet, 'filterset': VirtualMachineFilterSet,
'table': VirtualMachineDetailTable, 'table': VirtualMachineTable,
'url': 'virtualization:virtualmachine_list', 'url': 'virtualization:virtualmachine_list',
}), }),
# IPAM # IPAM

View File

@ -15,9 +15,9 @@
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col col-md-12"> <div class="col col-md-12">
{% include 'inc/table_controls.html' with table_modal="PrefixDetailTable_config" %} {% include 'inc/table_controls.html' with table_modal="PrefixTable_config" %}
{% include 'utilities/obj_table.html' with heading='Child Prefixes' bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' parent=prefix %} {% include 'utilities/obj_table.html' with heading='Child Prefixes' bulk_edit_url='ipam:prefix_bulk_edit' bulk_delete_url='ipam:prefix_bulk_delete' parent=prefix %}
</div> </div>
</div> </div>
{% table_config_form table table_name="PrefixDetailTable" %} {% table_config_form table table_name="PrefixTable" %}
{% endblock %} {% endblock %}

View File

@ -12,12 +12,13 @@ __all__ = (
'ClusterTable', 'ClusterTable',
'ClusterGroupTable', 'ClusterGroupTable',
'ClusterTypeTable', 'ClusterTypeTable',
'VirtualMachineDetailTable',
'VirtualMachineTable', 'VirtualMachineTable',
'VirtualMachineVMInterfaceTable', 'VirtualMachineVMInterfaceTable',
'VMInterfaceTable', 'VMInterfaceTable',
) )
PRIMARY_IP_ORDERING = ('primary_ip4', 'primary_ip6') if settings.PREFER_IPV4 else ('primary_ip6', 'primary_ip4')
VMINTERFACE_BUTTONS = """ VMINTERFACE_BUTTONS = """
{% if perms.ipam.add_ipaddress %} {% if perms.ipam.add_ipaddress %}
<a href="{% url 'ipam:ipaddress_add' %}?vminterface={{ record.pk }}&return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-sm btn-success" title="Add IP Address"> <a href="{% url 'ipam:ipaddress_add' %}?vminterface={{ record.pk }}&return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-sm btn-success" title="Add IP Address">
@ -118,13 +119,7 @@ class VirtualMachineTable(BaseTable):
) )
role = ColoredLabelColumn() role = ColoredLabelColumn()
tenant = TenantColumn() tenant = TenantColumn()
comments = MarkdownColumn()
class Meta(BaseTable.Meta):
model = VirtualMachine
fields = ('pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk')
class VirtualMachineDetailTable(VirtualMachineTable):
primary_ip4 = tables.Column( primary_ip4 = tables.Column(
linkify=True, linkify=True,
verbose_name='IPv4 Address' verbose_name='IPv4 Address'
@ -133,19 +128,11 @@ class VirtualMachineDetailTable(VirtualMachineTable):
linkify=True, linkify=True,
verbose_name='IPv6 Address' verbose_name='IPv6 Address'
) )
if settings.PREFER_IPV4:
primary_ip = tables.Column( primary_ip = tables.Column(
linkify=True, linkify=True,
order_by=('primary_ip4', 'primary_ip6'), order_by=PRIMARY_IP_ORDERING,
verbose_name='IP Address' verbose_name='IP Address'
) )
else:
primary_ip = tables.Column(
linkify=True,
order_by=('primary_ip6', 'primary_ip4'),
verbose_name='IP Address'
)
comments = MarkdownColumn()
tags = TagColumn( tags = TagColumn(
url_name='virtualization:virtualmachine_list' url_name='virtualization:virtualmachine_list'
) )

View File

@ -171,7 +171,11 @@ class ClusterVirtualMachinesView(generic.ObjectView):
def get_extra_context(self, request, instance): def get_extra_context(self, request, instance):
virtualmachines = VirtualMachine.objects.restrict(request.user, 'view').filter(cluster=instance) virtualmachines = VirtualMachine.objects.restrict(request.user, 'view').filter(cluster=instance)
virtualmachines_table = tables.VirtualMachineTable(virtualmachines, orderable=False) virtualmachines_table = tables.VirtualMachineTable(
virtualmachines,
exclude=('cluster',),
orderable=False
)
return { return {
'virtualmachines_table': virtualmachines_table, 'virtualmachines_table': virtualmachines_table,
@ -315,7 +319,7 @@ class VirtualMachineListView(generic.ObjectListView):
queryset = VirtualMachine.objects.all() queryset = VirtualMachine.objects.all()
filterset = filtersets.VirtualMachineFilterSet filterset = filtersets.VirtualMachineFilterSet
filterset_form = forms.VirtualMachineFilterForm filterset_form = forms.VirtualMachineFilterForm
table = tables.VirtualMachineDetailTable table = tables.VirtualMachineTable
template_name = 'virtualization/virtualmachine_list.html' template_name = 'virtualization/virtualmachine_list.html'