12
12
from utilities .fields import ColorField , NaturalOrderingField
13
13
from utilities .mptt import TreeManager
14
14
from utilities .ordering import naturalize_interface
15
+ from wireless .choices import WirelessRoleChoices
15
16
from .device_components import (
16
17
ConsolePort , ConsoleServerPort , DeviceBay , FrontPort , Interface , InventoryItem , ModuleBay , PowerOutlet , PowerPort ,
17
18
RearPort ,
@@ -387,6 +388,12 @@ class InterfaceTemplate(ModularComponentTemplateModel):
387
388
blank = True ,
388
389
verbose_name = 'PoE type'
389
390
)
391
+ rf_role = models .CharField (
392
+ max_length = 30 ,
393
+ choices = WirelessRoleChoices ,
394
+ blank = True ,
395
+ verbose_name = 'Wireless role'
396
+ )
390
397
391
398
component_model = Interface
392
399
@@ -405,6 +412,11 @@ def clean(self):
405
412
'bridge' : f"Bridge interface ({ self .bridge } ) must belong to the same module type"
406
413
})
407
414
415
+ if self .rf_role and self .type not in WIRELESS_IFACE_TYPES :
416
+ raise ValidationError ({
417
+ 'rf_role' : "Wireless role may be set only on wireless interfaces."
418
+ })
419
+
408
420
def instantiate (self , ** kwargs ):
409
421
return self .component_model (
410
422
name = self .resolve_name (kwargs .get ('module' )),
@@ -414,6 +426,7 @@ def instantiate(self, **kwargs):
414
426
mgmt_only = self .mgmt_only ,
415
427
poe_mode = self .poe_mode ,
416
428
poe_type = self .poe_type ,
429
+ rf_role = self .rf_role ,
417
430
** kwargs
418
431
)
419
432
instantiate .do_not_call_in_templates = True
@@ -429,6 +442,7 @@ def to_yaml(self):
429
442
'bridge' : self .bridge .name if self .bridge else None ,
430
443
'poe_mode' : self .poe_mode ,
431
444
'poe_type' : self .poe_type ,
445
+ 'rf_role' : self .rf_role ,
432
446
}
433
447
434
448
0 commit comments