Skip to content

Commit aa4571b

Browse files
authored
Merge pull request #20672 from pheus/20389-allow-all-bulk-rename
Fixes #20389: Add FilterSet support to BulkRenameView
2 parents 56d9146 + ac7a4ec commit aa4571b

File tree

12 files changed

+139
-4
lines changed

12 files changed

+139
-4
lines changed

netbox/circuits/views.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class ProviderBulkEditView(generic.BulkEditView):
8383
@register_model_view(Provider, 'bulk_rename', path='rename', detail=False)
8484
class ProviderBulkRenameView(generic.BulkRenameView):
8585
queryset = Provider.objects.all()
86+
filterset = filtersets.ProviderFilterSet
8687

8788

8889
@register_model_view(Provider, 'bulk_delete', path='delete', detail=False)
@@ -150,6 +151,7 @@ class ProviderAccountBulkEditView(generic.BulkEditView):
150151
@register_model_view(ProviderAccount, 'bulk_rename', path='rename', detail=False)
151152
class ProviderAccountBulkRenameView(generic.BulkRenameView):
152153
queryset = ProviderAccount.objects.all()
154+
filterset = filtersets.ProviderAccountFilterSet
153155

154156

155157
@register_model_view(ProviderAccount, 'bulk_delete', path='delete', detail=False)
@@ -226,6 +228,7 @@ class ProviderNetworkBulkEditView(generic.BulkEditView):
226228
@register_model_view(ProviderNetwork, 'bulk_rename', path='rename', detail=False)
227229
class ProviderNetworkBulkRenameView(generic.BulkRenameView):
228230
queryset = ProviderNetwork.objects.all()
231+
filterset = filtersets.ProviderNetworkFilterSet
229232

230233

231234
@register_model_view(ProviderNetwork, 'bulk_delete', path='delete', detail=False)
@@ -290,6 +293,7 @@ class CircuitTypeBulkEditView(generic.BulkEditView):
290293
@register_model_view(CircuitType, 'bulk_rename', path='rename', detail=False)
291294
class CircuitTypeBulkRenameView(generic.BulkRenameView):
292295
queryset = CircuitType.objects.all()
296+
filterset = filtersets.CircuitTypeFilterSet
293297

294298

295299
@register_model_view(CircuitType, 'bulk_delete', path='delete', detail=False)
@@ -362,6 +366,7 @@ class CircuitBulkEditView(generic.BulkEditView):
362366
class CircuitBulkRenameView(generic.BulkRenameView):
363367
queryset = Circuit.objects.all()
364368
field_name = 'cid'
369+
filterset = filtersets.CircuitFilterSet
365370

366371

367372
@register_model_view(Circuit, 'bulk_delete', path='delete', detail=False)
@@ -557,6 +562,7 @@ class CircuitGroupBulkEditView(generic.BulkEditView):
557562
@register_model_view(CircuitGroup, 'bulk_rename', path='rename', detail=False)
558563
class CircuitGroupBulkRenameView(generic.BulkRenameView):
559564
queryset = CircuitGroup.objects.all()
565+
filterset = filtersets.CircuitGroupFilterSet
560566

561567

562568
@register_model_view(CircuitGroup, 'bulk_delete', path='delete', detail=False)
@@ -672,6 +678,7 @@ class VirtualCircuitTypeBulkEditView(generic.BulkEditView):
672678
@register_model_view(VirtualCircuitType, 'bulk_rename', path='rename', detail=False)
673679
class VirtualCircuitTypeBulkRenameView(generic.BulkRenameView):
674680
queryset = VirtualCircuitType.objects.all()
681+
filterset = filtersets.VirtualCircuitTypeFilterSet
675682

676683

677684
@register_model_view(VirtualCircuitType, 'bulk_delete', path='delete', detail=False)
@@ -744,6 +751,7 @@ class VirtualCircuitBulkEditView(generic.BulkEditView):
744751
class VirtualCircuitBulkRenameView(generic.BulkRenameView):
745752
queryset = VirtualCircuit.objects.all()
746753
field_name = 'cid'
754+
filterset = filtersets.VirtualCircuitFilterSet
747755

748756

749757
@register_model_view(VirtualCircuit, 'bulk_delete', path='delete', detail=False)

