Coverage for dcim/forms/filtersets.py: 100%

544 statements  

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

1from django import forms 

2from django.utils.translation import gettext_lazy as _ 

3 

4from dcim.choices import * 

5from dcim.constants import * 

6from dcim.models import * 

7from extras.forms import LocalConfigContextFilterForm 

8from extras.models import ConfigTemplate 

9from ipam.models import ASN, VRF, VLANTranslationPolicy 

10from netbox.choices import * 

11from netbox.forms import ( 

12 NestedGroupModelFilterSetForm, 

13 NetBoxModelFilterSetForm, 

14 OrganizationalModelFilterSetForm, 

15 PrimaryModelFilterSetForm, 

16) 

17from netbox.forms.mixins import OwnerFilterMixin 

18from tenancy.forms import ContactModelFilterForm, TenancyFilterForm 

19from tenancy.models import Tenant 

20from users.models import User 

21from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice 

22from utilities.forms.fields import ( 

23 ColorField, 

24 DynamicModelMultipleChoiceField, 

25 PositiveBigIntegerField, 

26 TagFilterField, 

27) 

28from utilities.forms.rendering import FieldSet 

29from utilities.forms.widgets import DatePicker, NumberWithOptions 

30from virtualization.models import Cluster, ClusterGroup, VirtualMachine 

31from vpn.models import L2VPN 

32from wireless.choices import * 

33 

34__all__ = ( 

35 'CableBundleFilterForm', 

36 'CableFilterForm', 

37 'ConsoleConnectionFilterForm', 

38 'ConsolePortFilterForm', 

39 'ConsolePortTemplateFilterForm', 

40 'ConsoleServerPortFilterForm', 

41 'ConsoleServerPortTemplateFilterForm', 

42 'CoolingFeedFilterForm', 

43 'CoolingIntakeFilterForm', 

44 'CoolingIntakeTemplateFilterForm', 

45 'CoolingOutflowFilterForm', 

46 'CoolingOutflowTemplateFilterForm', 

47 'CoolingSourceFilterForm', 

48 'DeviceBayFilterForm', 

49 'DeviceBayTemplateFilterForm', 

50 'DeviceFilterForm', 

51 'DeviceRoleFilterForm', 

52 'DeviceTypeFilterForm', 

53 'FrontPortFilterForm', 

54 'FrontPortTemplateFilterForm', 

55 'InterfaceConnectionFilterForm', 

56 'InterfaceFilterForm', 

57 'InterfaceTemplateFilterForm', 

58 'InventoryItemFilterForm', 

59 'InventoryItemRoleFilterForm', 

60 'InventoryItemTemplateFilterForm', 

61 'LocationFilterForm', 

62 'MACAddressFilterForm', 

63 'ManufacturerFilterForm', 

64 'ModuleBayFilterForm', 

65 'ModuleBayTemplateFilterForm', 

66 'ModuleBayTypeFilterForm', 

67 'ModuleFilterForm', 

68 'ModuleTypeFilterForm', 

69 'ModuleTypeProfileFilterForm', 

70 'PlatformFilterForm', 

71 'PowerConnectionFilterForm', 

72 'PowerFeedFilterForm', 

73 'PowerOutletFilterForm', 

74 'PowerOutletTemplateFilterForm', 

75 'PowerPanelFilterForm', 

76 'PowerPortFilterForm', 

77 'PowerPortTemplateFilterForm', 

78 'RackElevationFilterForm', 

79 'RackFilterForm', 

80 'RackGroupFilterForm', 

81 'RackReservationFilterForm', 

82 'RackRoleFilterForm', 

83 'RackTypeFilterForm', 

84 'RearPortFilterForm', 

85 'RearPortTemplateFilterForm', 

86 'RegionFilterForm', 

87 'SiteFilterForm', 

88 'SiteGroupFilterForm', 

89 'VirtualChassisFilterForm', 

90 'VirtualDeviceContextFilterForm', 

91) 

92 

93 

94class DeviceComponentFilterForm(OwnerFilterMixin, NetBoxModelFilterSetForm): 

95 name = forms.CharField( 

96 label=_('Name'), 

97 required=False 

98 ) 

99 label = forms.CharField( 

100 label=_('Label'), 

101 required=False 

102 ) 

103 region_id = DynamicModelMultipleChoiceField( 

104 queryset=Region.objects.all(), 

105 required=False, 

106 label=_('Region') 

107 ) 

108 site_group_id = DynamicModelMultipleChoiceField( 

109 queryset=SiteGroup.objects.all(), 

110 required=False, 

111 label=_('Site group') 

112 ) 

113 site_id = DynamicModelMultipleChoiceField( 

114 queryset=Site.objects.all(), 

115 required=False, 

116 query_params={ 

117 'region_id': '$region_id', 

118 'group_id': '$site_group_id', 

119 }, 

120 label=_('Site') 

121 ) 

122 location_id = DynamicModelMultipleChoiceField( 

123 queryset=Location.objects.all(), 

124 required=False, 

125 query_params={ 

126 'site_id': '$site_id', 

127 }, 

128 label=_('Location') 

129 ) 

130 rack_id = DynamicModelMultipleChoiceField( 

131 queryset=Rack.objects.all(), 

132 required=False, 

133 query_params={ 

134 'site_id': '$site_id', 

135 'location_id': '$location_id', 

136 }, 

137 label=_('Rack') 

138 ) 

139 virtual_chassis_id = DynamicModelMultipleChoiceField( 

140 queryset=VirtualChassis.objects.all(), 

141 required=False, 

142 label=_('Virtual Chassis') 

143 ) 

144 device_type_id = DynamicModelMultipleChoiceField( 

145 queryset=DeviceType.objects.all(), 

146 required=False, 

147 label=_('Device type') 

148 ) 

149 device_role_id = DynamicModelMultipleChoiceField( 

150 queryset=DeviceRole.objects.all(), 

151 required=False, 

152 label=_('Device role') 

153 ) 

154 tenant_id = DynamicModelMultipleChoiceField( 

155 queryset=Tenant.objects.all(), 

156 required=False, 

157 label=_('Tenant') 

158 ) 

159 device_id = DynamicModelMultipleChoiceField( 

160 queryset=Device.objects.all(), 

161 required=False, 

162 query_params={ 

163 'site_id': '$site_id', 

164 'location_id': '$location_id', 

165 'virtual_chassis_id': '$virtual_chassis_id', 

166 'device_type_id': '$device_type_id', 

167 'role_id': '$role_id', 

168 'tenant_id': '$tenant_id' 

169 }, 

170 label=_('Device') 

171 ) 

172 device_status = forms.MultipleChoiceField( 

173 choices=DeviceStatusChoices, 

174 required=False, 

175 label=_('Device Status'), 

176 ) 

177 

178 

179class RegionFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): 

180 model = Region 

181 fieldsets = ( 

182 FieldSet('q', 'filter_id', 'tag'), 

183 FieldSet('parent_id', name=_('Region')), 

184 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

185 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')) 

186 ) 

187 parent_id = DynamicModelMultipleChoiceField( 

188 queryset=Region.objects.all(), 

189 required=False, 

190 label=_('Parent region') 

191 ) 

192 tag = TagFilterField(model) 

193 

194 

195class SiteGroupFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): 

196 model = SiteGroup 

197 fieldsets = ( 

198 FieldSet('q', 'filter_id', 'tag'), 

199 FieldSet('parent_id', name=_('Site Group')), 

200 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

201 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')) 

202 ) 

203 parent_id = DynamicModelMultipleChoiceField( 

204 queryset=SiteGroup.objects.all(), 

205 required=False, 

206 label=_('Parent group') 

207 ) 

208 tag = TagFilterField(model) 

209 

210 

211class SiteFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm): 

212 model = Site 

213 fieldsets = ( 

214 FieldSet('q', 'filter_id', 'tag'), 

215 FieldSet('status', 'region_id', 'group_id', 'asn_id', name=_('Attributes')), 

216 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

217 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

218 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

219 ) 

220 selector_fields = ('filter_id', 'q', 'region_id', 'group_id') 

221 status = forms.MultipleChoiceField( 

222 label=_('Status'), 

223 choices=SiteStatusChoices, 

224 required=False 

225 ) 

226 region_id = DynamicModelMultipleChoiceField( 

227 queryset=Region.objects.all(), 

228 required=False, 

229 label=_('Region') 

230 ) 

231 group_id = DynamicModelMultipleChoiceField( 

232 queryset=SiteGroup.objects.all(), 

233 required=False, 

234 label=_('Site group') 

235 ) 

236 asn_id = DynamicModelMultipleChoiceField( 

237 queryset=ASN.objects.all(), 

238 required=False, 

239 label=_('ASNs') 

240 ) 

241 tag = TagFilterField(model) 

242 

243 

244class LocationFilterForm(TenancyFilterForm, ContactModelFilterForm, NestedGroupModelFilterSetForm): 

245 model = Location 

246 fieldsets = ( 

247 FieldSet('q', 'filter_id', 'tag'), 

248 FieldSet('region_id', 'site_group_id', 'site_id', 'parent_id', 'status', 'facility', name=_('Attributes')), 

249 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

250 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

251 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

252 ) 

253 region_id = DynamicModelMultipleChoiceField( 

254 queryset=Region.objects.all(), 

255 required=False, 

256 label=_('Region') 

257 ) 

258 site_group_id = DynamicModelMultipleChoiceField( 

259 queryset=SiteGroup.objects.all(), 

260 required=False, 

261 label=_('Site group') 

262 ) 

263 site_id = DynamicModelMultipleChoiceField( 

264 queryset=Site.objects.all(), 

265 required=False, 

266 query_params={ 

267 'region_id': '$region_id', 

268 'group_id': '$site_group_id', 

269 }, 

270 label=_('Site') 

271 ) 

272 parent_id = DynamicModelMultipleChoiceField( 

273 queryset=Location.objects.all(), 

274 required=False, 

275 query_params={ 

276 'region_id': '$region_id', 

277 'site_id': '$site_id', 

278 }, 

279 label=_('Parent') 

280 ) 

281 status = forms.MultipleChoiceField( 

282 label=_('Status'), 

283 choices=LocationStatusChoices, 

284 required=False 

285 ) 

286 facility = forms.CharField( 

287 label=_('Facility'), 

288 required=False 

289 ) 

290 tag = TagFilterField(model) 

291 

292 

293class RackGroupFilterForm(OrganizationalModelFilterSetForm): 

294 model = RackGroup 

295 fieldsets = ( 

296 FieldSet('q', 'filter_id', 'tag'), 

297 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

298 ) 

299 tag = TagFilterField(model) 

300 

301 

302class RackRoleFilterForm(OrganizationalModelFilterSetForm): 

303 model = RackRole 

304 fieldsets = ( 

305 FieldSet('q', 'filter_id', 'tag'), 

306 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

307 ) 

308 tag = TagFilterField(model) 

309 

310 

311class RackBaseFilterForm(PrimaryModelFilterSetForm): 

312 form_factor = forms.MultipleChoiceField( 

313 label=_('Form factor'), 

314 choices=RackFormFactorChoices, 

315 required=False 

316 ) 

