Site.status to slug (#3569)

This commit is contained in:
Jeremy Stretch 2019-11-21 22:54:01 -05:00
parent 3fa4ceadb0
commit 5c95927a43
8 changed files with 64 additions and 24 deletions

View File

@ -68,7 +68,7 @@ class RegionSerializer(serializers.ModelSerializer):
class SiteSerializer(TaggitSerializer, CustomFieldModelSerializer): 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) region = NestedRegionSerializer(required=False, allow_null=True)
tenant = NestedTenantSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True)
time_zone = TimeZoneField(required=False) time_zone = TimeZoneField(required=False)

View File

@ -1,6 +1,29 @@
from utilities.choices import ChoiceSet 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 # Racks
# #

View File

@ -79,16 +79,6 @@ DEVICE_STATUS_CHOICES = [
[DEVICE_STATUS_DECOMMISSIONING, 'Decommissioning'], [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 # Bootstrap CSS classes for device/rack statuses
STATUS_CLASSES = { STATUS_CLASSES = {
0: 'warning', 0: 'warning',

View File

@ -49,7 +49,7 @@ class SiteFilter(TenancyFilterSet, CustomFieldFilterSet):
label='Search', label='Search',
) )
status = django_filters.MultipleChoiceFilter( status = django_filters.MultipleChoiceFilter(
choices=SITE_STATUS_CHOICES, choices=SiteStatusChoices,
null_value=None null_value=None
) )
region_id = TreeNodeMultipleChoiceFilter( region_id = TreeNodeMultipleChoiceFilter(

View File

@ -223,7 +223,7 @@ class SiteForm(BootstrapMixin, TenancyForm, CustomFieldForm):
class SiteCSVForm(forms.ModelForm): class SiteCSVForm(forms.ModelForm):
status = CSVChoiceField( status = CSVChoiceField(
choices=SITE_STATUS_CHOICES, choices=SiteStatusChoices,
required=False, required=False,
help_text='Operational status' help_text='Operational status'
) )
@ -262,7 +262,7 @@ class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditFor
widget=forms.MultipleHiddenInput widget=forms.MultipleHiddenInput
) )
status = forms.ChoiceField( status = forms.ChoiceField(
choices=add_blank_choice(SITE_STATUS_CHOICES), choices=add_blank_choice(SiteStatusChoices),
required=False, required=False,
initial='', initial='',
widget=StaticSelect2() widget=StaticSelect2()
@ -311,7 +311,7 @@ class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm):
label='Search' label='Search'
) )
status = forms.MultipleChoiceField( status = forms.MultipleChoiceField(
choices=SITE_STATUS_CHOICES, choices=SiteStatusChoices,
required=False, required=False,
widget=StaticSelect2Multiple() widget=StaticSelect2Multiple()
) )

View File

@ -1,5 +1,17 @@
from django.db import migrations, models 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): class Migration(migrations.Migration):
atomic = False atomic = False
@ -9,4 +21,12 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.AlterField(
model_name='site',
name='status',
field=models.CharField(default='active', max_length=50),
),
migrations.RunPython(
code=site_status_to_slug
),
] ]

View File

@ -245,9 +245,10 @@ class Site(ChangeLoggedModel, CustomFieldModel):
slug = models.SlugField( slug = models.SlugField(
unique=True unique=True
) )
status = models.PositiveSmallIntegerField( status = models.CharField(
choices=SITE_STATUS_CHOICES, max_length=50,
default=SITE_STATUS_ACTIVE choices=SiteStatusChoices,
default=SiteStatusChoices.STATUS_ACTIVE
) )
region = models.ForeignKey( region = models.ForeignKey(
to='dcim.Region', to='dcim.Region',
@ -331,6 +332,12 @@ class Site(ChangeLoggedModel, CustomFieldModel):
'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', 'contact_email', 'comments', '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: class Meta:
ordering = ['name'] ordering = ['name']
@ -362,7 +369,7 @@ class Site(ChangeLoggedModel, CustomFieldModel):
) )
def get_status_class(self): def get_status_class(self):
return STATUS_CLASSES[self.status] return self.STATUS_CLASS_MAP.get(self.status)
# #

View File

@ -3,7 +3,7 @@ from netaddr import IPNetwork
from rest_framework import status from rest_framework import status
from circuits.models import Circuit, CircuitTermination, CircuitType, Provider from circuits.models import Circuit, CircuitTermination, CircuitType, Provider
from dcim.choices import InterfaceModeChoices, SubdeviceRoleChoices from dcim.choices import *
from dcim.constants import * from dcim.constants import *
from dcim.models import ( from dcim.models import (
Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
@ -181,7 +181,7 @@ class SiteTest(APITestCase):
'name': 'Test Site 4', 'name': 'Test Site 4',
'slug': 'test-site-4', 'slug': 'test-site-4',
'region': self.region1.pk, 'region': self.region1.pk,
'status': SITE_STATUS_ACTIVE, 'status': SiteStatusChoices.STATUS_ACTIVE,
} }
url = reverse('dcim-api:site-list') url = reverse('dcim-api:site-list')
@ -201,19 +201,19 @@ class SiteTest(APITestCase):
'name': 'Test Site 4', 'name': 'Test Site 4',
'slug': 'test-site-4', 'slug': 'test-site-4',
'region': self.region1.pk, 'region': self.region1.pk,
'status': SITE_STATUS_ACTIVE, 'status': SiteStatusChoices.STATUS_ACTIVE,
}, },
{ {
'name': 'Test Site 5', 'name': 'Test Site 5',
'slug': 'test-site-5', 'slug': 'test-site-5',
'region': self.region1.pk, 'region': self.region1.pk,
'status': SITE_STATUS_ACTIVE, 'status': SiteStatusChoices.STATUS_ACTIVE,
}, },
{ {
'name': 'Test Site 6', 'name': 'Test Site 6',
'slug': 'test-site-6', 'slug': 'test-site-6',
'region': self.region1.pk, 'region': self.region1.pk,
'status': SITE_STATUS_ACTIVE, 'status': SiteStatusChoices.STATUS_ACTIVE,
}, },
] ]