netbox/core/views.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class DataSourceBulkEditView(generic.BulkEditView):
125125
@register_model_view(DataSource, 'bulk_rename', path='rename', detail=False)
126126
class DataSourceBulkRenameView(generic.BulkRenameView):
127127
queryset = DataSource.objects.all()
128+
filterset = filtersets.DataSourceFilterSet
128129

129130

130131
@register_model_view(DataSource, 'bulk_delete', path='delete', detail=False)

netbox/dcim/tests/test_views.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2885,6 +2885,43 @@ def test_bulk_delete_child_interfaces(self):
28852885
self.client.post(self._get_url('bulk_delete'), data)
28862886
self.assertEqual(device.interfaces.count(), 4) # Child & parent were both deleted
28872887

2888+
def test_rename_select_all_spans_pages(self):
2889+
"""
2890+
Tests the bulk rename functionality for interfaces spanning multiple pages in the UI.
2891+
"""
2892+
device_name = 'DeviceRename'
2893+
device = create_test_device(device_name)
2894+
# Create > default page size (25) so selection spans multiple pages
2895+
for i in range(37):
2896+
Interface.objects.create(device=device, name=f'eth{i}')
2897+
2898+
self.add_permissions('dcim.change_interface')
2899+
2900+
# Filter to this device's interfaces to simulate a real list filter
2901+
get_qs = {'device_id': Device.objects.get(name=device_name).pk}
2902+
post_url = f'{self._get_url("bulk_rename")}?device_id={get_qs["device_id"]}'
2903+
2904+
# Preview step: ensure 37 selected (not just one page)
2905+
data = {'_preview': '1', '_all': '1', 'find': 'eth', 'replace': 'xe'}
2906+
response = self.client.post(post_url, data=data)
2907+
self.assertHttpStatus(response, 200)
2908+
self.assertEqual(len(response.context['selected_objects']), 37)
2909+
2910+
# Extract pk[] just like the browser would submit on Apply
2911+
# (either from the form's initial, or from selected_objects)
2912+
pk_list = response.context['form'].initial.get('pk')
2913+
if not pk_list:
2914+
pk_list = [obj.pk for obj in response.context['selected_objects']]
2915+
pk_list = [str(pk) for pk in pk_list]
2916+
2917+
# Apply step: include pk[] in the POST
2918+
apply_data = {'_apply': '1', '_all': '1', 'find': 'eth', 'replace': 'xe', 'pk': pk_list}
2919+
response = self.client.post(post_url, data=apply_data)
2920+
2921+
# On success the view redirects back to the return URL
2922+
self.assertHttpStatus(response, 302)
2923+
self.assertEqual(Interface.objects.filter(device=device, name__startswith='xe').count(), 37)
2924+
28882925

28892926
class FrontPortTestCase(ViewTestCases.DeviceComponentViewTestCase):
28902927
model = FrontPort

netbox/dcim/views.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ class RegionBulkEditView(generic.BulkEditView):
295295
@register_model_view(Region, 'bulk_rename', path='rename', detail=False)
296296
class RegionBulkRenameView(generic.BulkRenameView):
297297
queryset = Region.objects.all()
298+
filterset = filtersets.RegionFilterSet
298299

299300

300301
@register_model_view(Region, 'bulk_delete', path='delete', detail=False)
@@ -426,6 +427,7 @@ class SiteGroupBulkEditView(generic.BulkEditView):
426427
@register_model_view(SiteGroup, 'bulk_rename', path='rename', detail=False)
427428
class SiteGroupBulkRenameView(generic.BulkRenameView):
428429
queryset = SiteGroup.objects.all()
430+
filterset = filtersets.SiteGroupFilterSet
429431

430432

431433
@register_model_view(SiteGroup, 'bulk_delete', path='delete', detail=False)
@@ -516,6 +518,7 @@ class SiteBulkEditView(generic.BulkEditView):
516518
@register_model_view(Site, 'bulk_rename', path='rename', detail=False)
517519
class SiteBulkRenameView(generic.BulkRenameView):
518520
queryset = Site.objects.all()
521+
filterset = filtersets.SiteFilterSet
519522

520523

521524
@register_model_view(Site, 'bulk_delete', path='delete', detail=False)
@@ -625,6 +628,7 @@ class LocationBulkEditView(generic.BulkEditView):
625628
@register_model_view(Location, 'bulk_rename', path='rename', detail=False)
626629
class LocationBulkRenameView(generic.BulkRenameView):
627630
queryset = Location.objects.all()
631+
filterset = filtersets.LocationFilterSet
628632