317 width = forms.MultipleChoiceField( 

318 label=_('Width'), 

319 choices=RackWidthChoices, 

320 required=False 

321 ) 

322 u_height = forms.IntegerField( 

323 required=False, 

324 min_value=1 

325 ) 

326 starting_unit = forms.IntegerField( 

327 required=False, 

328 min_value=1 

329 ) 

330 desc_units = forms.NullBooleanField( 

331 required=False, 

332 label=_('Descending units'), 

333 widget=forms.Select( 

334 choices=BOOLEAN_WITH_BLANK_CHOICES 

335 ) 

336 ) 

337 weight = forms.DecimalField( 

338 label=_('Weight'), 

339 required=False, 

340 min_value=1 

341 ) 

342 max_weight = forms.IntegerField( 

343 label=_('Max weight'), 

344 required=False, 

345 min_value=1 

346 ) 

347 weight_unit = forms.ChoiceField( 

348 label=_('Weight unit'), 

349 choices=add_blank_choice(WeightUnitChoices), 

350 required=False 

351 ) 

352 cooling_capability = forms.MultipleChoiceField( 

353 label=_('Cooling capability'), 

354 choices=RackCoolingCapabilityChoices, 

355 required=False 

356 ) 

357 cooling_capacity = forms.DecimalField( 

358 label=_('Cooling capacity'), 

359 required=False, 

360 min_value=0 

361 ) 

362 

363 

364class RackTypeFilterForm(RackBaseFilterForm): 

365 model = RackType 

366 fieldsets = ( 

367 FieldSet('q', 'filter_id', 'tag'), 

368 FieldSet('manufacturer_id', 'form_factor', 'width', 'u_height', 'rack_count', name=_('Rack Type')), 

369 FieldSet('starting_unit', 'desc_units', name=_('Numbering')), 

370 FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), 

371 FieldSet('cooling_capability', 'cooling_capacity', name=_('Cooling')), 

372 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

373 ) 

374 selector_fields = ('filter_id', 'q', 'manufacturer_id') 

375 manufacturer_id = DynamicModelMultipleChoiceField( 

376 queryset=Manufacturer.objects.all(), 

377 required=False, 

378 label=_('Manufacturer') 

379 ) 

380 rack_count = forms.IntegerField( 

381 label=_('Rack count'), 

382 required=False, 

383 min_value=0, 

384 ) 

385 tag = TagFilterField(model) 

386 

387 

388class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, RackBaseFilterForm): 

389 model = Rack 

390 fieldsets = ( 

391 FieldSet('q', 'filter_id', 'tag'), 

392 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'group_id', name=_('Location')), 

393 FieldSet('status', 'role_id', 'manufacturer_id', 'rack_type_id', 'serial', 'asset_tag', name=_('Rack')), 

394 FieldSet('form_factor', 'width', 'u_height', 'airflow', name=_('Hardware')), 

395 FieldSet('cooling_capability', 'cooling_capacity', name=_('Cooling')), 

396 FieldSet('starting_unit', 'desc_units', name=_('Numbering')), 

397 FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), 

398 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

399 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

400 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

401 ) 

402 selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id') 

403 region_id = DynamicModelMultipleChoiceField( 

404 queryset=Region.objects.all(), 

405 required=False, 

406 label=_('Region') 

407 ) 

408 site_id = DynamicModelMultipleChoiceField( 

409 queryset=Site.objects.all(), 

410 required=False, 

411 query_params={ 

412 'region_id': '$region_id' 

413 }, 

414 label=_('Site') 

415 ) 

416 site_group_id = DynamicModelMultipleChoiceField( 

417 queryset=SiteGroup.objects.all(), 

418 required=False, 

419 label=_('Site group') 

420 ) 

421 location_id = DynamicModelMultipleChoiceField( 

422 queryset=Location.objects.all(), 

423 required=False, 

424 null_option='None', 

425 query_params={ 

426 'site_id': '$site_id' 

427 }, 

428 label=_('Location') 

429 ) 

430 group_id = DynamicModelMultipleChoiceField( 

431 queryset=RackGroup.objects.all(), 

432 required=False, 

433 null_option='None', 

434 label=_('Rack group') 

435 ) 

436 status = forms.MultipleChoiceField( 

437 label=_('Status'), 

438 choices=RackStatusChoices, 

439 required=False 

440 ) 

441 role_id = DynamicModelMultipleChoiceField( 

442 queryset=RackRole.objects.all(), 

443 required=False, 

444 null_option='None', 

445 label=_('Role') 

446 ) 

447 manufacturer_id = DynamicModelMultipleChoiceField( 

448 queryset=Manufacturer.objects.all(), 

449 required=False, 

450 label=_('Manufacturer') 

451 ) 

452 rack_type_id = DynamicModelMultipleChoiceField( 

453 queryset=RackType.objects.all(), 

454 required=False, 

455 query_params={ 

456 'manufacturer_id': '$manufacturer_id' 

457 }, 

458 label=_('Rack type') 

459 ) 

460 airflow = forms.MultipleChoiceField( 

461 label=_('Airflow'), 

462 choices=add_blank_choice(RackAirflowChoices), 

463 required=False 

464 ) 

465 serial = forms.CharField( 

466 label=_('Serial'), 

467 required=False 

468 ) 

469 asset_tag = forms.CharField( 

470 label=_('Asset tag'), 

471 required=False 

472 ) 

473 tag = TagFilterField(model) 

474 

475 

476class RackElevationFilterForm(RackFilterForm): 

477 fieldsets = ( 

478 FieldSet('q', 'filter_id', 'tag'), 

479 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'group_id', 'id', name=_('Location')), 

480 FieldSet('status', 'role_id', name=_('Function')), 

481 FieldSet('type', 'width', 'serial', 'asset_tag', name=_('Hardware')), 

482 FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), 

483 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

484 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

485 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

486 ) 

487 id = DynamicModelMultipleChoiceField( 

488 queryset=Rack.objects.all(), 

489 label=_('Rack'), 

490 required=False, 

491 query_params={ 

492 'site_id': '$site_id', 

493 'location_id': '$location_id', 

494 } 

495 ) 

496 

497 

498class RackReservationFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): 

499 model = RackReservation 

500 fieldsets = ( 

501 FieldSet('q', 'filter_id', 'tag'), 

502 FieldSet('status', 'user_id', 'unit_count_min', 'unit_count_max', name=_('Reservation')), 

503 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'group_id', 'rack_id', name=_('Rack')), 

504 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

505 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

506 ) 

507 region_id = DynamicModelMultipleChoiceField( 

508 queryset=Region.objects.all(), 

509 required=False, 

510 label=_('Region') 

511 ) 

512 site_group_id = DynamicModelMultipleChoiceField( 

513 queryset=SiteGroup.objects.all(), 

514 required=False, 

515 label=_('Site group') 

516 ) 

517 site_id = DynamicModelMultipleChoiceField( 

518 queryset=Site.objects.all(), 

519 required=False, 

520 query_params={ 

521 'region_id': '$region_id', 

522 'group_id': '$site_group_id', 

523 }, 

524 label=_('Site') 

525 ) 

526 location_id = DynamicModelMultipleChoiceField( 

527 queryset=Location.objects.all(), 

528 required=False, 

529 query_params={ 

530 'site_id': '$site_id', 

531 }, 

532 label=_('Location'), 

533 null_option='None' 

534 ) 

535 group_id = DynamicModelMultipleChoiceField( 

536 queryset=RackGroup.objects.all(), 

537 required=False, 

538 null_option='None', 

539 label=_('Rack group') 

540 ) 

541 rack_id = DynamicModelMultipleChoiceField( 

542 queryset=Rack.objects.all(), 

543 required=False, 

544 query_params={ 

545 'group_id': '$group_id', 

546 'site_id': '$site_id', 

547 'location_id': '$location_id', 

548 }, 

549 label=_('Rack') 

550 ) 

551 status = forms.MultipleChoiceField( 

552 label=_('Status'), 

553 choices=RackReservationStatusChoices, 

554 required=False 

555 ) 

556 user_id = DynamicModelMultipleChoiceField( 

557 queryset=User.objects.all(), 

558 required=False, 

559 label=_('User') 

560 ) 

561 unit_count_min = forms.IntegerField( 

562 required=False, 

563 label=_("Minimum U's") 

564 ) 

565 unit_count_max = forms.IntegerField( 

566 required=False, 

567 label=_("Maximum U's") 

568 ) 

569 tag = TagFilterField(model) 

570 

571 

572class ManufacturerFilterForm(ContactModelFilterForm, OrganizationalModelFilterSetForm): 

573 model = Manufacturer 

574 fieldsets = ( 

575 FieldSet('q', 'filter_id', 'tag'), 

576 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

577 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')) 

578 ) 

579 tag = TagFilterField(model) 

580 

581 

582class DeviceTypeFilterForm(PrimaryModelFilterSetForm): 

583 model = DeviceType 

584 fieldsets = ( 

585 FieldSet('q', 'filter_id', 'tag'), 

586 FieldSet( 

587 'manufacturer_id', 'default_platform_id', 'part_number', 'device_count', 

588 'subdevice_role', name=_('Hardware') 

589 ), 

590 FieldSet('cooling_method', 'airflow', name=_('Cooling')), 

591 FieldSet('has_front_image', 'has_rear_image', name=_('Images')), 

592 FieldSet( 

593 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 

594 'pass_through_ports', 'device_bays', 'module_bays', 'inventory_items', name=_('Components') 

595 ), 

596 FieldSet('weight', 'weight_unit', name=_('Weight')), 

597 FieldSet('end_of_life__gte', 'end_of_life__lte', name=_('Lifecycle')), 

598 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

599 ) 

600 selector_fields = ('filter_id', 'q', 'manufacturer_id') 

601 manufacturer_id = DynamicModelMultipleChoiceField( 

602 queryset=Manufacturer.objects.all(), 

603 required=False, 

604 label=_('Manufacturer') 

605 ) 

606 default_platform_id = DynamicModelMultipleChoiceField( 

607 queryset=Platform.objects.all(), 

608 required=False, 

609 label=_('Default platform') 

610 ) 

611 part_number = forms.CharField( 

612 label=_('Part number'), 

613 required=False 

614 ) 

615 device_count = forms.IntegerField( 

616 label=_('Device count'), 

617 required=False, 

618 min_value=0, 

619 ) 

620 subdevice_role = forms.MultipleChoiceField( 

621 label=_('Subdevice role'), 

622 choices=add_blank_choice(SubdeviceRoleChoices), 

623 required=False 

624 ) 

625 airflow = forms.MultipleChoiceField( 

626 label=_('Airflow'), 

627 choices=add_blank_choice(DeviceAirflowChoices), 

628 required=False 

629 ) 

630 cooling_method = forms.MultipleChoiceField( 

631 label=_('Cooling method'), 

632 choices=add_blank_choice(CoolingMethodChoices), 

633 required=False 

634 ) 

635 has_front_image = forms.NullBooleanField( 

636 required=False, 

637 label=_('Has a front image'), 

638 widget=forms.Select( 

639 choices=BOOLEAN_WITH_BLANK_CHOICES 

640 ) 

641 ) 

