Replace extraneous form fields with selector widgets

This commit is contained in:
jeremystretch 2023-03-06 17:06:04 -05:00
parent 967df9d9b1
commit 15ed9b7492
12 changed files with 76 additions and 495 deletions

View File

@ -1,7 +1,7 @@
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from circuits.models import * from circuits.models import *
from dcim.models import Region, Site, SiteGroup from dcim.models import Site
from ipam.models import ASN from ipam.models import ASN
from netbox.forms import NetBoxModelForm from netbox.forms import NetBoxModelForm
from tenancy.forms import TenancyForm from tenancy.forms import TenancyForm
@ -114,50 +114,22 @@ class CircuitTerminationForm(NetBoxModelForm):
'provider_id': '$provider', 'provider_id': '$provider',
}, },
) )
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
query_params={
'region_id': '$region',
'group_id': '$site_group',
},
required=False
)
provider_network_provider = DynamicModelChoiceField(
queryset=Provider.objects.all(),
required=False, required=False,
label='Provider', selector=True
initial_params={
'networks': 'provider_network'
}
) )
provider_network = DynamicModelChoiceField( provider_network = DynamicModelChoiceField(
queryset=ProviderNetwork.objects.all(), queryset=ProviderNetwork.objects.all(),
query_params={ required=False,
'provider_id': '$provider_network_provider', selector=True
},
required=False
) )
class Meta: class Meta:
model = CircuitTermination model = CircuitTermination
fields = [ fields = [
'provider', 'circuit', 'term_side', 'region', 'site_group', 'site', 'provider_network_provider', 'provider', 'circuit', 'term_side', 'site', 'provider_network', 'mark_connected', 'port_speed',
'provider_network', 'mark_connected', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'tags',
'description', 'tags',
] ]
widgets = { widgets = {
'port_speed': SelectSpeedWidget(), 'port_speed': SelectSpeedWidget(),

View File

@ -16,7 +16,7 @@ from utilities.forms import (
DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SelectWithPK, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SelectWithPK,
SlugField, SelectSpeedWidget SlugField, SelectSpeedWidget
) )
from virtualization.models import Cluster, ClusterGroup from virtualization.models import Cluster
from wireless.models import WirelessLAN, WirelessLANGroup from wireless.models import WirelessLAN, WirelessLANGroup
from .common import InterfaceCommonForm, ModuleCommonForm from .common import InterfaceCommonForm, ModuleCommonForm
@ -157,26 +157,9 @@ class SiteForm(TenancyForm, NetBoxModelForm):
class LocationForm(TenancyForm, NetBoxModelForm): class LocationForm(TenancyForm, NetBoxModelForm):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
query_params={ selector=True
'region_id': '$region',
'group_id': '$site_group',
}
) )
parent = DynamicModelChoiceField( parent = DynamicModelChoiceField(
queryset=Location.objects.all(), queryset=Location.objects.all(),
@ -188,17 +171,14 @@ class LocationForm(TenancyForm, NetBoxModelForm):
slug = SlugField() slug = SlugField()
fieldsets = ( fieldsets = (
('Location', ( ('Location', ('site', 'parent', 'name', 'slug', 'status', 'description', 'tags')),
'region', 'site_group', 'site', 'parent', 'name', 'slug', 'status', 'description', 'tags',
)),
('Tenancy', ('tenant_group', 'tenant')), ('Tenancy', ('tenant_group', 'tenant')),
) )
class Meta: class Meta:
model = Location model = Location
fields = ( fields = (
'region', 'site_group', 'site', 'parent', 'name', 'slug', 'status', 'description', 'tenant_group', 'tenant', 'site', 'parent', 'name', 'slug', 'status', 'description', 'tenant_group', 'tenant', 'tags',
'tags',
) )
@ -219,26 +199,9 @@ class RackRoleForm(NetBoxModelForm):
class RackForm(TenancyForm, NetBoxModelForm): class RackForm(TenancyForm, NetBoxModelForm):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
query_params={ selector=True
'region_id': '$region',
'group_id': '$site_group',
}
) )
location = DynamicModelChoiceField( location = DynamicModelChoiceField(
queryset=Location.objects.all(), queryset=Location.objects.all(),
@ -256,48 +219,16 @@ class RackForm(TenancyForm, NetBoxModelForm):
class Meta: class Meta:
model = Rack model = Rack
fields = [ fields = [
'region', 'site_group', 'site', 'location', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', 'site', 'location', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', 'role', 'serial',
'role', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit',
'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags',
] ]
class RackReservationForm(TenancyForm, NetBoxModelForm): class RackReservationForm(TenancyForm, NetBoxModelForm):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField(
queryset=Site.objects.all(),
required=False,
query_params={
'region_id': '$region',
'group_id': '$site_group',
}
)
location = DynamicModelChoiceField(
queryset=Location.objects.all(),
required=False,
query_params={
'site_id': '$site'
}
)
rack = DynamicModelChoiceField( rack = DynamicModelChoiceField(
queryset=Rack.objects.all(), queryset=Rack.objects.all(),
query_params={ selector=True
'site_id': '$site',
'location_id': '$location',
}
) )
units = NumericArrayField( units = NumericArrayField(
base_field=forms.IntegerField(), base_field=forms.IntegerField(),
@ -311,15 +242,14 @@ class RackReservationForm(TenancyForm, NetBoxModelForm):
comments = CommentField() comments = CommentField()
fieldsets = ( fieldsets = (
('Reservation', ('region', 'site_group', 'site', 'location', 'rack', 'units', 'user', 'description', 'tags')), ('Reservation', ('rack', 'units', 'user', 'description', 'tags')),
('Tenancy', ('tenant_group', 'tenant')), ('Tenancy', ('tenant_group', 'tenant')),
) )
class Meta: class Meta:
model = RackReservation model = RackReservation
fields = [ fields = [
'region', 'site_group', 'site', 'location', 'rack', 'units', 'user', 'tenant_group', 'tenant', 'rack', 'units', 'user', 'tenant_group', 'tenant', 'description', 'comments', 'tags',
'description', 'comments', 'tags',
] ]
@ -443,7 +373,7 @@ class PlatformForm(NetBoxModelForm):
class DeviceForm(TenancyForm, NetBoxModelForm): class DeviceForm(TenancyForm, NetBoxModelForm):
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
with_selector=True selector=True
) )
location = DynamicModelChoiceField( location = DynamicModelChoiceField(
queryset=Location.objects.all(), queryset=Location.objects.all(),
@ -476,7 +406,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm):
) )
device_type = DynamicModelChoiceField( device_type = DynamicModelChoiceField(
queryset=DeviceType.objects.all(), queryset=DeviceType.objects.all(),
with_selector=True selector=True
) )
device_role = DynamicModelChoiceField( device_role = DynamicModelChoiceField(
queryset=DeviceRole.objects.all() queryset=DeviceRole.objects.all()
@ -488,7 +418,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm):
cluster = DynamicModelChoiceField( cluster = DynamicModelChoiceField(
queryset=Cluster.objects.all(), queryset=Cluster.objects.all(),
required=False, required=False,
with_selector=True selector=True
) )
comments = CommentField() comments = CommentField()
local_context_data = JSONField( local_context_data = JSONField(
@ -498,7 +428,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm):
virtual_chassis = DynamicModelChoiceField( virtual_chassis = DynamicModelChoiceField(
queryset=VirtualChassis.objects.all(), queryset=VirtualChassis.objects.all(),
required=False, required=False,
with_selector=True selector=True
) )
vc_position = forms.IntegerField( vc_position = forms.IntegerField(
required=False, required=False,
@ -594,18 +524,9 @@ class ModuleForm(ModuleCommonForm, NetBoxModelForm):
'device_id': '$device' 'device_id': '$device'
} }
) )
manufacturer = DynamicModelChoiceField(
queryset=Manufacturer.objects.all(),
required=False,
initial_params={
'module_types': '$module_type'
}
)
module_type = DynamicModelChoiceField( module_type = DynamicModelChoiceField(
queryset=ModuleType.objects.all(), queryset=ModuleType.objects.all(),
query_params={ selector=True
'manufacturer_id': '$manufacturer'
}
) )
comments = CommentField() comments = CommentField()
replicate_components = forms.BooleanField( replicate_components = forms.BooleanField(
@ -613,7 +534,6 @@ class ModuleForm(ModuleCommonForm, NetBoxModelForm):
initial=True, initial=True,
help_text=_("Automatically populate components associated with this module type") help_text=_("Automatically populate components associated with this module type")
) )
adopt_components = forms.BooleanField( adopt_components = forms.BooleanField(
required=False, required=False,
initial=False, initial=False,
@ -621,9 +541,7 @@ class ModuleForm(ModuleCommonForm, NetBoxModelForm):
) )
fieldsets = ( fieldsets = (
('Module', ( ('Module', ('device', 'module_bay', 'module_type', 'status', 'description', 'tags')),
'device', 'module_bay', 'manufacturer', 'module_type', 'status', 'description', 'tags',
)),
('Hardware', ( ('Hardware', (
'serial', 'asset_tag', 'replicate_components', 'adopt_components', 'serial', 'asset_tag', 'replicate_components', 'adopt_components',
)), )),
@ -632,8 +550,8 @@ class ModuleForm(ModuleCommonForm, NetBoxModelForm):
class Meta: class Meta:
model = Module model = Module
fields = [ fields = [
'device', 'module_bay', 'manufacturer', 'module_type', 'status', 'serial', 'asset_tag', 'tags', 'device', 'module_bay', 'module_type', 'status', 'serial', 'asset_tag', 'tags', 'replicate_components',
'replicate_components', 'adopt_components', 'description', 'comments', 'adopt_components', 'description', 'comments',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -664,26 +582,9 @@ class CableForm(TenancyForm, NetBoxModelForm):
class PowerPanelForm(NetBoxModelForm): class PowerPanelForm(NetBoxModelForm):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
query_params={ selector=True
'region_id': '$region',
'group_id': '$site_group',
}
) )
location = DynamicModelChoiceField( location = DynamicModelChoiceField(
queryset=Location.objects.all(), queryset=Location.objects.all(),
@ -695,80 +596,38 @@ class PowerPanelForm(NetBoxModelForm):
comments = CommentField() comments = CommentField()
fieldsets = ( fieldsets = (
('Power Panel', ('region', 'site_group', 'site', 'location', 'name', 'description', 'tags')), ('Power Panel', ('site', 'location', 'name', 'description', 'tags')),
) )
class Meta: class Meta:
model = PowerPanel model = PowerPanel
fields = [ fields = [
'region', 'site_group', 'site', 'location', 'name', 'description', 'comments', 'tags', 'site', 'location', 'name', 'description', 'comments', 'tags',
] ]
class PowerFeedForm(NetBoxModelForm): class PowerFeedForm(NetBoxModelForm):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites__powerpanel': '$power_panel'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField(
queryset=Site.objects.all(),
required=False,
initial_params={
'powerpanel': '$power_panel'
},
query_params={
'region_id': '$region',
'group_id': '$site_group',
}
)
power_panel = DynamicModelChoiceField( power_panel = DynamicModelChoiceField(
queryset=PowerPanel.objects.all(), queryset=PowerPanel.objects.all(),
query_params={ selector=True
'site_id': '$site'
}
)
location = DynamicModelChoiceField(
queryset=Location.objects.all(),
required=False,
query_params={
'site_id': '$site'
},
initial_params={
'racks': '$rack'
}
) )
rack = DynamicModelChoiceField( rack = DynamicModelChoiceField(
queryset=Rack.objects.all(), queryset=Rack.objects.all(),
required=False, required=False,
query_params={ selector=True
'location_id': '$location',
'site_id': '$site'
}
) )
comments = CommentField() comments = CommentField()
fieldsets = ( fieldsets = (
('Power Panel', ('region', 'site', 'power_panel')), ('Power Feed', ('power_panel', 'rack', 'name', 'status', 'type', 'description', 'mark_connected', 'tags')),
('Power Feed', ('location', 'rack', 'name', 'status', 'type', 'description', 'mark_connected', 'tags')),
('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')), ('Characteristics', ('supply', 'voltage', 'amperage', 'phase', 'max_utilization')),
) )
class Meta: class Meta:
model = PowerFeed model = PowerFeed
fields = [ fields = [
'region', 'site_group', 'site', 'power_panel', 'location', 'rack', 'name', 'status', 'type', 'power_panel', 'rack', 'name', 'status', 'type', 'mark_connected', 'supply', 'phase', 'voltage', 'amperage',
'mark_connected', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', 'description', 'comments', 'max_utilization', 'description', 'comments', 'tags',
'tags',
] ]
@ -840,43 +699,12 @@ class DeviceVCMembershipForm(forms.ModelForm):
class VCMemberSelectForm(BootstrapMixin, forms.Form): class VCMemberSelectForm(BootstrapMixin, forms.Form):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField(
queryset=Site.objects.all(),
required=False,
query_params={
'region_id': '$region',
'group_id': '$site_group',
}
)
rack = DynamicModelChoiceField(
queryset=Rack.objects.all(),
required=False,
null_option='None',
query_params={
'site_id': '$site'
}
)
device = DynamicModelChoiceField( device = DynamicModelChoiceField(
queryset=Device.objects.all(), queryset=Device.objects.all(),
query_params={ query_params={
'site_id': '$site',
'rack_id': '$rack',
'virtual_chassis_id': 'null', 'virtual_chassis_id': 'null',
} },
selector=True
) )
def clean_device(self): def clean_device(self):
@ -1545,53 +1373,9 @@ class InventoryItemRoleForm(NetBoxModelForm):
class VirtualDeviceContextForm(TenancyForm, NetBoxModelForm): class VirtualDeviceContextForm(TenancyForm, NetBoxModelForm):
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField(
queryset=Site.objects.all(),
required=False,
query_params={
'region_id': '$region',
'group_id': '$site_group',
}
)
location = DynamicModelChoiceField(
queryset=Location.objects.all(),
required=False,
query_params={
'site_id': '$site'
},
initial_params={
'racks': '$rack'
}
)
rack = DynamicModelChoiceField(
queryset=Rack.objects.all(),
required=False,
query_params={
'site_id': '$site',
'location_id': '$location',
}
)
device = DynamicModelChoiceField( device = DynamicModelChoiceField(
queryset=Device.objects.all(), queryset=Device.objects.all(),
query_params={ selector=True
'site_id': '$site',
'location_id': '$location',
'rack_id': '$rack',
}
) )
primary_ip4 = DynamicModelChoiceField( primary_ip4 = DynamicModelChoiceField(
queryset=IPAddress.objects.all(), queryset=IPAddress.objects.all(),
@ -1613,14 +1397,13 @@ class VirtualDeviceContextForm(TenancyForm, NetBoxModelForm):
) )
fieldsets = ( fieldsets = (
('Assigned Device', ('region', 'site_group', 'site', 'location', 'rack', 'device')), ('Virtual Device Context', ('device', 'name', 'status', 'identifier', 'primary_ip4', 'primary_ip6', 'tags')),
('Virtual Device Context', ('name', 'status', 'identifier', 'primary_ip4', 'primary_ip6', 'tags')),
('Tenancy', ('tenant_group', 'tenant')) ('Tenancy', ('tenant_group', 'tenant'))
) )
class Meta: class Meta:
model = VirtualDeviceContext model = VirtualDeviceContext
fields = [ fields = [
'region', 'site_group', 'site', 'location', 'rack', 'device', 'name', 'status', 'identifier', 'device', 'name', 'status', 'identifier', 'primary_ip4', 'primary_ip6', 'tenant_group', 'tenant',
'primary_ip4', 'primary_ip6', 'tenant_group', 'tenant', 'comments', 'tags' 'comments', 'tags'
] ]

View File

@ -200,40 +200,11 @@ class PrefixForm(TenancyForm, NetBoxModelForm):
required=False, required=False,
label=_('VRF') label=_('VRF')
) )
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
required=False, required=False,
null_option='None', selector=True,
query_params={ null_option='None'
'region_id': '$region',
'group_id': '$site_group',
}
)
vlan_group = DynamicModelChoiceField(
queryset=VLANGroup.objects.all(),
required=False,
label=_('VLAN group'),
null_option='None',
query_params={
'site': '$site'
},
initial_params={
'vlans': '$vlan'
}
) )
vlan = DynamicModelChoiceField( vlan = DynamicModelChoiceField(
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
@ -241,7 +212,6 @@ class PrefixForm(TenancyForm, NetBoxModelForm):
label=_('VLAN'), label=_('VLAN'),
query_params={ query_params={
'site_id': '$site', 'site_id': '$site',
'group_id': '$vlan_group',
} }
) )
role = DynamicModelChoiceField( role = DynamicModelChoiceField(
@ -252,7 +222,7 @@ class PrefixForm(TenancyForm, NetBoxModelForm):
fieldsets = ( fieldsets = (
('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags')), ('Prefix', ('prefix', 'status', 'vrf', 'role', 'is_pool', 'mark_utilized', 'description', 'tags')),
('Site/VLAN Assignment', ('region', 'site_group', 'site', 'vlan_group', 'vlan')), ('Site/VLAN Assignment', ('site', 'vlan')),
('Tenancy', ('tenant_group', 'tenant')), ('Tenancy', ('tenant_group', 'tenant')),
) )
@ -329,65 +299,22 @@ class IPAddressForm(TenancyForm, NetBoxModelForm):
required=False, required=False,
label=_('VRF') label=_('VRF')
) )
nat_region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
label=_('Region'),
initial_params={
'sites': '$nat_site'
}
)
nat_site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
label=_('Site group'),
initial_params={
'sites': '$nat_site'
}
)
nat_site = DynamicModelChoiceField(
queryset=Site.objects.all(),
required=False,
label=_('Site'),
query_params={
'region_id': '$nat_region',
'group_id': '$nat_site_group',
}
)
nat_rack = DynamicModelChoiceField(
queryset=Rack.objects.all(),
required=False,
label=_('Rack'),
null_option='None',
query_params={
'site_id': '$site'
}
)
nat_device = DynamicModelChoiceField( nat_device = DynamicModelChoiceField(
queryset=Device.objects.all(), queryset=Device.objects.all(),
required=False, required=False,
label=_('Device'), selector=True,
query_params={ label=_('Device')
'site_id': '$site',
'rack_id': '$nat_rack',
}
)
nat_cluster = DynamicModelChoiceField(
queryset=Cluster.objects.all(),
required=False,
label=_('Cluster')
) )
nat_virtual_machine = DynamicModelChoiceField( nat_virtual_machine = DynamicModelChoiceField(
queryset=VirtualMachine.objects.all(), queryset=VirtualMachine.objects.all(),
required=False, required=False,
label=_('Virtual Machine'), selector=True,
query_params={ label=_('Virtual Machine')
'cluster_id': '$nat_cluster',
}
) )
nat_vrf = DynamicModelChoiceField( nat_vrf = DynamicModelChoiceField(
queryset=VRF.objects.all(), queryset=VRF.objects.all(),
required=False, required=False,
selector=True,
label=_('VRF') label=_('VRF')
) )
nat_inside = DynamicModelChoiceField( nat_inside = DynamicModelChoiceField(
@ -409,9 +336,8 @@ class IPAddressForm(TenancyForm, NetBoxModelForm):
class Meta: class Meta:
model = IPAddress model = IPAddress
fields = [ fields = [
'address', 'vrf', 'status', 'role', 'dns_name', 'primary_for_parent', 'nat_site', 'nat_rack', 'nat_device', 'address', 'vrf', 'status', 'role', 'dns_name', 'primary_for_parent', 'nat_device', 'nat_virtual_machine',
'nat_cluster', 'nat_virtual_machine', 'nat_vrf', 'nat_inside', 'tenant_group', 'tenant', 'description', 'nat_vrf', 'nat_inside', 'tenant_group', 'tenant', 'description', 'comments', 'tags',
'comments', 'tags',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -803,11 +729,13 @@ class ServiceTemplateForm(NetBoxModelForm):
class ServiceForm(NetBoxModelForm): class ServiceForm(NetBoxModelForm):
device = DynamicModelChoiceField( device = DynamicModelChoiceField(
queryset=Device.objects.all(), queryset=Device.objects.all(),
required=False required=False,
selector=True
) )
virtual_machine = DynamicModelChoiceField( virtual_machine = DynamicModelChoiceField(
queryset=VirtualMachine.objects.all(), queryset=VirtualMachine.objects.all(),
required=False required=False,
selector=True
) )
ports = NumericArrayField( ports = NumericArrayField(
base_field=forms.IntegerField( base_field=forms.IntegerField(
@ -907,43 +835,21 @@ class L2VPNTerminationForm(NetBoxModelForm):
label=_('L2VPN'), label=_('L2VPN'),
fetch_trigger='open' fetch_trigger='open'
) )
device_vlan = DynamicModelChoiceField(
queryset=Device.objects.all(),
label=_("Available on Device"),
required=False,
query_params={}
)
vlan = DynamicModelChoiceField( vlan = DynamicModelChoiceField(
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
required=False, required=False,
query_params={ selector=True,
'available_on_device': '$device_vlan'
},
label=_('VLAN') label=_('VLAN')
) )
device = DynamicModelChoiceField(
queryset=Device.objects.all(),
required=False,
query_params={}
)
interface = DynamicModelChoiceField( interface = DynamicModelChoiceField(
queryset=Interface.objects.all(), queryset=Interface.objects.all(),
required=False, required=False,
query_params={ selector=True
'device_id': '$device'
}
)
virtual_machine = DynamicModelChoiceField(
queryset=VirtualMachine.objects.all(),
required=False,
query_params={}
) )
vminterface = DynamicModelChoiceField( vminterface = DynamicModelChoiceField(
queryset=VMInterface.objects.all(), queryset=VMInterface.objects.all(),
required=False, required=False,
query_params={ selector=True,
'virtual_machine_id': '$virtual_machine'
},
label=_('Interface') label=_('Interface')
) )
@ -957,7 +863,6 @@ class L2VPNTerminationForm(NetBoxModelForm):
if instance: if instance:
if type(instance.assigned_object) is Interface: if type(instance.assigned_object) is Interface:
initial['device'] = instance.assigned_object.parent
initial['interface'] = instance.assigned_object initial['interface'] = instance.assigned_object
elif type(instance.assigned_object) is VLAN: elif type(instance.assigned_object) is VLAN:
initial['vlan'] = instance.assigned_object initial['vlan'] = instance.assigned_object

View File

@ -27,12 +27,9 @@
</div> </div>
<div class="tab-content p-0 border-0"> <div class="tab-content p-0 border-0">
<div class="tab-pane{% if not providernetwork_tab_active %} active{% endif %}" id="site"> <div class="tab-pane{% if not providernetwork_tab_active %} active{% endif %}" id="site">
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %} {% render_field form.site %}
</div> </div>
<div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork"> <div class="tab-pane{% if providernetwork_tab_active %} active{% endif %}" id="providernetwork">
{% render_field form.provider_network_provider %}
{% render_field form.provider_network %} {% render_field form.provider_network %}
</div> </div>
</div> </div>

View File

@ -113,7 +113,3 @@
</div> </div>
{% endblock %} {% endblock %}
{% block modals %}
{% include 'inc/htmx_modal.html' with size='lg' %}
{% endblock %}

View File

@ -6,8 +6,6 @@
<div class="row mb-2"> <div class="row mb-2">
<h5 class="offset-sm-3">Rack</h5> <h5 class="offset-sm-3">Rack</h5>
</div> </div>
{% render_field form.region %}
{% render_field form.site_group %}
{% render_field form.site %} {% render_field form.site %}
{% render_field form.location %} {% render_field form.location %}
{% render_field form.name %} {% render_field form.name %}

View File

@ -74,3 +74,7 @@ Context:
</div> </div>
{% endblock content-wrapper %} {% endblock content-wrapper %}
{% block modals %}
{% include 'inc/htmx_modal.html' with size='lg' %}
{% endblock %}

View File

@ -121,14 +121,9 @@
</div> </div>
<div class="tab-content p-0 border-0"> <div class="tab-content p-0 border-0">
<div class="tab-pane active" id="by_device" aria-labelledby="device_tab" role="tabpanel"> <div class="tab-pane active" id="by_device" aria-labelledby="device_tab" role="tabpanel">
{% render_field form.nat_region %}
{% render_field form.nat_site_group %}
{% render_field form.nat_site %}
{% render_field form.nat_rack %}
{% render_field form.nat_device %} {% render_field form.nat_device %}
</div> </div>
<div class="tab-pane" id="by_vm" aria-labelledby="vm_tab" role="tabpanel"> <div class="tab-pane" id="by_vm" aria-labelledby="vm_tab" role="tabpanel">
{% render_field form.nat_cluster %}
{% render_field form.nat_virtual_machine %} {% render_field form.nat_virtual_machine %}
</div> </div>
<div class="tab-pane" id="by_vrf" aria-labelledby="vrf_tab" role="tabpanel"> <div class="tab-pane" id="by_vrf" aria-labelledby="vrf_tab" role="tabpanel">

View File

@ -32,15 +32,12 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="tab-content p-0 border-0"> <div class="tab-content p-0 border-0">
<div class="tab-pane {% if not form.initial.interface or form.initial.vminterface %}active{% endif %}" id="vlan" role="tabpanel" aria-labeled-by="vlan_tab"> <div class="tab-pane {% if not form.initial.interface or form.initial.vminterface %}active{% endif %}" id="vlan" role="tabpanel" aria-labeled-by="vlan_tab">
{% render_field form.device_vlan %}
{% render_field form.vlan %} {% render_field form.vlan %}
</div> </div>
<div class="tab-pane {% if form.initial.interface %}active{% endif %}" id="interface" role="tabpanel" aria-labeled-by="interface_tab"> <div class="tab-pane {% if form.initial.interface %}active{% endif %}" id="interface" role="tabpanel" aria-labeled-by="interface_tab">
{% render_field form.device %}
{% render_field form.interface %} {% render_field form.interface %}
</div> </div>
<div class="tab-pane {% if form.initial.vminterface %}active{% endif %}" id="vminterface" role="tabpanel" aria-labeled-by="vminterface_tab"> <div class="tab-pane {% if form.initial.vminterface %}active{% endif %}" id="vminterface" role="tabpanel" aria-labeled-by="vminterface_tab">
{% render_field form.virtual_machine %}
{% render_field form.vminterface %} {% render_field form.vminterface %}
</div> </div>
</div> </div>

View File

@ -26,6 +26,7 @@ class DynamicModelChoiceMixin:
choice (optional) choice (optional)
fetch_trigger: The event type which will cause the select element to fetch_trigger: The event type which will cause the select element to
fetch data from the API. Must be 'load', 'open', or 'collapse'. (optional) fetch data from the API. Must be 'load', 'open', or 'collapse'. (optional)
selector: Include an advanced object selection widget to assist the user in identifying the desired object
""" """
filter = django_filters.ModelChoiceFilter filter = django_filters.ModelChoiceFilter
widget = widgets.APISelect widget = widgets.APISelect
@ -40,7 +41,7 @@ class DynamicModelChoiceMixin:
disabled_indicator=None, disabled_indicator=None,
fetch_trigger=None, fetch_trigger=None,
empty_label=None, empty_label=None,
with_selector=False, selector=False,
**kwargs **kwargs
): ):
self.model = queryset.model self.model = queryset.model
@ -49,7 +50,7 @@ class DynamicModelChoiceMixin:
self.null_option = null_option self.null_option = null_option
self.disabled_indicator = disabled_indicator self.disabled_indicator = disabled_indicator
self.fetch_trigger = fetch_trigger self.fetch_trigger = fetch_trigger
self.with_selector = with_selector self.selector = selector
# to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference # to_field_name is set by ModelChoiceField.__init__(), but we need to set it early for reference
# by widget_attrs() # by widget_attrs()
@ -84,7 +85,7 @@ class DynamicModelChoiceMixin:
widget.add_query_params(self.query_params) widget.add_query_params(self.query_params)
# Include object selector? # Include object selector?
if self.with_selector: if self.selector:
attrs['selector'] = self.model._meta.label_lower attrs['selector'] = self.model._meta.label_lower
return attrs return attrs

View File

@ -65,41 +65,22 @@ class ClusterForm(TenancyForm, NetBoxModelForm):
queryset=ClusterGroup.objects.all(), queryset=ClusterGroup.objects.all(),
required=False required=False
) )
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField( site = DynamicModelChoiceField(
queryset=Site.objects.all(), queryset=Site.objects.all(),
required=False, required=False,
query_params={ selector=True
'region_id': '$region',
'group_id': '$site_group',
}
) )
comments = CommentField() comments = CommentField()
fieldsets = ( fieldsets = (
('Cluster', ('name', 'type', 'group', 'status', 'description', 'tags')), ('Cluster', ('name', 'type', 'group', 'site', 'status', 'description', 'tags')),
('Site', ('region', 'site_group', 'site')),
('Tenancy', ('tenant_group', 'tenant')), ('Tenancy', ('tenant_group', 'tenant')),
) )
class Meta: class Meta:
model = Cluster model = Cluster
fields = ( fields = (
'name', 'type', 'group', 'status', 'tenant', 'region', 'site_group', 'site', 'description', 'comments', 'name', 'type', 'group', 'status', 'tenant', 'site', 'description', 'comments', 'tags',
'tags',
) )
@ -178,20 +159,12 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm):
queryset=Site.objects.all(), queryset=Site.objects.all(),
required=False required=False
) )
cluster_group = DynamicModelChoiceField(
queryset=ClusterGroup.objects.all(),
required=False,
null_option='None',
initial_params={
'clusters': '$cluster'
}
)
cluster = DynamicModelChoiceField( cluster = DynamicModelChoiceField(
queryset=Cluster.objects.all(), queryset=Cluster.objects.all(),
required=False, required=False,
selector=True,
query_params={ query_params={
'site_id': '$site', 'site_id': '$site',
'group_id': '$cluster_group',
} }
) )
device = DynamicModelChoiceField( device = DynamicModelChoiceField(
@ -222,7 +195,7 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm):
fieldsets = ( fieldsets = (
('Virtual Machine', ('name', 'role', 'status', 'description', 'tags')), ('Virtual Machine', ('name', 'role', 'status', 'description', 'tags')),
('Site/Cluster', ('site', 'cluster_group', 'cluster', 'device')), ('Site/Cluster', ('site', 'cluster', 'device')),
('Tenancy', ('tenant_group', 'tenant')), ('Tenancy', ('tenant_group', 'tenant')),
('Management', ('platform', 'primary_ip4', 'primary_ip6')), ('Management', ('platform', 'primary_ip4', 'primary_ip6')),
('Resources', ('vcpus', 'memory', 'disk')), ('Resources', ('vcpus', 'memory', 'disk')),
@ -232,9 +205,8 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm):
class Meta: class Meta:
model = VirtualMachine model = VirtualMachine
fields = [ fields = [
'name', 'status', 'site', 'cluster_group', 'cluster', 'device', 'role', 'tenant_group', 'tenant', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant_group', 'tenant', 'platform', 'primary_ip4',
'platform', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', 'tags', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', 'tags', 'local_context_data',
'local_context_data',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@ -38,55 +38,16 @@ class WirelessLANForm(TenancyForm, NetBoxModelForm):
queryset=WirelessLANGroup.objects.all(), queryset=WirelessLANGroup.objects.all(),
required=False required=False
) )
region = DynamicModelChoiceField(
queryset=Region.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site_group = DynamicModelChoiceField(
queryset=SiteGroup.objects.all(),
required=False,
initial_params={
'sites': '$site'
}
)
site = DynamicModelChoiceField(
queryset=Site.objects.all(),
required=False,
null_option='None',
query_params={
'region_id': '$region',
'group_id': '$site_group',
}
)
vlan_group = DynamicModelChoiceField(
queryset=VLANGroup.objects.all(),
required=False,
label=_('VLAN group'),
null_option='None',
query_params={
'site': '$site'
},
initial_params={
'vlans': '$vlan'
}
)
vlan = DynamicModelChoiceField( vlan = DynamicModelChoiceField(
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
required=False, required=False,
label=_('VLAN'), selector=True,
query_params={ label=_('VLAN')
'site_id': '$site',
'group_id': '$vlan_group',
}
) )
comments = CommentField() comments = CommentField()
fieldsets = ( fieldsets = (
('Wireless LAN', ('ssid', 'group', 'status', 'description', 'tags')), ('Wireless LAN', ('ssid', 'group', 'vlan', 'status', 'description', 'tags')),
('VLAN', ('region', 'site_group', 'site', 'vlan_group', 'vlan',)),
('Tenancy', ('tenant_group', 'tenant')), ('Tenancy', ('tenant_group', 'tenant')),
('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')), ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')),
) )
@ -94,8 +55,8 @@ class WirelessLANForm(TenancyForm, NetBoxModelForm):
class Meta: class Meta:
model = WirelessLAN model = WirelessLAN
fields = [ fields = [
'ssid', 'group', 'region', 'site_group', 'site', 'status', 'vlan_group', 'vlan', 'tenant_group', 'tenant', 'ssid', 'group', 'status', 'vlan', 'tenant_group', 'tenant', 'auth_type', 'auth_cipher', 'auth_psk',
'auth_type', 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'description', 'comments', 'tags',
] ]