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

1from django.forms import PasswordInput 

2from django.utils.translation import gettext_lazy as _ 

3 

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 * 

21 

22__all__ = ( 

23 'WirelessLANForm', 

24 'WirelessLANGroupForm', 

25 'WirelessLinkForm', 

26) 

27 

28 

29class WirelessLANGroupForm(NestedGroupModelForm): 

30 parent = DynamicModelChoiceField( 

31 label=_('Parent'), 

32 queryset=WirelessLANGroup.objects.all(), 

33 required=False 

34 ) 

35 

36 fieldsets = ( 

37 FieldSet('parent', 'name', 'slug', 'description', 'tags', name=_('Wireless LAN Group')), 

38 ) 

39 

40 class Meta: 

41 model = WirelessLANGroup 

42 fields = [ 

43 'parent', 'name', 'slug', 'description', 'owner', 'comments', 'tags', 

44 ] 

45 

46 

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 ) 

75 

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 ) 

82 

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 } 

95 

96 

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 ) 

202 

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 ) 

217 

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 }