Coverage for circuits/forms/bulk_edit.py: 100%

89 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django import forms 

2from django.contrib.contenttypes.models import ContentType 

3from django.utils.translation import gettext_lazy as _ 

4 

5from circuits.choices import ( 

6 CircuitCommitRateChoices, 

7 CircuitPriorityChoices, 

8 CircuitStatusChoices, 

9 VirtualCircuitTerminationRoleChoices, 

10) 

11from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES 

12from circuits.models import * 

13from ipam.models import ASN 

14from netbox.choices import DistanceUnitChoices 

15from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm 

16from tenancy.models import Tenant 

17from utilities.forms import GenericObjectFormMixin, add_blank_choice 

18from utilities.forms.fields import ( 

19 ChoiceField, 

20 ColorField, 

21 DynamicModelChoiceField, 

22 DynamicModelMultipleChoiceField, 

23 GenericObjectChoiceField, 

24) 

25from utilities.forms.rendering import FieldSet 

26from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, NumberWithOptions 

27 

28__all__ = ( 

29 'CircuitBulkEditForm', 

30 'CircuitGroupAssignmentBulkEditForm', 

31 'CircuitGroupBulkEditForm', 

32 'CircuitTerminationBulkEditForm', 

33 'CircuitTypeBulkEditForm', 

34 'ProviderAccountBulkEditForm', 

35 'ProviderBulkEditForm', 

36 'ProviderNetworkBulkEditForm', 

37 'VirtualCircuitBulkEditForm', 

38 'VirtualCircuitTerminationBulkEditForm', 

39 'VirtualCircuitTypeBulkEditForm', 

40) 

41 

42 

43class ProviderBulkEditForm(PrimaryModelBulkEditForm): 

44 asns = DynamicModelMultipleChoiceField( 

45 queryset=ASN.objects.all(), 

46 label=_('ASNs'), 

47 required=False 

48 ) 

49 

50 model = Provider 

51 fieldsets = ( 

52 FieldSet('asns', 'description'), 

53 ) 

54 nullable_fields = ( 

55 'asns', 'description', 'comments', 

56 ) 

57 

58 

59class ProviderAccountBulkEditForm(PrimaryModelBulkEditForm): 

60 provider = DynamicModelChoiceField( 

61 label=_('Provider'), 

62 queryset=Provider.objects.all(), 

63 required=False 

64 ) 

65 

66 model = ProviderAccount 

67 fieldsets = ( 

68 FieldSet('provider', 'description'), 

69 ) 

70 nullable_fields = ( 

71 'description', 'comments', 

72 ) 

73 

74 

75class ProviderNetworkBulkEditForm(PrimaryModelBulkEditForm): 

76 provider = DynamicModelChoiceField( 

77 label=_('Provider'), 

78 queryset=Provider.objects.all(), 

79 required=False 

80 ) 

81 service_id = forms.CharField( 

82 max_length=100, 

83 required=False, 

84 label=_('Service ID') 

85 ) 

86 

87 model = ProviderNetwork 

88 fieldsets = ( 

89 FieldSet('provider', 'service_id', 'description'), 

90 ) 

91 nullable_fields = ( 

92 'service_id', 'description', 'comments', 

93 ) 

94 

95 

96class CircuitTypeBulkEditForm(OrganizationalModelBulkEditForm): 

97 color = ColorField( 

98 label=_('Color'), 

99 required=False 

100 ) 

101 

102 model = CircuitType 

103 fieldsets = ( 

104 FieldSet('color', 'description'), 

105 ) 

106 nullable_fields = ('color', 'description', 'comments') 

107 

108 

109class CircuitBulkEditForm(PrimaryModelBulkEditForm): 

110 type = DynamicModelChoiceField( 

111 label=_('Type'), 

112 queryset=CircuitType.objects.all(), 

113 required=False 

114 ) 

115 provider = DynamicModelChoiceField( 

116 label=_('Provider'), 

117 queryset=Provider.objects.all(), 

118 required=False 

119 ) 

120 provider_account = DynamicModelChoiceField( 

121 label=_('Provider account'), 

122 queryset=ProviderAccount.objects.all(), 

123 required=False, 

124 query_params={ 

125 'provider': '$provider' 

126 } 

127 ) 

128 status = ChoiceField( 

129 label=_('Status'), 

130 choices=add_blank_choice(CircuitStatusChoices), 

131 required=False, 

132 initial='' 

133 ) 

134 tenant = DynamicModelChoiceField( 

135 label=_('Tenant'), 

136 queryset=Tenant.objects.all(), 

137 required=False 

138 ) 

139 install_date = forms.DateField( 

140 label=_('Install date'), 

141 required=False, 

142 widget=DatePicker() 

143 ) 

144 termination_date = forms.DateField( 

145 label=_('Termination date'), 

146 required=False, 

147 widget=DatePicker() 

148 ) 

149 commit_rate = forms.IntegerField( 

150 required=False, 

151 label=_('Commit rate (Kbps)'), 

152 widget=NumberWithOptions( 

153 options=CircuitCommitRateChoices 

154 ) 

155 ) 

156 distance = forms.DecimalField( 

157 label=_('Distance'), 

158 min_value=0, 

159 required=False 

160 ) 

