From 73ba2ca2d8eb0b358affce92f80f02411286b005 Mon Sep 17 00:00:00 2001 From: Nino Date: Thu, 15 Jan 2026 14:27:04 +0100 Subject: [PATCH] prevent retrieving each case when getting an itinerary --- app/apps/cases/serializers.py | 32 ----------------------------- app/apps/itinerary/serializers.py | 34 +++++++++++++++++++++++++------ app/apps/itinerary/views.py | 22 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/app/apps/cases/serializers.py b/app/apps/cases/serializers.py index c78f5bd1..0e4ae10c 100755 --- a/app/apps/cases/serializers.py +++ b/app/apps/cases/serializers.py @@ -51,35 +51,3 @@ def get_data(self, obj): if data is not None: return data return obj.data_context(self.context) - - -class CaseDetailSerializer(serializers.ModelSerializer): - class Meta: - model = Case - fields = () - - def to_representation(self, obj): - """ - Retrieves the full case data from the cache or data_context, - but reduces workflows to a list containing only state.name. - """ - - cache = self.context.get("cases_data_cache") - - if cache is not None: - data = cache.get(str(obj.case_id)) - else: - data = obj.data_context(self.context) - - if not isinstance(data, dict): - return {} - - # Transformeer workflows naar alleen de namen - workflows = data.get("workflows", []) - data["workflows"] = [ - wf["state"]["name"] - for wf in workflows - if "state" in wf and "name" in wf["state"] - ] - - return data diff --git a/app/apps/itinerary/serializers.py b/app/apps/itinerary/serializers.py index fdc0a6c7..06b7a4be 100755 --- a/app/apps/itinerary/serializers.py +++ b/app/apps/itinerary/serializers.py @@ -1,9 +1,5 @@ from apps.cases.models import Case -from apps.cases.serializers import ( - CaseDetailSerializer, - CaseSerializer, - CaseSimpleSerializer, -) +from apps.cases.serializers import CaseSerializer, CaseSimpleSerializer from apps.itinerary.models import ( Itinerary, ItineraryItem, @@ -222,7 +218,33 @@ def get_theme(self, obj): class ItineraryItemDetailSerializer(ItineraryItemSerializer): - case = CaseDetailSerializer(read_only=True) + case = serializers.SerializerMethodField() + + def get_case(self, obj): + return self._serialize_case(obj) + + def _serialize_case(self, obj): + cache = self.context.get("cases_data_cache") + + if cache is not None: + data = cache.get(str(obj.case.case_id)) + else: + data = obj.case.data_context(self.context) + + if not isinstance(data, dict): + return {} + + workflows = data.get("workflows", []) + data["workflows"] = [ + wf["state"]["name"] + for wf in workflows + if isinstance(wf, dict) + and "state" in wf + and isinstance(wf["state"], dict) + and "name" in wf["state"] + ] + + return data class ItineraryDetailSerializer(ItinerarySerializer): diff --git a/app/apps/itinerary/views.py b/app/apps/itinerary/views.py index 8710a7af..a9d3ca28 100755 --- a/app/apps/itinerary/views.py +++ b/app/apps/itinerary/views.py @@ -69,6 +69,28 @@ def get_object(self): except Http404: raise NotFound(MESSAGE) + def retrieve(self, request, *args, **kwargs): + user = get_object_or_404(User, id=request.user.id) + itinerary = Itinerary.objects.filter( + id=kwargs["pk"], team_members__user=user + ).first() + if not itinerary: + return Response({"detail": "Not authorized."}, status=403) + item_qs = ItineraryItem.objects.filter(itinerary=itinerary) + case_ids = list(item_qs.values_list("case__case_id", flat=True)) + + auth_header = get_auth_header_from_request(request) + cases_data_cache = fetch_cases_data(case_ids, auth_header) + + serializer = self.get_serializer( + itinerary, + context={ + **self.get_serializer_context(), + "cases_data_cache": cases_data_cache, + }, + ) + return Response(serializer.data) + def __get_all_itineraries__(self, user, date=None): itineraries = Itinerary.objects.filter(team_members__user=user)