mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
PowerOutlet.feed_leg to slug (#3569)
This commit is contained in:
@ -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
|
||||||
)
|
)
|
||||||
|
@ -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
|
||||||
#
|
#
|
||||||
|
@ -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'),
|
|
||||||
)
|
|
||||||
|
@ -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
netbox/dcim/migrations/0085_3569_poweroutlet_fields.py
Normal file
62
netbox/dcim/migrations/0085_3569_poweroutlet_fields.py
Normal file
@ -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),
|
||||||
|
),
|
||||||
|
|
||||||
|
]
|
@ -1164,10 +1164,10 @@ class PowerOutletTemplate(ComponentTemplateModel):
|
|||||||
null=True,
|
null=True,
|
||||||
related_name='poweroutlet_templates'
|
related_name='poweroutlet_templates'
|
||||||
)
|
)
|
||||||
feed_leg = models.PositiveSmallIntegerField(
|
feed_leg = models.CharField(
|
||||||
choices=POWERFEED_LEG_CHOICES,
|
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(
|
feed_leg = models.CharField(
|
||||||
choices=POWERFEED_LEG_CHOICES,
|
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(
|
||||||
|
@ -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(
|
||||||
|
@ -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()
|
||||||
|
Reference in New Issue
Block a user