From dead5b42be049d957a9f00f9f6193baf98ceff2c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2019 19:39:25 -0500 Subject: [PATCH] Front/RearPort.type to slug (#3569) --- netbox/dcim/api/serializers.py | 8 +- netbox/dcim/constants.py | 41 --------- netbox/dcim/forms.py | 22 ++--- .../dcim/migrations/0082_3569_port_fields.py | 85 +++++++++++++++++++ netbox/dcim/models.py | 20 +++-- netbox/dcim/tests/test_api.py | 24 +++--- netbox/dcim/tests/test_models.py | 16 ++-- 7 files changed, 127 insertions(+), 89 deletions(-) create mode 100644 netbox/dcim/migrations/0082_3569_port_fields.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 795040b17..04752641a 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -266,7 +266,7 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer): class RearPortTemplateSerializer(ValidatedModelSerializer): device_type = NestedDeviceTypeSerializer() - type = ChoiceField(choices=PORT_TYPE_CHOICES) + type = ChoiceField(choices=PortTypeChoices) class Meta: model = RearPortTemplate @@ -275,7 +275,7 @@ class RearPortTemplateSerializer(ValidatedModelSerializer): class FrontPortTemplateSerializer(ValidatedModelSerializer): device_type = NestedDeviceTypeSerializer() - type = ChoiceField(choices=PORT_TYPE_CHOICES) + type = ChoiceField(choices=PortTypeChoices) rear_port = NestedRearPortTemplateSerializer() class Meta: @@ -511,7 +511,7 @@ class InterfaceSerializer(TaggitSerializer, ConnectedEndpointSerializer): class RearPortSerializer(TaggitSerializer, ValidatedModelSerializer): device = NestedDeviceSerializer() - type = ChoiceField(choices=PORT_TYPE_CHOICES) + type = ChoiceField(choices=PortTypeChoices) cable = NestedCableSerializer(read_only=True) tags = TagListSerializerField(required=False) @@ -533,7 +533,7 @@ class FrontPortRearPortSerializer(WritableNestedSerializer): class FrontPortSerializer(TaggitSerializer, ValidatedModelSerializer): device = NestedDeviceSerializer() - type = ChoiceField(choices=PORT_TYPE_CHOICES) + type = ChoiceField(choices=PortTypeChoices) rear_port = FrontPortRearPortSerializer() cable = NestedCableSerializer(read_only=True) tags = TagListSerializerField(required=False) diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index a1b6744b7..5892df352 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -20,47 +20,6 @@ WIRELESS_IFACE_TYPES = [ NONCONNECTABLE_IFACE_TYPES = VIRTUAL_IFACE_TYPES + WIRELESS_IFACE_TYPES - -# Pass-through port types -PORT_TYPE_8P8C = 1000 -PORT_TYPE_110_PUNCH = 1100 -PORT_TYPE_BNC = 1200 -PORT_TYPE_ST = 2000 -PORT_TYPE_SC = 2100 -PORT_TYPE_SC_APC = 2110 -PORT_TYPE_FC = 2200 -PORT_TYPE_LC = 2300 -PORT_TYPE_LC_APC = 2310 -PORT_TYPE_MTRJ = 2400 -PORT_TYPE_MPO = 2500 -PORT_TYPE_LSH = 2600 -PORT_TYPE_LSH_APC = 2610 -PORT_TYPE_CHOICES = [ - [ - 'Copper', - [ - [PORT_TYPE_8P8C, '8P8C'], - [PORT_TYPE_110_PUNCH, '110 Punch'], - [PORT_TYPE_BNC, 'BNC'], - ], - ], - [ - 'Fiber Optic', - [ - [PORT_TYPE_FC, 'FC'], - [PORT_TYPE_LC, 'LC'], - [PORT_TYPE_LC_APC, 'LC/APC'], - [PORT_TYPE_LSH, 'LSH'], - [PORT_TYPE_LSH_APC, 'LSH/APC'], - [PORT_TYPE_MPO, 'MPO'], - [PORT_TYPE_MTRJ, 'MTRJ'], - [PORT_TYPE_SC, 'SC'], - [PORT_TYPE_SC_APC, 'SC/APC'], - [PORT_TYPE_ST, 'ST'], - ] - ] -] - # Bootstrap CSS classes for device/rack statuses STATUS_CLASSES = { 0: 'warning', diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index d6c852c2d..51e454a16 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1133,7 +1133,7 @@ class FrontPortTemplateCreateForm(ComponentForm): label='Name' ) type = forms.ChoiceField( - choices=PORT_TYPE_CHOICES, + choices=PortTypeChoices, widget=StaticSelect2() ) rear_port_set = forms.MultipleChoiceField( @@ -1203,7 +1203,7 @@ class RearPortTemplateCreateForm(ComponentForm): label='Name' ) type = forms.ChoiceField( - choices=PORT_TYPE_CHOICES, + choices=PortTypeChoices, widget=StaticSelect2(), ) positions = forms.IntegerField( @@ -1328,11 +1328,6 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm): 'device_type', 'name', 'type', 'rear_port', 'rear_port_position', ] - def clean_type(self): - # Convert slug value to field integer value - slug = self.cleaned_data['type'] - return PortTypeChoices.slug_to_id(slug) - class RearPortTemplateImportForm(ComponentTemplateImportForm): type = forms.ChoiceField( @@ -1345,11 +1340,6 @@ class RearPortTemplateImportForm(ComponentTemplateImportForm): 'device_type', 'name', 'type', 'positions', ] - def clean_type(self): - # Convert slug value to field integer value - slug = self.cleaned_data['type'] - return PortTypeChoices.slug_to_id(slug) - class DeviceBayTemplateImportForm(ComponentTemplateImportForm): @@ -2686,7 +2676,7 @@ class FrontPortCreateForm(ComponentForm): label='Name' ) type = forms.ChoiceField( - choices=PORT_TYPE_CHOICES, + choices=PortTypeChoices, widget=StaticSelect2(), ) rear_port_set = forms.MultipleChoiceField( @@ -2746,7 +2736,7 @@ class FrontPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): widget=forms.MultipleHiddenInput() ) type = forms.ChoiceField( - choices=add_blank_choice(PORT_TYPE_CHOICES), + choices=add_blank_choice(PortTypeChoices), required=False, widget=StaticSelect2() ) @@ -2800,7 +2790,7 @@ class RearPortCreateForm(ComponentForm): label='Name' ) type = forms.ChoiceField( - choices=PORT_TYPE_CHOICES, + choices=PortTypeChoices, widget=StaticSelect2(), ) positions = forms.IntegerField( @@ -2820,7 +2810,7 @@ class RearPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): widget=forms.MultipleHiddenInput() ) type = forms.ChoiceField( - choices=add_blank_choice(PORT_TYPE_CHOICES), + choices=add_blank_choice(PortTypeChoices), required=False, widget=StaticSelect2() ) diff --git a/netbox/dcim/migrations/0082_3569_port_fields.py b/netbox/dcim/migrations/0082_3569_port_fields.py new file mode 100644 index 000000000..9cabc3bd5 --- /dev/null +++ b/netbox/dcim/migrations/0082_3569_port_fields.py @@ -0,0 +1,85 @@ +from django.db import migrations, models + + +PORT_TYPE_CHOICES = ( + (1000, '8p8c'), + (1100, '110-punch'), + (1200, 'bnc'), + (2000, 'st'), + (2100, 'sc'), + (2110, 'sc-apc'), + (2200, 'fc'), + (2300, 'lc'), + (2310, 'lc-apc'), + (2400, 'mtrj'), + (2500, 'mpo'), + (2600, 'lsh'), + (2610, 'lsh-apc'), +) + + +def frontporttemplate_type_to_slug(apps, schema_editor): + FrontPortTemplate = apps.get_model('dcim', 'FrontPortTemplate') + for id, slug in PORT_TYPE_CHOICES: + FrontPortTemplate.objects.filter(type=id).update(type=slug) + + +def rearporttemplate_type_to_slug(apps, schema_editor): + RearPortTemplate = apps.get_model('dcim', 'RearPortTemplate') + for id, slug in PORT_TYPE_CHOICES: + RearPortTemplate.objects.filter(type=id).update(type=slug) + + +def frontport_type_to_slug(apps, schema_editor): + FrontPort = apps.get_model('dcim', 'FrontPort') + for id, slug in PORT_TYPE_CHOICES: + FrontPort.objects.filter(type=id).update(type=slug) + + +def rearport_type_to_slug(apps, schema_editor): + RearPort = apps.get_model('dcim', 'RearPort') + for id, slug in PORT_TYPE_CHOICES: + RearPort.objects.filter(type=id).update(type=slug) + + +class Migration(migrations.Migration): + atomic = False + + dependencies = [ + ('dcim', '0082_3569_interface_fields'), + ] + + operations = [ + migrations.AlterField( + model_name='frontporttemplate', + name='type', + field=models.CharField(max_length=50), + ), + migrations.RunPython( + code=frontporttemplate_type_to_slug + ), + migrations.AlterField( + model_name='rearporttemplate', + name='type', + field=models.CharField(max_length=50), + ), + migrations.RunPython( + code=rearporttemplate_type_to_slug + ), + migrations.AlterField( + model_name='frontport', + name='type', + field=models.CharField(max_length=50), + ), + migrations.RunPython( + code=frontport_type_to_slug + ), + migrations.AlterField( + model_name='rearport', + name='type', + field=models.CharField(max_length=50), + ), + migrations.RunPython( + code=rearport_type_to_slug + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index f9707a90a..926377f9f 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1252,8 +1252,9 @@ class FrontPortTemplate(ComponentTemplateModel): name = models.CharField( max_length=64 ) - type = models.PositiveSmallIntegerField( - choices=PORT_TYPE_CHOICES + type = models.CharField( + max_length=50, + choices=PortTypeChoices ) rear_port = models.ForeignKey( to='dcim.RearPortTemplate', @@ -1319,8 +1320,9 @@ class RearPortTemplate(ComponentTemplateModel): name = models.CharField( max_length=64 ) - type = models.PositiveSmallIntegerField( - choices=PORT_TYPE_CHOICES + type = models.CharField( + max_length=50, + choices=PortTypeChoices ) positions = models.PositiveSmallIntegerField( default=1, @@ -2475,8 +2477,9 @@ class FrontPort(CableTermination, ComponentModel): name = models.CharField( max_length=64 ) - type = models.PositiveSmallIntegerField( - choices=PORT_TYPE_CHOICES + type = models.CharField( + max_length=50, + choices=PortTypeChoices ) rear_port = models.ForeignKey( to='dcim.RearPort', @@ -2542,8 +2545,9 @@ class RearPort(CableTermination, ComponentModel): name = models.CharField( max_length=64 ) - type = models.PositiveSmallIntegerField( - choices=PORT_TYPE_CHOICES + type = models.CharField( + max_length=50, + choices=PortTypeChoices ) positions = models.PositiveSmallIntegerField( default=1, diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 466b40b37..ebeba944b 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -3034,16 +3034,16 @@ class ConnectionTest(APITestCase): device=self.device2, name='Test Console Server Port 1' ) rearport1 = RearPort.objects.create( - device=self.panel1, name='Test Rear Port 1', type=PORT_TYPE_8P8C + device=self.panel1, name='Test Rear Port 1', type=PortTypeChoices.TYPE_8P8C ) frontport1 = FrontPort.objects.create( - device=self.panel1, name='Test Front Port 1', type=PORT_TYPE_8P8C, rear_port=rearport1 + device=self.panel1, name='Test Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport1 ) rearport2 = RearPort.objects.create( - device=self.panel2, name='Test Rear Port 2', type=PORT_TYPE_8P8C + device=self.panel2, name='Test Rear Port 2', type=PortTypeChoices.TYPE_8P8C ) frontport2 = FrontPort.objects.create( - device=self.panel2, name='Test Front Port 2', type=PORT_TYPE_8P8C, rear_port=rearport2 + device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2 ) url = reverse('dcim-api:cable-list') @@ -3162,16 +3162,16 @@ class ConnectionTest(APITestCase): device=self.device2, name='Test Interface 2' ) rearport1 = RearPort.objects.create( - device=self.panel1, name='Test Rear Port 1', type=PORT_TYPE_8P8C + device=self.panel1, name='Test Rear Port 1', type=PortTypeChoices.TYPE_8P8C ) frontport1 = FrontPort.objects.create( - device=self.panel1, name='Test Front Port 1', type=PORT_TYPE_8P8C, rear_port=rearport1 + device=self.panel1, name='Test Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport1 ) rearport2 = RearPort.objects.create( - device=self.panel2, name='Test Rear Port 2', type=PORT_TYPE_8P8C + device=self.panel2, name='Test Rear Port 2', type=PortTypeChoices.TYPE_8P8C ) frontport2 = FrontPort.objects.create( - device=self.panel2, name='Test Front Port 2', type=PORT_TYPE_8P8C, rear_port=rearport2 + device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2 ) url = reverse('dcim-api:cable-list') @@ -3273,16 +3273,16 @@ class ConnectionTest(APITestCase): circuit=circuit, term_side='A', site=self.site, port_speed=10000 ) rearport1 = RearPort.objects.create( - device=self.panel1, name='Test Rear Port 1', type=PORT_TYPE_8P8C + device=self.panel1, name='Test Rear Port 1', type=PortTypeChoices.TYPE_8P8C ) frontport1 = FrontPort.objects.create( - device=self.panel1, name='Test Front Port 1', type=PORT_TYPE_8P8C, rear_port=rearport1 + device=self.panel1, name='Test Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport1 ) rearport2 = RearPort.objects.create( - device=self.panel2, name='Test Rear Port 2', type=PORT_TYPE_8P8C + device=self.panel2, name='Test Rear Port 2', type=PortTypeChoices.TYPE_8P8C ) frontport2 = FrontPort.objects.create( - device=self.panel2, name='Test Front Port 2', type=PORT_TYPE_8P8C, rear_port=rearport2 + device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2 ) url = reverse('dcim-api:cable-list') diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index fae6a589d..3388b5c84 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -200,7 +200,7 @@ class DeviceTestCase(TestCase): rpt = RearPortTemplate( device_type=self.device_type, name='Rear Port 1', - type=PORT_TYPE_8P8C, + type=PortTypeChoices.TYPE_8P8C, positions=8 ) rpt.save() @@ -208,7 +208,7 @@ class DeviceTestCase(TestCase): FrontPortTemplate( device_type=self.device_type, name='Front Port 1', - type=PORT_TYPE_8P8C, + type=PortTypeChoices.TYPE_8P8C, rear_port=rpt, rear_port_position=2 ).save() @@ -264,14 +264,14 @@ class DeviceTestCase(TestCase): rp = RearPort.objects.get( device=d, name='Rear Port 1', - type=PORT_TYPE_8P8C, + type=PortTypeChoices.TYPE_8P8C, positions=8 ) FrontPort.objects.get( device=d, name='Front Port 1', - type=PORT_TYPE_8P8C, + type=PortTypeChoices.TYPE_8P8C, rear_port=rp, rear_port_position=2 ) @@ -421,16 +421,16 @@ class CablePathTestCase(TestCase): device_type=devicetype, device_role=devicerole, name='Test Panel 2', site=site ) self.rear_port1 = RearPort.objects.create( - device=self.panel1, name='Rear Port 1', type=PORT_TYPE_8P8C + device=self.panel1, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C ) self.front_port1 = FrontPort.objects.create( - device=self.panel1, name='Front Port 1', type=PORT_TYPE_8P8C, rear_port=self.rear_port1 + device=self.panel1, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=self.rear_port1 ) self.rear_port2 = RearPort.objects.create( - device=self.panel2, name='Rear Port 2', type=PORT_TYPE_8P8C + device=self.panel2, name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C ) self.front_port2 = FrontPort.objects.create( - device=self.panel2, name='Front Port 2', type=PORT_TYPE_8P8C, rear_port=self.rear_port2 + device=self.panel2, name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=self.rear_port2 ) def test_path_completion(self):