161 distance_unit = ChoiceField( 

162 label=_('Distance unit'), 

163 choices=add_blank_choice(DistanceUnitChoices), 

164 required=False, 

165 initial='' 

166 ) 

167 

168 model = Circuit 

169 fieldsets = ( 

170 FieldSet('provider', 'type', 'status', 'description', name=_('Circuit')), 

171 FieldSet('provider_account', 'install_date', 'termination_date', 'commit_rate', name=_('Service Parameters')), 

172 FieldSet('distance', 'distance_unit', name=_('Attributes')), 

173 FieldSet('tenant', name=_('Tenancy')), 

174 ) 

175 nullable_fields = ( 

176 'tenant', 'commit_rate', 'description', 'comments', 

177 ) 

178 

179 

180class CircuitTerminationBulkEditForm(GenericObjectFormMixin, NetBoxModelBulkEditForm): 

181 description = forms.CharField( 

182 label=_('Description'), 

183 max_length=200, 

184 required=False 

185 ) 

186 termination = GenericObjectChoiceField( 

187 label=_('Termination'), 

188 content_type_queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES), 

189 required=False, 

190 selector=True, 

191 hx_method='post', 

192 ) 

193 port_speed = forms.IntegerField( 

194 required=False, 

195 label=_('Port speed (Kbps)'), 

196 ) 

197 upstream_speed = forms.IntegerField( 

198 required=False, 

199 label=_('Upstream speed (Kbps)'), 

200 ) 

201 mark_connected = forms.NullBooleanField( 

202 label=_('Mark connected'), 

203 required=False, 

204 widget=BulkEditNullBooleanSelect 

205 ) 

206 

207 model = CircuitTermination 

208 fieldsets = ( 

209 FieldSet( 

210 'description', 'termination', 'mark_connected', name=_('Circuit Termination') 

211 ), 

212 FieldSet('port_speed', 'upstream_speed', name=_('Termination Details')), 

213 ) 

214 nullable_fields = ('description', 'termination') 

215 

216 

217class CircuitGroupBulkEditForm(OrganizationalModelBulkEditForm): 

218 tenant = DynamicModelChoiceField( 

219 label=_('Tenant'), 

220 queryset=Tenant.objects.all(), 

221 required=False 

222 ) 

223 

224 model = CircuitGroup 

225 nullable_fields = ( 

226 'description', 'tenant', 'comments', 

227 ) 

228 

229 

230class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): 

231 member = DynamicModelChoiceField( 

232 label=_('Circuit'), 

233 queryset=Circuit.objects.all(), 

234 required=False 

235 ) 

236 priority = ChoiceField( 

237 label=_('Priority'), 

238 choices=add_blank_choice(CircuitPriorityChoices), 

239 required=False 

240 ) 

241 

242 model = CircuitGroupAssignment 

243 fieldsets = ( 

244 FieldSet('member', 'priority'), 

245 ) 

246 nullable_fields = ('priority',) 

247 

248 

249class VirtualCircuitTypeBulkEditForm(OrganizationalModelBulkEditForm): 

250 color = ColorField( 

251 label=_('Color'), 

252 required=False 

253 ) 

254 

255 model = VirtualCircuitType 

256 fieldsets = ( 

257 FieldSet('color', 'description'), 

258 ) 

259 nullable_fields = ('color', 'description', 'comments') 

260 

261 

262class VirtualCircuitBulkEditForm(PrimaryModelBulkEditForm): 

263 provider_network = DynamicModelChoiceField( 

264 label=_('Provider network'), 

265 queryset=ProviderNetwork.objects.all(), 

266 required=False 

267 ) 

268 provider_account = DynamicModelChoiceField( 

269 label=_('Provider account'), 

270 queryset=ProviderAccount.objects.all(), 

271 required=False 

272 ) 

273 type = DynamicModelChoiceField( 

274 label=_('Type'), 

275 queryset=VirtualCircuitType.objects.all(), 

276 required=False 

277 ) 

278 status = ChoiceField( 

279 label=_('Status'), 

280 choices=add_blank_choice(CircuitStatusChoices), 

281 required=False, 

282 initial='' 

283 ) 

284 tenant = DynamicModelChoiceField( 

285 label=_('Tenant'), 

286 queryset=Tenant.objects.all(), 

287 required=False 

288 ) 

289 

290 model = VirtualCircuit 

291 fieldsets = ( 

292 FieldSet('provider_network', 'provider_account', 'status', 'description', name=_('Virtual circuit')), 

293 FieldSet('tenant', name=_('Tenancy')), 

294 ) 

295 nullable_fields = ( 

296 'provider_account', 'tenant', 'description', 'comments', 

297 ) 

298 

299 

300class VirtualCircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): 

301 role = ChoiceField( 

302 label=_('Role'), 

303 choices=add_blank_choice(VirtualCircuitTerminationRoleChoices), 

304 required=False, 

305 initial='' 

306 ) 

307 description = forms.CharField( 

308 label=_('Description'), 

309 max_length=200, 

310 required=False 

311 ) 

312 

313 model = VirtualCircuitTermination 

314 fieldsets = ( 

315 FieldSet('role', 'description'), 

316 ) 

317 nullable_fields = ('description',)