mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Fixes #1926: Prevent reassignment of parent device when bulk editing VC member interfaces
This commit is contained in:
@ -1883,7 +1883,6 @@ class InterfaceCreateForm(ComponentForm, ChainedFieldsMixin):
|
|||||||
|
|
||||||
class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm, ChainedFieldsMixin):
|
class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm, ChainedFieldsMixin):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Interface.objects.all(), widget=forms.MultipleHiddenInput)
|
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)
|
form_factor = forms.ChoiceField(choices=add_blank_choice(IFACE_FF_CHOICES), required=False)
|
||||||
enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect)
|
enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect)
|
||||||
lag = forms.ModelChoiceField(queryset=Interface.objects.all(), required=False, label='Parent LAG')
|
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)
|
super(InterfaceBulkEditForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
# Limit LAG choices to interfaces which belong to the parent device (or VC master)
|
# Limit LAG choices to interfaces which belong to the parent device (or VC master)
|
||||||
device = None
|
device = self.parent_obj
|
||||||
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
|
|
||||||
if device is not None:
|
if device is not None:
|
||||||
interface_ordering = device.device_type.interface_ordering
|
interface_ordering = device.device_type.interface_ordering
|
||||||
self.fields['lag'].queryset = Interface.objects.order_naturally(method=interface_ordering).filter(
|
self.fields['lag'].queryset = Interface.objects.order_naturally(method=interface_ordering).filter(
|
||||||
|
@ -539,9 +539,11 @@ class ComponentForm(BootstrapMixin, forms.Form):
|
|||||||
|
|
||||||
class BulkEditForm(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)
|
super(BulkEditForm, self).__init__(*args, **kwargs)
|
||||||
self.model = model
|
self.model = model
|
||||||
|
self.parent_obj = parent_obj
|
||||||
|
|
||||||
# Copy any nullable fields defined in Meta
|
# Copy any nullable fields defined in Meta
|
||||||
if hasattr(self.Meta, 'nullable_fields'):
|
if hasattr(self.Meta, 'nullable_fields'):
|
||||||
self.nullable_fields = [field for field in self.Meta.nullable_fields]
|
self.nullable_fields = [field for field in self.Meta.nullable_fields]
|
||||||
|
@ -507,7 +507,7 @@ class BulkEditView(View):
|
|||||||
pk_list = [int(pk) for pk in request.POST.getlist('pk')]
|
pk_list = [int(pk) for pk in request.POST.getlist('pk')]
|
||||||
|
|
||||||
if '_apply' in request.POST:
|
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():
|
if form.is_valid():
|
||||||
|
|
||||||
custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else []
|
custom_fields = form.custom_fields if hasattr(form, 'custom_fields') else []
|
||||||
@ -565,7 +565,7 @@ class BulkEditView(View):
|
|||||||
else:
|
else:
|
||||||
initial_data = request.POST.copy()
|
initial_data = request.POST.copy()
|
||||||
initial_data['pk'] = pk_list
|
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
|
# Retrieve objects being edited
|
||||||
queryset = self.queryset or self.cls.objects.all()
|
queryset = self.queryset or self.cls.objects.all()
|
||||||
|
@ -442,7 +442,6 @@ class InterfaceCreateForm(ComponentForm):
|
|||||||
|
|
||||||
class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
|
class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Interface.objects.all(), widget=forms.MultipleHiddenInput)
|
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)
|
enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect)
|
||||||
mtu = forms.IntegerField(required=False, min_value=1, max_value=32767, label='MTU')
|
mtu = forms.IntegerField(required=False, min_value=1, max_value=32767, label='MTU')
|
||||||
description = forms.CharField(max_length=100, required=False)
|
description = forms.CharField(max_length=100, required=False)
|
||||||
|
Reference in New Issue
Block a user