Skip to content

Commit 943dca7

Browse files
Closes #8184: Enable HTMX for embedded tables (#11518)
* Enable HTMX rendering for embedded tables * Start converting embedded tables to use HTMX (WIP) * Additional table conversions (WIP) * Standardize HTMX usage for nested group models * Enable HTMX for additional emebedded tables * Fix HTMX table rendering for ObjectChildrenView * Standardize usage of inc/panel_table.html * Hide selection boxes in embedded tables
1 parent ff4eb41 commit 943dca7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+385
-671
lines changed

netbox/circuits/views.py

-38
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,6 @@ class ProviderListView(generic.ObjectListView):
2929
class ProviderView(generic.ObjectView):
3030
queryset = Provider.objects.all()
3131

32-
def get_extra_context(self, request, instance):
33-
circuits = Circuit.objects.restrict(request.user, 'view').filter(
34-
provider=instance
35-
).prefetch_related(
36-
'tenant__group', 'termination_a__site', 'termination_z__site',
37-
'termination_a__provider_network', 'termination_z__provider_network',
38-
)
39-
circuits_table = tables.CircuitTable(circuits, user=request.user, exclude=('provider',))
40-
circuits_table.configure(request)
41-
42-
return {
43-
'circuits_table': circuits_table,
44-
}
45-
4632

4733
@register_model_view(Provider, 'edit')
4834
class ProviderEditView(generic.ObjectEditView):
@@ -93,21 +79,6 @@ class ProviderNetworkListView(generic.ObjectListView):
9379
class ProviderNetworkView(generic.ObjectView):
9480
queryset = ProviderNetwork.objects.all()
9581

96-
def get_extra_context(self, request, instance):
97-
circuits = Circuit.objects.restrict(request.user, 'view').filter(
98-
Q(termination_a__provider_network=instance.pk) |
99-
Q(termination_z__provider_network=instance.pk)
100-
).prefetch_related(
101-
'tenant__group', 'termination_a__site', 'termination_z__site',
102-
'termination_a__provider_network', 'termination_z__provider_network',
103-
)
104-
circuits_table = tables.CircuitTable(circuits, user=request.user)
105-
circuits_table.configure(request)
106-
107-
return {
108-
'circuits_table': circuits_table,
109-
}
110-
11182

11283
@register_model_view(ProviderNetwork, 'edit')
11384
class ProviderNetworkEditView(generic.ObjectEditView):
@@ -156,15 +127,6 @@ class CircuitTypeListView(generic.ObjectListView):
156127
class CircuitTypeView(generic.ObjectView):
157128
queryset = CircuitType.objects.all()
158129

159-
def get_extra_context(self, request, instance):
160-
circuits = Circuit.objects.restrict(request.user, 'view').filter(type=instance)
161-
circuits_table = tables.CircuitTable(circuits, user=request.user, exclude=('type',))
162-
circuits_table.configure(request)
163-
164-
return {
165-
'circuits_table': circuits_table,
166-
}
167-
168130

169131
@register_model_view(CircuitType, 'edit')
170132
class CircuitTypeEditView(generic.ObjectEditView):

netbox/dcim/views.py

+9-136
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from circuits.models import Circuit, CircuitTermination
1515
from extras.views import ObjectConfigContextView
1616
from ipam.models import ASN, IPAddress, Prefix, Service, VLAN, VLANGroup
17-
from ipam.tables import AssignedIPAddressesTable, InterfaceVLANTable
17+
from ipam.tables import InterfaceVLANTable
1818
from netbox.views import generic
1919
from utilities.forms import ConfirmationForm
2020
from utilities.paginator import EnhancedPaginator, get_paginate_count
@@ -210,30 +210,6 @@ class RegionListView(generic.ObjectListView):
210210
class RegionView(generic.ObjectView):
211211
queryset = Region.objects.all()
212212

213-
def get_extra_context(self, request, instance):
214-
child_regions = Region.objects.add_related_count(
215-
Region.objects.all(),
216-
Site,
217-
'region',
218-
'site_count',
219-
cumulative=True
220-
).restrict(request.user, 'view').filter(
221-
parent__in=instance.get_descendants(include_self=True)
222-
)
223-
child_regions_table = tables.RegionTable(child_regions)
224-
child_regions_table.columns.hide('actions')
225-
226-
sites = Site.objects.restrict(request.user, 'view').filter(
227-
region=instance
228-
)
229-
sites_table = tables.SiteTable(sites, user=request.user, exclude=('region',))
230-
sites_table.configure(request)
231-
232-
return {
233-
'child_regions_table': child_regions_table,
234-
'sites_table': sites_table,
235-
}
236-
237213

