Update component model forms to use DynamicModelChoiceField query_params for related objects

This commit is contained in:
jeremystretch 2021-12-27 21:25:47 -05:00
parent a237c01b4b
commit ba85101d30
3 changed files with 87 additions and 102 deletions

View File

@ -957,6 +957,7 @@ class ConsolePortTemplateForm(BootstrapMixin, forms.ModelForm):
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
'module_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(),
'type': StaticSelect,
} }
@ -969,6 +970,7 @@ class ConsoleServerPortTemplateForm(BootstrapMixin, forms.ModelForm):
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
'module_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(),
'type': StaticSelect,
} }
@ -981,10 +983,19 @@ class PowerPortTemplateForm(BootstrapMixin, forms.ModelForm):
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
'module_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(),
'type': StaticSelect(),
} }
class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm): class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm):
power_port = DynamicModelChoiceField(
queryset=PowerPortTemplate.objects.all(),
required=False,
query_params={
'devicetype_id': '$device_type',
}
)
class Meta: class Meta:
model = PowerOutletTemplate model = PowerOutletTemplate
fields = [ fields = [
@ -993,18 +1004,10 @@ class PowerOutletTemplateForm(BootstrapMixin, forms.ModelForm):
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
'module_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(),
'type': StaticSelect(),
'feed_leg': StaticSelect(),
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Limit power_port choices to current DeviceType/ModuleType
if self.instance.pk:
self.fields['power_port'].queryset = PowerPortTemplate.objects.filter(
device_type=self.instance.device_type,
module_type=self.instance.module_type
)
class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm): class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm):
class Meta: class Meta:
@ -1020,6 +1023,14 @@ class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm):
class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm): class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm):
rear_port = DynamicModelChoiceField(
queryset=RearPortTemplate.objects.all(),
required=False,
query_params={
'devicetype_id': '$device_type',
}
)
class Meta: class Meta:
model = FrontPortTemplate model = FrontPortTemplate
fields = [ fields = [
@ -1029,19 +1040,9 @@ class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm):
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
'module_type': forms.HiddenInput(), 'module_type': forms.HiddenInput(),
'rear_port': StaticSelect(), 'type': StaticSelect(),
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Limit rear_port choices to current DeviceType/ModuleType
if self.instance.pk:
self.fields['rear_port'].queryset = RearPortTemplate.objects.filter(
device_type=self.instance.device_type,
module_type=self.instance.module_type
)
class RearPortTemplateForm(BootstrapMixin, forms.ModelForm): class RearPortTemplateForm(BootstrapMixin, forms.ModelForm):
class Meta: class Meta:
@ -1095,6 +1096,7 @@ class ConsolePortForm(CustomFieldModelForm):
] ]
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
'type': StaticSelect(),
} }
@ -1111,6 +1113,7 @@ class ConsoleServerPortForm(CustomFieldModelForm):
] ]
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
'type': StaticSelect(),
} }
@ -1128,13 +1131,17 @@ class PowerPortForm(CustomFieldModelForm):
] ]
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
'type': StaticSelect(),
} }
class PowerOutletForm(CustomFieldModelForm): class PowerOutletForm(CustomFieldModelForm):
power_port = forms.ModelChoiceField( power_port = DynamicModelChoiceField(
queryset=PowerPort.objects.all(), queryset=PowerPort.objects.all(),
required=False required=False,
query_params={
'device_id': '$device',
}
) )
tags = DynamicModelMultipleChoiceField( tags = DynamicModelMultipleChoiceField(
queryset=Tag.objects.all(), queryset=Tag.objects.all(),
@ -1148,34 +1155,34 @@ class PowerOutletForm(CustomFieldModelForm):
] ]
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
'type': StaticSelect(),
'feed_leg': StaticSelect(),
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Limit power_port choices to the local device
if hasattr(self.instance, 'device'):
self.fields['power_port'].queryset = PowerPort.objects.filter(
device=self.instance.device
)
class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm): class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
parent = DynamicModelChoiceField( parent = DynamicModelChoiceField(
queryset=Interface.objects.all(), queryset=Interface.objects.all(),
required=False, required=False,
label='Parent interface' label='Parent interface',
query_params={
'device_id': '$device',
}
) )
bridge = DynamicModelChoiceField( bridge = DynamicModelChoiceField(
queryset=Interface.objects.all(), queryset=Interface.objects.all(),
required=False, required=False,
label='Bridged interface' label='Bridged interface',
query_params={
'device_id': '$device',
}
) )
lag = DynamicModelChoiceField( lag = DynamicModelChoiceField(
queryset=Interface.objects.all(), queryset=Interface.objects.all(),
required=False, required=False,
label='LAG interface', label='LAG interface',
query_params={ query_params={
'device_id': '$device',
'type': 'lag', 'type': 'lag',
} }
) )
@ -1203,6 +1210,7 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
label='Untagged VLAN', label='Untagged VLAN',
query_params={ query_params={
'group_id': '$vlan_group', 'group_id': '$vlan_group',
'available_on_device': '$device',
} }
) )
tagged_vlans = DynamicModelMultipleChoiceField( tagged_vlans = DynamicModelMultipleChoiceField(
@ -1211,6 +1219,7 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
label='Tagged VLANs', label='Tagged VLANs',
query_params={ query_params={
'group_id': '$vlan_group', 'group_id': '$vlan_group',
'available_on_device': '$device',
} }
) )
tags = DynamicModelMultipleChoiceField( tags = DynamicModelMultipleChoiceField(
@ -1241,26 +1250,15 @@ class InterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
'rf_channel_width': "Populated by selected channel (if set)", 'rf_channel_width': "Populated by selected channel (if set)",
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
device = Device.objects.get(pk=self.data['device']) if self.is_bound else self.instance.device
# Restrict parent/bridge/LAG interface assignment by device/VC
self.fields['parent'].widget.add_query_param('device_id', device.pk)
self.fields['bridge'].widget.add_query_param('device_id', device.pk)
self.fields['lag'].widget.add_query_param('device_id', device.pk)
if device.virtual_chassis and device.virtual_chassis.master:
self.fields['parent'].widget.add_query_param('device_id', device.virtual_chassis.master.pk)
self.fields['bridge'].widget.add_query_param('device_id', device.virtual_chassis.master.pk)
self.fields['lag'].widget.add_query_param('device_id', device.virtual_chassis.master.pk)
# Limit VLAN choices by device
self.fields['untagged_vlan'].widget.add_query_param('available_on_device', device.pk)
self.fields['tagged_vlans'].widget.add_query_param('available_on_device', device.pk)
class FrontPortForm(CustomFieldModelForm): class FrontPortForm(CustomFieldModelForm):
rear_port = DynamicModelChoiceField(
queryset=RearPort.objects.all(),
required=False,
query_params={
'device_id': '$device',
}
)
tags = DynamicModelMultipleChoiceField( tags = DynamicModelMultipleChoiceField(
queryset=Tag.objects.all(), queryset=Tag.objects.all(),
required=False required=False
@ -1275,18 +1273,8 @@ class FrontPortForm(CustomFieldModelForm):
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
'type': StaticSelect(), 'type': StaticSelect(),
'rear_port': StaticSelect(),
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Limit RearPort choices to the local device
if hasattr(self.instance, 'device'):
self.fields['rear_port'].queryset = self.fields['rear_port'].queryset.filter(
device=self.instance.device
)
class RearPortForm(CustomFieldModelForm): class RearPortForm(CustomFieldModelForm):
tags = DynamicModelMultipleChoiceField( tags = DynamicModelMultipleChoiceField(

View File

@ -2000,33 +2000,34 @@ class InterfaceView(generic.ObjectView):
class InterfaceCreateView(generic.ComponentCreateView): class InterfaceCreateView(generic.ComponentCreateView):
queryset = Interface.objects.all() queryset = Interface.objects.all()
model_form = forms.InterfaceForm model_form = forms.InterfaceForm
template_name = 'dcim/interface_create.html' # template_name = 'dcim/interface_create.html'
def post(self, request): # TODO: Figure out what to do with this
""" # def post(self, request):
Override inherited post() method to handle request to assign newly created # """
interface objects (first object) to an IP Address object. # Override inherited post() method to handle request to assign newly created
""" # interface objects (first object) to an IP Address object.
form = self.form(request.POST, initial=request.GET) # """
new_objs = self.validate_form(request, form) # form = self.form(request.POST, initial=request.GET)
# new_objs = self.validate_form(request, form)
if form.is_valid() and not form.errors: #
if '_addanother' in request.POST: # if form.is_valid() and not form.errors:
return redirect(request.get_full_path()) # if '_addanother' in request.POST:
elif new_objs is not None and '_assignip' in request.POST and len(new_objs) >= 1 and \ # return redirect(request.get_full_path())
request.user.has_perm('ipam.add_ipaddress'): # elif new_objs is not None and '_assignip' in request.POST and len(new_objs) >= 1 and \
first_obj = new_objs[0].pk # request.user.has_perm('ipam.add_ipaddress'):
return redirect( # first_obj = new_objs[0].pk
f'/ipam/ip-addresses/add/?interface={first_obj}&return_url={self.get_return_url(request)}' # return redirect(
) # f'/ipam/ip-addresses/add/?interface={first_obj}&return_url={self.get_return_url(request)}'
else: # )
return redirect(self.get_return_url(request)) # else:
# return redirect(self.get_return_url(request))
return render(request, self.template_name, { #
'obj_type': self.queryset.model._meta.verbose_name, # return render(request, self.template_name, {
'form': form, # 'obj_type': self.queryset.model._meta.verbose_name,
'return_url': self.get_return_url(request), # 'form': form,
}) # 'return_url': self.get_return_url(request),
# })
class InterfaceEditView(generic.ObjectEditView): class InterfaceEditView(generic.ObjectEditView):

View File

@ -275,12 +275,18 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
parent = DynamicModelChoiceField( parent = DynamicModelChoiceField(
queryset=VMInterface.objects.all(), queryset=VMInterface.objects.all(),
required=False, required=False,
label='Parent interface' label='Parent interface',
query_params={
'virtual_machine_id': '$virtual_machine',
}
) )
bridge = DynamicModelChoiceField( bridge = DynamicModelChoiceField(
queryset=VMInterface.objects.all(), queryset=VMInterface.objects.all(),
required=False, required=False,
label='Bridged interface' label='Bridged interface',
query_params={
'virtual_machine_id': '$virtual_machine',
}
) )
vlan_group = DynamicModelChoiceField( vlan_group = DynamicModelChoiceField(
queryset=VLANGroup.objects.all(), queryset=VLANGroup.objects.all(),
@ -293,6 +299,7 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
label='Untagged VLAN', label='Untagged VLAN',
query_params={ query_params={
'group_id': '$vlan_group', 'group_id': '$vlan_group',
'available_on_virtualmachine': '$virtual_machine',
} }
) )
tagged_vlans = DynamicModelMultipleChoiceField( tagged_vlans = DynamicModelMultipleChoiceField(
@ -301,6 +308,7 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
label='Tagged VLANs', label='Tagged VLANs',
query_params={ query_params={
'group_id': '$vlan_group', 'group_id': '$vlan_group',
'available_on_virtualmachine': '$virtual_machine',
} }
) )
tags = DynamicModelMultipleChoiceField( tags = DynamicModelMultipleChoiceField(
@ -324,15 +332,3 @@ class VMInterfaceForm(InterfaceCommonForm, CustomFieldModelForm):
help_texts = { help_texts = {
'mode': INTERFACE_MODE_HELP_TEXT, 'mode': INTERFACE_MODE_HELP_TEXT,
} }
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
vm_id = self.initial.get('virtual_machine') or self.data.get('virtual_machine')
# Restrict parent interface assignment by VM
self.fields['parent'].widget.add_query_param('virtual_machine_id', vm_id)
self.fields['bridge'].widget.add_query_param('virtual_machine_id', vm_id)
# Limit VLAN choices by virtual machine
self.fields['untagged_vlan'].widget.add_query_param('available_on_virtualmachine', vm_id)
self.fields['tagged_vlans'].widget.add_query_param('available_on_virtualmachine', vm_id)