Browse Source

Addresses #395: Show child prefixes from all VRFs if the parent prefix is in the global table

Jeremy Stretch 8 years ago
parent
commit
9f3647cd53
2 changed files with 12 additions and 4 deletions
  1. 2 1
      netbox/ipam/tables.py
  2. 10 3
      netbox/ipam/views.py

+ 2 - 1
netbox/ipam/tables.py

@@ -152,13 +152,14 @@ class PrefixTable(BaseTable):
 
 class PrefixBriefTable(BaseTable):
     prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF, verbose_name='Prefix')
+    vrf = tables.LinkColumn('ipam:vrf', args=[Accessor('vrf.pk')], default='Global', verbose_name='VRF')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site')
     status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status')
     role = tables.Column(verbose_name='Role')
 
     class Meta(BaseTable.Meta):
         model = Prefix
-        fields = ('prefix', 'status', 'site', 'role')
+        fields = ('prefix', 'vrf', 'status', 'site', 'role')
         orderable = False
 
 

+ 10 - 3
netbox/ipam/views.py

@@ -2,7 +2,7 @@ from netaddr import IPSet
 from django_tables2 import RequestConfig
 
 from django.contrib.auth.mixins import PermissionRequiredMixin
-from django.db.models import Count
+from django.db.models import Count, Q
 from django.shortcuts import get_object_or_404, render
 
 from dcim.models import Device
@@ -281,7 +281,8 @@ def prefix(request, pk):
         .count()
 
     # Parent prefixes table
-    parent_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contains=str(prefix.prefix))\
+    parent_prefixes = Prefix.objects.filter(Q(vrf=prefix.vrf) | Q(vrf__isnull=True))\
+        .filter(prefix__net_contains=str(prefix.prefix))\
         .select_related('site', 'role').annotate_depth()
     parent_prefix_table = tables.PrefixBriefTable(parent_prefixes)
 
@@ -291,7 +292,13 @@ def prefix(request, pk):
     duplicate_prefix_table = tables.PrefixBriefTable(duplicate_prefixes)
 
     # Child prefixes table
-    child_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contained=str(prefix.prefix))\
+    if prefix.vrf:
+        # If the prefix is in a VRF, show child prefixes only within that VRF.
+        child_prefixes = Prefix.objects.filter(vrf=prefix.vrf)
+    else:
+        # If the prefix is in the global table, show child prefixes from all VRFs.
+        child_prefixes = Prefix.objects.all()
+    child_prefixes = child_prefixes.filter(prefix__net_contained=str(prefix.prefix))\
         .select_related('site', 'role').annotate_depth(limit=0)
     if child_prefixes:
         child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes)