From 21fe5902a80f4435fa5925e87c27bec345c34348 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Nov 2019 21:29:58 -0500 Subject: [PATCH] PowerOutlet.feed_leg to slug (#3569) --- netbox/dcim/api/serializers.py | 4 +- netbox/dcim/choices.py | 19 ++++++ netbox/dcim/constants.py | 10 --- netbox/dcim/forms.py | 6 +- .../0085_3569_poweroutlet_fields.py | 62 +++++++++++++++++++ netbox/dcim/models.py | 14 ++--- netbox/dcim/tests/test_models.py | 4 +- netbox/dcim/tests/test_views.py | 8 +-- 8 files changed, 99 insertions(+), 28 deletions(-) create mode 100644 netbox/dcim/migrations/0085_3569_poweroutlet_fields.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index eb640914e..3c4170373 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -245,7 +245,7 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer): required=False ) feed_leg = ChoiceField( - choices=POWERFEED_LEG_CHOICES, + choices=PowerOutletFeedLegChoices, required=False, allow_null=True ) @@ -429,7 +429,7 @@ class PowerOutletSerializer(TaggitSerializer, ConnectedEndpointSerializer): required=False ) feed_leg = ChoiceField( - choices=POWERFEED_LEG_CHOICES, + choices=PowerOutletFeedLegChoices, required=False, allow_null=True ) diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 4ac4ecde0..ccffa4379 100644 --- a/netbox/dcim/choices.py +++ b/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 # diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index fb119286a..8dacd68f5 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -55,13 +55,3 @@ COMPATIBLE_TERMINATION_TYPES = { 'rearport': ['consoleport', 'consoleserverport', 'interface', 'frontport', 'rearport', 'circuittermination'], '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'), -) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 6350b5045..c177589e2 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1043,7 +1043,7 @@ class PowerOutletTemplateCreateForm(ComponentForm): required=False ) feed_leg = forms.ChoiceField( - choices=add_blank_choice(POWERFEED_LEG_CHOICES), + choices=add_blank_choice(PowerOutletFeedLegChoices), required=False, widget=StaticSelect2() ) @@ -2241,7 +2241,7 @@ class PowerOutletCreateForm(ComponentForm): required=False ) feed_leg = forms.ChoiceField( - choices=add_blank_choice(POWERFEED_LEG_CHOICES), + choices=add_blank_choice(PowerOutletFeedLegChoices), required=False ) description = forms.CharField( @@ -2270,7 +2270,7 @@ class PowerOutletBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): required=False ) feed_leg = forms.ChoiceField( - choices=add_blank_choice(POWERFEED_LEG_CHOICES), + choices=add_blank_choice(PowerOutletFeedLegChoices), required=False, ) power_port = forms.ModelChoiceField( diff --git a/netbox/dcim/migrations/0085_3569_poweroutlet_fields.py b/netbox/dcim/migrations/0085_3569_poweroutlet_fields.py new file mode 100644 index 000000000..e2c070584 --- /dev/null +++ b/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), + ), + + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index b38adb479..6f46c0c96 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1164,10 +1164,10 @@ class PowerOutletTemplate(ComponentTemplateModel): null=True, related_name='poweroutlet_templates' ) - feed_leg = models.PositiveSmallIntegerField( - choices=POWERFEED_LEG_CHOICES, + feed_leg = models.CharField( + max_length=50, + choices=PowerOutletFeedLegChoices, blank=True, - null=True, help_text="Phase (for three-phase feeds)" ) @@ -2109,7 +2109,7 @@ class PowerPort(CableTermination, ComponentModel): # Calculate per-leg aggregates for three-phase feeds 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) utilization = PowerPort.objects.filter(_connected_poweroutlet_id__in=outlet_ids).aggregate( maximum_draw_total=Sum('maximum_draw'), @@ -2161,10 +2161,10 @@ class PowerOutlet(CableTermination, ComponentModel): null=True, related_name='poweroutlets' ) - feed_leg = models.PositiveSmallIntegerField( - choices=POWERFEED_LEG_CHOICES, + feed_leg = models.CharField( + max_length=50, + choices=PowerOutletFeedLegChoices, blank=True, - null=True, help_text="Phase (for three-phase feeds)" ) connection_status = models.NullBooleanField( diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 3388b5c84..2c3507758 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -187,7 +187,7 @@ class DeviceTestCase(TestCase): device_type=self.device_type, name='Power Outlet 1', power_port=ppt, - feed_leg=POWERFEED_LEG_A + feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A ).save() InterfaceTemplate( @@ -251,7 +251,7 @@ class DeviceTestCase(TestCase): device=d, name='Power Outlet 1', power_port=pp, - feed_leg=POWERFEED_LEG_A + feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A ) Interface.objects.get( diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 9315b201d..8eaab77d4 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -255,15 +255,15 @@ power-outlets: - name: Power Outlet 1 type: iec-60320-c13 power_port: Power Port 1 - feed_leg: 1 + feed_leg: A - name: Power Outlet 2 type: iec-60320-c13 power_port: Power Port 1 - feed_leg: 1 + feed_leg: A - name: Power Outlet 3 type: iec-60320-c13 power_port: Power Port 1 - feed_leg: 1 + feed_leg: A interfaces: - name: Interface 1 type: 1000base-t @@ -343,7 +343,7 @@ device-bays: self.assertEqual(po1.name, 'Power Outlet 1') self.assertEqual(po1.type, PowerOutletTypeChoices.TYPE_IEC_C13) 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) iface1 = InterfaceTemplate.objects.first()