From 1ae5267253844786933421b732040766114bf492 Mon Sep 17 00:00:00 2001 From: ngovinh2k2 Date: Fri, 11 Sep 2026 14:25:11 +0700 Subject: [PATCH] fix: cant get device profile info --- apps/device/views.py | 106 ++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 32 deletions(-) diff --git a/apps/device/views.py b/apps/device/views.py index a144cc0..f8d6990 100644 --- a/apps/device/views.py +++ b/apps/device/views.py @@ -107,7 +107,57 @@ def bulk_create(self, request): ) -class ListCreateSpaceDeviceViewSet(SpaceListCreateAPIView): +class SpaceDeviceSerializationMixin: + entity_properties_context = False + + def get_space_device_serializer_context(self, items, base_context=None): + context = get_device_profile_context( + base_context or self.get_serializer_context(), + items, + ) + if self.entity_properties_context: + context = _entity_properties_context( + context, + items, + _organization_slug(self.request), + ) + return context + + def get_space_device_list_response(self, items): + page = self.paginate_queryset(items) + if page is not None: + serializer = self.get_serializer( + page, + many=True, + context=self.get_space_device_serializer_context(page), + ) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer( + items, + many=True, + context=self.get_space_device_serializer_context(items), + ) + return Response(serializer.data) + + def get_object(self): + instance = super().get_object() + if self.request.method == "GET": + self._space_device_context_items = [instance] + return instance + + def get_serializer_context(self): + context = super().get_serializer_context() + items = getattr(self, "_space_device_context_items", None) + if items is None: + return context + return self.get_space_device_serializer_context(items, base_context=context) + + +class ListCreateSpaceDeviceViewSet( + SpaceDeviceSerializationMixin, + SpaceListCreateAPIView, +): queryset = SpaceDevice.objects.select_related( "device", "device__lorawan_device", @@ -123,6 +173,7 @@ class ListCreateSpaceDeviceViewSet(SpaceListCreateAPIView): filterset_class = SpaceDeviceFilter ordering_fields = ["created_at", "name"] space_field = "space" + entity_properties_context = True search_fields = [ "name", "description", @@ -139,34 +190,7 @@ def list(self, request, *args, **kwargs): service = SpaceDeviceListService(request) queryset = self.filter_queryset(self.get_queryset()) results = service.get_combined_results(queryset) - - page = self.paginate_queryset(results) - if page is not None: - context = get_device_profile_context(self.get_serializer_context(), page) - context = _entity_properties_context( - context, - page, - _organization_slug(request), - ) - serializer = self.get_serializer( - page, - many=True, - context=context, - ) - return self.get_paginated_response(serializer.data) - - context = get_device_profile_context(self.get_serializer_context(), results) - context = _entity_properties_context( - context, - results, - _organization_slug(request), - ) - serializer = self.get_serializer( - results, - many=True, - context=context, - ) - return Response(serializer.data) + return self.get_space_device_list_response(results) class FindDeviceByCodeView(DeactivationMixin, views.APIView): @@ -198,12 +222,14 @@ def get(self, request, *args, **kwargs): class DeleteSpaceDeviceViewSet( + SpaceDeviceSerializationMixin, DeactivationMixin, generics.RetrieveUpdateDestroyAPIView, ): lookup_field = "id" queryset = SpaceDevice.objects.select_related("device", "space").all() deactivation = ["device", "space"] + entity_properties_context = True def get_serializer_class(self): if self.request.method == "GET": @@ -364,10 +390,15 @@ def get_object(self): return get_object_or_404(queryset, device_id=device_id) -class RetrieveSpaceDeviceView(DeactivationMixin, generics.RetrieveAPIView): +class RetrieveSpaceDeviceView( + SpaceDeviceSerializationMixin, + DeactivationMixin, + generics.RetrieveAPIView, +): serializer_class = SpaceDeviceSerializer lookup_field = "device_id" deactivation = ["device", "space"] + entity_properties_context = True queryset = SpaceDevice.objects.select_related( "device", "device__lorawan_device", @@ -379,7 +410,10 @@ class RetrieveSpaceDeviceView(DeactivationMixin, generics.RetrieveAPIView): ).all() -class ListPublicSpaceDeviceView(generics.ListAPIView): +class ListPublicSpaceDeviceView( + SpaceDeviceSerializationMixin, + generics.ListAPIView, +): serializer_class = SpaceDeviceSerializer pagination_class = BasePagination permission_classes = [AllowAny] @@ -399,8 +433,16 @@ def get_queryset(self): .order_by("-created_at") ) + def list(self, request, *args, **kwargs): + queryset = self.filter_queryset(self.get_queryset()) + return self.get_space_device_list_response(queryset) + -class RetrievePublicSpaceDeviceView(DeactivationMixin, generics.RetrieveAPIView): +class RetrievePublicSpaceDeviceView( + SpaceDeviceSerializationMixin, + DeactivationMixin, + generics.RetrieveAPIView, +): serializer_class = SpaceDeviceSerializer permission_classes = [AllowAny] lookup_field = "id"