Coverage for wireless/forms/model_forms.py: 100%
51 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.forms import PasswordInput
2from django.utils.translation import gettext_lazy as _
4from dcim.choices import LinkStatusChoices
5from dcim.forms.mixins import ScopedForm
6from dcim.models import Device, Interface, Location, Site
7from ipam.models import VLAN
8from netbox.choices import DistanceUnitChoices
9from netbox.forms import NestedGroupModelForm, PrimaryModelForm
10from tenancy.forms import TenancyForm
11from utilities.forms import add_blank_choice
12from utilities.forms.fields import ChoiceField, DynamicModelChoiceField, TypedChoiceField
13from utilities.forms.mixins import DistanceValidationMixin
14from utilities.forms.rendering import FieldSet, InlineFields
15from wireless.choices import (
16 WirelessAuthCipherChoices,
17 WirelessAuthTypeChoices,
18 WirelessLANStatusChoices,
19)
20from wireless.models import *
22__all__ = (
23 'WirelessLANForm',
24 'WirelessLANGroupForm',
25 'WirelessLinkForm',
26)
29class WirelessLANGroupForm(NestedGroupModelForm):
30 parent = DynamicModelChoiceField(
31 label=_('Parent'),
32 queryset=WirelessLANGroup.objects.all(),
33 required=False
34 )
36 fieldsets = (
37 FieldSet('parent', 'name', 'slug', 'description', 'tags', name=_('Wireless LAN Group')),
38 )
40 class Meta:
41 model = WirelessLANGroup
42 fields = [
43 'parent', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
44 ]
47class WirelessLANForm(ScopedForm, TenancyForm, PrimaryModelForm):
48 status = ChoiceField(
49 label=_('Status'),
50 choices=WirelessLANStatusChoices,
51 initial=WirelessLANStatusChoices.STATUS_ACTIVE,
52 )
53 auth_type = TypedChoiceField(
54 label=_('Authentication type'),
55 choices=add_blank_choice(WirelessAuthTypeChoices),
56 required=False,
57 )
58 auth_cipher = TypedChoiceField(
59 label=_('Authentication cipher'),
60 choices=add_blank_choice(WirelessAuthCipherChoices),
61 required=False,
62 )
63 group = DynamicModelChoiceField(
64 label=_('Group'),
65 queryset=WirelessLANGroup.objects.all(),
66 required=False,
67 quick_add=True
68 )
69 vlan = DynamicModelChoiceField(
70 queryset=VLAN.objects.all(),
71 required=False,
72 selector=True,
73 label=_('VLAN')
74 )
76 fieldsets = (
77 FieldSet('ssid', 'group', 'vlan', 'status', 'description', 'tags', name=_('Wireless LAN')),
78 FieldSet('scope', name=_('Scope'), html_id='scope'),
79 FieldSet('tenant_group', 'tenant', name=_('Tenancy')),
80 FieldSet('auth_type', 'auth_cipher', 'auth_psk', name=_('Authentication')),
81 )
83 class Meta:
84 model = WirelessLAN
85 fields = [
86 'ssid', 'group', 'status', 'vlan', 'tenant_group', 'tenant', 'auth_type', 'auth_cipher', 'auth_psk',
87 'description', 'owner', 'comments', 'tags',
88 ]
89 widgets = {
90 'auth_psk': PasswordInput(
91 render_value=True,
92 attrs={'data-toggle': 'password'}
93 ),
94 }
97class WirelessLinkForm(DistanceValidationMixin, TenancyForm, PrimaryModelForm):
98 status = ChoiceField(
99 label=_('Status'),
100 choices=LinkStatusChoices,
101 initial=LinkStatusChoices.STATUS_CONNECTED,
102 )
103 auth_type = TypedChoiceField(
104 label=_('Type'),
105 choices=add_blank_choice(WirelessAuthTypeChoices),
106 required=False,
107 )
108 auth_cipher = TypedChoiceField(
109 label=_('Cipher'),
110 choices=add_blank_choice(WirelessAuthCipherChoices),
111 required=False,
112 )
113 distance_unit = TypedChoiceField(
114 label=_('Distance unit'),
115 choices=add_blank_choice(DistanceUnitChoices),
116 required=False,
117 )
118 site_a = DynamicModelChoiceField(
119 queryset=Site.objects.all(),
120 required=False,
121 label=_('Site'),
122 initial_params={
123 'devices': '$device_a',
124 }
125 )
126 location_a = DynamicModelChoiceField(
127 queryset=Location.objects.all(),
128 query_params={
129 'site_id': '$site_a',
130 },
131 required=False,
132 label=_('Location'),
133 initial_params={
134 'devices': '$device_a',
135 }
136 )
137 device_a = DynamicModelChoiceField(
138 queryset=Device.objects.all(),
139 query_params={
140 'site_id': '$site_a',
141 'location_id': '$location_a',
142 },
143 required=False,
144 label=_('Device'),
145 initial_params={
146 'interfaces': '$interface_a'
147 }
148 )
149 interface_a = DynamicModelChoiceField(
150 queryset=Interface.objects.all(),
151 query_params={
152 'kind': 'wireless',
153 'device_id': '$device_a',
154 },
155 context={
156 'disabled': '_occupied',
157 },
158 label=_('Interface')
159 )
160 site_b = DynamicModelChoiceField(
161 queryset=Site.objects.all(),
162 required=False,
163 label=_('Site'),
164 initial_params={
165 'devices': '$device_b',
166 }
167 )
168 location_b = DynamicModelChoiceField(
169 queryset=Location.objects.all(),
170 query_params={
171 'site_id': '$site_b',
172 },
173 required=False,
174 label=_('Location'),
175 initial_params={
176 'devices': '$device_b',
177 }
178 )
179 device_b = DynamicModelChoiceField(
180 queryset=Device.objects.all(),
181 query_params={
182 'site_id': '$site_b',
183 'location_id': '$location_b',
184 },
185 required=False,
186 label=_('Device'),
187 initial_params={
188 'interfaces': '$interface_b'
189 }
190 )
191 interface_b = DynamicModelChoiceField(
192 queryset=Interface.objects.all(),
193 query_params={
194 'kind': 'wireless',
195 'device_id': '$device_b',
196 },
197 context={
198 'disabled': '_occupied',
199 },
200 label=_('Interface')
201 )
203 fieldsets = (
204 FieldSet('site_a', 'location_a', 'device_a', 'interface_a', name=_('Side A')),
205 FieldSet('site_b', 'location_b', 'device_b', 'interface_b', name=_('Side B')),
206 FieldSet(
207 'status',
208 'ssid',
209 InlineFields('distance', 'distance_unit', label=_('Distance')),
210 'description',
211 'tags',
212 name=_('Link')
213 ),
214 FieldSet('tenant_group', 'tenant', name=_('Tenancy')),
215 FieldSet('auth_type', 'auth_cipher', 'auth_psk', name=_('Authentication')),
216 )
218 class Meta:
219 model = WirelessLink
220 fields = [
221 'site_a', 'location_a', 'device_a', 'interface_a', 'site_b', 'location_b', 'device_b', 'interface_b',
222 'status', 'ssid', 'tenant_group', 'tenant', 'auth_type', 'auth_cipher', 'auth_psk',
223 'distance', 'distance_unit', 'description', 'owner', 'comments', 'tags',
224 ]
225 widgets = {
226 'auth_psk': PasswordInput(
227 render_value=True,
228 attrs={'data-toggle': 'password'}
229 ),
230 }