mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-13 19:18:16 -06:00
Move class queryset to cached property
Using ContentType on class definition breaks when the database tables haven't been created yet
This commit is contained in:
parent
fb4d9a6c14
commit
18fbb9eba1
@ -5,6 +5,7 @@ from django.contrib.contenttypes.models import ContentType
|
|||||||
from django.db.models import Count, F
|
from django.db.models import Count, F
|
||||||
from django.http import HttpResponseForbidden
|
from django.http import HttpResponseForbidden
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django.utils.functional import cached_property
|
||||||
from drf_yasg import openapi
|
from drf_yasg import openapi
|
||||||
from drf_yasg.openapi import Parameter
|
from drf_yasg.openapi import Parameter
|
||||||
from drf_yasg.utils import swagger_auto_schema
|
from drf_yasg.utils import swagger_auto_schema
|
||||||
@ -510,14 +511,17 @@ class InventoryItemViewSet(ModelViewSet):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleConnectionViewSet(ListModelMixin, GenericViewSet):
|
class ConsoleConnectionViewSet(ListModelMixin, GenericViewSet):
|
||||||
queryset = ConsolePort.objects.prefetch_related(
|
|
||||||
'device', 'connected_endpoint__device'
|
|
||||||
).filter(
|
|
||||||
connected_endpoint_type=ContentType.objects.get_for_model(ConsoleServerPort)
|
|
||||||
)
|
|
||||||
serializer_class = serializers.ConsolePortSerializer
|
serializer_class = serializers.ConsolePortSerializer
|
||||||
filterset_class = filters.ConsoleConnectionFilter
|
filterset_class = filters.ConsoleConnectionFilter
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def queryset(self):
|
||||||
|
return ConsolePort.objects.prefetch_related(
|
||||||
|
'device', 'connected_endpoint__device'
|
||||||
|
).filter(
|
||||||
|
connected_endpoint_type=ContentType.objects.get_for_model(ConsoleServerPort)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class PowerConnectionViewSet(ListModelMixin, GenericViewSet):
|
class PowerConnectionViewSet(ListModelMixin, GenericViewSet):
|
||||||
queryset = PowerPort.objects.prefetch_related(
|
queryset = PowerPort.objects.prefetch_related(
|
||||||
@ -530,18 +534,21 @@ class PowerConnectionViewSet(ListModelMixin, GenericViewSet):
|
|||||||
|
|
||||||
|
|
||||||
class InterfaceConnectionViewSet(ListModelMixin, GenericViewSet):
|
class InterfaceConnectionViewSet(ListModelMixin, GenericViewSet):
|
||||||
queryset = Interface.objects.prefetch_related(
|
|
||||||
'device', 'connected_endpoint__device'
|
|
||||||
).filter(
|
|
||||||
# Avoid duplicate connections by only selecting the lower PK in a connected pair
|
|
||||||
connected_endpoint_type=ContentType.objects.get_for_model(Interface),
|
|
||||||
pk__lt=F('connected_endpoint_id')
|
|
||||||
).order_by(
|
|
||||||
'device'
|
|
||||||
)
|
|
||||||
serializer_class = serializers.InterfaceConnectionSerializer
|
serializer_class = serializers.InterfaceConnectionSerializer
|
||||||
filterset_class = filters.InterfaceConnectionFilter
|
filterset_class = filters.InterfaceConnectionFilter
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def queryset(self):
|
||||||
|
return Interface.objects.prefetch_related(
|
||||||
|
'device', 'connected_endpoint__device'
|
||||||
|
).filter(
|
||||||
|
# Avoid duplicate connections by only selecting the lower PK in a connected pair
|
||||||
|
connected_endpoint_type=ContentType.objects.get_for_model(Interface),
|
||||||
|
pk__lt=F('connected_endpoint_id')
|
||||||
|
).order_by(
|
||||||
|
'device'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Cables
|
# Cables
|
||||||
|
@ -10,6 +10,7 @@ from django.db.models import Count, F
|
|||||||
from django.forms import modelformset_factory
|
from django.forms import modelformset_factory
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
from django.utils.functional import cached_property
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
from django.utils.http import is_safe_url
|
from django.utils.http import is_safe_url
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
@ -1876,18 +1877,21 @@ class CableBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|||||||
|
|
||||||
class ConsoleConnectionsListView(PermissionRequiredMixin, ObjectListView):
|
class ConsoleConnectionsListView(PermissionRequiredMixin, ObjectListView):
|
||||||
permission_required = ('dcim.view_consoleport', 'dcim.view_consoleserverport')
|
permission_required = ('dcim.view_consoleport', 'dcim.view_consoleserverport')
|
||||||
queryset = ConsolePort.objects.prefetch_related(
|
|
||||||
'device', 'connected_endpoint__device'
|
|
||||||
).filter(
|
|
||||||
connected_endpoint_type=ContentType.objects.get_for_model(ConsoleServerPort)
|
|
||||||
).order_by(
|
|
||||||
'cable', # 'connected_endpoint__device__name', 'connected_endpoint__name'
|
|
||||||
)
|
|
||||||
filter = filters.ConsoleConnectionFilter
|
filter = filters.ConsoleConnectionFilter
|
||||||
filter_form = forms.ConsoleConnectionFilterForm
|
filter_form = forms.ConsoleConnectionFilterForm
|
||||||
table = tables.ConsoleConnectionTable
|
table = tables.ConsoleConnectionTable
|
||||||
template_name = 'dcim/console_connections_list.html'
|
template_name = 'dcim/console_connections_list.html'
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def queryset(self):
|
||||||
|
return ConsolePort.objects.prefetch_related(
|
||||||
|
'device', 'connected_endpoint__device'
|
||||||
|
).filter(
|
||||||
|
connected_endpoint_type=ContentType.objects.get_for_model(ConsoleServerPort)
|
||||||
|
).order_by(
|
||||||
|
'cable', # 'connected_endpoint__device__name', 'connected_endpoint__name'
|
||||||
|
)
|
||||||
|
|
||||||
def queryset_to_csv(self):
|
def queryset_to_csv(self):
|
||||||
csv_data = [
|
csv_data = [
|
||||||
# Headers
|
# Headers
|
||||||
@ -1938,20 +1942,23 @@ class PowerConnectionsListView(PermissionRequiredMixin, ObjectListView):
|
|||||||
|
|
||||||
class InterfaceConnectionsListView(PermissionRequiredMixin, ObjectListView):
|
class InterfaceConnectionsListView(PermissionRequiredMixin, ObjectListView):
|
||||||
permission_required = 'dcim.view_interface'
|
permission_required = 'dcim.view_interface'
|
||||||
queryset = Interface.objects.prefetch_related(
|
|
||||||
'device', 'cable', 'connected_endpoint__device'
|
|
||||||
).filter(
|
|
||||||
# Avoid duplicate connections by only selecting the lower PK in a connected pair
|
|
||||||
connected_endpoint_type=ContentType.objects.get_for_model(Interface),
|
|
||||||
pk__lt=F('connected_endpoint_id')
|
|
||||||
).order_by(
|
|
||||||
'device'
|
|
||||||
)
|
|
||||||
filter = filters.InterfaceConnectionFilter
|
filter = filters.InterfaceConnectionFilter
|
||||||
filter_form = forms.InterfaceConnectionFilterForm
|
filter_form = forms.InterfaceConnectionFilterForm
|
||||||
table = tables.InterfaceConnectionTable
|
table = tables.InterfaceConnectionTable
|
||||||
template_name = 'dcim/interface_connections_list.html'
|
template_name = 'dcim/interface_connections_list.html'
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def queryset(self):
|
||||||
|
return Interface.objects.prefetch_related(
|
||||||
|
'device', 'cable', 'connected_endpoint__device'
|
||||||
|
).filter(
|
||||||
|
# Avoid duplicate connections by only selecting the lower PK in a connected pair
|
||||||
|
connected_endpoint_type=ContentType.objects.get_for_model(Interface),
|
||||||
|
pk__lt=F('connected_endpoint_id')
|
||||||
|
).order_by(
|
||||||
|
'device'
|
||||||
|
)
|
||||||
|
|
||||||
def queryset_to_csv(self):
|
def queryset_to_csv(self):
|
||||||
csv_data = [
|
csv_data = [
|
||||||
# Headers
|
# Headers
|
||||||
|
Loading…
Reference in New Issue
Block a user