From 57d35181f086a676256b931984cc79a938d1508b Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 12 Sep 2019 11:13:40 -0500 Subject: [PATCH] Fix performance issues when creating/editing interfaces due to unfiltered vlan queryset --- netbox/dcim/forms.py | 91 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 774b69741..cdb4cfa4d 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -2189,6 +2189,36 @@ class InterfaceForm(InterfaceCommonForm, BootstrapMixin, forms.ModelForm): device__in=[self.instance.device, self.instance.device.get_vc_master()], type=IFACE_TYPE_LAG ) + # 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) + vlan_choices.append( + (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) + ) + + site = getattr(self.instance.device, '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 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 = vlan_choices + self.fields['tagged_vlans'].choices = vlan_choices + class InterfaceCreateForm(InterfaceCommonForm, ComponentForm, forms.Form): name_pattern = ExpandableNameField( @@ -2269,6 +2299,37 @@ class InterfaceCreateForm(InterfaceCommonForm, ComponentForm, forms.Form): else: self.fields['lag'].queryset = Interface.objects.none() + # 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) + vlan_choices.append( + (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) + ) + + site = getattr(self.parent, '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 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 = vlan_choices + self.fields['tagged_vlans'].choices = vlan_choices + + class InterfaceBulkEditForm(InterfaceCommonForm, BootstrapMixin, AddRemoveTagsForm, BulkEditForm): pk = forms.ModelMultipleChoiceField( @@ -2351,6 +2412,36 @@ class InterfaceBulkEditForm(InterfaceCommonForm, BootstrapMixin, AddRemoveTagsFo else: self.fields['lag'].choices = [] + # 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) + vlan_choices.append( + (group.name, [(vlan.pk, vlan) for vlan in global_group_vlans]) + ) + if self.parent_obj is not None: + site = getattr(self.parent_obj, '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 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 = vlan_choices + self.fields['tagged_vlans'].choices = vlan_choices + class InterfaceBulkRenameForm(BulkRenameForm): pk = forms.ModelMultipleChoiceField(