Просмотр исходного кода

Add the `enabled` filed to InterfaceTemplate

kkthxbye 3 лет назад
Родитель
Сommit
8e94eb67d2

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

@@ -487,7 +487,7 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer):
     class Meta:
         model = InterfaceTemplate
         fields = [
-            'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description',
+            'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description',
             'poe_mode', 'poe_type', 'created', 'last_updated',
         ]
 

+ 1 - 1
netbox/dcim/filtersets.py

@@ -683,7 +683,7 @@ class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo
 
     class Meta:
         model = InterfaceTemplate
-        fields = ['id', 'name', 'type', 'mgmt_only']
+        fields = ['id', 'name', 'type', 'enabled', 'mgmt_only']
 
 
 class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):

+ 4 - 0
netbox/dcim/forms/bulk_edit.py

@@ -923,6 +923,10 @@ class InterfaceTemplateBulkEditForm(BulkEditForm):
         required=False,
         widget=StaticSelect()
     )
+    enabled = forms.NullBooleanField(
+        required=False,
+        widget=BulkEditNullBooleanSelect
+    )
     mgmt_only = forms.NullBooleanField(
         required=False,
         widget=BulkEditNullBooleanSelect,

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

@@ -1088,14 +1088,14 @@ class PowerOutletTemplateForm(ModularComponentTemplateForm):
 
 class InterfaceTemplateForm(ModularComponentTemplateForm):
     fieldsets = (
-        (None, ('device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description')),
+        (None, ('device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description')),
         ('PoE', ('poe_mode', 'poe_type'))
     )
 
     class Meta:
         model = InterfaceTemplate
         fields = [
-            'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description', 'poe_mode', 'poe_type',
+            'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'enabled', 'description', 'poe_mode', 'poe_type',
         ]
         widgets = {
             'type': StaticSelect(),

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

@@ -100,7 +100,7 @@ class InterfaceTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
         model = InterfaceTemplate
         fields = [
-            'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description', 'poe_mode', 'poe_type',
+            'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'poe_mode', 'poe_type',
         ]
 
 

+ 18 - 0
netbox/dcim/migrations/0168_interface_template_enabled.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.5 on 2023-01-09 07:03
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0167_module_status'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='interfacetemplate',
+            name='enabled',
+            field=models.BooleanField(default=True),
+        ),
+    ]

+ 5 - 0
netbox/dcim/models/device_component_templates.py

@@ -344,6 +344,9 @@ class InterfaceTemplate(ModularComponentTemplateModel):
         max_length=50,
         choices=InterfaceTypeChoices
     )
+    enabled = models.BooleanField(
+        default=True
+    )
     mgmt_only = models.BooleanField(
         default=False,
         verbose_name='Management only'
@@ -368,6 +371,7 @@ class InterfaceTemplate(ModularComponentTemplateModel):
             name=self.resolve_name(kwargs.get('module')),
             label=self.resolve_label(kwargs.get('module')),
             type=self.type,
+            enabled=self.enabled,
             mgmt_only=self.mgmt_only,
             poe_mode=self.poe_mode,
             poe_type=self.poe_type,
@@ -378,6 +382,7 @@ class InterfaceTemplate(ModularComponentTemplateModel):
         return {
             'name': self.name,
             'type': self.type,
+            'enabled': self.enabled,
             'mgmt_only': self.mgmt_only,
             'label': self.label,
             'description': self.description,

+ 2 - 1
netbox/dcim/tables/devicetypes.py

@@ -174,6 +174,7 @@ class PowerOutletTemplateTable(ComponentTemplateTable):
 
 
 class InterfaceTemplateTable(ComponentTemplateTable):
+    enabled = columns.BooleanColumn()
     mgmt_only = columns.BooleanColumn(
         verbose_name='Management Only'
     )
@@ -184,7 +185,7 @@ class InterfaceTemplateTable(ComponentTemplateTable):
 
     class Meta(ComponentTemplateTable.Meta):
         model = models.InterfaceTemplate
-        fields = ('pk', 'name', 'label', 'mgmt_only', 'type', 'description', 'poe_mode', 'poe_type', 'actions')
+        fields = ('pk', 'name', 'label', 'enabled', 'mgmt_only', 'type', 'description', 'poe_mode', 'poe_type', 'actions')
         empty_text = "None"
 
 

+ 8 - 2
netbox/dcim/tests/test_filtersets.py

@@ -1129,8 +1129,8 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests):
         DeviceType.objects.bulk_create(device_types)
 
         InterfaceTemplate.objects.bulk_create((
-            InterfaceTemplate(device_type=device_types[0], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED, mgmt_only=True, poe_mode=InterfacePoEModeChoices.MODE_PD, poe_type=InterfacePoETypeChoices.TYPE_1_8023AF),
-            InterfaceTemplate(device_type=device_types[1], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_GBIC, mgmt_only=False, poe_mode=InterfacePoEModeChoices.MODE_PSE, poe_type=InterfacePoETypeChoices.TYPE_2_8023AT),
+            InterfaceTemplate(device_type=device_types[0], name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED, enabled=True, mgmt_only=True, poe_mode=InterfacePoEModeChoices.MODE_PD, poe_type=InterfacePoETypeChoices.TYPE_1_8023AF),
+            InterfaceTemplate(device_type=device_types[1], name='Interface 2', type=InterfaceTypeChoices.TYPE_1GE_GBIC, enabled=False, mgmt_only=False, poe_mode=InterfacePoEModeChoices.MODE_PSE, poe_type=InterfacePoETypeChoices.TYPE_2_8023AT),
             InterfaceTemplate(device_type=device_types[2], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_SFP, mgmt_only=False),
         ))
 
@@ -1147,6 +1147,12 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests):
         params = {'type': [InterfaceTypeChoices.TYPE_1GE_FIXED, InterfaceTypeChoices.TYPE_1GE_GBIC]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
+    def test_enabled(self):
+        params = {'enabled': 'true'}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
+        params = {'enabled': 'false'}
+        self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
+
     def test_mgmt_only(self):
         params = {'mgmt_only': 'true'}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)

+ 5 - 0
netbox/dcim/tests/test_views.py

@@ -718,6 +718,7 @@ interfaces:
     mgmt_only: true
   - name: Interface 2
     type: 1000base-t
+    enabled: false
   - name: Interface 3
     type: 1000base-t
 rear-ports:
@@ -811,6 +812,10 @@ inventory-items:
         self.assertEqual(iface1.name, 'Interface 1')
         self.assertEqual(iface1.type, InterfaceTypeChoices.TYPE_1GE_FIXED)
         self.assertTrue(iface1.mgmt_only)
+        self.assertTrue(iface1.enabled)
+
+        iface2 = InterfaceTemplate.objects.filter(name="Interface 2").first()
+        self.assertFalse(iface2.enabled)
 
         self.assertEqual(device_type.rearporttemplates.count(), 3)
         rp1 = RearPortTemplate.objects.first()