mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-22 20:12:00 -06:00
Site.status to slug (#3569)
This commit is contained in:
parent
3fa4ceadb0
commit
5c95927a43
@ -68,7 +68,7 @@ class RegionSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class SiteSerializer(TaggitSerializer, CustomFieldModelSerializer):
|
||||
status = ChoiceField(choices=SITE_STATUS_CHOICES, required=False)
|
||||
status = ChoiceField(choices=SiteStatusChoices, required=False)
|
||||
region = NestedRegionSerializer(required=False, allow_null=True)
|
||||
tenant = NestedTenantSerializer(required=False, allow_null=True)
|
||||
time_zone = TimeZoneField(required=False)
|
||||
|
@ -1,6 +1,29 @@
|
||||
from utilities.choices import ChoiceSet
|
||||
|
||||
|
||||
#
|
||||
# Sites
|
||||
#
|
||||
|
||||
class SiteStatusChoices(ChoiceSet):
|
||||
|
||||
STATUS_ACTIVE = 'active'
|
||||
STATUS_PLANNED = 'planned'
|
||||
STATUS_RETIRED = 'retired'
|
||||
|
||||
CHOICES = (
|
||||
(STATUS_ACTIVE, 'Active'),
|
||||
(STATUS_PLANNED, 'Planned'),
|
||||
(STATUS_RETIRED, 'Retired'),
|
||||
)
|
||||
|
||||
LEGACY_MAP = {
|
||||
STATUS_ACTIVE: 1,
|
||||
STATUS_PLANNED: 2,
|
||||
STATUS_RETIRED: 4,
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Racks
|
||||
#
|
||||
|
@ -79,16 +79,6 @@ DEVICE_STATUS_CHOICES = [
|
||||
[DEVICE_STATUS_DECOMMISSIONING, 'Decommissioning'],
|
||||
]
|
||||
|
||||
# Site statuses
|
||||
SITE_STATUS_ACTIVE = 1
|
||||
SITE_STATUS_PLANNED = 2
|
||||
SITE_STATUS_RETIRED = 4
|
||||
SITE_STATUS_CHOICES = [
|
||||
[SITE_STATUS_ACTIVE, 'Active'],
|
||||
[SITE_STATUS_PLANNED, 'Planned'],
|
||||
[SITE_STATUS_RETIRED, 'Retired'],
|
||||
]
|
||||
|
||||
# Bootstrap CSS classes for device/rack statuses
|
||||
STATUS_CLASSES = {
|
||||
0: 'warning',
|
||||
|
@ -49,7 +49,7 @@ class SiteFilter(TenancyFilterSet, CustomFieldFilterSet):
|
||||
label='Search',
|
||||
)
|
||||
status = django_filters.MultipleChoiceFilter(
|
||||
choices=SITE_STATUS_CHOICES,
|
||||
choices=SiteStatusChoices,
|
||||
null_value=None
|
||||
)
|
||||
region_id = TreeNodeMultipleChoiceFilter(
|
||||
|
@ -223,7 +223,7 @@ class SiteForm(BootstrapMixin, TenancyForm, CustomFieldForm):
|
||||
|
||||
class SiteCSVForm(forms.ModelForm):
|
||||
status = CSVChoiceField(
|
||||
choices=SITE_STATUS_CHOICES,
|
||||
choices=SiteStatusChoices,
|
||||
required=False,
|
||||
help_text='Operational status'
|
||||
)
|
||||
@ -262,7 +262,7 @@ class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFor
|
||||
widget=forms.MultipleHiddenInput
|
||||
)
|
||||
status = forms.ChoiceField(
|
||||
choices=add_blank_choice(SITE_STATUS_CHOICES),
|
||||
choices=add_blank_choice(SiteStatusChoices),
|
||||
required=False,
|
||||
initial='',
|
||||
widget=StaticSelect2()
|
||||
@ -311,7 +311,7 @@ class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
|
||||
label='Search'
|
||||
)
|
||||
status = forms.MultipleChoiceField(
|
||||
choices=SITE_STATUS_CHOICES,
|
||||
choices=SiteStatusChoices,
|
||||
required=False,
|
||||
widget=StaticSelect2Multiple()
|
||||
)
|
||||
|
@ -1,5 +1,17 @@
|
||||
from django.db import migrations, models
|
||||
|
||||
SITE_STATUS_CHOICES = (
|
||||
(1, 'active'),
|
||||
(2, 'planned'),
|
||||
(4, 'retired'),
|
||||
)
|
||||
|
||||
|
||||
def site_status_to_slug(apps, schema_editor):
|
||||
Site = apps.get_model('dcim', 'Site')
|
||||
for id, slug in SITE_STATUS_CHOICES:
|
||||
Site.objects.filter(status=str(id)).update(status=slug)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
atomic = False
|
||||
@ -9,4 +21,12 @@ class Migration(migrations.Migration):
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='site',
|
||||
name='status',
|
||||
field=models.CharField(default='active', max_length=50),
|
||||
),
|
||||
migrations.RunPython(
|
||||
code=site_status_to_slug
|
||||
),
|
||||
]
|
||||
|
@ -245,9 +245,10 @@ class Site(ChangeLoggedModel, CustomFieldModel):
|
||||
slug = models.SlugField(
|
||||
unique=True
|
||||
)
|
||||
status = models.PositiveSmallIntegerField(
|
||||
choices=SITE_STATUS_CHOICES,
|
||||
default=SITE_STATUS_ACTIVE
|
||||
status = models.CharField(
|
||||
max_length=50,
|
||||
choices=SiteStatusChoices,
|
||||
default=SiteStatusChoices.STATUS_ACTIVE
|
||||
)
|
||||
region = models.ForeignKey(
|
||||
to='dcim.Region',
|
||||
@ -331,6 +332,12 @@ class Site(ChangeLoggedModel, CustomFieldModel):
|
||||
'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', 'contact_email', 'comments',
|
||||
]
|
||||
|
||||
STATUS_CLASS_MAP = {
|
||||
SiteStatusChoices.STATUS_ACTIVE: 'success',
|
||||
SiteStatusChoices.STATUS_PLANNED: 'info',
|
||||
SiteStatusChoices.STATUS_RETIRED: 'danger',
|
||||
}
|
||||
|
||||
class Meta:
|
||||
ordering = ['name']
|
||||
|
||||
@ -362,7 +369,7 @@ class Site(ChangeLoggedModel, CustomFieldModel):
|
||||
)
|
||||
|
||||
def get_status_class(self):
|
||||
return STATUS_CLASSES[self.status]
|
||||
return self.STATUS_CLASS_MAP.get(self.status)
|
||||
|
||||
|
||||
#
|
||||
|
@ -3,7 +3,7 @@ from netaddr import IPNetwork
|
||||
from rest_framework import status
|
||||
|
||||
from circuits.models import Circuit, CircuitTermination, CircuitType, Provider
|
||||
from dcim.choices import InterfaceModeChoices, SubdeviceRoleChoices
|
||||
from dcim.choices import *
|
||||
from dcim.constants import *
|
||||
from dcim.models import (
|
||||
Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
|
||||
@ -181,7 +181,7 @@ class SiteTest(APITestCase):
|
||||
'name': 'Test Site 4',
|
||||
'slug': 'test-site-4',
|
||||
'region': self.region1.pk,
|
||||
'status': SITE_STATUS_ACTIVE,
|
||||
'status': SiteStatusChoices.STATUS_ACTIVE,
|
||||
}
|
||||
|
||||
url = reverse('dcim-api:site-list')
|
||||
@ -201,19 +201,19 @@ class SiteTest(APITestCase):
|
||||
'name': 'Test Site 4',
|
||||
'slug': 'test-site-4',
|
||||
'region': self.region1.pk,
|
||||
'status': SITE_STATUS_ACTIVE,
|
||||
'status': SiteStatusChoices.STATUS_ACTIVE,
|
||||
},
|
||||
{
|
||||
'name': 'Test Site 5',
|
||||
'slug': 'test-site-5',
|
||||
'region': self.region1.pk,
|
||||
'status': SITE_STATUS_ACTIVE,
|
||||
'status': SiteStatusChoices.STATUS_ACTIVE,
|
||||
},
|
||||
{
|
||||
'name': 'Test Site 6',
|
||||
'slug': 'test-site-6',
|
||||
'region': self.region1.pk,
|
||||
'status': SITE_STATUS_ACTIVE,
|
||||
'status': SiteStatusChoices.STATUS_ACTIVE,
|
||||
},
|
||||
]
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user