Skip to content

Commit 1f45663

Browse files
committed
adds rf_role to interface template #13170
1 parent 837be4d commit 1f45663

10 files changed

+66
-8
lines changed

netbox/dcim/api/serializers.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -498,12 +498,18 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer):
498498
allow_blank=True,
499499
allow_null=True
500500
)
501+
rf_role = ChoiceField(
502+
choices=WirelessRoleChoices,
503+
required=False,
504+
allow_blank=True,
505+
allow_null=True
506+
)
501507

502508
class Meta:
503509
model = InterfaceTemplate
504510
fields = [
505511
'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only',
506-
'description', 'bridge', 'poe_mode', 'poe_type', 'created', 'last_updated',
512+
'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'created', 'last_updated',
507513
]
508514

509515

netbox/dcim/filtersets.py

+3
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,9 @@ class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo
696696
poe_type = django_filters.MultipleChoiceFilter(
697697
choices=InterfacePoETypeChoices
698698
)
699+
rf_role = django_filters.MultipleChoiceFilter(
700+
choices=WirelessRoleChoices
701+
)
699702

700703
class Meta:
701704
model = InterfaceTemplate

netbox/dcim/forms/bulk_create.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,14 @@ class PowerOutletBulkCreateForm(
7676

7777
class InterfaceBulkCreateForm(
7878
form_from_model(Interface, [
79-
'type', 'enabled', 'speed', 'duplex', 'mtu', 'mgmt_only', 'mark_connected', 'poe_mode', 'poe_type',
79+
'type', 'enabled', 'speed', 'duplex', 'mtu', 'mgmt_only', 'mark_connected', 'poe_mode', 'poe_type', 'rf_role'
8080
]),
8181
DeviceBulkAddComponentForm
8282
):
8383
model = Interface
8484
field_order = (
8585
'name', 'label', 'type', 'enabled', 'speed', 'duplex', 'mtu', 'mgmt_only', 'poe_mode',
86-
'poe_type', 'mark_connected', 'description', 'tags',
86+
'poe_type', 'mark_connected', 'rf_role', 'description', 'tags',
8787
)
8888

8989

netbox/dcim/forms/bulk_edit.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
1616
from utilities.forms.widgets import BulkEditNullBooleanSelect, NumberWithOptions
1717
from wireless.models import WirelessLAN, WirelessLANGroup
18+
from wireless.choices import WirelessRoleChoices
1819

1920
__all__ = (
2021
'CableBulkEditForm',
@@ -922,8 +923,14 @@ class InterfaceTemplateBulkEditForm(BulkEditForm):
922923
initial='',
923924
label=_('PoE type')
924925
)
926+
rf_role = forms.ChoiceField(
927+
choices=add_blank_choice(WirelessRoleChoices),
928+
required=False,
929+
initial='',
930+
label=_('Wireless role')
931+
)
925932

926-
nullable_fields = ('label', 'description', 'poe_mode', 'poe_type')
933+
nullable_fields = ('label', 'description', 'poe_mode', 'poe_type', 'rf_role')
927934

928935

929936
class FrontPortTemplateBulkEditForm(BulkEditForm):

netbox/dcim/forms/model_forms.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -821,13 +821,14 @@ class InterfaceTemplateForm(ModularComponentTemplateForm):
821821

822822
fieldsets = (
823823
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'bridge')),
824-
('PoE', ('poe_mode', 'poe_type'))
824+
('PoE', ('poe_mode', 'poe_type')),
825+
('Wireless', ('rf_role',))
825826
)
826827

827828
class Meta:
828829
model = InterfaceTemplate
829830
fields = [
830-
'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'enabled', 'description', 'poe_mode', 'poe_type', 'bridge',
831+
'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'enabled', 'description', 'poe_mode', 'poe_type', 'bridge', 'rf_role',
831832
]
832833

833834

