Closes #704: Allow filtering VLANs by group when editing prefixes

This commit is contained in:
Jeremy Stretch 2017-06-09 14:15:12 -04:00
parent 9e1d03b383
commit 05a796faf1
3 changed files with 32 additions and 5 deletions

View File

@ -180,6 +180,18 @@ class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldForm):
required=False, required=False,
label='Site', label='Site',
widget=forms.Select( widget=forms.Select(
attrs={'filter-for': 'vlan_group', 'nullable': 'true'}
)
)
vlan_group = ChainedModelChoiceField(
queryset=VLANGroup.objects.all(),
chains=(
('site', 'site'),
),
required=False,
label='VLAN group',
widget=APISelect(
api_url='/api/ipam/vlan-groups/?site_id={{site}}',
attrs={'filter-for': 'vlan', 'nullable': 'true'} attrs={'filter-for': 'vlan', 'nullable': 'true'}
) )
) )
@ -187,11 +199,12 @@ class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldForm):
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
chains=( chains=(
('site', 'site'), ('site', 'site'),
('group', 'vlan_group'),
), ),
required=False, required=False,
label='VLAN', label='VLAN',
widget=APISelect( widget=APISelect(
api_url='/api/ipam/vlans/?site_id={{site}}', display_field='display_name' api_url='/api/ipam/vlans/?site_id={{site}}&group_id={{vlan_group}}', display_field='display_name'
) )
) )
@ -200,6 +213,14 @@ class PrefixForm(BootstrapMixin, TenancyForm, CustomFieldForm):
fields = ['prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'description', 'tenant_group', 'tenant'] fields = ['prefix', 'vrf', 'site', 'vlan', 'status', 'role', 'is_pool', 'description', 'tenant_group', 'tenant']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# Initialize helper selectors
instance = kwargs.get('instance')
initial = kwargs.get('initial', {})
if instance and instance.vlan is not None:
initial['vlan_group'] = instance.vlan.group
kwargs['initial'] = initial
super(PrefixForm, self).__init__(*args, **kwargs) super(PrefixForm, self).__init__(*args, **kwargs)
self.fields['vrf'].empty_label = 'Global' self.fields['vrf'].empty_label = 'Global'

View File

@ -8,13 +8,19 @@
{% render_field form.prefix %} {% render_field form.prefix %}
{% render_field form.status %} {% render_field form.status %}
{% render_field form.vrf %} {% render_field form.vrf %}
{% render_field form.site %}
{% render_field form.vlan %}
{% render_field form.role %} {% render_field form.role %}
{% render_field form.description %} {% render_field form.description %}
{% render_field form.is_pool %} {% render_field form.is_pool %}
</div> </div>
</div> </div>
<div class="panel panel-default">
<div class="panel-heading"><strong>Site/VLAN Assignment</strong></div>
<div class="panel-body">
{% render_field form.site %}
{% render_field form.vlan_group %}
{% render_field form.vlan %}
</div>
</div>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"><strong>Tenancy</strong></div> <div class="panel-heading"><strong>Tenancy</strong></div>
<div class="panel-body"> <div class="panel-body">

View File

@ -478,8 +478,8 @@ class ChainedFieldsMixin(forms.BaseForm):
filters_dict = {} filters_dict = {}
for (db_field, parent_field) in field.chains: for (db_field, parent_field) in field.chains:
if self.is_bound and self.data.get(parent_field): if self.is_bound and parent_field in self.data:
filters_dict[db_field] = self.data[parent_field] filters_dict[db_field] = self.data[parent_field] or None
elif self.initial.get(parent_field): elif self.initial.get(parent_field):
filters_dict[db_field] = self.initial[parent_field] filters_dict[db_field] = self.initial[parent_field]
elif self.fields[parent_field].widget.attrs.get('nullable'): elif self.fields[parent_field].widget.attrs.get('nullable'):