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

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

@@ -691,8 +691,8 @@ class PowerFeedSerializer(TaggitSerializer, CustomFieldModelSerializer):
         default=None
     )
     type = ChoiceField(
-        choices=POWERFEED_TYPE_CHOICES,
-        default=POWERFEED_TYPE_PRIMARY
+        choices=PowerFeedTypeChoices,
+        default=PowerFeedTypeChoices.TYPE_PRIMARY
     )
     status = ChoiceField(
         choices=POWERFEED_STATUS_CHOICES,

+ 20 - 0
netbox/dcim/choices.py

@@ -872,3 +872,23 @@ class CableLengthUnitChoices(ChoiceSet):
         UNIT_FOOT: 2100,
         UNIT_INCH: 2000,
     }
+
+
+#
+# PowerFeeds
+#
+
+class PowerFeedTypeChoices(ChoiceSet):
+
+    TYPE_PRIMARY = 'primary'
+    TYPE_REDUNDANT = 'redundant'
+
+    CHOICES = (
+        (TYPE_PRIMARY, 'Primary'),
+        (TYPE_REDUNDANT, 'Redundant'),
+    )
+
+    LEGACY_MAP = {
+        TYPE_PRIMARY: 1,
+        TYPE_REDUNDANT: 2,
+    }

+ 0 - 6
netbox/dcim/constants.py

@@ -68,12 +68,6 @@ COMPATIBLE_TERMINATION_TYPES = {
 }
 
 # Power feeds
-POWERFEED_TYPE_PRIMARY = 1
-POWERFEED_TYPE_REDUNDANT = 2
-POWERFEED_TYPE_CHOICES = (
-    (POWERFEED_TYPE_PRIMARY, 'Primary'),
-    (POWERFEED_TYPE_REDUNDANT, 'Redundant'),
-)
 POWERFEED_SUPPLY_AC = 1
 POWERFEED_SUPPLY_DC = 2
 POWERFEED_SUPPLY_CHOICES = (

+ 3 - 3
netbox/dcim/forms.py

@@ -3860,7 +3860,7 @@ class PowerFeedCSVForm(forms.ModelForm):
         help_text='Operational status'
     )
     type = CSVChoiceField(
-        choices=POWERFEED_TYPE_CHOICES,
+        choices=PowerFeedTypeChoices,
         required=False,
         help_text='Primary or redundant'
     )
@@ -3936,7 +3936,7 @@ class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEd
         widget=StaticSelect2()
     )
     type = forms.ChoiceField(
-        choices=add_blank_choice(POWERFEED_TYPE_CHOICES),
+        choices=add_blank_choice(PowerFeedTypeChoices),
         required=False,
         initial='',
         widget=StaticSelect2()
@@ -4014,7 +4014,7 @@ class PowerFeedFilterForm(BootstrapMixin, CustomFieldFilterForm):
         widget=StaticSelect2Multiple()
     )
     type = forms.ChoiceField(
-        choices=add_blank_choice(POWERFEED_TYPE_CHOICES),
+        choices=add_blank_choice(PowerFeedTypeChoices),
         required=False,
         widget=StaticSelect2()
     )

+ 35 - 0
netbox/dcim/migrations/0084_3569_powerfeed_fields.py

@@ -0,0 +1,35 @@
+from django.db import migrations, models
+
+
+POWERFEED_TYPE_CHOICES = (
+    (1, 'primary'),
+    (2, 'redundant'),
+)
+
+
+def powerfeed_type_to_slug(apps, schema_editor):
+    PowerFeed = apps.get_model('dcim', 'PowerFeed')
+    for id, slug in POWERFEED_TYPE_CHOICES:
+        PowerFeed.objects.filter(type=id).update(type=slug)
+
+
+class Migration(migrations.Migration):
+    atomic = False
+
+    dependencies = [
+        ('dcim', '0083_3569_cable_fields'),
+    ]
+
+    operations = [
+
+        # Cable.type
+        migrations.AlterField(
+            model_name='powerfeed',
+            name='type',
+            field=models.CharField(blank=True, max_length=50),
+        ),
+        migrations.RunPython(
+            code=powerfeed_type_to_slug
+        ),
+
+    ]

+ 3 - 3
netbox/dcim/models.py

@@ -3111,9 +3111,9 @@ class PowerFeed(ChangeLoggedModel, CableTermination, CustomFieldModel):
         choices=POWERFEED_STATUS_CHOICES,
         default=POWERFEED_STATUS_ACTIVE
     )
-    type = models.PositiveSmallIntegerField(
-        choices=POWERFEED_TYPE_CHOICES,
-        default=POWERFEED_TYPE_PRIMARY
+    type = models.CharField(
+        choices=PowerFeedTypeChoices,
+        default=PowerFeedTypeChoices.TYPE_PRIMARY
     )
     supply = models.PositiveSmallIntegerField(
         choices=POWERFEED_SUPPLY_CHOICES,

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

@@ -3679,22 +3679,22 @@ class PowerFeedTest(APITestCase):
             site=self.site1, rack_group=self.rackgroup1, name='Test Power Panel 2'
         )
         self.powerfeed1 = PowerFeed.objects.create(
-            power_panel=self.powerpanel1, rack=self.rack1, name='Test Power Feed 1A', type=POWERFEED_TYPE_PRIMARY
+            power_panel=self.powerpanel1, rack=self.rack1, name='Test Power Feed 1A', type=PowerFeedTypeChoices.TYPE_PRIMARY
         )
         self.powerfeed2 = PowerFeed.objects.create(
-            power_panel=self.powerpanel2, rack=self.rack1, name='Test Power Feed 1B', type=POWERFEED_TYPE_REDUNDANT
+            power_panel=self.powerpanel2, rack=self.rack1, name='Test Power Feed 1B', type=PowerFeedTypeChoices.TYPE_REDUNDANT
         )
         self.powerfeed3 = PowerFeed.objects.create(
-            power_panel=self.powerpanel1, rack=self.rack2, name='Test Power Feed 2A', type=POWERFEED_TYPE_PRIMARY
+            power_panel=self.powerpanel1, rack=self.rack2, name='Test Power Feed 2A', type=PowerFeedTypeChoices.TYPE_PRIMARY
         )
         self.powerfeed4 = PowerFeed.objects.create(
-            power_panel=self.powerpanel2, rack=self.rack2, name='Test Power Feed 2B', type=POWERFEED_TYPE_REDUNDANT
+            power_panel=self.powerpanel2, rack=self.rack2, name='Test Power Feed 2B', type=PowerFeedTypeChoices.TYPE_REDUNDANT
         )
         self.powerfeed5 = PowerFeed.objects.create(
-            power_panel=self.powerpanel1, rack=self.rack3, name='Test Power Feed 3A', type=POWERFEED_TYPE_PRIMARY
+            power_panel=self.powerpanel1, rack=self.rack3, name='Test Power Feed 3A', type=PowerFeedTypeChoices.TYPE_PRIMARY
         )
         self.powerfeed6 = PowerFeed.objects.create(
-            power_panel=self.powerpanel2, rack=self.rack3, name='Test Power Feed 3B', type=POWERFEED_TYPE_REDUNDANT
+            power_panel=self.powerpanel2, rack=self.rack3, name='Test Power Feed 3B', type=PowerFeedTypeChoices.TYPE_REDUNDANT
         )
 
     def test_get_powerfeed(self):
@@ -3727,7 +3727,7 @@ class PowerFeedTest(APITestCase):
             'name': 'Test Power Feed 4A',
             'power_panel': self.powerpanel1.pk,
             'rack': self.rack4.pk,
-            'type': POWERFEED_TYPE_PRIMARY,
+            'type': PowerFeedTypeChoices.TYPE_PRIMARY,
         }
 
         url = reverse('dcim-api:powerfeed-list')
@@ -3747,13 +3747,13 @@ class PowerFeedTest(APITestCase):
                 'name': 'Test Power Feed 4A',
                 'power_panel': self.powerpanel1.pk,
                 'rack': self.rack4.pk,
-                'type': POWERFEED_TYPE_PRIMARY,
+                'type': PowerFeedTypeChoices.TYPE_PRIMARY,
             },
             {
                 'name': 'Test Power Feed 4B',
                 'power_panel': self.powerpanel1.pk,
                 'rack': self.rack4.pk,
-                'type': POWERFEED_TYPE_REDUNDANT,
+                'type': PowerFeedTypeChoices.TYPE_REDUNDANT,
             },
         ]
 
@@ -3770,7 +3770,7 @@ class PowerFeedTest(APITestCase):
         data = {
             'name': 'Test Power Feed X',
             'rack': self.rack4.pk,
-            'type': POWERFEED_TYPE_REDUNDANT,
+            'type': PowerFeedTypeChoices.TYPE_REDUNDANT,
         }
 
         url = reverse('dcim-api:powerfeed-detail', kwargs={'pk': self.powerfeed1.pk})