From 57a0cf0a3361c9e5ba8e0a1d63194753d37121fe Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 5 Feb 2020 10:26:22 -0500 Subject: [PATCH] Fix component bulk edit views --- netbox/dcim/forms.py | 12 ++-- netbox/templates/dcim/device.html | 8 ++- .../virtualization/virtualmachine.html | 2 +- netbox/virtualization/forms.py | 56 ++++++++++--------- 4 files changed, 46 insertions(+), 32 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 14e13ad44..4d332e904 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -2499,6 +2499,10 @@ class PowerOutletBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): queryset=PowerOutlet.objects.all(), widget=forms.MultipleHiddenInput() ) + device = forms.ModelChoiceField( + queryset=Device.objects.all(), + widget=forms.HiddenInput() + ) type = forms.ChoiceField( choices=PowerOutletTypeChoices, required=False @@ -2528,8 +2532,6 @@ class PowerOutletBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): if 'device' in self.initial: device = Device.objects.filter(pk=self.initial['device']).first() self.fields['power_port'].queryset = PowerPort.objects.filter(device=device) - else: - self.fields['power_port'].queryset = PowerPort.objects.none() class PowerOutletBulkRenameForm(BulkRenameForm): @@ -2773,6 +2775,10 @@ class InterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): queryset=Interface.objects.all(), widget=forms.MultipleHiddenInput() ) + device = forms.ModelChoiceField( + queryset=Device.objects.all(), + widget=forms.HiddenInput() + ) type = forms.ChoiceField( choices=add_blank_choice(InterfaceTypeChoices), required=False, @@ -2846,8 +2852,6 @@ class InterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): device__in=[device, device.get_vc_master()], type=InterfaceTypeChoices.TYPE_LAG ) - else: - self.fields['lag'].queryset = Interface.objects.none() def clean(self): diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 1c287cdc8..c36671349 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -619,6 +619,7 @@ {% if perms.dcim.delete_consoleserverport %}
{% csrf_token %} + {% endif %}
@@ -679,6 +680,7 @@ {% if perms.dcim.delete_poweroutlet %} {% csrf_token %} + {% endif %}
@@ -738,7 +740,8 @@ {% endif %} {% if front_ports %} - {% csrf_token %} + {% csrf_token %} +
Front Ports @@ -796,7 +799,8 @@ {% endif %} {% if rear_ports %} - {% csrf_token %} + {% csrf_token %} +
Rear Ports diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html index 18488715b..c8253775e 100644 --- a/netbox/templates/virtualization/virtualmachine.html +++ b/netbox/templates/virtualization/virtualmachine.html @@ -288,7 +288,7 @@ - {% endif %} diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index f5ecad119..f9261e8e2 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -835,6 +835,10 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm): 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() @@ -881,37 +885,39 @@ class InterfaceBulkEditForm(BootstrapMixin, BulkEditForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - parent_obj = VirtualMachine.objects.filter(pk=self.initial.get('virtual_machine')).first() + # Limit available VLANs based on the parent VirtualMachine + if 'virtual_machine' in self.initial: + parent_obj = VirtualMachine.objects.filter(pk=self.initial['virtual_machine']).first() - # Limit VLan choices to those in: global vlans, global groups, the current site's group, the current site - vlan_choices = [] - global_vlans = VLAN.objects.filter(site=None, group=None) - vlan_choices.append( - ('Global', [(vlan.pk, vlan) for vlan in global_vlans]) - ) - for group in VLANGroup.objects.filter(site=None): - global_group_vlans = VLAN.objects.filter(group=group) + # Limit VLAN choices to global VLANs, VLANs in global groups, the current site's group, the current site + vlan_choices = [] + global_vlans = VLAN.objects.filter(site=None, group=None) vlan_choices.append( - (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) + ('Global', [(vlan.pk, vlan) for vlan in global_vlans]) ) - if parent_obj.cluster is not None: - site = getattr(parent_obj.cluster, 'site', None) - if site is not None: + for group in VLANGroup.objects.filter(site=None): + global_group_vlans = VLAN.objects.filter(group=group) + vlan_choices.append( + (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) + ) + if parent_obj.cluster is not None: + site = getattr(parent_obj.cluster, 'site', None) + if site is not None: - # Add non-grouped site VLANs - site_vlans = VLAN.objects.filter(site=site, group=None) - vlan_choices.append((site.name, [(vlan.pk, vlan) for vlan in site_vlans])) + # Add non-grouped site VLANs + site_vlans = VLAN.objects.filter(site=site, group=None) + vlan_choices.append((site.name, [(vlan.pk, vlan) for vlan in site_vlans])) - # Add grouped site VLANs - for group in VLANGroup.objects.filter(site=site): - site_group_vlans = VLAN.objects.filter(group=group) - vlan_choices.append(( - '{} / {}'.format(group.site.name, group.name), - [(vlan.pk, vlan) for vlan in site_group_vlans] - )) + # Add grouped site VLANs + for group in VLANGroup.objects.filter(site=site): + site_group_vlans = VLAN.objects.filter(group=group) + vlan_choices.append(( + '{} / {}'.format(group.site.name, group.name), + [(vlan.pk, vlan) for vlan in site_group_vlans] + )) - self.fields['untagged_vlan'].choices = [(None, '---------')] + vlan_choices - self.fields['tagged_vlans'].choices = vlan_choices + self.fields['untagged_vlan'].choices = [(None, '---------')] + vlan_choices + self.fields['tagged_vlans'].choices = vlan_choices #