642 has_rear_image = forms.NullBooleanField( 

643 required=False, 

644 label=_('Has a rear image'), 

645 widget=forms.Select( 

646 choices=BOOLEAN_WITH_BLANK_CHOICES 

647 ) 

648 ) 

649 console_ports = forms.NullBooleanField( 

650 required=False, 

651 label=_('Has console ports'), 

652 widget=forms.Select( 

653 choices=BOOLEAN_WITH_BLANK_CHOICES 

654 ) 

655 ) 

656 console_server_ports = forms.NullBooleanField( 

657 required=False, 

658 label=_('Has console server ports'), 

659 widget=forms.Select( 

660 choices=BOOLEAN_WITH_BLANK_CHOICES 

661 ) 

662 ) 

663 power_ports = forms.NullBooleanField( 

664 required=False, 

665 label=_('Has power ports'), 

666 widget=forms.Select( 

667 choices=BOOLEAN_WITH_BLANK_CHOICES 

668 ) 

669 ) 

670 power_outlets = forms.NullBooleanField( 

671 required=False, 

672 label=_('Has power outlets'), 

673 widget=forms.Select( 

674 choices=BOOLEAN_WITH_BLANK_CHOICES 

675 ) 

676 ) 

677 interfaces = forms.NullBooleanField( 

678 required=False, 

679 label=_('Has interfaces'), 

680 widget=forms.Select( 

681 choices=BOOLEAN_WITH_BLANK_CHOICES 

682 ) 

683 ) 

684 pass_through_ports = forms.NullBooleanField( 

685 required=False, 

686 label=_('Has pass-through ports'), 

687 widget=forms.Select( 

688 choices=BOOLEAN_WITH_BLANK_CHOICES 

689 ) 

690 ) 

691 device_bays = forms.NullBooleanField( 

692 required=False, 

693 label=_('Has device bays'), 

694 widget=forms.Select( 

695 choices=BOOLEAN_WITH_BLANK_CHOICES 

696 ) 

697 ) 

698 module_bays = forms.NullBooleanField( 

699 required=False, 

700 label=_('Has module bays'), 

701 widget=forms.Select( 

702 choices=BOOLEAN_WITH_BLANK_CHOICES 

703 ) 

704 ) 

705 inventory_items = forms.NullBooleanField( 

706 required=False, 

707 label=_('Has inventory items'), 

708 widget=forms.Select( 

709 choices=BOOLEAN_WITH_BLANK_CHOICES 

710 ) 

711 ) 

712 tag = TagFilterField(model) 

713 weight = forms.DecimalField( 

714 label=_('Weight'), 

715 required=False 

716 ) 

717 weight_unit = forms.ChoiceField( 

718 label=_('Weight unit'), 

719 choices=add_blank_choice(WeightUnitChoices), 

720 required=False 

721 ) 

722 end_of_life__gte = forms.DateField( 

723 label=_('End of life after'), 

724 required=False, 

725 widget=DatePicker() 

726 ) 

727 end_of_life__lte = forms.DateField( 

728 label=_('End of life before'), 

729 required=False, 

730 widget=DatePicker() 

731 ) 

732 

733 

734class ModuleBayTypeFilterForm(PrimaryModelFilterSetForm): 

735 model = ModuleBayType 

736 fieldsets = ( 

737 FieldSet('q', 'filter_id', 'tag'), 

738 FieldSet('manufacturer_id', 'color', name=_('Module Bay Type')), 

739 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

740 ) 

741 selector_fields = ('filter_id', 'q', 'manufacturer_id') 

742 manufacturer_id = DynamicModelMultipleChoiceField( 

743 queryset=Manufacturer.objects.all(), 

744 required=False, 

745 label=_('Manufacturer') 

746 ) 

747 color = ColorField( 

748 label=_('Color'), 

749 required=False, 

750 ) 

751 tag = TagFilterField(model) 

752 

753 

754class ModuleTypeProfileFilterForm(PrimaryModelFilterSetForm): 

755 model = ModuleTypeProfile 

756 fieldsets = ( 

757 FieldSet('q', 'filter_id', 'tag'), 

758 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

759 ) 

760 selector_fields = ('filter_id', 'q') 

761 tag = TagFilterField(model) 

762 

763 

764class ModuleTypeFilterForm(PrimaryModelFilterSetForm): 

765 model = ModuleType 

766 fieldsets = ( 

767 FieldSet('q', 'filter_id', 'tag'), 

768 FieldSet( 

769 'profile_id', 'manufacturer_id', 'part_number', 'module_count', 

770 'module_bay_type_id', name=_('Hardware') 

771 ), 

772 FieldSet('cooling_method', 'airflow', name=_('Cooling')), 

773 FieldSet( 

774 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 

775 'pass_through_ports', 'module_bays', name=_('Components') 

776 ), 

777 FieldSet('weight', 'weight_unit', name=_('Weight')), 

778 FieldSet('end_of_life__gte', 'end_of_life__lte', name=_('Lifecycle')), 

779 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

780 ) 

781 selector_fields = ('filter_id', 'q', 'manufacturer_id') 

782 profile_id = DynamicModelMultipleChoiceField( 

783 queryset=ModuleTypeProfile.objects.all(), 

784 required=False, 

785 null_option='None', 

786 label=_('Profile') 

787 ) 

788 manufacturer_id = DynamicModelMultipleChoiceField( 

789 queryset=Manufacturer.objects.all(), 

790 required=False, 

791 label=_('Manufacturer') 

792 ) 

793 module_bay_type_id = DynamicModelMultipleChoiceField( 

794 queryset=ModuleBayType.objects.all(), 

795 required=False, 

796 null_option='None', 

797 label=_('Module bay type') 

798 ) 

799 part_number = forms.CharField( 

800 label=_('Part number'), 

801 required=False 

802 ) 

803 module_count = forms.IntegerField( 

804 label=_('Module count'), 

805 required=False, 

806 min_value=0, 

807 ) 

808 console_ports = forms.NullBooleanField( 

809 required=False, 

810 label=_('Has console ports'), 

811 widget=forms.Select( 

812 choices=BOOLEAN_WITH_BLANK_CHOICES 

813 ) 

814 ) 

815 console_server_ports = forms.NullBooleanField( 

816 required=False, 

817 label=_('Has console server ports'), 

818 widget=forms.Select( 

819 choices=BOOLEAN_WITH_BLANK_CHOICES 

820 ) 

821 ) 

822 power_ports = forms.NullBooleanField( 

823 required=False, 

824 label=_('Has power ports'), 

825 widget=forms.Select( 

826 choices=BOOLEAN_WITH_BLANK_CHOICES 

827 ) 

828 ) 

829 power_outlets = forms.NullBooleanField( 

830 required=False, 

831 label=_('Has power outlets'), 

832 widget=forms.Select( 

833 choices=BOOLEAN_WITH_BLANK_CHOICES 

834 ) 

835 ) 

836 interfaces = forms.NullBooleanField( 

837 required=False, 

838 label=_('Has interfaces'), 

839 widget=forms.Select( 

840 choices=BOOLEAN_WITH_BLANK_CHOICES 

841 ) 

842 ) 

843 pass_through_ports = forms.NullBooleanField( 

844 required=False, 

845 label=_('Has pass-through ports'), 

846 widget=forms.Select( 

847 choices=BOOLEAN_WITH_BLANK_CHOICES 

848 ) 

849 ) 

850 module_bays = forms.NullBooleanField( 

851 required=False, 

852 label=_('Has module bays'), 

853 widget=forms.Select( 

854 choices=BOOLEAN_WITH_BLANK_CHOICES 

855 ) 

856 ) 

857 tag = TagFilterField(model) 

858 airflow = forms.MultipleChoiceField( 

859 label=_('Airflow'), 

860 choices=add_blank_choice(ModuleAirflowChoices), 

861 required=False 

862 ) 

863 cooling_method = forms.MultipleChoiceField( 

864 label=_('Cooling method'), 

865 choices=add_blank_choice(CoolingMethodChoices), 

866 required=False 

867 ) 

868 weight = forms.DecimalField( 

869 label=_('Weight'), 

870 required=False 

871 ) 

872 weight_unit = forms.ChoiceField( 

873 label=_('Weight unit'), 

874 choices=add_blank_choice(WeightUnitChoices), 

875 required=False 

876 ) 

877 end_of_life__gte = forms.DateField( 

878 label=_('End of life after'), 

879 required=False, 

880 widget=DatePicker() 

881 ) 

882 end_of_life__lte = forms.DateField( 

883 label=_('End of life before'), 

884 required=False, 

885 widget=DatePicker() 

886 ) 

887 

888 

889class DeviceRoleFilterForm(NestedGroupModelFilterSetForm): 

890 model = DeviceRole 

891 fieldsets = ( 

892 FieldSet('q', 'filter_id', 'tag'), 

893 FieldSet('parent_id', 'config_template_id', name=_('Device Role')), 

894 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

895 ) 

896 config_template_id = DynamicModelMultipleChoiceField( 

897 queryset=ConfigTemplate.objects.all(), 

898 required=False, 

899 label=_('Config template') 

900 ) 

901 parent_id = DynamicModelMultipleChoiceField( 

902 queryset=DeviceRole.objects.all(), 

903 required=False, 

904 label=_('Parent') 

905 ) 

906 tag = TagFilterField(model) 

907 

908 

909class PlatformFilterForm(NestedGroupModelFilterSetForm): 

910 model = Platform 

911 fieldsets = ( 

912 FieldSet('q', 'filter_id', 'tag'), 

913 FieldSet('manufacturer_id', 'parent_id', 'config_template_id', name=_('Platform')), 

914 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

915 ) 

916 selector_fields = ('filter_id', 'q', 'manufacturer_id') 

917 parent_id = DynamicModelMultipleChoiceField( 

918 queryset=Platform.objects.all(), 

919 required=False, 

920 label=_('Parent') 

921 ) 

922 manufacturer_id = DynamicModelMultipleChoiceField( 

923 queryset=Manufacturer.objects.all(), 

924 required=False, 

925 label=_('Manufacturer') 

926 ) 

927 config_template_id = DynamicModelMultipleChoiceField( 

928 queryset=ConfigTemplate.objects.all(), 

929 required=False, 

930 label=_('Config template') 

931 ) 

932 tag = TagFilterField(model) 

933 

934 

935class DeviceFilterForm( 

936 LocalConfigContextFilterForm, 

937 TenancyFilterForm, 

938 ContactModelFilterForm, 

939 PrimaryModelFilterSetForm 

940): 

941 model = Device 

942 fieldsets = ( 

943 FieldSet('q', 'filter_id', 'tag'), 

944 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

945 FieldSet('status', 'role_id', 'serial', 'asset_tag', 'mac_address', name=_('Operation')), 

946 FieldSet('manufacturer_id', 'device_type_id', 'platform_id', name=_('Hardware')), 

947 FieldSet('cooling_method', 'airflow', name=_('Cooling')), 

948 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

949 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

950 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

951 FieldSet( 

952 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports', 

953 name=_('Components') 

954 ), 

955 FieldSet('cluster_group_id', 'cluster_id', name=_('Cluster')), 

956 FieldSet( 

957 'has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data', 

958 'has_virtual_device_context', 

959 name=_('Miscellaneous') 

960 ) 

961 ) 

962 selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id') 

963 region_id = DynamicModelMultipleChoiceField( 

964 queryset=Region.objects.all(), 

965 required=False, 

966 label=_('Region') 

967 ) 

968 site_group_id = DynamicModelMultipleChoiceField( 

969 queryset=SiteGroup.objects.all(), 

970 required=False, 

971 label=_('Site group') 

972 ) 

973 site_id = DynamicModelMultipleChoiceField( 

974 queryset=Site.objects.all(), 

975 required=False, 

976 query_params={ 

977 'region_id': '$region_id', 

978 'group_id': '$site_group_id', 

979 }, 

980 label=_('Site') 

981 ) 

982 location_id = DynamicModelMultipleChoiceField( 

983 queryset=Location.objects.all(), 

984 required=False, 

985 null_option='None', 

986 query_params={ 

987 'site_id': '$site_id' 

988 }, 

989 label=_('Location') 

990 ) 

991 rack_id = DynamicModelMultipleChoiceField( 

992 queryset=Rack.objects.all(), 

993 required=False, 

994 null_option='None', 

995 query_params={ 

996 'site_id': '$site_id', 

997 'location_id': '$location_id', 

998 }, 

999 label=_('Rack') 

1000 ) 

1001 role_id = DynamicModelMultipleChoiceField( 

1002 queryset=DeviceRole.objects.all(), 

1003 required=False, 

1004 label=_('Role') 

1005 ) 

1006 manufacturer_id = DynamicModelMultipleChoiceField( 

1007 queryset=Manufacturer.objects.all(), 

1008 required=False, 

1009 label=_('Manufacturer') 

1010 ) 

1011 device_type_id = DynamicModelMultipleChoiceField( 

1012 queryset=DeviceType.objects.all(), 

1013 required=False, 

1014 query_params={ 

1015 'manufacturer_id': '$manufacturer_id' 

1016 }, 

1017 label=_('Model') 

1018 ) 

1019 platform_id = DynamicModelMultipleChoiceField( 

1020 queryset=Platform.objects.all(), 

1021 required=False, 

1022 null_option='None', 

1023 label=_('Platform') 

1024 ) 

1025 status = forms.MultipleChoiceField( 

1026 label=_('Status'), 

1027 choices=DeviceStatusChoices, 

1028 required=False 

1029 ) 

1030 airflow = forms.MultipleChoiceField( 

1031 label=_('Airflow'), 

1032 choices=add_blank_choice(DeviceAirflowChoices), 

1033 required=False 

1034 ) 

1035 cooling_method = forms.MultipleChoiceField( 

1036 label=_('Cooling method'), 

1037 choices=add_blank_choice(CoolingMethodChoices), 

1038 required=False 

1039 ) 

1040 serial = forms.CharField( 

1041 label=_('Serial'), 

1042 required=False 

1043 ) 

1044 asset_tag = forms.CharField( 

1045 label=_('Asset tag'), 

1046 required=False 

1047 ) 

1048 mac_address = forms.CharField( 

1049 required=False, 

1050 label=_('MAC address') 

1051 ) 

1052 config_template_id = DynamicModelMultipleChoiceField( 

1053 queryset=ConfigTemplate.objects.all(), 

1054 required=False, 

1055 label=_('Config template') 

1056 ) 

1057 has_primary_ip = forms.NullBooleanField( 

1058 required=False, 

1059 label=_('Has a primary IP'), 

1060 widget=forms.Select( 

1061 choices=BOOLEAN_WITH_BLANK_CHOICES 

1062 ) 

1063 ) 

1064 has_oob_ip = forms.NullBooleanField( 

1065 required=False, 

1066 label=_('Has an OOB IP'), 

1067 widget=forms.Select( 

1068 choices=BOOLEAN_WITH_BLANK_CHOICES 

1069 ) 

1070 ) 

1071 virtual_chassis_member = forms.NullBooleanField( 

1072 required=False, 

1073 label=_('Virtual chassis member'), 

1074 widget=forms.Select( 

1075 choices=BOOLEAN_WITH_BLANK_CHOICES 

1076 ) 

1077 ) 

1078 console_ports = forms.NullBooleanField( 

1079 required=False, 

1080 label=_('Has console ports'), 

1081 widget=forms.Select( 

1082 choices=BOOLEAN_WITH_BLANK_CHOICES 

1083 ) 

1084 ) 

1085 console_server_ports = forms.NullBooleanField( 

1086 required=False, 

1087 label=_('Has console server ports'), 

1088 widget=forms.Select( 

1089 choices=BOOLEAN_WITH_BLANK_CHOICES 

1090 ) 

1091 ) 

1092 power_ports = forms.NullBooleanField( 

1093 required=False, 

1094 label=_('Has power ports'), 

1095 widget=forms.Select( 

1096 choices=BOOLEAN_WITH_BLANK_CHOICES 

1097 ) 

1098 ) 

1099 power_outlets = forms.NullBooleanField( 

1100 required=False, 

1101 label=_('Has power outlets'), 

1102 widget=forms.Select( 

1103 choices=BOOLEAN_WITH_BLANK_CHOICES 

1104 ) 

1105 ) 

1106 interfaces = forms.NullBooleanField( 

1107 required=False, 

1108 label=_('Has interfaces'), 

1109 widget=forms.Select( 

1110 choices=BOOLEAN_WITH_BLANK_CHOICES 

1111 ) 

1112 ) 

1113 pass_through_ports = forms.NullBooleanField( 

1114 required=False, 

1115 label=_('Has pass-through ports'), 

1116 widget=forms.Select( 

1117 choices=BOOLEAN_WITH_BLANK_CHOICES 

1118 ) 

1119 ) 

1120 has_virtual_device_context = forms.NullBooleanField( 

1121 required=False, 

1122 label=_('Has virtual device contexts'), 

1123 widget=forms.Select( 

1124 choices=BOOLEAN_WITH_BLANK_CHOICES 

1125 ) 

1126 ) 

1127 cluster_id = DynamicModelMultipleChoiceField( 

1128 queryset=Cluster.objects.all(), 

1129 required=False, 

1130 label=_('Cluster') 

1131 ) 

1132 cluster_group_id = DynamicModelMultipleChoiceField( 

1133 queryset=ClusterGroup.objects.all(), 

1134 required=False, 

1135 label=_('Cluster group') 

1136 ) 

1137 tag = TagFilterField(model) 

1138 

1139 

1140class VirtualDeviceContextFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): 

1141 model = VirtualDeviceContext 

1142 fieldsets = ( 

1143 FieldSet('q', 'filter_id', 'tag'), 

1144 FieldSet('device', 'status', 'has_primary_ip', name=_('Attributes')), 

1145 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

1146 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1147 ) 

1148 device = DynamicModelMultipleChoiceField( 

1149 queryset=Device.objects.all(), 

1150 required=False, 

1151 label=_('Device') 

1152 ) 

1153 status = forms.MultipleChoiceField( 

1154 label=_('Status'), 

1155 required=False, 

1156 choices=add_blank_choice(VirtualDeviceContextStatusChoices) 

1157 ) 

1158 has_primary_ip = forms.NullBooleanField( 

1159 required=False, 

1160 label=_('Has a primary IP'), 

1161 widget=forms.Select( 

1162 choices=BOOLEAN_WITH_BLANK_CHOICES 

1163 ) 

1164 ) 

1165 tag = TagFilterField(model) 

1166 

1167 

1168class ModuleFilterForm(LocalConfigContextFilterForm, TenancyFilterForm, PrimaryModelFilterSetForm): 

1169 model = Module 

1170 fieldsets = ( 

1171 FieldSet('q', 'filter_id', 'tag'), 

1172 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'device_id', name=_('Location')), 

1173 FieldSet( 

1174 'profile_id', 'manufacturer_id', 'module_type_id', 'status', 'serial', 'asset_tag', 

1175 name=_('Hardware') 

1176 ), 

1177 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1178 ) 

1179 selector_fields = ('filter_id', 'q', 'manufacturer_id', 'profile_id') 

1180 device_id = DynamicModelMultipleChoiceField( 

1181 queryset=Device.objects.all(), 

1182 required=False, 

1183 query_params={ 

1184 'site_id': '$site_id', 

1185 'location_id': '$location_id', 

1186 'rack_id': '$rack_id', 

1187 }, 

1188 label=_('Device') 

1189 ) 

1190 region_id = DynamicModelMultipleChoiceField( 

1191 queryset=Region.objects.all(), 

1192 required=False, 

1193 label=_('Region') 

1194 ) 

1195 site_group_id = DynamicModelMultipleChoiceField( 

1196 queryset=SiteGroup.objects.all(), 

1197 required=False, 

1198 label=_('Site group') 

1199 ) 

1200 site_id = DynamicModelMultipleChoiceField( 

1201 queryset=Site.objects.all(), 

1202 required=False, 

1203 query_params={ 

1204 'region_id': '$region_id', 

1205 'group_id': '$site_group_id', 

1206 }, 

1207 label=_('Site') 

1208 ) 

1209 location_id = DynamicModelMultipleChoiceField( 

1210 queryset=Location.objects.all(), 

1211 required=False, 

1212 query_params={ 

1213 'site_id': '$site_id', 

1214 }, 

1215 label=_('Location') 

1216 ) 

1217 rack_id = DynamicModelMultipleChoiceField( 

1218 queryset=Rack.objects.all(), 

1219 required=False, 

1220 label=_('Rack'), 

1221 null_option='None', 

1222 query_params={ 

1223 'site_id': '$site_id', 

1224 'location_id': '$location_id', 

1225 } 

1226 ) 

1227 manufacturer_id = DynamicModelMultipleChoiceField( 

1228 queryset=Manufacturer.objects.all(), 

1229 required=False, 

1230 label=_('Manufacturer') 

1231 ) 

1232 profile_id = DynamicModelMultipleChoiceField( 

1233 queryset=ModuleTypeProfile.objects.all(), 

1234 required=False, 

1235 null_option='None', 

1236 label=_('Profile') 

1237 ) 

1238 module_type_id = DynamicModelMultipleChoiceField( 

1239 queryset=ModuleType.objects.all(), 

1240 required=False, 

1241 query_params={ 

1242 'profile_id': '$profile_id', 

1243 'manufacturer_id': '$manufacturer_id' 

1244 }, 

1245 label=_('Type') 

1246 ) 

1247 status = forms.MultipleChoiceField( 

1248 label=_('Status'), 

1249 choices=ModuleStatusChoices, 

1250 required=False 

1251 ) 

1252 serial = forms.CharField( 

1253 label=_('Serial'), 

1254 required=False 

1255 ) 

1256 asset_tag = forms.CharField( 

1257 label=_('Asset tag'), 

1258 required=False 

1259 ) 

1260 tag = TagFilterField(model) 

1261 

1262 

1263class VirtualChassisFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): 

1264 model = VirtualChassis 

1265 fieldsets = ( 

1266 FieldSet('q', 'filter_id', 'tag'), 

1267 FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')), 

1268 FieldSet('tenant_id', name=_('Tenant')), 

1269 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1270 ) 

1271 region_id = DynamicModelMultipleChoiceField( 

1272 queryset=Region.objects.all(), 

1273 required=False, 

1274 label=_('Region') 

1275 ) 

1276 site_group_id = DynamicModelMultipleChoiceField( 

1277 queryset=SiteGroup.objects.all(), 

1278 required=False, 

1279 label=_('Site group') 

1280 ) 

1281 site_id = DynamicModelMultipleChoiceField( 

1282 queryset=Site.objects.all(), 

1283 required=False, 

1284 query_params={ 

1285 'region_id': '$region_id', 

1286 'group_id': '$site_group_id', 

1287 }, 

1288 label=_('Site') 

1289 ) 

1290 tag = TagFilterField(model) 

1291 

1292 

1293class CableBundleFilterForm(PrimaryModelFilterSetForm): 

1294 model = CableBundle 

1295 fieldsets = ( 

1296 FieldSet('q', 'filter_id', 'tag'), 

1297 FieldSet('name', name=_('Attributes')), 

1298 ) 

1299 tag = TagFilterField(model) 

1300 

1301 

1302class CableFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): 

1303 model = Cable 

1304 fieldsets = ( 

1305 FieldSet('q', 'filter_id', 'tag'), 

1306 FieldSet('site_id', 'location_id', 'rack_id', 'device_id', name=_('Location')), 

1307 FieldSet( 

1308 'type', 'status', 'profile', 'color', 'length', 'length_unit', 'unterminated', 'bundle_id', 

1309 name=_('Attributes'), 

1310 ), 

1311 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

1312 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1313 ) 

1314 region_id = DynamicModelMultipleChoiceField( 

1315 queryset=Region.objects.all(), 

1316 required=False, 

1317 label=_('Region') 

1318 ) 

1319 site_id = DynamicModelMultipleChoiceField( 

1320 queryset=Site.objects.all(), 

1321 required=False, 

1322 query_params={ 

1323 'region_id': '$region_id' 

1324 }, 

1325 label=_('Site') 

1326 ) 

1327 location_id = DynamicModelMultipleChoiceField( 

1328 queryset=Location.objects.all(), 

1329 required=False, 

1330 label=_('Location'), 

1331 null_option='None', 

1332 query_params={ 

1333 'site_id': '$site_id' 

1334 } 

1335 ) 

1336 rack_id = DynamicModelMultipleChoiceField( 

1337 queryset=Rack.objects.all(), 

1338 required=False, 

1339 label=_('Rack'), 

1340 null_option='None', 

1341 query_params={ 

1342 'site_id': '$site_id', 

1343 'location_id': '$location_id', 

1344 } 

1345 ) 

1346 device_id = DynamicModelMultipleChoiceField( 

1347 queryset=Device.objects.all(), 

1348 required=False, 

1349 query_params={ 

1350 'site_id': '$site_id', 

1351 'location_id': '$location_id', 

1352 'rack_id': '$rack_id', 

1353 'tenant_id': '$tenant_id', 

1354 }, 

1355 label=_('Device') 

1356 ) 

1357 type = forms.MultipleChoiceField( 

1358 label=_('Type'), 

1359 choices=add_blank_choice(CableTypeChoices), 

1360 required=False 

1361 ) 

1362 status = forms.MultipleChoiceField( 

1363 label=_('Status'), 

1364 required=False, 

1365 choices=add_blank_choice(LinkStatusChoices) 

1366 ) 

1367 profile = forms.MultipleChoiceField( 

1368 label=_('Profile'), 

1369 required=False, 

1370 choices=add_blank_choice(CableProfileChoices) 

1371 ) 

1372 color = ColorField( 

1373 label=_('Color'), 

1374 required=False 

1375 ) 

1376 length = forms.DecimalField( 

1377 label=_('Length'), 

1378 required=False, 

1379 ) 

1380 length_unit = forms.ChoiceField( 

1381 label=_('Length unit'), 

1382 choices=add_blank_choice(CableLengthUnitChoices), 

1383 required=False 

1384 ) 

1385 unterminated = forms.NullBooleanField( 

1386 label=_('Unterminated'), 

1387 required=False, 

1388 widget=forms.Select( 

1389 choices=BOOLEAN_WITH_BLANK_CHOICES 

1390 ) 

1391 ) 

1392 bundle_id = DynamicModelMultipleChoiceField( 

1393 queryset=CableBundle.objects.all(), 

1394 required=False, 

1395 label=_('Bundle'), 

1396 ) 

1397 tag = TagFilterField(model) 

1398 

1399 

1400class PowerPanelFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): 

1401 model = PowerPanel 

1402 fieldsets = ( 

1403 FieldSet('q', 'filter_id', 'tag'), 

1404 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Location')), 

1405 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1406 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

1407 ) 

1408 selector_fields = ('filter_id', 'q', 'site_id', 'location_id') 

1409 region_id = DynamicModelMultipleChoiceField( 

1410 queryset=Region.objects.all(), 

1411 required=False, 

1412 label=_('Region') 

1413 ) 

1414 site_group_id = DynamicModelMultipleChoiceField( 

1415 queryset=SiteGroup.objects.all(), 

1416 required=False, 

1417 label=_('Site group') 

1418 ) 

1419 site_id = DynamicModelMultipleChoiceField( 

1420 queryset=Site.objects.all(), 

1421 required=False, 

1422 query_params={ 

1423 'region_id': '$region_id', 

1424 'group_id': '$site_group_id', 

1425 }, 

1426 label=_('Site') 

1427 ) 

1428 location_id = DynamicModelMultipleChoiceField( 

1429 queryset=Location.objects.all(), 

1430 required=False, 

1431 null_option='None', 

1432 query_params={ 

1433 'site_id': '$site_id' 

1434 }, 

1435 label=_('Location') 

1436 ) 

1437 tag = TagFilterField(model) 

1438 

1439 

1440class PowerFeedFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): 

1441 model = PowerFeed 

1442 fieldsets = ( 

1443 FieldSet('q', 'filter_id', 'tag'), 

1444 FieldSet('region_id', 'site_group_id', 'site_id', 'power_panel_id', 'rack_id', name=_('Location')), 

1445 FieldSet('status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', name=_('Attributes')), 

1446 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

1447 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1448 ) 

1449 region_id = DynamicModelMultipleChoiceField( 

1450 queryset=Region.objects.all(), 

1451 required=False, 

1452 label=_('Region') 

1453 ) 

1454 site_group_id = DynamicModelMultipleChoiceField( 

1455 queryset=SiteGroup.objects.all(), 

1456 required=False, 

1457 label=_('Site group') 

1458 ) 

1459 site_id = DynamicModelMultipleChoiceField( 

1460 queryset=Site.objects.all(), 

1461 required=False, 

1462 query_params={ 

1463 'region_id': '$region_id' 

1464 }, 

1465 label=_('Site') 

1466 ) 

1467 power_panel_id = DynamicModelMultipleChoiceField( 

1468 queryset=PowerPanel.objects.all(), 

1469 required=False, 

1470 null_option='None', 

1471 query_params={ 

1472 'site_id': '$site_id' 

1473 }, 

1474 label=_('Power panel') 

1475 ) 

1476 rack_id = DynamicModelMultipleChoiceField( 

1477 queryset=Rack.objects.all(), 

1478 required=False, 

1479 null_option='None', 

1480 query_params={ 

1481 'site_id': '$site_id' 

1482 }, 

1483 label=_('Rack') 

1484 ) 

1485 status = forms.MultipleChoiceField( 

1486 label=_('Status'), 

1487 choices=PowerFeedStatusChoices, 

1488 required=False 

1489 ) 

1490 type = forms.ChoiceField( 

1491 label=_('Type'), 

1492 choices=add_blank_choice(PowerFeedTypeChoices), 

1493 required=False 

1494 ) 

1495 supply = forms.ChoiceField( 

1496 label=_('Supply'), 

1497 choices=add_blank_choice(PowerFeedSupplyChoices), 

1498 required=False 

1499 ) 

1500 phase = forms.ChoiceField( 

1501 label=_('Phase'), 

1502 choices=add_blank_choice(PowerFeedPhaseChoices), 

1503 required=False 

1504 ) 

1505 voltage = forms.IntegerField( 

1506 label=_('Voltage'), 

1507 required=False 

1508 ) 

1509 amperage = forms.IntegerField( 

1510 label=_('Amperage'), 

1511 required=False 

1512 ) 

1513 max_utilization = forms.IntegerField( 

1514 label=_('Max utilization'), 

1515 required=False 

1516 ) 

1517 tag = TagFilterField(model) 

1518 

1519 

1520class CoolingSourceFilterForm(ContactModelFilterForm, PrimaryModelFilterSetForm): 

1521 model = CoolingSource 

1522 fieldsets = ( 

1523 FieldSet('q', 'filter_id', 'tag'), 

1524 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Location')), 

1525 FieldSet('type', 'status', 'fluid_type', name=_('Attributes')), 

1526 FieldSet('cooling_capacity', name=_('Characteristics')), 

1527 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1528 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), 

1529 ) 

1530 selector_fields = ('filter_id', 'q', 'site_id', 'location_id') 

1531 region_id = DynamicModelMultipleChoiceField( 

1532 queryset=Region.objects.all(), 

1533 required=False, 

1534 label=_('Region') 

1535 ) 

1536 site_group_id = DynamicModelMultipleChoiceField( 

1537 queryset=SiteGroup.objects.all(), 

1538 required=False, 

1539 label=_('Site group') 

1540 ) 

1541 site_id = DynamicModelMultipleChoiceField( 

1542 queryset=Site.objects.all(), 

1543 required=False, 

1544 query_params={ 

1545 'region_id': '$region_id', 

1546 'group_id': '$site_group_id', 

1547 }, 

1548 label=_('Site') 

1549 ) 

1550 location_id = DynamicModelMultipleChoiceField( 

1551 queryset=Location.objects.all(), 

1552 required=False, 

1553 null_option='None', 

1554 query_params={ 

1555 'site_id': '$site_id' 

1556 }, 

1557 label=_('Location') 

1558 ) 

1559 type = forms.MultipleChoiceField( 

1560 label=_('Type'), 

1561 choices=CoolingSourceTypeChoices, 

1562 required=False 

1563 ) 

1564 status = forms.MultipleChoiceField( 

1565 label=_('Status'), 

1566 choices=CoolingSourceStatusChoices, 

1567 required=False 

1568 ) 

1569 fluid_type = forms.MultipleChoiceField( 

1570 label=_('Fluid type'), 

1571 choices=FluidTypeChoices, 

1572 required=False 

1573 ) 

1574 cooling_capacity = forms.DecimalField( 

1575 label=_('Cooling capacity'), 

1576 required=False 

1577 ) 

1578 tag = TagFilterField(model) 

1579 

1580 

1581class CoolingFeedFilterForm(TenancyFilterForm, PrimaryModelFilterSetForm): 

1582 model = CoolingFeed 

