Jeremy Stretch 1 سال پیش
والد
کامیت
9b4b56febc

+ 13 - 2
netbox/dcim/forms/bulk_edit.py

@@ -7,6 +7,7 @@ from dcim.choices import *
 from dcim.constants import *
 from dcim.models import *
 from extras.models import ConfigTemplate
+from ipam.choices import VLANQinQRoleChoices
 from ipam.models import ASN, VLAN, VLANGroup, VRF
 from netbox.choices import *
 from netbox.forms import NetBoxModelBulkEditForm
@@ -1522,6 +1523,16 @@ class InterfaceBulkEditForm(
             'available_on_device': '$device',
         }
     )
+    qinq_svlan = DynamicModelChoiceField(
+        queryset=VLAN.objects.all(),
+        required=False,
+        label=_('Q-in-Q Service VLAN'),
+        query_params={
+            'group_id': '$vlan_group',
+            'available_on_device': '$device',
+            'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE,
+        }
+    )
     vrf = DynamicModelChoiceField(
         queryset=VRF.objects.all(),
         required=False,
@@ -1548,7 +1559,7 @@ class InterfaceBulkEditForm(
         FieldSet('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected', name=_('Operation')),
         FieldSet('poe_mode', 'poe_type', name=_('PoE')),
         FieldSet('parent', 'bridge', 'lag', name=_('Related Interfaces')),
-        FieldSet('mode', 'vlan_group', 'untagged_vlan', name=_('802.1Q Switching')),
+        FieldSet('mode', 'vlan_group', 'untagged_vlan', 'qinq_svlan', name=_('802.1Q Switching')),
         FieldSet(
             TabbedGroups(
                 FieldSet('tagged_vlans', name=_('Assignment')),
@@ -1563,7 +1574,7 @@ class InterfaceBulkEditForm(
     nullable_fields = (
         'module', 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'wwn', 'vdcs', 'mtu', 'description',
         'poe_mode', 'poe_type', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
-        'untagged_vlan', 'tagged_vlans', 'vrf', 'wireless_lans'
+        'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vrf', 'wireless_lans'
     )
 
     def __init__(self, *args, **kwargs):

+ 1 - 1
netbox/dcim/forms/model_forms.py

@@ -1395,7 +1395,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
             'available_on_device': '$device',
         }
     )
-    qinq_svlan = DynamicModelMultipleChoiceField(
+    qinq_svlan = DynamicModelChoiceField(
         queryset=VLAN.objects.all(),
         required=False,
         label=_('Q-in-Q Service VLAN'),

+ 2 - 2
netbox/ipam/choices.py

@@ -159,8 +159,8 @@ class VLANStatusChoices(ChoiceSet):
 
 class VLANQinQRoleChoices(ChoiceSet):
 
-    ROLE_SERVICE = 's-vlan'
-    ROLE_CUSTOMER = 'c-vlan'
+    ROLE_SERVICE = 'svlan'
+    ROLE_CUSTOMER = 'cvlan'
 
     CHOICES = [
         (ROLE_SERVICE, _('Service'), 'blue'),

+ 1 - 1
netbox/ipam/forms/bulk_import.py

@@ -459,7 +459,7 @@ class VLANImportForm(NetBoxModelImportForm):
     )
     qinq_role = CSVChoiceField(
         label=_('Q-in-Q role'),
-        choices=VLANStatusChoices,
+        choices=VLANQinQRoleChoices,
         required=False,
         help_text=_('Operational status')
     )

+ 6 - 0
netbox/templates/dcim/interface.html

@@ -81,6 +81,12 @@
             <th scope="row">{% trans "802.1Q Mode" %}</th>
             <td>{{ object.get_mode_display|placeholder }}</td>
           </tr>
+          {% if object.mode == 'q-in-q' %}
+            <tr>
+              <th scope="row">{% trans "Q-in-Q SVLAN" %}</th>
+              <td>{{ object.qinq_svlan|linkify|placeholder }}</td>
+            </tr>
+          {% endif %}
           <tr>
             <th scope="row">{% trans "Transmit power (dBm)" %}</th>
             <td>{{ object.tx_power|placeholder }}</td>

+ 3 - 3
netbox/templates/ipam/vlan.html

@@ -72,7 +72,7 @@
                         {% endif %}
                       </td>
                     </tr>
-                    {% if object.qinq_role == 'c-vlan' %}
+                    {% if object.qinq_role == 'cvlan' %}
                       <tr>
                         <th scope="row">{% trans "Q-in-Q SVLAN" %}</th>
                         <td>{{ object.qinq_svlan|linkify|placeholder }}</td>
@@ -108,13 +108,13 @@
           </h2>
           {% htmx_table 'ipam:prefix_list' vlan_id=object.pk %}
         </div>
-        {% if object.qinq_role == 's-vlan' %}
+        {% if object.qinq_role == 'svlan' %}
           <div class="card">
             <h2 class="card-header">
               {% trans "Customer VLANs" %}
               {% if perms.ipam.add_vlan %}
                 <div class="card-actions">
-                  <a href="{% url 'ipam:vlan_add' %}?qinq_role=c-vlan&qinq_svlan={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+                  <a href="{% url 'ipam:vlan_add' %}?qinq_role=cvlan&qinq_svlan={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
                     <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a VLAN" %}
                   </a>
                 </div>