238214
@register_model_view(Region, 'edit')
239215
class RegionEditView(generic.ObjectEditView):
@@ -298,30 +274,6 @@ class SiteGroupListView(generic.ObjectListView):
298274
class SiteGroupView(generic.ObjectView):
299275
queryset = SiteGroup.objects.all()
300276

301-
def get_extra_context(self, request, instance):
302-
child_groups = SiteGroup.objects.add_related_count(
303-
SiteGroup.objects.all(),
304-
Site,
305-
'group',
306-
'site_count',
307-
cumulative=True
308-
).restrict(request.user, 'view').filter(
309-
parent__in=instance.get_descendants(include_self=True)
310-
)
311-
child_groups_table = tables.SiteGroupTable(child_groups)
312-
child_groups_table.columns.hide('actions')
313-
314-
sites = Site.objects.restrict(request.user, 'view').filter(
315-
group=instance
316-
)
317-
sites_table = tables.SiteTable(sites, user=request.user, exclude=('group',))
318-
sites_table.configure(request)
319-
320-
return {
321-
'child_groups_table': child_groups_table,
322-
'sites_table': sites_table,
323-
}
324-
325277

326278
@register_model_view(SiteGroup, 'edit')
327279
class SiteGroupEditView(generic.ObjectEditView):
@@ -491,22 +443,6 @@ def get_extra_context(self, request, instance):
491443
rack_count = Rack.objects.filter(location__in=location_ids).count()
492444
device_count = Device.objects.filter(location__in=location_ids).count()
493445

494-
child_locations = Location.objects.add_related_count(
495-
Location.objects.add_related_count(
496-
Location.objects.all(),
497-
Device,
498-
'location',
499-
'device_count',
500-
cumulative=True
501-
),
502-
Rack,
503-
'location',
504-
'rack_count',
505-
cumulative=True
506-
).filter(pk__in=location_ids).exclude(pk=instance.pk)
507-
child_locations_table = tables.LocationTable(child_locations, user=request.user)
508-
child_locations_table.configure(request)
509-
510446
nonracked_devices = Device.objects.filter(
511447
location=instance,
512448
rack__isnull=True,
@@ -516,7 +452,6 @@ def get_extra_context(self, request, instance):
516452
return {
517453
'rack_count': rack_count,
518454
'device_count': device_count,
519-
'child_locations_table': child_locations_table,
520455
'nonracked_devices': nonracked_devices.order_by('-pk')[:10],
521456
'total_nonracked_devices_count': nonracked_devices.count(),
522457
}
@@ -581,20 +516,6 @@ class RackRoleListView(generic.ObjectListView):
581516
class RackRoleView(generic.ObjectView):
582517
queryset = RackRole.objects.all()
583518

584-
def get_extra_context(self, request, instance):
585-
racks = Rack.objects.restrict(request.user, 'view').filter(role=instance).annotate(
586-
device_count=count_related(Device, 'rack')
587-
)
588-
589-
racks_table = tables.RackTable(racks, user=request.user, exclude=(
590-
'role', 'get_utilization', 'get_power_utilization',
591-
))
592-
racks_table.configure(request)
593-
594-
return {
595-
'racks_table': racks_table,
596-
}
597-
598519

599520
@register_model_view(RackRole, 'edit')
600521
class RackRoleEditView(generic.ObjectEditView):
@@ -855,8 +776,6 @@ class ManufacturerView(generic.ObjectView):
855776
def get_extra_context(self, request, instance):
856777
device_types = DeviceType.objects.restrict(request.user, 'view').filter(
857778
manufacturer=instance
858-
).annotate(
859-
instance_count=count_related(Device, 'device_type')
860779
)
861780
module_types = ModuleType.objects.restrict(request.user, 'view').filter(
862781
manufacturer=instance
@@ -865,13 +784,10 @@ def get_extra_context(self, request, instance):
865784
manufacturer=instance
866785
)
867786

868-
devicetypes_table = tables.DeviceTypeTable(device_types, user=request.user, exclude=('manufacturer',))
869-
devicetypes_table.configure(request)
870-
871787
return {
872-
'devicetypes_table': devicetypes_table,
873-
'inventory_item_count': inventory_items.count(),
874-
'module_type_count': module_types.count(),
788+
'devicetype_count': device_types.count(),
789+
'inventoryitem_count': inventory_items.count(),
790+
'moduletype_count': module_types.count(),
875791
}
876792

877793

@@ -1722,19 +1638,6 @@ class DeviceRoleListView(generic.ObjectListView):
17221638
class DeviceRoleView(generic.ObjectView):
17231639
queryset = DeviceRole.objects.all()
17241640

1725-
def get_extra_context(self, request, instance):
1726-
devices = Device.objects.restrict(request.user, 'view').filter(
1727-
device_role=instance
1728-
)
1729-
devices_table = tables.DeviceTable(devices, user=request.user, exclude=('device_role',))
1730-
devices_table.configure(request)
1731-
1732-
return {
1733-
'devices_table': devices_table,
1734-
'device_count': Device.objects.filter(device_role=instance).count(),
1735-
'virtualmachine_count': VirtualMachine.objects.filter(role=instance).count(),
1736-
}
1737-
17381641

17391642
@register_model_view(DeviceRole, 'edit')
17401643
class DeviceRoleEditView(generic.ObjectEditView):
@@ -1793,12 +1696,13 @@ def get_extra_context(self, request, instance):
17931696
devices = Device.objects.restrict(request.user, 'view').filter(
17941697
platform=instance
17951698
)
1796-
devices_table = tables.DeviceTable(devices, user=request.user, exclude=('platform',))
1797-
devices_table.configure(request)
1699+
virtual_machines = VirtualMachine.objects.restrict(request.user, 'view').filter(
1700+
platform=instance
1701+
)
17981702

17991703
return {
1800-
'devices_table': devices_table,
1801-
'virtualmachine_count': VirtualMachine.objects.filter(platform=instance).count()
1704+
'device_count': devices.count(),
1705+
'virtualmachine_count': virtual_machines.count()
18021706
}
18031707

18041708

@@ -2487,12 +2391,6 @@ def get_extra_context(self, request, instance):
24872391
orderable=False
24882392
)
24892393

