Jeremy Stretch 6 лет назад
Родитель
Сommit
21fe5902a8

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

@@ -245,7 +245,7 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer):
         required=False
         required=False
     )
     )
     feed_leg = ChoiceField(
     feed_leg = ChoiceField(
-        choices=POWERFEED_LEG_CHOICES,
+        choices=PowerOutletFeedLegChoices,
         required=False,
         required=False,
         allow_null=True
         allow_null=True
     )
     )
@@ -429,7 +429,7 @@ class PowerOutletSerializer(TaggitSerializer, ConnectedEndpointSerializer):
         required=False
         required=False
     )
     )
     feed_leg = ChoiceField(
     feed_leg = ChoiceField(
-        choices=POWERFEED_LEG_CHOICES,
+        choices=PowerOutletFeedLegChoices,
         required=False,
         required=False,
         allow_null=True
         allow_null=True
     )
     )

+ 19 - 0
netbox/dcim/choices.py

@@ -391,6 +391,25 @@ class PowerOutletTypeChoices(ChoiceSet):
     )
     )
 
 
 
 
+class PowerOutletFeedLegChoices(ChoiceSet):
+
+    FEED_LEG_A = 'A'
+    FEED_LEG_B = 'B'
+    FEED_LEG_C = 'C'
+
+    CHOICES = (
+        (FEED_LEG_A, 'A'),
+        (FEED_LEG_B, 'B'),
+        (FEED_LEG_C, 'C'),
+    )
+
+    LEGACY_MAP = {
+        FEED_LEG_A: 1,
+        FEED_LEG_B: 2,
+        FEED_LEG_C: 3,
+    }
+
+
 #
 #
 # Interfaces
 # Interfaces
 #
 #

+ 0 - 10
netbox/dcim/constants.py

@@ -55,13 +55,3 @@ COMPATIBLE_TERMINATION_TYPES = {
     'rearport': ['consoleport', 'consoleserverport', 'interface', 'frontport', 'rearport', 'circuittermination'],
     'rearport': ['consoleport', 'consoleserverport', 'interface', 'frontport', 'rearport', 'circuittermination'],
     'circuittermination': ['interface', 'frontport', 'rearport'],
     'circuittermination': ['interface', 'frontport', 'rearport'],
 }
 }
-
-# Power feeds
-POWERFEED_LEG_A = 1
-POWERFEED_LEG_B = 2
-POWERFEED_LEG_C = 3
-POWERFEED_LEG_CHOICES = (
-    (POWERFEED_LEG_A, 'A'),
-    (POWERFEED_LEG_B, 'B'),
-    (POWERFEED_LEG_C, 'C'),
-)

+ 3 - 3
netbox/dcim/forms.py

@@ -1043,7 +1043,7 @@ class PowerOutletTemplateCreateForm(ComponentForm):
         required=False
         required=False
     )
     )
     feed_leg = forms.ChoiceField(
     feed_leg = forms.ChoiceField(
-        choices=add_blank_choice(POWERFEED_LEG_CHOICES),
+        choices=add_blank_choice(PowerOutletFeedLegChoices),
         required=False,
         required=False,
         widget=StaticSelect2()
         widget=StaticSelect2()
     )
     )
