diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index da504ded2..f0ec9aa86 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -116,6 +116,12 @@ class VLANGroup(OrganizationalModel): return available_vids[0] return None + def get_child_vlans(self): + """ + Return all VLANs within this group. + """ + return VLAN.objects.filter(group=self).order_by('vid') + class VLAN(PrimaryModel): """ diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index d8e4d8b47..490cf940b 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -897,21 +897,8 @@ class VLANGroupView(generic.ObjectView): (VLAN.objects.restrict(request.user, 'view').filter(group=instance), 'group_id'), ) - # TODO: Replace with embedded table - vlans = VLAN.objects.restrict(request.user, 'view').filter(group=instance).prefetch_related( - Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user)), - 'tenant', 'site', 'role', - ).order_by('vid') - vlans = add_available_vlans(vlans, vlan_group=instance) - - vlans_table = tables.VLANTable(vlans, user=request.user, exclude=('group',)) - if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'): - vlans_table.columns.show('pk') - vlans_table.configure(request) - return { 'related_models': related_models, - 'vlans_table': vlans_table, } @@ -944,6 +931,30 @@ class VLANGroupBulkDeleteView(generic.BulkDeleteView): table = tables.VLANGroupTable +@register_model_view(VLANGroup, 'vlans') +class VLANGroupVLANsView(generic.ObjectChildrenView): + queryset = VLANGroup.objects.all() + child_model = VLAN + table = tables.VLANTable + filterset = filtersets.VLANFilterSet + template_name = 'generic/object_children.html' + tab = ViewTab( + label=_('VLANs'), + badge=lambda x: x.get_child_vlans().count(), + permission='ipam.view_vlan', + weight=500 + ) + + def get_children(self, request, parent): + return parent.get_child_vlans().restrict(request.user, 'view').prefetch_related( + Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user)), + 'tenant', 'site', 'role', + ) + + def prep_table_data(self, request, queryset, parent): + return add_available_vlans(parent.get_child_vlans(), parent) + + # # FHRP groups # diff --git a/netbox/templates/ipam/vlangroup.html b/netbox/templates/ipam/vlangroup.html index e474cbd84..ade06a466 100644 --- a/netbox/templates/ipam/vlangroup.html +++ b/netbox/templates/ipam/vlangroup.html @@ -58,15 +58,4 @@ {% plugin_right_page object %} -