2490-
# Get assigned IP addresses
2491-
ipaddress_table = AssignedIPAddressesTable(
2492-
data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
2493-
orderable=False
2494-
)
2495-
24962394
# Get bridge interfaces
24972395
bridge_interfaces = Interface.objects.restrict(request.user, 'view').filter(bridge=instance)
24982396
bridge_interfaces_tables = tables.InterfaceTable(
@@ -2525,7 +2423,6 @@ def get_extra_context(self, request, instance):
25252423

25262424
return {
25272425
'vdc_table': vdc_table,
2528-
'ipaddress_table': ipaddress_table,
25292426
'bridge_interfaces_table': bridge_interfaces_tables,
25302427
'child_interfaces_table': child_interfaces_tables,
25312428
'vlan_table': vlan_table,
@@ -3500,20 +3397,6 @@ class PowerPanelListView(generic.ObjectListView):
35003397
class PowerPanelView(generic.ObjectView):
35013398
queryset = PowerPanel.objects.all()
35023399

3503-
def get_extra_context(self, request, instance):
3504-
power_feeds = PowerFeed.objects.restrict(request.user).filter(power_panel=instance)
3505-
powerfeed_table = tables.PowerFeedTable(
3506-
data=power_feeds,
3507-
orderable=False
3508-
)
3509-
if request.user.has_perm('dcim.delete_cable'):
3510-
powerfeed_table.columns.show('pk')
3511-
powerfeed_table.exclude = ['power_panel']
3512-
3513-
return {
3514-
'powerfeed_table': powerfeed_table,
3515-
}
3516-
35173400

35183401
@register_model_view(PowerPanel, 'edit')
35193402
class PowerPanelEditView(generic.ObjectEditView):
@@ -3615,16 +3498,6 @@ class VirtualDeviceContextListView(generic.ObjectListView):
36153498
class VirtualDeviceContextView(generic.ObjectView):
36163499
queryset = VirtualDeviceContext.objects.all()
36173500

3618-
def get_extra_context(self, request, instance):
3619-
interfaces_table = tables.InterfaceTable(instance.interfaces, user=request.user)
3620-
interfaces_table.configure(request)
3621-
interfaces_table.columns.hide('device')
3622-
3623-
return {
3624-
'interfaces_table': interfaces_table,
3625-
'interface_count': instance.interfaces.count(),
3626-
}
3627-
36283501

36293502
@register_model_view(VirtualDeviceContext, 'edit')
36303503
class VirtualDeviceContextEditView(generic.ObjectEditView):

0 commit comments

Comments
 (0)