#1493: Extended DeviceRole to include a toggle indicating applicability to virtual machines

This commit is contained in:
Jeremy Stretch 2017-09-29 12:11:20 -04:00
parent 0deae84ecb
commit a6599874db
7 changed files with 34 additions and 7 deletions

View File

@ -404,7 +404,7 @@ class DeviceRoleSerializer(ValidatedModelSerializer):
class Meta:
model = DeviceRole
fields = ['id', 'name', 'slug', 'color']
fields = ['id', 'name', 'slug', 'color', 'vm_role']
class NestedDeviceRoleSerializer(serializers.ModelSerializer):

View File

@ -531,7 +531,7 @@ class DeviceRoleForm(BootstrapMixin, forms.ModelForm):
class Meta:
model = DeviceRole
fields = ['name', 'slug', 'color']
fields = ['name', 'slug', 'color', 'vm_role']
#

View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-09-29 16:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dcim', '0044_virtualization'),
]
operations = [
migrations.AddField(
model_name='devicerole',
name='vm_role',
field=models.BooleanField(default=True, help_text='Virtual machines may be assigned to this role', verbose_name='VM Role'),
),
]

View File

@ -743,11 +743,17 @@ class DeviceBayTemplate(models.Model):
class DeviceRole(models.Model):
"""
Devices are organized by functional role; for example, "Core Switch" or "File Server". Each DeviceRole is assigned a
color to be used when displaying rack elevations.
color to be used when displaying rack elevations. The vm_role field determines whether the role is applicable to
virtual machines as well.
"""
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(unique=True)
color = ColorField()
vm_role = models.BooleanField(
default=True,
verbose_name="VM Role",
help_text="Virtual machines may be assigned to this role"
)
class Meta:
ordering = ['name']

View File

@ -369,7 +369,7 @@ class DeviceRoleTable(BaseTable):
class Meta(BaseTable.Meta):
model = DeviceRole
fields = ('pk', 'name', 'device_count', 'color', 'slug', 'actions')
fields = ('pk', 'name', 'device_count', 'color', 'vm_role', 'slug', 'actions')
#

View File

@ -253,7 +253,7 @@ class VirtualMachineCSVForm(forms.ModelForm):
}
)
role = forms.ModelChoiceField(
queryset=DeviceRole.objects.all(),
queryset=DeviceRole.objects.filter(vm_role=True),
required=False,
to_field_name='name',
help_text='Name of functional role',
@ -289,7 +289,7 @@ class VirtualMachineBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
pk = forms.ModelMultipleChoiceField(queryset=VirtualMachine.objects.all(), widget=forms.MultipleHiddenInput)
status = forms.ChoiceField(choices=add_blank_choice(STATUS_CHOICES), required=False, initial='')
cluster = forms.ModelChoiceField(queryset=Cluster.objects.all(), required=False)
role = forms.ModelChoiceField(queryset=DeviceRole.objects.all(), required=False)
role = forms.ModelChoiceField(queryset=DeviceRole.objects.filter(vm_role=True), required=False)
tenant = forms.ModelChoiceField(queryset=Tenant.objects.all(), required=False)
platform = forms.ModelChoiceField(queryset=Platform.objects.all(), required=False)
vcpus = forms.IntegerField(required=False, label='vCPUs')
@ -321,7 +321,7 @@ class VirtualMachineFilterForm(BootstrapMixin, CustomFieldFilterForm):
label='Cluster'
)
role = FilterChoiceField(
queryset=DeviceRole.objects.annotate(filter_count=Count('virtual_machines')),
queryset=DeviceRole.objects.filter(vm_role=True).annotate(filter_count=Count('virtual_machines')),
to_field_name='slug',
null_option=(0, 'None')
)

View File

@ -181,6 +181,7 @@ class VirtualMachine(CreatedUpdatedModel, CustomFieldModel):
)
role = models.ForeignKey(
to='dcim.DeviceRole',
limit_choices_to={'vm_role': True},
on_delete=models.PROTECT,
related_name='virtual_machines',
blank=True,