From a85b3aa69f66031a128764b20f2c215cc12838ab Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2017 17:05:03 -0500 Subject: [PATCH] Added a form to edit virtual chassis --- netbox/dcim/forms.py | 20 +++++++++++++++++++ netbox/dcim/models.py | 8 ++++++++ netbox/dcim/views.py | 4 +--- netbox/templates/dcim/device.html | 18 ++++++++++------- .../templates/dcim/virtualchassis_edit.html | 11 ++++++++++ 5 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 netbox/templates/dcim/virtualchassis_edit.html diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 529d9c8d8..e5631a04c 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -2177,11 +2177,31 @@ class InventoryItemForm(BootstrapMixin, forms.ModelForm): # class VirtualChassisForm(BootstrapMixin, forms.ModelForm): + master = forms.ModelChoiceField(queryset=Device.objects.all()) class Meta: model = VirtualChassis fields = ['domain'] + def __init__(self, *args, **kwargs): + super(VirtualChassisForm, self).__init__(*args, **kwargs) + + if self.instance: + vc_memberships = self.instance.memberships.all() + self.fields['master'].queryset = Device.objects.filter(pk__in=[vcm.device_id for vcm in vc_memberships]) + self.initial['master'] = self.instance.master + + def save(self, commit=True): + instance = super(VirtualChassisForm, self).save(commit=commit) + + # Update the master membership if it has been changed + master = self.cleaned_data['master'] + if instance.pk and instance.master != master: + VCMembership.objects.filter(virtual_chassis=self.instance).update(is_master=False) + VCMembership.objects.filter(virtual_chassis=self.instance, device=master).update(is_master=True) + + return instance + class DeviceSelectionForm(forms.Form): pk = forms.ModelMultipleChoiceField(queryset=Device.objects.all(), widget=forms.MultipleHiddenInput) diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index b4f78dacc..ec267c297 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1503,9 +1503,17 @@ class VirtualChassis(models.Model): blank=True ) + def __str__(self): + return self.master.name + def get_absolute_url(self): return "{}?virtual_chassis={}".format(reverse('dcim:device_list'), self.pk) + @property + def master(self): + master_vcm = VCMembership.objects.filter(virtual_chassis=self, is_master=True).first() + return master_vcm.device if master_vcm else None + @python_2_unicode_compatible class VCMembership(models.Model): diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 7f17af435..bc90be536 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1895,9 +1895,7 @@ class VirtualChassisEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_virtualchassis' model = VirtualChassis model_form = forms.VirtualChassisForm - - def get_return_url(self, request, obj): - return reverse('dcim:virtualchassis_list') + template_name = 'dcim/virtualchassis_edit.html' class VirtualChassisDeleteView(PermissionRequiredMixin, ObjectDeleteView): diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index dedc8ec54..a1f2576fb 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -116,19 +116,23 @@ {{ vcm.device }} {{ vcm.position }} - {{ vcm.is_master }} + {% if vcm.is_master %}{% endif %} {{ vcm.priority|default:"" }} - {% endfor %} - {% if perms.dcim.delete_virtualchassis %} - {% endif %}
diff --git a/netbox/templates/dcim/virtualchassis_edit.html b/netbox/templates/dcim/virtualchassis_edit.html new file mode 100644 index 000000000..a2627c0b3 --- /dev/null +++ b/netbox/templates/dcim/virtualchassis_edit.html @@ -0,0 +1,11 @@ +{% extends 'utilities/obj_edit.html' %} +{% load form_helpers %} + +{% block form %} +
+
{{ obj_type|capfirst }}
+
+ {% render_form form %} +
+
+{% endblock %}