mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 17:08:41 -06:00
Update component model forms to use DynamicModelChoiceField query_params for related objects
This commit is contained in:
parent
a237c01b4b
commit
ba85101d30
@ -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(
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user