From 83c1a0a92910b44e833b8b08d9f631110c20cc1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20L=C3=B3pez=20Dato?= Date: Mon, 7 Jul 2025 12:12:57 -0300 Subject: [PATCH 1/4] Add missing Swagger schema for GET feature by ID --- api/features/views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/features/views.py b/api/features/views.py index 6731d860565a..50a1c24b1781 100644 --- a/api/features/views.py +++ b/api/features/views.py @@ -102,6 +102,10 @@ def get_feature_by_uuid(request, uuid): # type: ignore[no-untyped-def] name="list", decorator=swagger_auto_schema(query_serializer=FeatureQuerySerializer()), ) +@method_decorator( + name="retrieve", + decorator=swagger_auto_schema(responses={200: ProjectFeatureSerializer()}), +) class FeatureViewSet(viewsets.ModelViewSet): # type: ignore[type-arg] permission_classes = [FeaturePermissions] pagination_class = CustomPagination From 346d9c8ec6f9cdfeedb499f3a80979dbf26fdd5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20L=C3=B3pez=20Dato?= Date: Mon, 7 Jul 2025 12:43:52 -0300 Subject: [PATCH 2/4] Remove unused serializer class --- api/features/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/api/features/views.py b/api/features/views.py index 50a1c24b1781..82bec3eb9027 100644 --- a/api/features/views.py +++ b/api/features/views.py @@ -113,7 +113,6 @@ class FeatureViewSet(viewsets.ModelViewSet): # type: ignore[type-arg] def get_serializer_class(self): # type: ignore[no-untyped-def] return { "list": ListFeatureSerializer, - "retrieve": ListFeatureSerializer, "create": ListFeatureSerializer, "update": UpdateFeatureSerializer, "partial_update": UpdateFeatureSerializer, From e35001a81450e865be3b6a4e9ce4840a0c405c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20L=C3=B3pez=20Dato?= Date: Tue, 8 Jul 2025 09:14:33 -0300 Subject: [PATCH 3/4] Fix schema generation warning --- api/features/views.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/api/features/views.py b/api/features/views.py index 82bec3eb9027..598bf764ffe2 100644 --- a/api/features/views.py +++ b/api/features/views.py @@ -102,10 +102,6 @@ def get_feature_by_uuid(request, uuid): # type: ignore[no-untyped-def] name="list", decorator=swagger_auto_schema(query_serializer=FeatureQuerySerializer()), ) -@method_decorator( - name="retrieve", - decorator=swagger_auto_schema(responses={200: ProjectFeatureSerializer()}), -) class FeatureViewSet(viewsets.ModelViewSet): # type: ignore[type-arg] permission_classes = [FeaturePermissions] pagination_class = CustomPagination @@ -113,6 +109,7 @@ class FeatureViewSet(viewsets.ModelViewSet): # type: ignore[type-arg] def get_serializer_class(self): # type: ignore[no-untyped-def] return { "list": ListFeatureSerializer, + "retrieve": ListFeatureSerializer, "create": ListFeatureSerializer, "update": UpdateFeatureSerializer, "partial_update": UpdateFeatureSerializer, @@ -208,6 +205,8 @@ def perform_destroy(self, instance): # type: ignore[no-untyped-def] instance.delete() def get_serializer_context(self): # type: ignore[no-untyped-def] + if getattr(self, "swagger_fake_view", False): + return None context = super().get_serializer_context() feature_states = getattr(self, "_feature_states", {}) project = get_object_or_404(Project.objects.all(), pk=self.kwargs["project_pk"]) @@ -507,8 +506,6 @@ def get_queryset(self): # type: ignore[no-untyped-def] """ Override queryset to filter based on provided URL parameters. """ - if getattr(self, "swagger_fake_view", False): - return FeatureState.objects.none() environment_api_key = self.kwargs["environment_api_key"] From 77eb346b27f0bd7d0480bd5d97f0c48a2c5cea09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20L=C3=B3pez=20Dato?= Date: Tue, 8 Jul 2025 09:26:28 -0300 Subject: [PATCH 4/4] feedback --- api/features/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/api/features/views.py b/api/features/views.py index 598bf764ffe2..a7394377320b 100644 --- a/api/features/views.py +++ b/api/features/views.py @@ -205,9 +205,10 @@ def perform_destroy(self, instance): # type: ignore[no-untyped-def] instance.delete() def get_serializer_context(self): # type: ignore[no-untyped-def] - if getattr(self, "swagger_fake_view", False): - return None context = super().get_serializer_context() + if getattr(self, "swagger_fake_view", False): + return context + feature_states = getattr(self, "_feature_states", {}) project = get_object_or_404(Project.objects.all(), pk=self.kwargs["project_pk"]) context.update( @@ -506,6 +507,8 @@ def get_queryset(self): # type: ignore[no-untyped-def] """ Override queryset to filter based on provided URL parameters. """ + if getattr(self, "swagger_fake_view", False): + return FeatureState.objects.none() environment_api_key = self.kwargs["environment_api_key"]