Add the enabled filed to InterfaceTemplate

This commit is contained in:
kkthxbye 2023-01-09 09:01:14 +01:00 committed by jeremystretch
parent 1a2dae3471
commit 8e94eb67d2
10 changed files with 47 additions and 8 deletions

View File

@ -487,7 +487,7 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer):
class Meta: class Meta:
model = InterfaceTemplate model = InterfaceTemplate
fields = [ 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', 'poe_mode', 'poe_type', 'created', 'last_updated',
] ]

View File

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

View File

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

View File

@ -1088,14 +1088,14 @@ class PowerOutletTemplateForm(ModularComponentTemplateForm):
class InterfaceTemplateForm(ModularComponentTemplateForm): class InterfaceTemplateForm(ModularComponentTemplateForm):
fieldsets = ( 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')) ('PoE', ('poe_mode', 'poe_type'))
) )
class Meta: class Meta:
model = InterfaceTemplate model = InterfaceTemplate
fields = [ 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 = { widgets = {
'type': StaticSelect(), 'type': StaticSelect(),

View File

@ -100,7 +100,7 @@ class InterfaceTemplateImportForm(ComponentTemplateImportForm):
class Meta: class Meta:
model = InterfaceTemplate model = InterfaceTemplate
fields = [ 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',
] ]

View File

@ -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),
),
]

View File

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

View File

@ -174,6 +174,7 @@ class PowerOutletTemplateTable(ComponentTemplateTable):
class InterfaceTemplateTable(ComponentTemplateTable): class InterfaceTemplateTable(ComponentTemplateTable):
enabled = columns.BooleanColumn()
mgmt_only = columns.BooleanColumn( mgmt_only = columns.BooleanColumn(
verbose_name='Management Only' verbose_name='Management Only'
) )
@ -184,7 +185,7 @@ class InterfaceTemplateTable(ComponentTemplateTable):
class Meta(ComponentTemplateTable.Meta): class Meta(ComponentTemplateTable.Meta):
model = models.InterfaceTemplate 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" empty_text = "None"

View File

@ -1129,8 +1129,8 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests):
DeviceType.objects.bulk_create(device_types) DeviceType.objects.bulk_create(device_types)
InterfaceTemplate.objects.bulk_create(( 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[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, mgmt_only=False, poe_mode=InterfacePoEModeChoices.MODE_PSE, poe_type=InterfacePoETypeChoices.TYPE_2_8023AT), 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), 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]} params = {'type': [InterfaceTypeChoices.TYPE_1GE_FIXED, InterfaceTypeChoices.TYPE_1GE_GBIC]}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) 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): def test_mgmt_only(self):
params = {'mgmt_only': 'true'} params = {'mgmt_only': 'true'}
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)

View File

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