Skip to content

Commit

Permalink
Improve remaining APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
hipek8 committed Sep 17, 2024
1 parent cebb5ab commit bcdbc1a
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 9 deletions.
21 changes: 14 additions & 7 deletions src/ralph/api/tests/test_rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -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/",
Expand All @@ -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/",
Expand Down Expand Up @@ -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)
1 change: 1 addition & 0 deletions src/ralph/assets/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
16 changes: 14 additions & 2 deletions src/ralph/data_center/api/views.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bcdbc1a

Please sign in to comment.