From 078404fb5971d38d930f0fd2e3e70649bebcd19b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 1 Mar 2018 13:10:36 -0500 Subject: [PATCH] Fixes #1926: Prevent reassignment of parent device when bulk editing VC member interfaces --- netbox/dcim/forms.py | 13 +------------ netbox/utilities/forms.py | 4 +++- netbox/utilities/views.py | 4 ++-- netbox/virtualization/forms.py | 1 - 4 files changed, 6 insertions(+), 16 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 6645b198c..593ffa6c0 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1883,7 +1883,6 @@ class InterfaceCreateForm(ComponentForm, ChainedFieldsMixin): class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm, ChainedFieldsMixin): pk = forms.ModelMultipleChoiceField(queryset=Interface.objects.all(), widget=forms.MultipleHiddenInput) - device = forms.ModelChoiceField(queryset=Device.objects.all(), widget=forms.HiddenInput) form_factor = forms.ChoiceField(choices=add_blank_choice(IFACE_FF_CHOICES), required=False) enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect) lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='Parent LAG') @@ -1943,17 +1942,7 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm, ChainedFieldsMixin): super(InterfaceBulkEditForm, self).__init__(*args, **kwargs) # Limit LAG choices to interfaces which belong to the parent device (or VC master) - device = None - if self.initial.get('device'): - try: - device = Device.objects.get(pk=self.initial.get('device')) - except Device.DoesNotExist: - pass - else: - try: - device = Device.objects.get(pk=self.data.get('device')) - except Device.DoesNotExist: - pass + device = self.parent_obj if device is not None: interface_ordering = device.device_type.interface_ordering self.fields['lag'].queryset = Interface.objects.order_naturally(method=interface_ordering).filter( diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 13e1e10f1..a2bfef001 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -539,9 +539,11 @@ class ComponentForm(BootstrapMixin, forms.Form): class BulkEditForm(forms.Form): - def __init__(self, model, *args, **kwargs): + def __init__(self, model, parent_obj=None, *args, **kwargs): super(BulkEditForm, self).__init__(*args, **kwargs) self.model = model + self.parent_obj = parent_obj + # Copy any nullable fields defined in Meta if hasattr(self.Meta, 'nullable_fields'): self.nullable_fields = [field for field in self.Meta.nullable_fields] diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index ff99a6401..d060e53d7 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -507,7 +507,7 @@ class BulkEditView(View): pk_list = [int(pk) for pk in request.POST.getlist('pk')] if '_apply' in request.POST: - form = self.form(self.cls, request.POST) + form = self.form(self.cls, parent_obj, request.POST) if form.is_valid(): custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else [] @@ -565,7 +565,7 @@ class BulkEditView(View): else: initial_data = request.POST.copy() initial_data['pk'] = pk_list - form = self.form(self.cls, initial=initial_data) + form = self.form(self.cls, parent_obj, initial=initial_data) # Retrieve objects being edited queryset = self.queryset or self.cls.objects.all() diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index 5a2f11763..06b992203 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -442,7 +442,6 @@ class InterfaceCreateForm(ComponentForm): class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm): pk = forms.ModelMultipleChoiceField(queryset=Interface.objects.all(), widget=forms.MultipleHiddenInput) - virtual_machine = forms.ModelChoiceField(queryset=VirtualMachine.objects.all(), widget=forms.HiddenInput) enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect) mtu = forms.IntegerField(required=False, min_value=1, max_value=32767, label='MTU') description = forms.CharField(max_length=100, required=False)