13
13
from users .models import User
14
14
from utilities .forms import BulkEditForm , add_blank_choice , form_from_model
15
15
from utilities .forms .fields import ColorField , CommentField , DynamicModelChoiceField , DynamicModelMultipleChoiceField
16
- from utilities .forms .rendering import FieldSet , InlineFields
16
+ from utilities .forms .rendering import FieldSet , InlineFields , TabbedGroups
17
17
from utilities .forms .widgets import BulkEditNullBooleanSelect , NumberWithOptions
18
18
from wireless .models import WirelessLAN , WirelessLANGroup
19
19
from wireless .choices import WirelessRoleChoices
@@ -1404,18 +1404,25 @@ class InterfaceBulkEditForm(
1404
1404
parent = DynamicModelChoiceField (
1405
1405
label = _ ('Parent' ),
1406
1406
queryset = Interface .objects .all (),
1407
- required = False
1407
+ required = False ,
1408
+ query_params = {
1409
+ 'virtual_chassis_member_id' : '$device' ,
1410
+ }
1408
1411
)
1409
1412
bridge = DynamicModelChoiceField (
1410
1413
label = _ ('Bridge' ),
1411
1414
queryset = Interface .objects .all (),
1412
- required = False
1415
+ required = False ,
1416
+ query_params = {
1417
+ 'virtual_chassis_member_id' : '$device' ,
1418
+ }
1413
1419
)
1414
1420
lag = DynamicModelChoiceField (
1415
1421
queryset = Interface .objects .all (),
1416
1422
required = False ,
1417
1423
query_params = {
1418
1424
'type' : 'lag' ,
1425
+ 'virtual_chassis_member_id' : '$device' ,
1419
1426
},
1420
1427
label = _ ('LAG' )
1421
1428
)
@@ -1472,6 +1479,7 @@ class InterfaceBulkEditForm(
1472
1479
required = False ,
1473
1480
query_params = {
1474
1481
'group_id' : '$vlan_group' ,
1482
+ 'available_on_device' : '$device' ,
1475
1483
},
1476
1484
label = _ ('Untagged VLAN' )
1477
1485
)
@@ -1480,9 +1488,28 @@ class InterfaceBulkEditForm(
1480
1488
required = False ,
1481
1489
query_params = {
1482
1490
'group_id' : '$vlan_group' ,
1491
+ 'available_on_device' : '$device' ,
1483
1492
},
1484
1493
label = _ ('Tagged VLANs' )
1485
1494
)
1495
+ add_tagged_vlans = DynamicModelMultipleChoiceField (
1496
+ label = _ ('Add tagged VLANs' ),
1497
+ queryset = VLAN .objects .all (),
1498
+ required = False ,
1499
+ query_params = {
1500
+ 'group_id' : '$vlan_group' ,
1501
+ 'available_on_device' : '$device' ,
1502
+ },
1503
+ )
1504
+ remove_tagged_vlans = DynamicModelMultipleChoiceField (
1505
+ label = _ ('Remove tagged VLANs' ),
1506
+ queryset = VLAN .objects .all (),
1507
+ required = False ,
1508
+ query_params = {
1509
+ 'group_id' : '$vlan_group' ,
1510
+ 'available_on_device' : '$device' ,
1511
+ }
1512
+ )
1486
1513
vrf = DynamicModelChoiceField (
1487
1514
queryset = VRF .objects .all (),
1488
1515
required = False ,
@@ -1509,7 +1536,13 @@ class InterfaceBulkEditForm(
1509
1536
FieldSet ('vdcs' , 'mtu' , 'tx_power' , 'enabled' , 'mgmt_only' , 'mark_connected' , name = _ ('Operation' )),
1510
1537
FieldSet ('poe_mode' , 'poe_type' , name = _ ('PoE' )),
1511
1538
FieldSet ('parent' , 'bridge' , 'lag' , name = _ ('Related Interfaces' )),
1512
- FieldSet ('mode' , 'vlan_group' , 'untagged_vlan' , 'tagged_vlans' , name = _ ('802.1Q Switching' )),
1539
+ FieldSet ('mode' , 'vlan_group' , 'untagged_vlan' , name = _ ('802.1Q Switching' )),
1540
+ FieldSet (
1541
+ TabbedGroups (
1542
+ FieldSet ('tagged_vlans' , name = _ ('Assignment' )),
1543
+ FieldSet ('add_tagged_vlans' , 'remove_tagged_vlans' , name = _ ('Add/Remove' )),
1544
+ ),
1545
+ ),
1513
1546
FieldSet (
1514
1547
'rf_role' , 'rf_channel' , 'rf_channel_frequency' , 'rf_channel_width' , 'wireless_lan_group' , 'wireless_lans' ,
1515
1548
name = _ ('Wireless' )
@@ -1523,19 +1556,7 @@ class InterfaceBulkEditForm(
1523
1556
1524
1557
def __init__ (self , * args , ** kwargs ):
1525
1558
super ().__init__ (* args , ** kwargs )
1526
- if self .device_id :
1527
- device = Device .objects .filter (pk = self .device_id ).first ()
1528
-
1529
- # Restrict parent/bridge/LAG interface assignment by device
1530
- self .fields ['parent' ].widget .add_query_param ('virtual_chassis_member_id' , device .pk )
1531
- self .fields ['bridge' ].widget .add_query_param ('virtual_chassis_member_id' , device .pk )
1532
- self .fields ['lag' ].widget .add_query_param ('virtual_chassis_member_id' , device .pk )
1533
-
1534
- # Limit VLAN choices by device
1535
- self .fields ['untagged_vlan' ].widget .add_query_param ('available_on_device' , device .pk )
1536
- self .fields ['tagged_vlans' ].widget .add_query_param ('available_on_device' , device .pk )
1537
-
1538
- else :
1559
+ if not self .device_id :
1539
1560
# See #4523
1540
1561
if 'pk' in self .initial :
1541
1562
site = None
@@ -1559,6 +1580,13 @@ def __init__(self, *args, **kwargs):
1559
1580
'site_id' , [site .pk , settings .FILTERS_NULL_CHOICE_VALUE ]
1560
1581
)
1561
1582
1583
+ self .fields ['add_tagged_vlans' ].widget .add_query_param (
1584
+ 'site_id' , [site .pk , settings .FILTERS_NULL_CHOICE_VALUE ]
1585
+ )
1586
+ self .fields ['remove_tagged_vlans' ].widget .add_query_param (
1587
+ 'site_id' , [site .pk , settings .FILTERS_NULL_CHOICE_VALUE ]
1588
+ )
1589
+
1562
1590
self .fields ['parent' ].choices = ()
1563
1591
self .fields ['parent' ].widget .attrs ['disabled' ] = True
1564
1592
self .fields ['bridge' ].choices = ()
0 commit comments