629633

630634
@register_model_view(Location, 'bulk_delete', path='delete', detail=False)
@@ -695,6 +699,7 @@ class RackRoleBulkEditView(generic.BulkEditView):
695699
@register_model_view(RackRole, 'bulk_rename', path='rename', detail=False)
696700
class RackRoleBulkRenameView(generic.BulkRenameView):
697701
queryset = RackRole.objects.all()
702+
filterset = filtersets.RackRoleFilterSet
698703

699704

700705
@register_model_view(RackRole, 'bulk_delete', path='delete', detail=False)
@@ -760,6 +765,7 @@ class RackTypeBulkEditView(generic.BulkEditView):
760765
class RackTypeBulkRenameView(generic.BulkRenameView):
761766
queryset = RackType.objects.all()
762767
field_name = 'model'
768+
filterset = filtersets.RackTypeFilterSet
763769

764770

765771
@register_model_view(RackType, 'bulk_delete', path='delete', detail=False)
@@ -944,6 +950,7 @@ class RackBulkEditView(generic.BulkEditView):
944950
@register_model_view(Rack, 'bulk_rename', path='rename', detail=False)
945951
class RackBulkRenameView(generic.BulkRenameView):
946952
queryset = Rack.objects.all()
953+
filterset = filtersets.RackFilterSet
947954

948955

949956
@register_model_view(Rack, 'bulk_delete', path='delete', detail=False)
@@ -1083,6 +1090,7 @@ class ManufacturerBulkEditView(generic.BulkEditView):
10831090
@register_model_view(Manufacturer, 'bulk_rename', path='rename', detail=False)
10841091
class ManufacturerBulkRenameView(generic.BulkRenameView):
10851092
queryset = Manufacturer.objects.all()
1093+
filterset = filtersets.ManufacturerFilterSet
10861094

10871095

10881096
@register_model_view(Manufacturer, 'bulk_delete', path='delete', detail=False)
@@ -1336,6 +1344,7 @@ class DeviceTypeBulkEditView(generic.BulkEditView):
13361344
class DeviceTypeBulkRenameView(generic.BulkRenameView):
13371345
queryset = DeviceType.objects.all()
13381346
field_name = 'model'
1347+
filterset = filtersets.DeviceTypeFilterSet
13391348

13401349

13411350
@register_model_view(DeviceType, 'bulk_delete', path='delete', detail=False)
@@ -1397,6 +1406,7 @@ class ModuleTypeProfileBulkEditView(generic.BulkEditView):
13971406
@register_model_view(ModuleTypeProfile, 'bulk_rename', path='rename', detail=False)
13981407
class ModuleTypeProfileBulkRenameView(generic.BulkRenameView):
13991408
queryset = ModuleTypeProfile.objects.all()
1409+
filterset = filtersets.ModuleTypeProfileFilterSet
14001410

14011411

14021412
@register_model_view(ModuleTypeProfile, 'bulk_delete', path='delete', detail=False)
@@ -1612,6 +1622,7 @@ class ModuleTypeBulkEditView(generic.BulkEditView):
16121622
@register_model_view(ModuleType, 'bulk_rename', path='rename', detail=False)
16131623
class ModuleTypeBulkRenameView(generic.BulkRenameView):
16141624
queryset = ModuleType.objects.all()
1625+
filterset = filtersets.ModuleTypeFilterSet
16151626

16161627

16171628
@register_model_view(ModuleType, 'bulk_delete', path='delete', detail=False)
@@ -2100,6 +2111,7 @@ class DeviceRoleBulkEditView(generic.BulkEditView):
21002111
@register_model_view(DeviceRole, 'bulk_rename', path='rename', detail=False)
21012112
class DeviceRoleBulkRenameView(generic.BulkRenameView):
21022113
queryset = DeviceRole.objects.all()
2114+
filterset = filtersets.DeviceRoleFilterSet
21032115

21042116

21052117
@register_model_view(DeviceRole, 'bulk_delete', path='delete', detail=False)
@@ -2175,6 +2187,7 @@ class PlatformBulkEditView(generic.BulkEditView):
21752187
@register_model_view(Platform, 'bulk_rename', path='rename', detail=False)
21762188
class PlatformBulkRenameView(generic.BulkRenameView):
21772189
queryset = Platform.objects.all()
2190+
filterset = filtersets.PlatformFilterSet
21782191

