Jeremy Stretch 6 лет назад
Родитель
Сommit
5c95927a43

+ 1 - 1
netbox/dcim/api/serializers.py

@@ -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)

+ 23 - 0
netbox/dcim/choices.py

@@ -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
 #
 #

+ 0 - 10
netbox/dcim/constants.py

@@ -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',

+ 1 - 1
netbox/dcim/filters.py

@@ -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(

+ 3 - 3
netbox/dcim/forms.py

@@ -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()
     )
     )

+ 20 - 0
netbox/dcim/migrations/0078_3569_site_fields.py

@@ -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
+        ),
     ]
     ]

+ 11 - 4
netbox/dcim/models.py

@@ -245,9 +245,10 @@ class Site(ChangeLoggedModel, CustomFieldModel):
     slug = models.SlugField(
     slug = models.SlugField(
         unique=True
         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(
     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)
 
 
 
 
 #
 #

+ 5 - 5
netbox/dcim/tests/test_api.py

@@ -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,
             },
             },
         ]
         ]