Skip to content

Commit 1a2dae3

Browse files
committed
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 f74a253 commit 1a2dae3

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

+381
-667
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
@@ -212,30 +212,6 @@ class RegionListView(generic.ObjectListView):
212212
class RegionView(generic.ObjectView):
213213
queryset = Region.objects.all()
214214

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

240216
@register_model_view(Region, 'edit')
241217
class RegionEditView(generic.ObjectEditView):
@@ -300,30 +276,6 @@ class SiteGroupListView(generic.ObjectListView):
300276
class SiteGroupView(generic.ObjectView):
301277
queryset = SiteGroup.objects.all()
302278

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

328280
@register_model_view(SiteGroup, 'edit')
329281
class SiteGroupEditView(generic.ObjectEditView):
@@ -493,22 +445,6 @@ def get_extra_context(self, request, instance):
493445
rack_count = Rack.objects.filter(location__in=location_ids).count()
494446
device_count = Device.objects.filter(location__in=location_ids).count()
495447

496-
child_locations = Location.objects.add_related_count(
497-
Location.objects.add_related_count(
498-
Location.objects.all(),
499-
Device,
500-
'location',
501-
'device_count',
502-
cumulative=True
503-
),
504-
Rack,
505-
'location',
506-
'rack_count',
507-
cumulative=True
508-
).filter(pk__in=location_ids).exclude(pk=instance.pk)
509-
child_locations_table = tables.LocationTable(child_locations, user=request.user)
510-
child_locations_table.configure(request)
511-
512448
nonracked_devices = Device.objects.filter(
513449
location=instance,
514450
rack__isnull=True,
@@ -518,7 +454,6 @@ def get_extra_context(self, request, instance):
518454
return {
519455
'rack_count': rack_count,
520456
'device_count': device_count,
521-
'child_locations_table': child_locations_table,
522457
'nonracked_devices': nonracked_devices.order_by('-pk')[:10],
523458
'total_nonracked_devices_count': nonracked_devices.count(),
524459
}
@@ -583,20 +518,6 @@ class RackRoleListView(generic.ObjectListView):
583518
class RackRoleView(generic.ObjectView):
584519
queryset = RackRole.objects.all()
585520

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

601522
@register_model_view(RackRole, 'edit')
602523
class RackRoleEditView(generic.ObjectEditView):
@@ -859,8 +780,6 @@ class ManufacturerView(generic.ObjectView):
859780
def get_extra_context(self, request, instance):
860781
device_types = DeviceType.objects.restrict(request.user, 'view').filter(
861782
manufacturer=instance
862-
).annotate(
863-
instance_count=count_related(Device, 'device_type')
864783
)
865784
module_types = ModuleType.objects.restrict(request.user, 'view').filter(
866785
manufacturer=instance
@@ -869,13 +788,10 @@ def get_extra_context(self, request, instance):
869788
manufacturer=instance
870789
)
871790

872-
devicetypes_table = tables.DeviceTypeTable(device_types, user=request.user, exclude=('manufacturer',))
873-
devicetypes_table.configure(request)
874-
875791
return {
876-
'devicetypes_table': devicetypes_table,
877-
'inventory_item_count': inventory_items.count(),
878-
'module_type_count': module_types.count(),
792+
'devicetype_count': device_types.count(),
793+
'inventoryitem_count': inventory_items.count(),
794+
'moduletype_count': module_types.count(),
879795
}
880796

881797

@@ -1726,19 +1642,6 @@ class DeviceRoleListView(generic.ObjectListView):
17261642
class DeviceRoleView(generic.ObjectView):
17271643
queryset = DeviceRole.objects.all()
17281644

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

17431646
@register_model_view(DeviceRole, 'devices', path='devices')
17441647
class DeviceRoleDevicesView(generic.ObjectChildrenView):
@@ -1833,12 +1736,13 @@ def get_extra_context(self, request, instance):
18331736
devices = Device.objects.restrict(request.user, 'view').filter(
18341737
platform=instance
18351738
)
1836-
devices_table = tables.DeviceTable(devices, user=request.user, exclude=('platform',))
1837-
devices_table.configure(request)
1739+
virtual_machines = VirtualMachine.objects.restrict(request.user, 'view').filter(
1740+
platform=instance
1741+
)
18381742

18391743
return {
1840-
'devices_table': devices_table,
1841-
'virtualmachine_count': VirtualMachine.objects.filter(platform=instance).count()
1744+
'device_count': devices.count(),
1745+
'virtualmachine_count': virtual_machines.count()
18421746
}
18431747

18441748

@@ -2520,12 +2424,6 @@ def get_extra_context(self, request, instance):
25202424
orderable=False
25212425
)
25222426

2523-
# Get assigned IP addresses
2524-
ipaddress_table = AssignedIPAddressesTable(
2525-
data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
2526-
orderable=False
2527-
)
2528-
25292427
# Get bridge interfaces
25302428
bridge_interfaces = Interface.objects.restrict(request.user, 'view').filter(bridge=instance)
25312429
bridge_interfaces_tables = tables.InterfaceTable(
@@ -2558,7 +2456,6 @@ def get_extra_context(self, request, instance):
25582456

25592457
return {
25602458
'vdc_table': vdc_table,
2561-
'ipaddress_table': ipaddress_table,
25622459
'bridge_interfaces_table': bridge_interfaces_tables,
25632460
'child_interfaces_table': child_interfaces_tables,
25642461
'vlan_table': vlan_table,
@@ -3533,20 +3430,6 @@ class PowerPanelListView(generic.ObjectListView):
35333430
class PowerPanelView(generic.ObjectView):
35343431
queryset = PowerPanel.objects.all()
35353432

3536-
def get_extra_context(self, request, instance):
3537-
power_feeds = PowerFeed.objects.restrict(request.user).filter(power_panel=instance)
3538-
powerfeed_table = tables.PowerFeedTable(
3539-
data=power_feeds,
3540-
orderable=False
3541-
)
3542-
if request.user.has_perm('dcim.delete_cable'):
3543-
powerfeed_table.columns.show('pk')
3544-
powerfeed_table.exclude = ['power_panel']
3545-
3546-
return {
3547-
'powerfeed_table': powerfeed_table,
3548-
}
3549-
35503433

35513434
@register_model_view(PowerPanel, 'edit')
35523435
class PowerPanelEditView(generic.ObjectEditView):
@@ -3648,16 +3531,6 @@ class VirtualDeviceContextListView(generic.ObjectListView):
36483531
class VirtualDeviceContextView(generic.ObjectView):
36493532
queryset = VirtualDeviceContext.objects.all()
36503533

3651-
def get_extra_context(self, request, instance):
3652-
interfaces_table = tables.InterfaceTable(instance.interfaces, user=request.user)
3653-
interfaces_table.configure(request)
3654-
interfaces_table.columns.hide('device')
3655-
3656-
return {
3657-
'interfaces_table': interfaces_table,
3658-
'interface_count': instance.interfaces.count(),
3659-
}
3660-
36613534

36623535
@register_model_view(VirtualDeviceContext, 'edit')
36633536
class VirtualDeviceContextEditView(generic.ObjectEditView):

0 commit comments

Comments
 (0)