1583 fieldsets = ( 

1584 FieldSet('q', 'filter_id', 'tag'), 

1585 FieldSet('region_id', 'site_group_id', 'site_id', 'cooling_source_id', 'rack_id', name=_('Location')), 

1586 FieldSet('status', name=_('Attributes')), 

1587 FieldSet( 

1588 'cooling_capacity', 'max_flow', 'max_flow_unit', name=_('Characteristics') 

1589 ), 

1590 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), 

1591 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1592 ) 

1593 region_id = DynamicModelMultipleChoiceField( 

1594 queryset=Region.objects.all(), 

1595 required=False, 

1596 label=_('Region') 

1597 ) 

1598 site_group_id = DynamicModelMultipleChoiceField( 

1599 queryset=SiteGroup.objects.all(), 

1600 required=False, 

1601 label=_('Site group') 

1602 ) 

1603 site_id = DynamicModelMultipleChoiceField( 

1604 queryset=Site.objects.all(), 

1605 required=False, 

1606 query_params={ 

1607 'region_id': '$region_id' 

1608 }, 

1609 label=_('Site') 

1610 ) 

1611 cooling_source_id = DynamicModelMultipleChoiceField( 

1612 queryset=CoolingSource.objects.all(), 

1613 required=False, 

1614 null_option='None', 

1615 query_params={ 

1616 'site_id': '$site_id' 

1617 }, 

1618 label=_('Cooling source') 

1619 ) 

1620 rack_id = DynamicModelMultipleChoiceField( 

1621 queryset=Rack.objects.all(), 

1622 required=False, 

1623 null_option='None', 

1624 query_params={ 

1625 'site_id': '$site_id' 

1626 }, 

1627 label=_('Rack') 

1628 ) 

1629 status = forms.MultipleChoiceField( 

1630 label=_('Status'), 

1631 choices=CoolingFeedStatusChoices, 

1632 required=False 

1633 ) 

1634 cooling_capacity = forms.DecimalField( 

1635 label=_('Cooling capacity'), 

1636 required=False 

1637 ) 

1638 max_flow = forms.DecimalField( 

1639 label=_('Max flow'), 

1640 required=False 

1641 ) 

1642 max_flow_unit = forms.MultipleChoiceField( 

1643 label=_('Max flow unit'), 

1644 choices=FlowRateUnitChoices, 

1645 required=False 

1646 ) 

1647 tag = TagFilterField(model) 

1648 

1649 

1650# 

1651# Device components 

1652# 

1653 

1654class DeviceComponentTemplateFilterForm(NetBoxModelFilterSetForm): 

1655 device_type_id = DynamicModelMultipleChoiceField( 

1656 queryset=DeviceType.objects.all(), 

1657 required=False, 

1658 label=_('Device type'), 

1659 ) 

1660 

1661 

1662class ModularDeviceComponentTemplateFilterForm(DeviceComponentTemplateFilterForm): 

1663 module_type_id = DynamicModelMultipleChoiceField( 

1664 queryset=ModuleType.objects.all(), 

1665 required=False, 

1666 query_params={'manufacturer_id': '$manufacturer_id'}, 

1667 label=_('Module Type'), 

1668 ) 

1669 

1670 

1671class CabledFilterForm(forms.Form): 

1672 cabled = forms.NullBooleanField( 

1673 label=_('Cabled'), 

1674 required=False, 

1675 widget=forms.Select( 

1676 choices=BOOLEAN_WITH_BLANK_CHOICES 

1677 ) 

1678 ) 

1679 occupied = forms.NullBooleanField( 

1680 label=_('Occupied'), 

1681 required=False, 

1682 widget=forms.Select( 

1683 choices=BOOLEAN_WITH_BLANK_CHOICES 

1684 ) 

1685 ) 

1686 

1687 

1688class PathEndpointFilterForm(CabledFilterForm): 

1689 connected = forms.NullBooleanField( 

1690 label=_('Connected'), 

1691 required=False, 

1692 widget=forms.Select( 

1693 choices=BOOLEAN_WITH_BLANK_CHOICES 

1694 ) 

1695 ) 

1696 

1697 

1698class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): 

1699 model = ConsolePort 

1700 fieldsets = ( 

1701 FieldSet('q', 'filter_id', 'tag'), 

1702 FieldSet('name', 'label', 'type', 'speed', name=_('Attributes')), 

1703 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

1704 FieldSet( 

1705 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

1706 name=_('Device') 

1707 ), 

1708 FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), 

1709 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1710 ) 

1711 type = forms.MultipleChoiceField( 

1712 label=_('Type'), 

1713 choices=ConsolePortTypeChoices, 

1714 required=False 

1715 ) 

1716 speed = forms.MultipleChoiceField( 

1717 label=_('Speed'), 

1718 choices=ConsolePortSpeedChoices, 

1719 required=False 

1720 ) 

1721 tag = TagFilterField(model) 

1722 

1723 

1724class ConsolePortTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

1725 model = ConsolePortTemplate 

1726 fieldsets = ( 

1727 FieldSet('q', 'filter_id', 'tag'), 

1728 FieldSet('name', 'label', 'type', name=_('Attributes')), 

1729 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

1730 ) 

1731 type = forms.MultipleChoiceField( 

1732 label=_('Type'), 

1733 choices=ConsolePortTypeChoices, 

1734 required=False 

1735 ) 

1736 

1737 

1738class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): 

1739 model = ConsoleServerPort 

1740 fieldsets = ( 

1741 FieldSet('q', 'filter_id', 'tag'), 

1742 FieldSet('name', 'label', 'type', 'speed', name=_('Attributes')), 

1743 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

1744 FieldSet( 

1745 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

1746 name=_('Device') 

1747 ), 

1748 FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), 

1749 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1750 ) 

1751 type = forms.MultipleChoiceField( 

1752 label=_('Type'), 

1753 choices=ConsolePortTypeChoices, 

1754 required=False 

1755 ) 

1756 speed = forms.MultipleChoiceField( 

1757 label=_('Speed'), 

1758 choices=ConsolePortSpeedChoices, 

1759 required=False 

1760 ) 

1761 tag = TagFilterField(model) 

1762 

1763 

1764class ConsoleServerPortTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

1765 model = ConsoleServerPortTemplate 

1766 fieldsets = ( 

1767 FieldSet('q', 'filter_id', 'tag'), 

1768 FieldSet('name', 'label', 'type', name=_('Attributes')), 

1769 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

1770 ) 

1771 type = forms.MultipleChoiceField( 

1772 label=_('Type'), 

1773 choices=ConsolePortTypeChoices, 

1774 required=False 

1775 ) 

1776 

1777 

1778class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): 

1779 model = PowerPort 

1780 fieldsets = ( 

1781 FieldSet('q', 'filter_id', 'tag'), 

1782 FieldSet('name', 'label', 'type', name=_('Attributes')), 

1783 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

1784 FieldSet( 

1785 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

1786 name=_('Device') 

1787 ), 

1788 FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), 

1789 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1790 ) 

1791 type = forms.MultipleChoiceField( 

1792 label=_('Type'), 

1793 choices=PowerPortTypeChoices, 

1794 required=False 

1795 ) 

1796 tag = TagFilterField(model) 

1797 

1798 

1799class PowerPortTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

1800 model = PowerPortTemplate 

1801 fieldsets = ( 

1802 FieldSet('q', 'filter_id', 'tag'), 

1803 FieldSet('name', 'label', 'type', name=_('Attributes')), 

1804 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

1805 ) 

1806 type = forms.MultipleChoiceField( 

1807 label=_('Type'), 

1808 choices=PowerPortTypeChoices, 

1809 required=False 

1810 ) 

1811 

1812 

1813class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): 

1814 model = PowerOutlet 

1815 fieldsets = ( 

1816 FieldSet('q', 'filter_id', 'tag'), 

1817 FieldSet('name', 'label', 'type', 'color', 'status', name=_('Attributes')), 

1818 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

1819 FieldSet( 

1820 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

1821 name=_('Device') 

1822 ), 

1823 FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), 

1824 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1825 ) 

1826 type = forms.MultipleChoiceField( 

1827 label=_('Type'), 

1828 choices=PowerOutletTypeChoices, 

1829 required=False 

1830 ) 

1831 tag = TagFilterField(model) 

1832 color = ColorField( 

1833 label=_('Color'), 

1834 required=False 

1835 ) 

1836 status = forms.MultipleChoiceField( 

1837 label=_('Status'), 

1838 choices=PowerOutletStatusChoices, 

1839 required=False 

1840 ) 

1841 

1842 

1843class PowerOutletTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

1844 model = PowerOutletTemplate 

1845 fieldsets = ( 

1846 FieldSet('q', 'filter_id', 'tag'), 

1847 FieldSet('name', 'label', 'type', name=_('Attributes')), 

1848 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

1849 ) 

1850 type = forms.MultipleChoiceField( 

1851 label=_('Type'), 

1852 choices=PowerOutletTypeChoices, 

1853 required=False 

1854 ) 

1855 

1856 

1857class CoolingIntakeFilterForm(DeviceComponentFilterForm): 

1858 model = CoolingIntake 

1859 fieldsets = ( 

1860 FieldSet('q', 'filter_id', 'tag'), 

1861 FieldSet( 

1862 'name', 'label', 'type', 'diameter', 'diameter_unit', 'max_flow', 'max_flow_unit', 

1863 'cooling_outflow_id', name=_('Attributes') 

1864 ), 

1865 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

1866 FieldSet( 

1867 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

1868 name=_('Device') 

1869 ), 

1870 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1871 ) 

1872 type = forms.MultipleChoiceField( 

1873 label=_('Type'), 

1874 choices=CoolingConnectorTypeChoices, 

1875 required=False 

1876 ) 

1877 diameter = forms.DecimalField( 

1878 label=_('Diameter'), 

1879 required=False 

1880 ) 

1881 diameter_unit = forms.MultipleChoiceField( 

1882 label=_('Diameter unit'), 

1883 choices=DiameterUnitChoices, 

1884 required=False 

1885 ) 

1886 max_flow = forms.DecimalField( 

1887 label=_('Max flow'), 

1888 required=False 

1889 ) 

1890 max_flow_unit = forms.MultipleChoiceField( 

1891 label=_('Max flow unit'), 

1892 choices=FlowRateUnitChoices, 

1893 required=False 

1894 ) 

1895 cooling_outflow_id = DynamicModelMultipleChoiceField( 

1896 label=_('Cooling outflow'), 

1897 queryset=CoolingOutflow.objects.all(), 

1898 required=False 

1899 ) 

1900 tag = TagFilterField(model) 

1901 

1902 

1903class CoolingIntakeTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

1904 model = CoolingIntakeTemplate 

1905 fieldsets = ( 

1906 FieldSet('q', 'filter_id', 'tag'), 

1907 FieldSet( 

1908 'name', 'label', 'type', 'diameter', 'diameter_unit', 'max_flow', 'max_flow_unit', 

1909 name=_('Attributes') 

1910 ), 

1911 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

1912 ) 

1913 type = forms.MultipleChoiceField( 

1914 label=_('Type'), 

1915 choices=CoolingConnectorTypeChoices, 

1916 required=False 

1917 ) 

