Explorar o código

Front/RearPort.type to slug (#3569)

Jeremy Stretch %!s(int64=6) %!d(string=hai) anos
pai
achega
dead5b42be

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

@@ -266,7 +266,7 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer):
 
 
 class RearPortTemplateSerializer(ValidatedModelSerializer):
 class RearPortTemplateSerializer(ValidatedModelSerializer):
     device_type = NestedDeviceTypeSerializer()
     device_type = NestedDeviceTypeSerializer()
-    type = ChoiceField(choices=PORT_TYPE_CHOICES)
+    type = ChoiceField(choices=PortTypeChoices)
 
 
     class Meta:
     class Meta:
         model = RearPortTemplate
         model = RearPortTemplate
@@ -275,7 +275,7 @@ class RearPortTemplateSerializer(ValidatedModelSerializer):
 
 
 class FrontPortTemplateSerializer(ValidatedModelSerializer):
 class FrontPortTemplateSerializer(ValidatedModelSerializer):
     device_type = NestedDeviceTypeSerializer()
     device_type = NestedDeviceTypeSerializer()
-    type = ChoiceField(choices=PORT_TYPE_CHOICES)
+    type = ChoiceField(choices=PortTypeChoices)
     rear_port = NestedRearPortTemplateSerializer()
     rear_port = NestedRearPortTemplateSerializer()
 
 
     class Meta:
     class Meta:
@@ -511,7 +511,7 @@ class InterfaceSerializer(TaggitSerializer, ConnectedEndpointSerializer):
 
 
 class RearPortSerializer(TaggitSerializer, ValidatedModelSerializer):
 class RearPortSerializer(TaggitSerializer, ValidatedModelSerializer):
     device = NestedDeviceSerializer()
     device = NestedDeviceSerializer()
-    type = ChoiceField(choices=PORT_TYPE_CHOICES)
+    type = ChoiceField(choices=PortTypeChoices)
     cable = NestedCableSerializer(read_only=True)
     cable = NestedCableSerializer(read_only=True)
     tags = TagListSerializerField(required=False)
     tags = TagListSerializerField(required=False)
 
 
@@ -533,7 +533,7 @@ class FrontPortRearPortSerializer(WritableNestedSerializer):
 
 
 class FrontPortSerializer(TaggitSerializer, ValidatedModelSerializer):
 class FrontPortSerializer(TaggitSerializer, ValidatedModelSerializer):
     device = NestedDeviceSerializer()
     device = NestedDeviceSerializer()
-    type = ChoiceField(choices=PORT_TYPE_CHOICES)
+    type = ChoiceField(choices=PortTypeChoices)
     rear_port = FrontPortRearPortSerializer()
     rear_port = FrontPortRearPortSerializer()
     cable = NestedCableSerializer(read_only=True)
     cable = NestedCableSerializer(read_only=True)
     tags = TagListSerializerField(required=False)
     tags = TagListSerializerField(required=False)

+ 0 - 41
netbox/dcim/constants.py

