Skip to content

Commit 5353f83

Browse files
15794 Make "related objects" dynamic (#15876)
* Closes #15794: Make "related objects" dynamic Instead of hardcoding relationships between models for the detail view, they are now dynamically generated. * Fix related models call * Remove extra related models hook Instead of providing a rarely used hook method, additional related models can now be passed directly to the lookup method. * Fix relations view for ASNs ASNs have ManyToMany relationships and therefore can't used automatic resolving. Explicit relations have been restored as before. * Add method call keywords for clarification * Cleanup related models --------- Co-authored-by: Jeremy Stretch <[email protected]>
1 parent 763d65b commit 5353f83

File tree

9 files changed

+176
-238
lines changed

9 files changed

+176
-238
lines changed

netbox/circuits/views.py

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from tenancy.views import ObjectContactsView
88
from utilities.forms import ConfirmationForm
99
from utilities.query import count_related
10-
from utilities.views import register_model_view
10+
from utilities.views import GetRelatedModelsMixin, register_model_view
1111
from . import filtersets, forms, tables
1212
from .models import *
1313

@@ -26,17 +26,12 @@ class ProviderListView(generic.ObjectListView):
2626

2727

2828
@register_model_view(Provider)
29-
class ProviderView(generic.ObjectView):
29+
class ProviderView(GetRelatedModelsMixin, generic.ObjectView):
3030
queryset = Provider.objects.all()
3131

3232
def get_extra_context(self, request, instance):
33-
related_models = (
34-
(ProviderAccount.objects.restrict(request.user, 'view').filter(provider=instance), 'provider_id'),
35-
(Circuit.objects.restrict(request.user, 'view').filter(provider=instance), 'provider_id'),
36-
)
37-
3833
return {
39-
'related_models': related_models,
34+
'related_models': self.get_related_models(request, instance),
4035
}
4136

4237

@@ -92,16 +87,12 @@ class ProviderAccountListView(generic.ObjectListView):
9287

9388

9489
@register_model_view(ProviderAccount)
95-
class ProviderAccountView(generic.ObjectView):
90+
class ProviderAccountView(GetRelatedModelsMixin, generic.ObjectView):
9691
queryset = ProviderAccount.objects.all()
9792

9893
def get_extra_context(self, request, instance):
99-
related_models = (
100-
(Circuit.objects.restrict(request.user, 'view').filter(provider_account=instance), 'provider_account_id'),
101-
)
102-
10394
return {
104-
'related_models': related_models,
95+
'related_models': self.get_related_models(request, instance),
10596
}
10697

10798

@@ -156,19 +147,21 @@ class ProviderNetworkListView(generic.ObjectListView):
156147

157148

158149
@register_model_view(ProviderNetwork)
159-
class ProviderNetworkView(generic.ObjectView):
150+
class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView):
160151
queryset = ProviderNetwork.objects.all()
161152

162153
def get_extra_context(self, request, instance):
163-
related_models = (
164-
(
165-
Circuit.objects.restrict(request.user, 'view').filter(terminations__provider_network=instance),
166-
'provider_network_id',
167-
),
168-
)
169-
170154
return {
171-
'related_models': related_models,
155+
'related_models': self.get_related_models(
156+
request,
157+
instance,
158+
extra=(
159+
(
160+
Circuit.objects.restrict(request.user, 'view').filter(terminations__provider_network=instance),
161+
'provider_network_id',
162+
),
163+
),
164+
),
172165
}
173166

174167

@@ -215,16 +208,12 @@ class CircuitTypeListView(generic.ObjectListView):
215208

216209

217210
@register_model_view(CircuitType)
218-
class CircuitTypeView(generic.ObjectView):
211+
class CircuitTypeView(GetRelatedModelsMixin, generic.ObjectView):
219212
queryset = CircuitType.objects.all()
220213

221214
def get_extra_context(self, request, instance):
222-
related_models = (
223-
(Circuit.objects.restrict(request.user, 'view').filter(type=instance), 'type_id'),
224-
)
225-
226215
return {
227-
'related_models': related_models,
216+
'related_models': self.get_related_models(request, instance),
228217
}
229218

230219

netbox/core/views.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
from utilities.forms import ConfirmationForm
3333
from utilities.htmx import htmx_partial
3434
from utilities.query import count_related
35-
from utilities.views import ContentTypePermissionRequiredMixin, register_model_view
35+
from utilities.views import ContentTypePermissionRequiredMixin, GetRelatedModelsMixin, register_model_view
3636
from . import filtersets, forms, tables
3737
from .models import *
3838

@@ -51,16 +51,12 @@ class DataSourceListView(generic.ObjectListView):
5151

5252

5353
@register_model_view(DataSource)
54-
class DataSourceView(generic.ObjectView):
54+
class DataSourceView(GetRelatedModelsMixin, generic.ObjectView):
5555
queryset = DataSource.objects.all()
5656

5757
def get_extra_context(self, request, instance):
58-
related_models = (
59-
(DataFile.objects.restrict(request.user, 'view').filter(source=instance), 'source_id'),
60-
)
61-
6258
return {
63-
'related_models': related_models,
59+
'related_models': self.get_related_models(request, instance),
6460
}
6561

6662

0 commit comments

Comments
 (0)