netbox/dcim/forms/object_import.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from dcim.choices import InterfacePoEModeChoices, InterfacePoETypeChoices, InterfaceTypeChoices, PortTypeChoices
55
from dcim.models import *
66
from utilities.forms import BootstrapMixin
7+
from wireless.choices import WirelessRoleChoices
78

89
__all__ = (
910
'ConsolePortTemplateImportForm',
@@ -96,11 +97,16 @@ class InterfaceTemplateImportForm(ComponentTemplateImportForm):
9697
required=False,
9798
label=_('PoE type')
9899
)
100+
rf_role = forms.ChoiceField(
101+
choices=WirelessRoleChoices,
102+
required=False,
103+
label=_('Wireless role')
104+
)
99105

100106
class Meta:
101107
model = InterfaceTemplate
102108
fields = [
103-
'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'poe_mode', 'poe_type',
109+
'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description', 'poe_mode', 'poe_type', 'rf_role'
104110
]
105111

106112

netbox/dcim/graphql/types.py

+3
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ def resolve_poe_mode(self, info):
277277
def resolve_poe_type(self, info):
278278
return self.poe_type or None
279279

280+
def resolve_rf_role(self, info):
281+
return self.rf_role or None
282+
280283

281284
class InventoryItemType(ComponentObjectType):
282285
component = graphene.Field('dcim.graphql.gfk_mixins.InventoryItemComponentType')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.2 on 2023-07-18 07:55
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('dcim', '0174_rack_starting_unit'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='interfacetemplate',
15+
name='rf_role',
16+
field=models.CharField(blank=True, max_length=30),
17+
),
18+
]

netbox/dcim/models/device_component_templates.py

+14
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from utilities.fields import ColorField, NaturalOrderingField
1313
from utilities.mptt import TreeManager
1414
from utilities.ordering import naturalize_interface
15+
from wireless.choices import WirelessRoleChoices
1516
from .device_components import (
1617
ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, Interface, InventoryItem, ModuleBay, PowerOutlet, PowerPort,
1718
RearPort,
@@ -387,6 +388,12 @@ class InterfaceTemplate(ModularComponentTemplateModel):
387388
blank=True,
388389
verbose_name='PoE type'
389390
)
391+
rf_role = models.CharField(
392+
max_length=30,
393+
choices=WirelessRoleChoices,
394+
blank=True,
395+
verbose_name='Wireless role'
396+
)
390397

391398
component_model = Interface
392399

@@ -405,6 +412,11 @@ def clean(self):
405412
'bridge': f"Bridge interface ({self.bridge}) must belong to the same module type"
406413
})
407414

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+
408420
def instantiate(self, **kwargs):
409421
return self.component_model(
410422
name=self.resolve_name(kwargs.get('module')),
@@ -414,6 +426,7 @@ def instantiate(self, **kwargs):
414426
mgmt_only=self.mgmt_only,
415427
poe_mode=self.poe_mode,
416428
poe_type=self.poe_type,
429+
rf_role=self.rf_role,
417430
**kwargs
418431
)
419432
instantiate.do_not_call_in_templates = True
@@ -429,6 +442,7 @@ def to_yaml(self):
429442
'bridge': self.bridge.name if self.bridge else None,
430443
'poe_mode': self.poe_mode,
431444
'poe_type': self.poe_type,
445+
'rf_role': self.rf_role,
432446
}
433447

434448

netbox/dcim/tables/devicetypes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ class InterfaceTemplateTable(ComponentTemplateTable):
187187

188188
class Meta(ComponentTemplateTable.Meta):
189189
model = models.InterfaceTemplate
190-
fields = ('pk', 'name', 'label', 'enabled', 'mgmt_only', 'type', 'description', 'bridge', 'poe_mode', 'poe_type', 'actions')
190+
fields = ('pk', 'name', 'label', 'enabled', 'mgmt_only', 'type', 'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'actions')
191191
empty_text = "None"
192192

193193

0 commit comments

Comments
 (0)