@@ -20,47 +20,6 @@ WIRELESS_IFACE_TYPES = [
 
 
 NONCONNECTABLE_IFACE_TYPES = VIRTUAL_IFACE_TYPES + 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
 # Bootstrap CSS classes for device/rack statuses
 STATUS_CLASSES = {
 STATUS_CLASSES = {
     0: 'warning',
     0: 'warning',

+ 6 - 16
netbox/dcim/forms.py

@@ -1133,7 +1133,7 @@ class FrontPortTemplateCreateForm(ComponentForm):
         label='Name'
         label='Name'
     )
     )
     type = forms.ChoiceField(
     type = forms.ChoiceField(
-        choices=PORT_TYPE_CHOICES,
+        choices=PortTypeChoices,
         widget=StaticSelect2()
         widget=StaticSelect2()
     )
     )
     rear_port_set = forms.MultipleChoiceField(
     rear_port_set = forms.MultipleChoiceField(
@@ -1203,7 +1203,7 @@ class RearPortTemplateCreateForm(ComponentForm):
         label='Name'
         label='Name'
     )
     )
     type = forms.ChoiceField(
     type = forms.ChoiceField(
-        choices=PORT_TYPE_CHOICES,
+        choices=PortTypeChoices,
         widget=StaticSelect2(),
         widget=StaticSelect2(),
     )
     )
     positions = forms.IntegerField(
     positions = forms.IntegerField(
@@ -1328,11 +1328,6 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm):
             'device_type', 'name', 'type', 'rear_port', 'rear_port_position',
             '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):
 class RearPortTemplateImportForm(ComponentTemplateImportForm):
     type = forms.ChoiceField(
     type = forms.ChoiceField(
@@ -1345,11 +1340,6 @@ class RearPortTemplateImportForm(ComponentTemplateImportForm):
             'device_type', 'name', 'type', 'positions',
             '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):
 class DeviceBayTemplateImportForm(ComponentTemplateImportForm):
 
 
@@ -2686,7 +2676,7 @@ class FrontPortCreateForm(ComponentForm):
         label='Name'
         label='Name'
     )
     )
     type = forms.ChoiceField(
     type = forms.ChoiceField(
-        choices=PORT_TYPE_CHOICES,
+        choices=PortTypeChoices,
         widget=StaticSelect2(),
         widget=StaticSelect2(),
     )
     )
     rear_port_set = forms.MultipleChoiceField(
     rear_port_set = forms.MultipleChoiceField(
@@ -2746,7 +2736,7 @@ class FrontPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
         widget=forms.MultipleHiddenInput()
         widget=forms.MultipleHiddenInput()
     )
     )
     type = forms.ChoiceField(
     type = forms.ChoiceField(
-        choices=add_blank_choice(PORT_TYPE_CHOICES),
+        choices=add_blank_choice(PortTypeChoices),
         required=False,
         required=False,
         widget=StaticSelect2()
         widget=StaticSelect2()
     )
     )
@@ -2800,7 +2790,7 @@ class RearPortCreateForm(ComponentForm):
         label='Name'
         label='Name'
     )
     )
     type = forms.ChoiceField(
     type = forms.ChoiceField(
-        choices=PORT_TYPE_CHOICES,
+        choices=PortTypeChoices,
         widget=StaticSelect2(),
         widget=StaticSelect2(),
     )
     )
     positions = forms.IntegerField(
     positions = forms.IntegerField(
@@ -2820,7 +2810,7 @@ class RearPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
         widget=forms.MultipleHiddenInput()
         widget=forms.MultipleHiddenInput()
     )
     )
     type = forms.ChoiceField(
     type = forms.ChoiceField(
-        choices=add_blank_choice(PORT_TYPE_CHOICES),
+        choices=add_blank_choice(PortTypeChoices),
         required=False,
         required=False,
         widget=StaticSelect2()
         widget=StaticSelect2()
     )
     )

+ 85 - 0
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
+        ),
+    ]

+ 12 - 8
netbox/dcim/models.py

@@ -1252,8 +1252,9 @@ class FrontPortTemplate(ComponentTemplateModel):
     name = models.CharField(
     name = models.CharField(
         max_length=64
         max_length=64
     )
     )
