Browse Source

Added a form to edit virtual chassis

Jeremy Stretch 7 years ago
parent
commit
a85b3aa69f

+ 20 - 0
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)

+ 8 - 0
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):

+ 1 - 3
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):

+ 11 - 7
netbox/templates/dcim/device.html

@@ -116,19 +116,23 @@
                                 <a href="{{ vcm.device.get_absolute_url }}">{{ vcm.device }}</a>
                             </td>
                             <td>{{ vcm.position }}</td>
-                            <td>{{ vcm.is_master }}</td>
+                            <td>{% if vcm.is_master %}<i class="fa fa-check"></i>{% endif %}</td>
                             <td>{{ vcm.priority|default:"" }}</td>
-                            <td>
                         </tr>
                     {% endfor %}
                 </table>
-                {% if perms.dcim.delete_virtualchassis %}
-                    <div class="panel-footer text-right">
-                        <a href="{% url 'dcim:virtualchassis_delete' pk=device.virtual_chassis.pk %}" class="btn btn-danger btn-xs">
+                <div class="panel-footer text-right">
+                    {% if perms.dcim.change_virtualchassis %}
+                        <a href="{% url 'dcim:virtualchassis_edit' pk=device.virtual_chassis.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
+                            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Edit Virtual Chassis
+                        </a>
+                    {% endif %}
+                    {% if perms.dcim.delete_virtualchassis %}
+                        <a href="{% url 'dcim:virtualchassis_delete' pk=device.virtual_chassis.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
                             <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete Virtual Chassis
                         </a>
-                    </div>
-                {% endif %}
+                    {% endif %}
+                </div>
             </div>
         {% endif %}
         <div class="panel panel-default">

+ 11 - 0
netbox/templates/dcim/virtualchassis_edit.html

@@ -0,0 +1,11 @@
+{% extends 'utilities/obj_edit.html' %}
+{% load form_helpers %}
+
+{% block form %}
+    <div class="panel panel-default">
+        <div class="panel-heading"><strong>{{ obj_type|capfirst }}</strong></div>
+        <div class="panel-body">
+            {% render_form form %}
+        </div>
+    </div>
+{% endblock %}