21792192

21802193
@register_model_view(Platform, 'bulk_delete', path='delete', detail=False)
@@ -2582,6 +2595,7 @@ class ConsolePortBulkEditView(generic.BulkEditView):
25822595
@register_model_view(ConsolePort, 'bulk_rename', path='rename', detail=False)
25832596
class ConsolePortBulkRenameView(generic.BulkRenameView):
25842597
queryset = ConsolePort.objects.all()
2598+
filterset = filtersets.ConsolePortFilterSet
25852599

25862600

25872601
@register_model_view(ConsolePort, 'bulk_disconnect', path='disconnect', detail=False)
@@ -2652,6 +2666,7 @@ class ConsoleServerPortBulkEditView(generic.BulkEditView):
26522666
@register_model_view(ConsoleServerPort, 'bulk_rename', path='rename', detail=False)
26532667
class ConsoleServerPortBulkRenameView(generic.BulkRenameView):
26542668
queryset = ConsoleServerPort.objects.all()
2669+
filterset = filtersets.ConsoleServerPortFilterSet
26552670

26562671

26572672
@register_model_view(ConsoleServerPort, 'bulk_disconnect', path='disconnect', detail=False)
@@ -2722,6 +2737,7 @@ class PowerPortBulkEditView(generic.BulkEditView):
27222737
@register_model_view(PowerPort, 'bulk_rename', path='rename', detail=False)
27232738
class PowerPortBulkRenameView(generic.BulkRenameView):
27242739
queryset = PowerPort.objects.all()
2740+
filterset = filtersets.PowerPortFilterSet
27252741

27262742

27272743
@register_model_view(PowerPort, 'bulk_disconnect', path='disconnect', detail=False)
@@ -2792,6 +2808,7 @@ class PowerOutletBulkEditView(generic.BulkEditView):
27922808
@register_model_view(PowerOutlet, 'bulk_rename', path='rename', detail=False)
27932809
class PowerOutletBulkRenameView(generic.BulkRenameView):
27942810
queryset = PowerOutlet.objects.all()
2811+
filterset = filtersets.PowerOutletFilterSet
27952812

27962813

27972814
@register_model_view(PowerOutlet, 'bulk_disconnect', path='disconnect', detail=False)
@@ -2934,6 +2951,7 @@ def post_save_operations(self, form, obj):
29342951
@register_model_view(Interface, 'bulk_rename', path='rename', detail=False)
29352952
class InterfaceBulkRenameView(generic.BulkRenameView):
29362953
queryset = Interface.objects.all()
2954+
filterset = filtersets.InterfaceFilterSet
29372955

29382956

29392957
@register_model_view(Interface, 'bulk_disconnect', path='disconnect', detail=False)
@@ -3005,6 +3023,7 @@ class FrontPortBulkEditView(generic.BulkEditView):
30053023
@register_model_view(FrontPort, 'bulk_rename', path='rename', detail=False)
30063024
class FrontPortBulkRenameView(generic.BulkRenameView):
30073025
queryset = FrontPort.objects.all()
3026+
filterset = filtersets.FrontPortFilterSet
30083027

30093028

30103029
@register_model_view(FrontPort, 'bulk_disconnect', path='disconnect', detail=False)
@@ -3080,6 +3099,7 @@ class RearPortBulkRenameView(generic.BulkRenameView):
30803099
@register_model_view(RearPort, 'bulk_disconnect', path='disconnect', detail=False)
30813100
class RearPortBulkDisconnectView(BulkDisconnectView):
30823101
queryset = RearPort.objects.all()
3102+
filterset = filtersets.RearPortFilterSet
30833103

30843104

30853105
@register_model_view(RearPort, 'bulk_delete', path='delete', detail=False)
@@ -3145,6 +3165,7 @@ class ModuleBayBulkEditView(generic.BulkEditView):
31453165
@register_model_view(ModuleBay, 'bulk_rename', path='rename', detail=False)
31463166
class ModuleBayBulkRenameView(generic.BulkRenameView):
31473167
queryset = ModuleBay.objects.all()
3168+
filterset = filtersets.ModuleBayFilterSet
31483169

