From bcdbc1ac84172ce059ee6543ed1823778ad78b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Szulc?= Date: Tue, 17 Sep 2024 13:54:06 +0200 Subject: [PATCH] Improve remaining APIs --- src/ralph/api/tests/test_rendering.py | 21 ++++++++++++++------- src/ralph/assets/api/views.py | 1 + src/ralph/data_center/api/views.py | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/ralph/api/tests/test_rendering.py b/src/ralph/api/tests/test_rendering.py index ce66957795..29e403b853 100644 --- a/src/ralph/api/tests/test_rendering.py +++ b/src/ralph/api/tests/test_rendering.py @@ -19,6 +19,7 @@ class APIBrowsableClient(APIClient): default_format = 'text/html' +DEFAULT_MAX_QUERIES = 20 # To get this just visit /api in your browser ALL_API_ENDPOINTS = { "access-card": "/api/access-card/", @@ -44,7 +45,7 @@ class APIBrowsableClient(APIClient): "configuration-classes": "/api/configuration-classes/", "configuration-modules": "/api/configuration-modules/", "custom-fields": "/api/custom-fields/", - "data-center-assets": "/api/data-center-assets/", + "data-center-assets": ("/api/data-center-assets/", 22), "data-centers": "/api/data-centers/", "databases": "/api/databases/", "dc-hosts": "/api/dc-hosts/", @@ -129,21 +130,27 @@ def test_rendering(self): self.assertEqual(response.status_code, status.HTTP_200_OK) @data( - *ALL_API_ENDPOINTS.values() + *ALL_API_ENDPOINTS.keys() ) - def test_browsable_endpoint(self, endpoint): + def test_browsable_endpoint(self, model_name): + endpoint, max_queries = ALL_API_ENDPOINTS[model_name] \ + if isinstance(ALL_API_ENDPOINTS[model_name], tuple) \ + else (ALL_API_ENDPOINTS[model_name], DEFAULT_MAX_QUERIES) self.client.force_authenticate(self.user) with CaptureQueriesContext(connections['default']) as cqc: response = self.client.get(endpoint, HTTP_ACCEPT='text/html') self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertLessEqual(len(cqc.captured_queries), 30) + self.assertLessEqual(len(cqc.captured_queries), max_queries) @data( - *ALL_API_ENDPOINTS.values() + *ALL_API_ENDPOINTS.keys() ) - def test_json_endpoint(self, endpoint): + def test_json_endpoint(self, model_name): + endpoint, max_queries = ALL_API_ENDPOINTS[model_name] \ + if isinstance(ALL_API_ENDPOINTS[model_name], tuple) \ + else (ALL_API_ENDPOINTS[model_name], DEFAULT_MAX_QUERIES) self.client.force_authenticate(self.user) with CaptureQueriesContext(connections['default']) as cqc: response = self.client.get(endpoint, HTTP_ACCEPT='application/json') self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertLessEqual(len(cqc.captured_queries), 30) + self.assertLessEqual(len(cqc.captured_queries), max_queries) diff --git a/src/ralph/assets/api/views.py b/src/ralph/assets/api/views.py index 3394a3c906..a55e090436 100644 --- a/src/ralph/assets/api/views.py +++ b/src/ralph/assets/api/views.py @@ -90,6 +90,7 @@ class AssetModelViewSet(RalphAPIViewSet): serializer_class = serializers.AssetModelSerializer save_serializer_class = serializers.AssetModelSaveSerializer select_related = ["manufacturer"] + prefetch_related = ["custom_fields"] class BaseObjectFilterSet(NetworkableObjectFilters): diff --git a/src/ralph/data_center/api/views.py b/src/ralph/data_center/api/views.py index 7a04139235..acbb150f2f 100644 --- a/src/ralph/data_center/api/views.py +++ b/src/ralph/data_center/api/views.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from django.contrib.contenttypes.models import ContentType from django.db.models import Prefetch from ralph.api import RalphAPIViewSet @@ -7,7 +8,12 @@ base_object_descendant_prefetch_related, BaseObjectViewSetMixin ) -from ralph.assets.models import Ethernet +from ralph.assets.models import ( + ConfigurationClass, + ConfigurationModule, + Ethernet, + ServiceEnvironment +) from ralph.data_center.admin import DataCenterAssetAdmin from ralph.data_center.api.serializers import ( AccessorySerializer, @@ -48,7 +54,6 @@ class DataCenterAssetViewSet(BaseObjectViewSetMixin, RalphAPIViewSet): serializer_class = DataCenterAssetSerializer save_serializer_class = DataCenterAssetSaveSerializer select_related = DataCenterAssetAdmin.list_select_related + [ - 'service_env__service', 'service_env__environment', 'rack__server_room__data_center', 'property_of', 'budget_info', 'content_type', 'configuration_path__module', @@ -83,6 +88,13 @@ class DataCenterAssetViewSet(BaseObjectViewSetMixin, RalphAPIViewSet): exclude_filter_fields = ['configuration_path'] def get_queryset(self): + # precache content types, this can save 3 db queries occasionally + ContentType.objects.get_for_models( + DataCenterAsset, + ConfigurationClass, + ConfigurationModule, + ServiceEnvironment + ) return ( DataCenterAsset.polymorphic_objects .select_related(*self.select_related)