From ca11b9a2f5d4d4893b8ae9e4ea35652837cb40c4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Dec 2019 20:40:18 -0500 Subject: [PATCH] VirtualMachine.status to slug --- netbox/virtualization/api/serializers.py | 4 +-- netbox/virtualization/choices.py | 24 ++++++++++++++ netbox/virtualization/constants.py | 15 --------- netbox/virtualization/filters.py | 4 +-- netbox/virtualization/forms.py | 8 ++--- .../0011_3569_virtualmachine_fields.py | 33 +++++++++++++++++++ netbox/virtualization/models.py | 17 +++++++--- 7 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 netbox/virtualization/choices.py delete mode 100644 netbox/virtualization/constants.py create mode 100644 netbox/virtualization/migrations/0011_3569_virtualmachine_fields.py diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 98cc63226..8603e31d3 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -10,7 +10,7 @@ from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSer from ipam.models import VLAN from tenancy.api.nested_serializers import NestedTenantSerializer from utilities.api import ChoiceField, SerializedPKRelatedField, ValidatedModelSerializer -from virtualization.constants import VM_STATUS_CHOICES +from virtualization.choices import * from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine from .nested_serializers import * @@ -57,7 +57,7 @@ class ClusterSerializer(TaggitSerializer, CustomFieldModelSerializer): # class VirtualMachineSerializer(TaggitSerializer, CustomFieldModelSerializer): - status = ChoiceField(choices=VM_STATUS_CHOICES, required=False) + status = ChoiceField(choices=VirtualMachineStatusChoices, required=False) site = NestedSiteSerializer(read_only=True) cluster = NestedClusterSerializer() role = NestedDeviceRoleSerializer(required=False, allow_null=True) diff --git a/netbox/virtualization/choices.py b/netbox/virtualization/choices.py new file mode 100644 index 000000000..d96842c35 --- /dev/null +++ b/netbox/virtualization/choices.py @@ -0,0 +1,24 @@ +from utilities.choices import ChoiceSet + + +# +# VirtualMachines +# + +class VirtualMachineStatusChoices(ChoiceSet): + + STATUS_ACTIVE = 'active' + STATUS_OFFLINE = 'offline' + STATUS_STAGED = 'staged' + + CHOICES = ( + (STATUS_ACTIVE, 'Active'), + (STATUS_OFFLINE, 'Offline'), + (STATUS_STAGED, 'Staged'), + ) + + LEGACY_MAP = { + STATUS_OFFLINE: 0, + STATUS_ACTIVE: 1, + STATUS_STAGED: 3, + } diff --git a/netbox/virtualization/constants.py b/netbox/virtualization/constants.py deleted file mode 100644 index 3eeddd066..000000000 --- a/netbox/virtualization/constants.py +++ /dev/null @@ -1,15 +0,0 @@ -from dcim.choices import DeviceStatusChoices - -# VirtualMachine statuses (replicated from Device statuses) -VM_STATUS_CHOICES = [ - [1, 'Active'], - [0, 'Offline'], - [3, 'Staged'], -] - -# Bootstrap CSS classes for VirtualMachine statuses -VM_STATUS_CLASSES = { - 0: 'warning', - 1: 'success', - 3: 'primary', -} diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py index a438d8598..0e21d75f7 100644 --- a/netbox/virtualization/filters.py +++ b/netbox/virtualization/filters.py @@ -10,7 +10,7 @@ from tenancy.filtersets import TenancyFilterSet from utilities.filters import ( MultiValueMACAddressFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter, ) -from .constants import * +from .choices import * from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine @@ -96,7 +96,7 @@ class VirtualMachineFilter(TenancyFilterSet, CustomFieldFilterSet): label='Search', ) status = django_filters.MultipleChoiceFilter( - choices=VM_STATUS_CHOICES, + choices=VirtualMachineStatusChoices, null_value=None ) cluster_group_id = django_filters.ModelMultipleChoiceFilter( diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index 5bfca6654..712c5e1fa 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -15,7 +15,7 @@ from utilities.forms import ( ConfirmationForm, CSVChoiceField, ExpandableNameField, FilterChoiceField, JSONField, SlugField, SmallTextarea, StaticSelect2, StaticSelect2Multiple ) -from .constants import * +from .choices import * from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine VIFACE_TYPE_CHOICES = ( @@ -428,7 +428,7 @@ class VirtualMachineForm(BootstrapMixin, TenancyForm, CustomFieldForm): class VirtualMachineCSVForm(forms.ModelForm): status = CSVChoiceField( - choices=VM_STATUS_CHOICES, + choices=VirtualMachineStatusChoices, required=False, help_text='Operational status of device' ) @@ -481,7 +481,7 @@ class VirtualMachineBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldB widget=forms.MultipleHiddenInput() ) status = forms.ChoiceField( - choices=add_blank_choice(VM_STATUS_CHOICES), + choices=add_blank_choice(VirtualMachineStatusChoices), required=False, initial='', widget=StaticSelect2(), @@ -612,7 +612,7 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFil ) ) status = forms.MultipleChoiceField( - choices=VM_STATUS_CHOICES, + choices=VirtualMachineStatusChoices, required=False, widget=StaticSelect2Multiple() ) diff --git a/netbox/virtualization/migrations/0011_3569_virtualmachine_fields.py b/netbox/virtualization/migrations/0011_3569_virtualmachine_fields.py new file mode 100644 index 000000000..828fee71c --- /dev/null +++ b/netbox/virtualization/migrations/0011_3569_virtualmachine_fields.py @@ -0,0 +1,33 @@ +from django.db import migrations, models + + +VIRTUALMACHINE_STATUS_CHOICES = ( + (0, 'offline'), + (1, 'active'), + (3, 'staged'), +) + + +def virtualmachine_status_to_slug(apps, schema_editor): + VirtualMachine = apps.get_model('virtualization', 'VirtualMachine') + for id, slug in VIRTUALMACHINE_STATUS_CHOICES: + VirtualMachine.objects.filter(status=str(id)).update(status=slug) + + +class Migration(migrations.Migration): + atomic = False + + dependencies = [ + ('virtualization', '0010_cluster_add_tenant'), + ] + + operations = [ + migrations.AlterField( + model_name='virtualmachine', + name='status', + field=models.CharField(default='active', max_length=50), + ), + migrations.RunPython( + code=virtualmachine_status_to_slug + ), + ] diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 790c9c190..09df53344 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -8,7 +8,7 @@ from taggit.managers import TaggableManager from dcim.models import Device from extras.models import ConfigContextModel, CustomFieldModel, TaggedItem from utilities.models import ChangeLoggedModel -from .constants import * +from .choices import * # @@ -193,9 +193,10 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): max_length=64, unique=True ) - status = models.PositiveSmallIntegerField( - choices=VM_STATUS_CHOICES, - default=1, # TODO: Replace with ChoiceSet value + status = models.CharField( + max_length=50, + choices=VirtualMachineStatusChoices, + default=VirtualMachineStatusChoices.STATUS_ACTIVE, verbose_name='Status' ) role = models.ForeignKey( @@ -252,6 +253,12 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): 'name', 'status', 'role', 'cluster', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'comments', ] + STATUS_CLASS_MAP = { + 'active': 'success', + 'offline': 'warning', + 'staged': 'primary', + } + class Meta: ordering = ['name'] @@ -294,7 +301,7 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): ) def get_status_class(self): - return VM_STATUS_CLASSES[self.status] + return self.STATUS_CLASS_MAP.get(self.status) @property def primary_ip(self):