31493170

31503171
@register_model_view(ModuleBay, 'bulk_delete', path='delete', detail=False)
@@ -3287,6 +3308,7 @@ class DeviceBayBulkEditView(generic.BulkEditView):
32873308
@register_model_view(DeviceBay, 'bulk_rename', path='rename', detail=False)
32883309
class DeviceBayBulkRenameView(generic.BulkRenameView):
32893310
queryset = DeviceBay.objects.all()
3311+
filterset = filtersets.DeviceBayFilterSet
32903312

32913313

32923314
@register_model_view(DeviceBay, 'bulk_delete', path='delete', detail=False)
@@ -3348,6 +3370,7 @@ class InventoryItemBulkEditView(generic.BulkEditView):
33483370
@register_model_view(InventoryItem, 'bulk_rename', path='rename', detail=False)
33493371
class InventoryItemBulkRenameView(generic.BulkRenameView):
33503372
queryset = InventoryItem.objects.all()
3373+
filterset = filtersets.InventoryItemFilterSet
33513374

33523375

33533376
@register_model_view(InventoryItem, 'bulk_delete', path='delete', detail=False)
@@ -3431,6 +3454,7 @@ class InventoryItemRoleBulkEditView(generic.BulkEditView):
34313454
@register_model_view(InventoryItemRole, 'bulk_rename', path='rename', detail=False)
34323455
class InventoryItemRoleBulkRenameView(generic.BulkRenameView):
34333456
queryset = InventoryItemRole.objects.all()
3457+
filterset = filtersets.InventoryItemRoleFilterSet
34343458

34353459

34363460
@register_model_view(InventoryItemRole, 'bulk_delete', path='delete', detail=False)
@@ -3634,6 +3658,7 @@ class CableBulkEditView(generic.BulkEditView):
36343658
class CableBulkRenameView(generic.BulkRenameView):
36353659
queryset = Cable.objects.all()
36363660
field_name = 'label'
3661+
filterset = filtersets.CableFilterSet
36373662

36383663

36393664
@register_model_view(Cable, 'bulk_delete', path='delete', detail=False)
@@ -3931,6 +3956,7 @@ class VirtualChassisBulkEditView(generic.BulkEditView):
39313956
@register_model_view(VirtualChassis, 'bulk_rename', path='rename', detail=False)
39323957
class VirtualChassisBulkRenameView(generic.BulkRenameView):
39333958
queryset = VirtualChassis.objects.all()
3959+
filterset = filtersets.VirtualChassisFilterSet
39343960

39353961

39363962
@register_model_view(VirtualChassis, 'bulk_delete', path='delete', detail=False)
@@ -3993,6 +4019,7 @@ class PowerPanelBulkEditView(generic.BulkEditView):
39934019
@register_model_view(PowerPanel, 'bulk_rename', path='rename', detail=False)
39944020
class PowerPanelBulkRenameView(generic.BulkRenameView):
39954021
queryset = PowerPanel.objects.all()
4022+
filterset = filtersets.PowerPanelFilterSet
39964023

39974024

39984025
@register_model_view(PowerPanel, 'bulk_delete', path='delete', detail=False)
@@ -4050,6 +4077,7 @@ class PowerFeedBulkEditView(generic.BulkEditView):
40504077
@register_model_view(PowerFeed, 'bulk_rename', path='rename', detail=False)
40514078
class PowerFeedBulkRenameView(generic.BulkRenameView):
40524079
queryset = PowerFeed.objects.all()
4080+
filterset = filtersets.PowerFeedFilterSet
40534081

40544082

40554083
@register_model_view(PowerFeed, 'bulk_disconnect', path='disconnect', detail=False)
@@ -4128,6 +4156,7 @@ class VirtualDeviceContextBulkEditView(generic.BulkEditView):
41284156
@register_model_view(VirtualDeviceContext, 'bulk_rename', path='rename', detail=False)
41294157
class VirtualDeviceContextBulkRenameView(generic.BulkRenameView):
41304158
queryset = VirtualDeviceContext.objects.all()
4159+
filterset = filtersets.VirtualDeviceContextFilterSet
41314160

41324161

41334162
@register_model_view(VirtualDeviceContext, 'bulk_delete', path='delete', detail=False)

0 commit comments

Comments
 (0)