1918 diameter = forms.DecimalField( 

1919 label=_('Diameter'), 

1920 required=False 

1921 ) 

1922 diameter_unit = forms.MultipleChoiceField( 

1923 label=_('Diameter unit'), 

1924 choices=DiameterUnitChoices, 

1925 required=False 

1926 ) 

1927 max_flow = forms.DecimalField( 

1928 label=_('Max flow'), 

1929 required=False 

1930 ) 

1931 max_flow_unit = forms.MultipleChoiceField( 

1932 label=_('Max flow unit'), 

1933 choices=FlowRateUnitChoices, 

1934 required=False 

1935 ) 

1936 

1937 

1938class CoolingOutflowFilterForm(DeviceComponentFilterForm): 

1939 model = CoolingOutflow 

1940 fieldsets = ( 

1941 FieldSet('q', 'filter_id', 'tag'), 

1942 FieldSet( 

1943 'name', 'label', 'type', 'diameter', 'diameter_unit', 'cooling_intake_id', name=_('Attributes') 

1944 ), 

1945 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

1946 FieldSet( 

1947 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

1948 name=_('Device') 

1949 ), 

1950 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

1951 ) 

1952 type = forms.MultipleChoiceField( 

1953 label=_('Type'), 

1954 choices=CoolingConnectorTypeChoices, 

1955 required=False 

1956 ) 

1957 diameter = forms.DecimalField( 

1958 label=_('Diameter'), 

1959 required=False 

1960 ) 

1961 diameter_unit = forms.MultipleChoiceField( 

1962 label=_('Diameter unit'), 

1963 choices=DiameterUnitChoices, 

1964 required=False 

1965 ) 

1966 cooling_intake_id = DynamicModelMultipleChoiceField( 

1967 label=_('Cooling intake'), 

1968 queryset=CoolingIntake.objects.all(), 

1969 required=False 

1970 ) 

1971 tag = TagFilterField(model) 

1972 

1973 

1974class CoolingOutflowTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

1975 model = CoolingOutflowTemplate 

1976 fieldsets = ( 

1977 FieldSet('q', 'filter_id', 'tag'), 

1978 FieldSet('name', 'label', 'type', 'diameter', 'diameter_unit', 'cooling_intake_id', name=_('Attributes')), 

1979 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

1980 ) 

1981 type = forms.MultipleChoiceField( 

1982 label=_('Type'), 

1983 choices=CoolingConnectorTypeChoices, 

1984 required=False 

1985 ) 

1986 diameter = forms.DecimalField( 

1987 label=_('Diameter'), 

1988 required=False 

1989 ) 

1990 diameter_unit = forms.MultipleChoiceField( 

1991 label=_('Diameter unit'), 

1992 choices=DiameterUnitChoices, 

1993 required=False 

1994 ) 

1995 cooling_intake_id = DynamicModelMultipleChoiceField( 

1996 label=_('Cooling intake'), 

1997 queryset=CoolingIntakeTemplate.objects.all(), 

1998 required=False 

1999 ) 

2000 

2001 

2002class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): 

2003 model = Interface 

2004 fieldsets = ( 

2005 FieldSet('q', 'filter_id', 'tag'), 

2006 FieldSet( 

2007 'name', 'label', 'kind', 'type', 'channels', 'channel_id', 'speed', 'duplex', 'enabled', 'mgmt_only', 

2008 name=_('Attributes') 

2009 ), 

2010 FieldSet('vrf_id', 'l2vpn_id', 'mac_address', 'wwn', name=_('Addressing')), 

2011 FieldSet('poe_mode', 'poe_type', name=_('PoE')), 

2012 FieldSet('mode', 'vlan_translation_policy_id', name=_('802.1Q Switching')), 

2013 FieldSet('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power', name=_('Wireless')), 

2014 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

2015 FieldSet( 

2016 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

2017 'vdc_id', 

2018 name=_('Device') 

2019 ), 

2020 FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), 

2021 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2022 ) 

2023 selector_fields = ('filter_id', 'q', 'device_id') 

2024 vdc_id = DynamicModelMultipleChoiceField( 

2025 queryset=VirtualDeviceContext.objects.all(), 

2026 required=False, 

2027 query_params={ 

2028 'device_id': '$device_id', 

2029 }, 

2030 label=_('Virtual Device Context') 

2031 ) 

2032 kind = forms.MultipleChoiceField( 

2033 label=_('Kind'), 

2034 choices=InterfaceKindChoices, 

2035 required=False 

2036 ) 

2037 type = forms.MultipleChoiceField( 

2038 label=_('Type'), 

2039 choices=InterfaceTypeChoices, 

2040 required=False 

2041 ) 

2042 channels = forms.IntegerField( 

2043 label=_('Channels'), 

2044 required=False 

2045 ) 

2046 channel_id = forms.IntegerField( 

2047 label=_('Channel ID'), 

2048 required=False 

2049 ) 

2050 speed = PositiveBigIntegerField( 

2051 label=_('Speed'), 

2052 required=False, 

2053 widget=NumberWithOptions( 

2054 options=InterfaceSpeedChoices 

2055 ) 

2056 ) 

2057 duplex = forms.MultipleChoiceField( 

2058 label=_('Duplex'), 

2059 choices=InterfaceDuplexChoices, 

2060 required=False 

2061 ) 

2062 enabled = forms.NullBooleanField( 

2063 label=_('Enabled'), 

2064 required=False, 

2065 widget=forms.Select( 

2066 choices=BOOLEAN_WITH_BLANK_CHOICES 

2067 ) 

2068 ) 

2069 mgmt_only = forms.NullBooleanField( 

2070 label=_('Mgmt only'), 

2071 required=False, 

2072 widget=forms.Select( 

2073 choices=BOOLEAN_WITH_BLANK_CHOICES 

2074 ) 

2075 ) 

2076 mac_address = forms.CharField( 

2077 required=False, 

2078 label=_('MAC address') 

2079 ) 

2080 wwn = forms.CharField( 

2081 required=False, 

2082 label=_('WWN') 

2083 ) 

2084 poe_mode = forms.MultipleChoiceField( 

2085 choices=InterfacePoEModeChoices, 

2086 required=False, 

2087 label=_('PoE mode') 

2088 ) 

2089 poe_type = forms.MultipleChoiceField( 

2090 choices=InterfacePoETypeChoices, 

2091 required=False, 

2092 label=_('PoE type') 

2093 ) 

2094 mode = forms.MultipleChoiceField( 

2095 choices=InterfaceModeChoices, 

2096 required=False, 

2097 label=_('802.1Q mode') 

2098 ) 

2099 vlan_translation_policy_id = DynamicModelMultipleChoiceField( 

2100 queryset=VLANTranslationPolicy.objects.all(), 

2101 required=False, 

2102 label=_('VLAN Translation Policy') 

2103 ) 

2104 rf_role = forms.MultipleChoiceField( 

2105 choices=WirelessRoleChoices, 

2106 required=False, 

2107 label=_('Wireless role') 

2108 ) 

2109 rf_channel = forms.MultipleChoiceField( 

2110 choices=WirelessChannelChoices, 

2111 required=False, 

2112 label=_('Wireless channel') 

2113 ) 

2114 rf_channel_frequency = forms.IntegerField( 

2115 required=False, 

2116 label=_('Channel frequency (MHz)') 

2117 ) 

2118 rf_channel_width = forms.IntegerField( 

2119 required=False, 

2120 label=_('Channel width (MHz)') 

2121 ) 

2122 tx_power = forms.IntegerField( 

2123 required=False, 

2124 label=_('Transmit power (dBm)'), 

2125 min_value=-40, 

2126 max_value=127 

2127 ) 

2128 vrf_id = DynamicModelMultipleChoiceField( 

2129 queryset=VRF.objects.all(), 

2130 required=False, 

2131 label=_('VRF') 

2132 ) 

2133 l2vpn_id = DynamicModelMultipleChoiceField( 

2134 queryset=L2VPN.objects.all(), 

2135 required=False, 

2136 label=_('L2VPN') 

2137 ) 

2138 tag = TagFilterField(model) 

2139 

2140 

2141class InterfaceTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

2142 model = InterfaceTemplate 

2143 fieldsets = ( 

2144 FieldSet('q', 'filter_id', 'tag'), 

2145 FieldSet('name', 'label', 'type', 'enabled', 'mgmt_only', name=_('Attributes')), 

2146 FieldSet('poe_mode', 'poe_type', name=_('PoE')), 

2147 FieldSet('rf_role', name=_('Wireless')), 

2148 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

2149 ) 

2150 type = forms.MultipleChoiceField( 

2151 label=_('Type'), 

2152 choices=InterfaceTypeChoices, 

2153 required=False 

2154 ) 

2155 enabled = forms.NullBooleanField( 

2156 label=_('Enabled'), 

2157 required=False, 

2158 widget=forms.Select( 

2159 choices=BOOLEAN_WITH_BLANK_CHOICES 

2160 ) 

2161 ) 

2162 mgmt_only = forms.NullBooleanField( 

2163 label=_('Management only'), 

2164 required=False, 

2165 widget=forms.Select( 

2166 choices=BOOLEAN_WITH_BLANK_CHOICES 

2167 ) 

2168 ) 

2169 poe_mode = forms.MultipleChoiceField( 

2170 choices=InterfacePoEModeChoices, 

2171 required=False, 

2172 label=_('PoE mode') 

2173 ) 

2174 poe_type = forms.MultipleChoiceField( 

2175 choices=InterfacePoETypeChoices, 

2176 required=False, 

2177 label=_('PoE type') 

2178 ) 

2179 rf_role = forms.MultipleChoiceField( 

2180 choices=WirelessRoleChoices, 

2181 required=False, 

2182 label=_('Wireless role') 

2183 ) 

2184 

2185 

2186class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): 

2187 fieldsets = ( 

2188 FieldSet('q', 'filter_id', 'tag'), 

2189 FieldSet('name', 'label', 'type', 'color', name=_('Attributes')), 

2190 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

2191 FieldSet( 

2192 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

2193 name=_('Device') 

2194 ), 

2195 FieldSet('cabled', 'occupied', name=_('Cable')), 

2196 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2197 ) 

2198 model = FrontPort 

2199 type = forms.MultipleChoiceField( 

2200 label=_('Type'), 

2201 choices=PortTypeChoices, 

2202 required=False 

2203 ) 

2204 color = ColorField( 

2205 label=_('Color'), 

2206 required=False 

2207 ) 

2208 tag = TagFilterField(model) 

2209 

2210 

2211class FrontPortTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

2212 model = FrontPortTemplate 

2213 fieldsets = ( 

2214 FieldSet('q', 'filter_id', 'tag'), 

2215 FieldSet('name', 'label', 'type', 'color', name=_('Attributes')), 

2216 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

2217 ) 

2218 type = forms.MultipleChoiceField( 

2219 label=_('Type'), 

2220 choices=PortTypeChoices, 

2221 required=False 

2222 ) 

2223 color = ColorField( 

2224 label=_('Color'), 

2225 required=False 

2226 ) 

2227 

2228 

2229class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): 

2230 model = RearPort 