-    type = models.PositiveSmallIntegerField(
-        choices=PORT_TYPE_CHOICES
+    type = models.CharField(
+        max_length=50,
+        choices=PortTypeChoices
     )
     )
     rear_port = models.ForeignKey(
     rear_port = models.ForeignKey(
         to='dcim.RearPortTemplate',
         to='dcim.RearPortTemplate',
@@ -1319,8 +1320,9 @@ class RearPortTemplate(ComponentTemplateModel):
     name = models.CharField(
     name = models.CharField(
         max_length=64
         max_length=64
     )
     )
-    type = models.PositiveSmallIntegerField(
-        choices=PORT_TYPE_CHOICES
+    type = models.CharField(
+        max_length=50,
+        choices=PortTypeChoices
     )
     )
     positions = models.PositiveSmallIntegerField(
     positions = models.PositiveSmallIntegerField(
         default=1,
         default=1,
@@ -2475,8 +2477,9 @@ class FrontPort(CableTermination, ComponentModel):
     name = models.CharField(
     name = models.CharField(
         max_length=64
         max_length=64
     )
     )
-    type = models.PositiveSmallIntegerField(
-        choices=PORT_TYPE_CHOICES
+    type = models.CharField(
+        max_length=50,
+        choices=PortTypeChoices
     )
     )
     rear_port = models.ForeignKey(
     rear_port = models.ForeignKey(
         to='dcim.RearPort',
         to='dcim.RearPort',
@@ -2542,8 +2545,9 @@ class RearPort(CableTermination, ComponentModel):
     name = models.CharField(
     name = models.CharField(
         max_length=64
         max_length=64
     )
     )
-    type = models.PositiveSmallIntegerField(
-        choices=PORT_TYPE_CHOICES
+    type = models.CharField(
+        max_length=50,
+        choices=PortTypeChoices
     )
     )
     positions = models.PositiveSmallIntegerField(
     positions = models.PositiveSmallIntegerField(
         default=1,
         default=1,

+ 12 - 12
netbox/dcim/tests/test_api.py

@@ -3034,16 +3034,16 @@ class ConnectionTest(APITestCase):
             device=self.device2, name='Test Console Server Port 1'
             device=self.device2, name='Test Console Server Port 1'
         )
         )
         rearport1 = RearPort.objects.create(
         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(
         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(
         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(
         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')
         url = reverse('dcim-api:cable-list')
@@ -3162,16 +3162,16 @@ class ConnectionTest(APITestCase):
             device=self.device2, name='Test Interface 2'
             device=self.device2, name='Test Interface 2'
         )
         )
         rearport1 = RearPort.objects.create(
         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(
         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(
         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(
         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')
         url = reverse('dcim-api:cable-list')
@@ -3273,16 +3273,16 @@ class ConnectionTest(APITestCase):
             circuit=circuit, term_side='A', site=self.site, port_speed=10000
             circuit=circuit, term_side='A', site=self.site, port_speed=10000
         )
         )
         rearport1 = RearPort.objects.create(
         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(
         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(
         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(
         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')
         url = reverse('dcim-api:cable-list')

+ 8 - 8
netbox/dcim/tests/test_models.py

@@ -200,7 +200,7 @@ class DeviceTestCase(TestCase):
         rpt = RearPortTemplate(
         rpt = RearPortTemplate(
             device_type=self.device_type,
             device_type=self.device_type,
             name='Rear Port 1',
             name='Rear Port 1',
-            type=PORT_TYPE_8P8C,
+            type=PortTypeChoices.TYPE_8P8C,
             positions=8
             positions=8
         )
         )
         rpt.save()
         rpt.save()
@@ -208,7 +208,7 @@ class DeviceTestCase(TestCase):
         FrontPortTemplate(
         FrontPortTemplate(
             device_type=self.device_type,
             device_type=self.device_type,
             name='Front Port 1',
             name='Front Port 1',
-            type=PORT_TYPE_8P8C,
+            type=PortTypeChoices.TYPE_8P8C,
             rear_port=rpt,
             rear_port=rpt,
             rear_port_position=2
             rear_port_position=2
         ).save()
         ).save()
@@ -264,14 +264,14 @@ class DeviceTestCase(TestCase):
         rp = RearPort.objects.get(
         rp = RearPort.objects.get(
             device=d,
             device=d,
             name='Rear Port 1',
             name='Rear Port 1',
-            type=PORT_TYPE_8P8C,
+            type=PortTypeChoices.TYPE_8P8C,
             positions=8
             positions=8
         )
         )
 
 
         FrontPort.objects.get(
         FrontPort.objects.get(
             device=d,
             device=d,
             name='Front Port 1',
             name='Front Port 1',
-            type=PORT_TYPE_8P8C,
+            type=PortTypeChoices.TYPE_8P8C,
             rear_port=rp,
             rear_port=rp,
             rear_port_position=2
             rear_port_position=2
         )
         )
@@ -421,16 +421,16 @@ class CablePathTestCase(TestCase):
             device_type=devicetype, device_role=devicerole, name='Test Panel 2', site=site
             device_type=devicetype, device_role=devicerole, name='Test Panel 2', site=site
         )
         )
         self.rear_port1 = RearPort.objects.create(
         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(
         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(
         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(
         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):
     def test_path_completion(self):