@@ -2241,7 +2241,7 @@ class PowerOutletCreateForm(ComponentForm):
         required=False
         required=False
     )
     )
     feed_leg = forms.ChoiceField(
     feed_leg = forms.ChoiceField(
-        choices=add_blank_choice(POWERFEED_LEG_CHOICES),
+        choices=add_blank_choice(PowerOutletFeedLegChoices),
         required=False
         required=False
     )
     )
     description = forms.CharField(
     description = forms.CharField(
@@ -2270,7 +2270,7 @@ class PowerOutletBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
         required=False
         required=False
     )
     )
     feed_leg = forms.ChoiceField(
     feed_leg = forms.ChoiceField(
-        choices=add_blank_choice(POWERFEED_LEG_CHOICES),
+        choices=add_blank_choice(PowerOutletFeedLegChoices),
         required=False,
         required=False,
     )
     )
     power_port = forms.ModelChoiceField(
     power_port = forms.ModelChoiceField(

+ 62 - 0
netbox/dcim/migrations/0085_3569_poweroutlet_fields.py

@@ -0,0 +1,62 @@
+from django.db import migrations, models
+
+
+POWEROUTLET_FEED_LEG_CHOICES_CHOICES = (
+    (1, 'A'),
+    (2, 'B'),
+    (3, 'C'),
+)
+
+
+def poweroutlettemplate_feed_leg_to_slug(apps, schema_editor):
+    PowerOutletTemplate = apps.get_model('dcim', 'PowerOutletTemplate')
+    for id, slug in POWEROUTLET_FEED_LEG_CHOICES_CHOICES:
+        PowerOutletTemplate.objects.filter(feed_leg=id).update(feed_leg=slug)
+
+
+def poweroutlet_feed_leg_to_slug(apps, schema_editor):
+    PowerOutlet = apps.get_model('dcim', 'PowerOutlet')
+    for id, slug in POWEROUTLET_FEED_LEG_CHOICES_CHOICES:
+        PowerOutlet.objects.filter(feed_leg=id).update(feed_leg=slug)
+
+
+class Migration(migrations.Migration):
+    atomic = False
+
+    dependencies = [
+        ('dcim', '0084_3569_powerfeed_fields'),
+    ]
+
+    operations = [
+
+        # PowerOutletTemplate.feed_leg
+        migrations.AlterField(
+            model_name='poweroutlettemplate',
+            name='feed_leg',
+            field=models.CharField(blank=True, default='', max_length=50),
+        ),
+        migrations.RunPython(
+            code=poweroutlettemplate_feed_leg_to_slug
+        ),
+        migrations.AlterField(
+            model_name='poweroutlettemplate',
+            name='feed_leg',
+            field=models.CharField(blank=True, max_length=50),
+        ),
+
+        # PowerOutlet.feed_leg
+        migrations.AlterField(
+            model_name='poweroutlet',
+            name='feed_leg',
+            field=models.CharField(blank=True, default='', max_length=50),
+        ),
+        migrations.RunPython(
+            code=poweroutlet_feed_leg_to_slug
+        ),
+        migrations.AlterField(
+            model_name='poweroutlet',
+            name='feed_leg',
+            field=models.CharField(blank=True, max_length=50),
+        ),
+
+    ]

+ 7 - 7
netbox/dcim/models.py

@@ -1164,10 +1164,10 @@ class PowerOutletTemplate(ComponentTemplateModel):
         null=True,
         null=True,
         related_name='poweroutlet_templates'
         related_name='poweroutlet_templates'
     )
     )
-    feed_leg = models.PositiveSmallIntegerField(
-        choices=POWERFEED_LEG_CHOICES,
+    feed_leg = models.CharField(
+        max_length=50,
+        choices=PowerOutletFeedLegChoices,
         blank=True,
         blank=True,
-        null=True,
         help_text="Phase (for three-phase feeds)"
         help_text="Phase (for three-phase feeds)"
     )
     )
 
 
@@ -2109,7 +2109,7 @@ class PowerPort(CableTermination, ComponentModel):
 
 
             # Calculate per-leg aggregates for three-phase feeds
             # Calculate per-leg aggregates for three-phase feeds
             if self._connected_powerfeed and self._connected_powerfeed.phase == PowerFeedPhaseChoices.PHASE_3PHASE:
             if self._connected_powerfeed and self._connected_powerfeed.phase == PowerFeedPhaseChoices.PHASE_3PHASE:
-                for leg, leg_name in POWERFEED_LEG_CHOICES:
+                for leg, leg_name in PowerOutletFeedLegChoices:
                     outlet_ids = PowerOutlet.objects.filter(power_port=self, feed_leg=leg).values_list('pk', flat=True)
                     outlet_ids = PowerOutlet.objects.filter(power_port=self, feed_leg=leg).values_list('pk', flat=True)
                     utilization = PowerPort.objects.filter(_connected_poweroutlet_id__in=outlet_ids).aggregate(
                     utilization = PowerPort.objects.filter(_connected_poweroutlet_id__in=outlet_ids).aggregate(
                         maximum_draw_total=Sum('maximum_draw'),
                         maximum_draw_total=Sum('maximum_draw'),
@@ -2161,10 +2161,10 @@ class PowerOutlet(CableTermination, ComponentModel):
         null=True,
         null=True,
         related_name='poweroutlets'
         related_name='poweroutlets'
     )
     )
-    feed_leg = models.PositiveSmallIntegerField(
-        choices=POWERFEED_LEG_CHOICES,
+    feed_leg = models.CharField(
+        max_length=50,
+        choices=PowerOutletFeedLegChoices,
         blank=True,
         blank=True,
-        null=True,
         help_text="Phase (for three-phase feeds)"
         help_text="Phase (for three-phase feeds)"
     )
     )
     connection_status = models.NullBooleanField(
     connection_status = models.NullBooleanField(

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

@@ -187,7 +187,7 @@ class DeviceTestCase(TestCase):
             device_type=self.device_type,
             device_type=self.device_type,
             name='Power Outlet 1',
             name='Power Outlet 1',
             power_port=ppt,
             power_port=ppt,
-            feed_leg=POWERFEED_LEG_A
+            feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A
         ).save()
         ).save()
 
 
         InterfaceTemplate(
         InterfaceTemplate(
@@ -251,7 +251,7 @@ class DeviceTestCase(TestCase):
             device=d,
             device=d,
             name='Power Outlet 1',
             name='Power Outlet 1',
             power_port=pp,
             power_port=pp,
-            feed_leg=POWERFEED_LEG_A
+            feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A
         )
         )
 
 
         Interface.objects.get(
         Interface.objects.get(

+ 4 - 4
netbox/dcim/tests/test_views.py

@@ -255,15 +255,15 @@ power-outlets:
   - name: Power Outlet 1
   - name: Power Outlet 1
     type: iec-60320-c13
     type: iec-60320-c13
     power_port: Power Port 1
     power_port: Power Port 1
-    feed_leg: 1
+    feed_leg: A
   - name: Power Outlet 2
   - name: Power Outlet 2
     type: iec-60320-c13
     type: iec-60320-c13
     power_port: Power Port 1
     power_port: Power Port 1
-    feed_leg: 1
+    feed_leg: A
   - name: Power Outlet 3
   - name: Power Outlet 3
     type: iec-60320-c13
     type: iec-60320-c13
     power_port: Power Port 1
     power_port: Power Port 1
-    feed_leg: 1
+    feed_leg: A
 interfaces:
 interfaces:
   - name: Interface 1
   - name: Interface 1
     type: 1000base-t
     type: 1000base-t
@@ -343,7 +343,7 @@ device-bays:
         self.assertEqual(po1.name, 'Power Outlet 1')
         self.assertEqual(po1.name, 'Power Outlet 1')
         self.assertEqual(po1.type, PowerOutletTypeChoices.TYPE_IEC_C13)
         self.assertEqual(po1.type, PowerOutletTypeChoices.TYPE_IEC_C13)
         self.assertEqual(po1.power_port, pp1)
         self.assertEqual(po1.power_port, pp1)
-        self.assertEqual(po1.feed_leg, POWERFEED_LEG_A)
+        self.assertEqual(po1.feed_leg, PowerOutletFeedLegChoices.FEED_LEG_A)
 
 
         self.assertEqual(dt.interface_templates.count(), 3)
         self.assertEqual(dt.interface_templates.count(), 3)
         iface1 = InterfaceTemplate.objects.first()
         iface1 = InterfaceTemplate.objects.first()