2231 fieldsets = ( 

2232 FieldSet('q', 'filter_id', 'tag'), 

2233 FieldSet('name', 'label', 'type', 'color', name=_('Attributes')), 

2234 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

2235 FieldSet( 

2236 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

2237 name=_('Device') 

2238 ), 

2239 FieldSet('cabled', 'occupied', name=_('Cable')), 

2240 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2241 ) 

2242 type = forms.MultipleChoiceField( 

2243 label=_('Type'), 

2244 choices=PortTypeChoices, 

2245 required=False 

2246 ) 

2247 color = ColorField( 

2248 label=_('Color'), 

2249 required=False 

2250 ) 

2251 tag = TagFilterField(model) 

2252 

2253 

2254class RearPortTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

2255 model = RearPortTemplate 

2256 fieldsets = ( 

2257 FieldSet('q', 'filter_id', 'tag'), 

2258 FieldSet('name', 'label', 'type', 'color', name=_('Attributes')), 

2259 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

2260 ) 

2261 type = forms.MultipleChoiceField( 

2262 label=_('Type'), 

2263 choices=PortTypeChoices, 

2264 required=False 

2265 ) 

2266 color = ColorField( 

2267 label=_('Color'), 

2268 required=False 

2269 ) 

2270 

2271 

2272class ModuleBayFilterForm(DeviceComponentFilterForm): 

2273 model = ModuleBay 

2274 fieldsets = ( 

2275 FieldSet('q', 'filter_id', 'tag'), 

2276 FieldSet('name', 'label', 'position', 'enabled', 'module_bay_type_id', name=_('Attributes')), 

2277 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

2278 FieldSet( 

2279 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

2280 name=_('Device') 

2281 ), 

2282 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2283 ) 

2284 position = forms.CharField( 

2285 label=_('Position'), 

2286 required=False 

2287 ) 

2288 enabled = forms.NullBooleanField( 

2289 label=_('Enabled'), 

2290 required=False, 

2291 widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), 

2292 ) 

2293 module_bay_type_id = DynamicModelMultipleChoiceField( 

2294 queryset=ModuleBayType.objects.all(), 

2295 required=False, 

2296 label=_('Module bay type') 

2297 ) 

2298 tag = TagFilterField(model) 

2299 

2300 

2301class ModuleBayTemplateFilterForm(ModularDeviceComponentTemplateFilterForm): 

2302 model = ModuleBayTemplate 

2303 fieldsets = ( 

2304 FieldSet('q', 'filter_id', 'tag'), 

2305 FieldSet('name', 'label', 'position', 'enabled', 'module_bay_type_id', name=_('Attributes')), 

2306 FieldSet('device_type_id', 'module_type_id', name=_('Device')), 

2307 ) 

2308 position = forms.CharField( 

2309 label=_('Position'), 

2310 required=False, 

2311 ) 

2312 enabled = forms.NullBooleanField( 

2313 label=_('Enabled'), 

2314 required=False, 

2315 widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), 

2316 ) 

2317 module_bay_type_id = DynamicModelMultipleChoiceField( 

2318 queryset=ModuleBayType.objects.all(), 

2319 required=False, 

2320 label=_('Module bay type') 

2321 ) 

2322 

2323 

2324class DeviceBayFilterForm(DeviceComponentFilterForm): 

2325 model = DeviceBay 

2326 fieldsets = ( 

2327 FieldSet('q', 'filter_id', 'tag'), 

2328 FieldSet('name', 'label', 'enabled', name=_('Attributes')), 

2329 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

2330 FieldSet( 

2331 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

2332 name=_('Device') 

2333 ), 

2334 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2335 ) 

2336 enabled = forms.NullBooleanField( 

2337 label=_('Enabled'), 

2338 required=False, 

2339 widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), 

2340 ) 

2341 tag = TagFilterField(model) 

2342 

2343 

2344class DeviceBayTemplateFilterForm(DeviceComponentTemplateFilterForm): 

2345 model = DeviceBayTemplate 

2346 fieldsets = ( 

2347 FieldSet('q', 'filter_id', 'tag'), 

2348 FieldSet('name', 'label', 'enabled', name=_('Attributes')), 

2349 FieldSet('device_type_id', name=_('Device')), 

2350 ) 

2351 enabled = forms.NullBooleanField( 

2352 label=_('Enabled'), 

2353 required=False, 

2354 widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES), 

2355 ) 

2356 

2357 

2358class InventoryItemFilterForm(DeviceComponentFilterForm): 

2359 model = InventoryItem 

2360 fieldsets = ( 

2361 FieldSet('q', 'filter_id', 'tag'), 

2362 FieldSet( 

2363 'name', 'label', 'status', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered', 

2364 name=_('Attributes') 

2365 ), 

2366 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), 

2367 FieldSet( 

2368 'tenant_id', 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 

2369 name=_('Device') 

2370 ), 

2371 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2372 ) 

2373 role_id = DynamicModelMultipleChoiceField( 

2374 queryset=InventoryItemRole.objects.all(), 

2375 required=False, 

2376 label=_('Role') 

2377 ) 

2378 manufacturer_id = DynamicModelMultipleChoiceField( 

2379 queryset=Manufacturer.objects.all(), 

2380 required=False, 

2381 label=_('Manufacturer') 

2382 ) 

2383 serial = forms.CharField( 

2384 label=_('Serial'), 

2385 required=False 

2386 ) 

2387 asset_tag = forms.CharField( 

2388 label=_('Asset tag'), 

2389 required=False 

2390 ) 

2391 discovered = forms.NullBooleanField( 

2392 label=_('Discovered'), 

2393 required=False, 

2394 widget=forms.Select( 

2395 choices=BOOLEAN_WITH_BLANK_CHOICES 

2396 ) 

2397 ) 

2398 status = forms.MultipleChoiceField( 

2399 label=_('Status'), 

2400 choices=InventoryItemStatusChoices, 

2401 required=False 

2402 ) 

2403 tag = TagFilterField(model) 

2404 

2405 

2406class InventoryItemTemplateFilterForm(DeviceComponentTemplateFilterForm): 

2407 model = InventoryItemTemplate 

2408 fieldsets = ( 

2409 FieldSet('q', 'filter_id', 'tag'), 

2410 FieldSet('name', 'label', 'role_id', 'manufacturer_id', name=_('Attributes')), 

2411 FieldSet('device_type_id', name=_('Device')), 

2412 ) 

2413 role_id = DynamicModelMultipleChoiceField( 

2414 queryset=InventoryItemRole.objects.all(), 

2415 required=False, 

2416 label=_('Role') 

2417 ) 

2418 manufacturer_id = DynamicModelMultipleChoiceField( 

2419 queryset=Manufacturer.objects.all(), 

2420 required=False, 

2421 label=_('Manufacturer') 

2422 ) 

2423 

2424 

2425# 

2426# Device component roles 

2427# 

2428 

2429class InventoryItemRoleFilterForm(OrganizationalModelFilterSetForm): 

2430 model = InventoryItemRole 

2431 fieldsets = ( 

2432 FieldSet('q', 'filter_id', 'tag'), 

2433 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2434 ) 

2435 tag = TagFilterField(model) 

2436 

2437 

2438# 

2439# Addressing 

2440# 

2441 

2442class MACAddressFilterForm(PrimaryModelFilterSetForm): 

2443 model = MACAddress 

2444 fieldsets = ( 

2445 FieldSet('q', 'filter_id', 'tag'), 

2446 FieldSet('mac_address', name=_('Attributes')), 

2447 FieldSet('device_id', 'virtual_machine_id', 'assigned', 'primary', name=_('Assignments')), 

2448 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')), 

2449 ) 

2450 selector_fields = ('filter_id', 'q', 'device_id', 'virtual_machine_id') 

2451 mac_address = forms.CharField( 

2452 required=False, 

2453 label=_('MAC address'), 

2454 ) 

2455 device_id = DynamicModelMultipleChoiceField( 

2456 queryset=Device.objects.all(), 

2457 required=False, 

2458 label=_('Assigned Device'), 

2459 ) 

2460 virtual_machine_id = DynamicModelMultipleChoiceField( 

2461 queryset=VirtualMachine.objects.all(), 

2462 required=False, 

2463 label=_('Assigned VM'), 

2464 ) 

2465 assigned = forms.NullBooleanField( 

2466 required=False, 

2467 label=_('Assigned to an interface'), 

2468 widget=forms.Select( 

2469 choices=BOOLEAN_WITH_BLANK_CHOICES 

2470 ), 

2471 ) 

2472 primary = forms.NullBooleanField( 

2473 required=False, 

2474 label=_('Primary MAC of an interface'), 

2475 widget=forms.Select( 

2476 choices=BOOLEAN_WITH_BLANK_CHOICES 

2477 ), 

2478 ) 

2479 tag = TagFilterField(model) 

2480 

2481 

2482# 

2483# Connections 

2484# 

2485 

2486class ConsoleConnectionFilterForm(FilterForm): 

2487 region_id = DynamicModelMultipleChoiceField( 

2488 queryset=Region.objects.all(), 

2489 required=False, 

2490 label=_('Region') 

2491 ) 

2492 site_id = DynamicModelMultipleChoiceField( 

2493 queryset=Site.objects.all(), 

2494 required=False, 

2495 query_params={ 

2496 'region_id': '$region_id' 

2497 }, 

2498 label=_('Site') 

2499 ) 

2500 device_id = DynamicModelMultipleChoiceField( 

2501 queryset=Device.objects.all(), 

2502 required=False, 

2503 query_params={ 

2504 'site_id': '$site_id' 

2505 }, 

2506 label=_('Device') 

2507 ) 

2508 

2509 

2510class PowerConnectionFilterForm(FilterForm): 

2511 region_id = DynamicModelMultipleChoiceField( 

2512 queryset=Region.objects.all(), 

2513 required=False, 

2514 label=_('Region') 

2515 ) 

2516 site_id = DynamicModelMultipleChoiceField( 

2517 queryset=Site.objects.all(), 

2518 required=False, 

2519 query_params={ 

2520 'region_id': '$region_id' 

2521 }, 

2522 label=_('Site') 

2523 ) 

2524 device_id = DynamicModelMultipleChoiceField( 

2525 queryset=Device.objects.all(), 

2526 required=False, 

2527 query_params={ 

2528 'site_id': '$site_id' 

2529 }, 

2530 label=_('Device') 

2531 ) 

2532 

2533 

2534class InterfaceConnectionFilterForm(FilterForm): 

2535 region_id = DynamicModelMultipleChoiceField( 

2536 queryset=Region.objects.all(), 

2537 required=False, 

2538 label=_('Region') 

2539 ) 

2540 site_id = DynamicModelMultipleChoiceField( 

2541 queryset=Site.objects.all(), 

2542 required=False, 

2543 query_params={ 

2544 'region_id': '$region_id' 

2545 }, 

2546 label=_('Site') 

2547 ) 

2548 device_id = DynamicModelMultipleChoiceField( 

2549 queryset=Device.objects.all(), 

2550 required=False, 

2551 query_params={ 

2552 'site_id': '$site_id' 

2553 }, 

2554 label=_('Device') 

2555 )