jeremystretch 3 ani în urmă
părinte
comite
13d39a28ce

+ 4 - 1
netbox/dcim/api/serializers.py

@@ -680,11 +680,14 @@ class VirtualDeviceContextSerializer(NetBoxModelSerializer):
     primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True)
     primary_ip4 = NestedIPAddressSerializer(required=False, allow_null=True)
     primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True)
     primary_ip6 = NestedIPAddressSerializer(required=False, allow_null=True)
 
 
+    # Related object counts
+    interface_count = serializers.IntegerField(read_only=True)
+
     class Meta:
     class Meta:
         model = VirtualDeviceContext
         model = VirtualDeviceContext
         fields = [
         fields = [
             'id', 'url', 'display', 'name', 'device', 'identifier', 'tenant', 'primary_ip', 'primary_ip4',
             'id', 'url', 'display', 'name', 'device', 'identifier', 'tenant', 'primary_ip', 'primary_ip4',
-            'primary_ip6', 'status', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
+            'primary_ip6', 'status', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'interface_count',
         ]
         ]
 
 
 
 

+ 2 - 0
netbox/dcim/api/views.py

@@ -541,6 +541,8 @@ class DeviceViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet):
 class VirtualDeviceContextViewSet(NetBoxModelViewSet):
 class VirtualDeviceContextViewSet(NetBoxModelViewSet):
     queryset = VirtualDeviceContext.objects.prefetch_related(
     queryset = VirtualDeviceContext.objects.prefetch_related(
         'device__device_type', 'device', 'tenant', 'tags',
         'device__device_type', 'device', 'tenant', 'tags',
+    ).annotate(
+        interface_count=count_related(Interface, 'vdcs'),
     )
     )
     serializer_class = serializers.VirtualDeviceContextSerializer
     serializer_class = serializers.VirtualDeviceContextSerializer
     filterset_class = filtersets.VirtualDeviceContextFilterSet
     filterset_class = filtersets.VirtualDeviceContextFilterSet

+ 2 - 3
netbox/dcim/forms/model_forms.py

@@ -1462,7 +1462,6 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
         required=False,
         required=False,
         label=_('VRF')
         label=_('VRF')
     )
     )
-
     wwn = forms.CharField(
     wwn = forms.CharField(
         empty_value=None,
         empty_value=None,
         required=False,
         required=False,
@@ -1470,9 +1469,9 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
     )
     )
 
 
     fieldsets = (
     fieldsets = (
-        ('Interface', ('device', 'module', 'vdcs', 'name', 'label', 'type', 'speed', 'duplex', 'description', 'tags')),
+        ('Interface', ('device', 'module', 'name', 'label', 'type', 'speed', 'duplex', 'description', 'tags')),
         ('Addressing', ('vrf', 'mac_address', 'wwn')),
         ('Addressing', ('vrf', 'mac_address', 'wwn')),
-        ('Operation', ('mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')),
+        ('Operation', ('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected')),
         ('Related Interfaces', ('parent', 'bridge', 'lag')),
         ('Related Interfaces', ('parent', 'bridge', 'lag')),
         ('PoE', ('poe_mode', 'poe_type')),
         ('PoE', ('poe_mode', 'poe_type')),
         ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')),
         ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')),

+ 7 - 2
netbox/dcim/tables/devices.py

@@ -916,6 +916,11 @@ class VirtualDeviceContextTable(TenancyColumnsMixin, NetBoxTable):
         linkify=True,
         linkify=True,
         verbose_name='IPv6 Address'
         verbose_name='IPv6 Address'
     )
     )
+    interface_count = columns.LinkedCountColumn(
+        viewname='dcim:interface_list',
+        url_params={'vdc_id': 'pk'},
+        verbose_name='Interfaces'
+    )
 
 
     comments = columns.MarkdownColumn()
     comments = columns.MarkdownColumn()
 
 
@@ -926,8 +931,8 @@ class VirtualDeviceContextTable(TenancyColumnsMixin, NetBoxTable):
     class Meta(NetBoxTable.Meta):
     class Meta(NetBoxTable.Meta):
         model = models.VirtualDeviceContext
         model = models.VirtualDeviceContext
         fields = (
         fields = (
-            'pk', 'id', 'name', 'status', 'identifier', 'tenant', 'tenant_group',
-            'primary_ip', 'primary_ip4', 'primary_ip6', 'comments', 'tags', 'created', 'last_updated',
+            'pk', 'id', 'name', 'status', 'identifier', 'tenant', 'tenant_group', 'primary_ip', 'primary_ip4',
+            'primary_ip6', 'comments', 'tags', 'interface_count', 'created', 'last_updated',
         )
         )
         default_columns = (
         default_columns = (
             'pk', 'name', 'identifier', 'status', 'tenant', 'primary_ip',
             'pk', 'name', 'identifier', 'status', 'tenant', 'primary_ip',

+ 4 - 1
netbox/dcim/views.py

@@ -3611,7 +3611,9 @@ register_model_view(PowerFeed, 'trace', kwargs={'model': PowerFeed})(PathTraceVi
 
 
 # VDC
 # VDC
 class VirtualDeviceContextListView(generic.ObjectListView):
 class VirtualDeviceContextListView(generic.ObjectListView):
-    queryset = VirtualDeviceContext.objects.all()
+    queryset = VirtualDeviceContext.objects.annotate(
+        interface_count=count_related(Interface, 'vdcs'),
+    )
     filterset = filtersets.VirtualDeviceContextFilterSet
     filterset = filtersets.VirtualDeviceContextFilterSet
     filterset_form = forms.VirtualDeviceContextFilterForm
     filterset_form = forms.VirtualDeviceContextFilterForm
     table = tables.VirtualDeviceContextTable
     table = tables.VirtualDeviceContextTable
@@ -3624,6 +3626,7 @@ class VirtualDeviceContextView(generic.ObjectView):
     def get_extra_context(self, request, instance):
     def get_extra_context(self, request, instance):
         interfaces_table = tables.InterfaceTable(instance.interfaces, user=request.user)
         interfaces_table = tables.InterfaceTable(instance.interfaces, user=request.user)
         interfaces_table.configure(request)
         interfaces_table.configure(request)
+        interfaces_table.columns.hide('device')
 
 
         return {
         return {
             'interfaces_table': interfaces_table,
             'interfaces_table': interfaces_table,