Skip to content

Commit ba8f324

Browse files
committed
IPAddress.status to slug (#3569)
1 parent 929c064 commit ba8f324

File tree

7 files changed

+80
-22
lines changed

7 files changed

+80
-22
lines changed

netbox/ipam/api/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ class IPAddressSerializer(TaggitSerializer, CustomFieldModelSerializer):
201201
family = ChoiceField(choices=AF_CHOICES, read_only=True)
202202
vrf = NestedVRFSerializer(required=False, allow_null=True)
203203
tenant = NestedTenantSerializer(required=False, allow_null=True)
204-
status = ChoiceField(choices=IPADDRESS_STATUS_CHOICES, required=False)
204+
status = ChoiceField(choices=IPAddressStatusChoices, required=False)
205205
role = ChoiceField(choices=IPADDRESS_ROLE_CHOICES, required=False, allow_null=True)
206206
interface = IPAddressInterfaceSerializer(required=False, allow_null=True)
207207
nat_inside = NestedIPAddressSerializer(required=False, allow_null=True)

netbox/ipam/choices.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,29 @@ class PrefixStatusChoices(ChoiceSet):
2525
STATUS_RESERVED: 2,
2626
STATUS_DEPRECATED: 3,
2727
}
28+
29+
30+
#
31+
# IPAddresses
32+
#
33+
34+
class IPAddressStatusChoices(ChoiceSet):
35+
36+
STATUS_ACTIVE = 'active'
37+
STATUS_RESERVED = 'reserved'
38+
STATUS_DEPRECATED = 'deprecated'
39+
STATUS_DHCP = 'dhcp'
40+
41+
CHOICES = (
42+
(STATUS_ACTIVE, 'Active'),
43+
(STATUS_RESERVED, 'Reserved'),
44+
(STATUS_DEPRECATED, 'Deprecated'),
45+
(STATUS_DHCP, 'DHCP'),
46+
)
47+
48+
LEGACY_MAP = {
49+
STATUS_ACTIVE: 1,
50+
STATUS_RESERVED: 2,
51+
STATUS_DEPRECATED: 3,
52+
STATUS_DHCP: 5,
53+
}

netbox/ipam/constants.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,6 @@
44
(6, 'IPv6'),
55
)
66

7-
# IP address statuses
8-
IPADDRESS_STATUS_ACTIVE = 1
9-
IPADDRESS_STATUS_RESERVED = 2
10-
IPADDRESS_STATUS_DEPRECATED = 3
11-
IPADDRESS_STATUS_DHCP = 5
12-
IPADDRESS_STATUS_CHOICES = (
13-
(IPADDRESS_STATUS_ACTIVE, 'Active'),
14-
(IPADDRESS_STATUS_RESERVED, 'Reserved'),
15-
(IPADDRESS_STATUS_DEPRECATED, 'Deprecated'),
16-
(IPADDRESS_STATUS_DHCP, 'DHCP')
17-
)
18-
197
# IP address roles
208
IPADDRESS_ROLE_LOOPBACK = 10
219
IPADDRESS_ROLE_SECONDARY = 20

netbox/ipam/filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ class IPAddressFilter(TenancyFilterSet, CustomFieldFilterSet):
311311
label='Interface (ID)',
312312
)
313313
status = django_filters.MultipleChoiceFilter(
314-
choices=IPADDRESS_STATUS_CHOICES,
314+
choices=IPAddressStatusChoices,
315315
null_value=None
316316
)
317317
role = django_filters.MultipleChoiceFilter(

netbox/ipam/forms.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ class IPAddressCSVForm(forms.ModelForm):
765765
}
766766
)
767767
status = CSVChoiceField(
768-
choices=IPADDRESS_STATUS_CHOICES,
768+
choices=IPAddressStatusChoices,
769769
help_text='Operational status'
770770
)
771771
role = CSVChoiceField(
@@ -894,7 +894,7 @@ class IPAddressBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEd
894894
)
895895
)
896896
status = forms.ChoiceField(
897-
choices=add_blank_choice(IPADDRESS_STATUS_CHOICES),
897+
choices=add_blank_choice(IPAddressStatusChoices),
898898
required=False,
899899
widget=StaticSelect2()
900900
)
@@ -973,7 +973,7 @@ class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterFo
973973
)
974974
)
975975
status = forms.MultipleChoiceField(
976-
choices=IPADDRESS_STATUS_CHOICES,
976+
choices=IPAddressStatusChoices,
977977
required=False,
978978
widget=StaticSelect2Multiple()
979979
)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from django.db import migrations, models
2+
3+
4+
IPADDRESS_STATUS_CHOICES = (
5+
(0, 'container'),
6+
(1, 'active'),
7+
(2, 'reserved'),
8+
(3, 'deprecated'),
9+
)
10+
11+
12+
def ipaddress_status_to_slug(apps, schema_editor):
13+
IPAddress = apps.get_model('ipam', 'IPAddress')
14+
for id, slug in IPADDRESS_STATUS_CHOICES:
15+
IPAddress.objects.filter(status=str(id)).update(status=slug)
16+
17+
18+
class Migration(migrations.Migration):
19+
atomic = False
20+
21+
dependencies = [
22+
('ipam', '0028_3569_prefix_fields'),
23+
]
24+
25+
operations = [
26+
27+
# IPAddress.status
28+
migrations.AlterField(
29+
model_name='ipaddress',
30+
name='status',
31+
field=models.CharField(default='active', max_length=50),
32+
),
33+
migrations.RunPython(
34+
code=ipaddress_status_to_slug
35+
),
36+
37+
]

netbox/ipam/models.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -559,10 +559,10 @@ class IPAddress(ChangeLoggedModel, CustomFieldModel):
559559
blank=True,
560560
null=True
561561
)
562-
status = models.PositiveSmallIntegerField(
563-
choices=IPADDRESS_STATUS_CHOICES,
564-
default=IPADDRESS_STATUS_ACTIVE,
565-
verbose_name='Status',
562+
status = models.CharField(
563+
max_length=50,
564+
choices=IPAddressStatusChoices,
565+
default=IPAddressStatusChoices.STATUS_ACTIVE,
566566
help_text='The operational status of this IP'
567567
)
568568
role = models.PositiveSmallIntegerField(
@@ -613,6 +613,13 @@ class IPAddress(ChangeLoggedModel, CustomFieldModel):
613613
'dns_name', 'description',
614614
]
615615

616+
STATUS_CLASS_MAP = {
617+
'active': 'primary',
618+
'reserved': 'info',
619+
'deprecated': 'danger',
620+
'dhcp': 'success',
621+
}
622+
616623
class Meta:
617624
ordering = ['family', 'address']
618625
verbose_name = 'IP address'
@@ -746,7 +753,7 @@ def virtual_machine(self):
746753
return None
747754

748755
def get_status_class(self):
749-
return STATUS_CHOICE_CLASSES[self.status]
756+
return self.STATUS_CLASS_MAP.get(self.status)
750757

751758
def get_role_class(self):
752759
return ROLE_CHOICE_CLASSES[self.role]

0 commit comments

Comments
 (0)