Skip to content

Commit bd33a09

Browse files
committed
feat: add deprecation notice for questionnaire endpoints with end-of-life date
1 parent 16a0680 commit bd33a09

1 file changed

Lines changed: 107 additions & 7 deletions

File tree

dojo/api_v2/views.py

Lines changed: 107 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,19 @@ class PrefetchDojoModelViewSet(
242242
pass
243243

244244

245+
class DeprecationNoticeMixin:
246+
247+
deprecated: bool | None = None
248+
end_of_life_date: datetime | None = None
249+
250+
def finalize_response(self, request, response, *args, **kwargs):
251+
if self.deprecated is not None:
252+
response["X-Deprecated"] = self.deprecated
253+
if self.end_of_life_date is not None:
254+
response["X-End-Of-Life-Date"] = self.end_of_life_date.isoformat()
255+
return super().finalize_response(request, response, *args, **kwargs)
256+
257+
245258
# Authorization: authenticated users
246259
class RoleViewSet(viewsets.ReadOnlyModelViewSet):
247260
serializer_class = serializers.RoleSerializer
@@ -3171,7 +3184,10 @@ def get_queryset(self):
31713184
class QuestionnaireQuestionViewSet(
31723185
viewsets.ReadOnlyModelViewSet,
31733186
dojo_mixins.QuestionSubClassFieldsMixin,
3187+
DeprecationNoticeMixin,
31743188
):
3189+
deprecated = True
3190+
end_of_life_date = datetime(2026, 6, 1)
31753191
serializer_class = serializers.QuestionnaireQuestionSerializer
31763192
queryset = Question.objects.none()
31773193
filter_backends = (DjangoFilterBackend,)
@@ -3183,11 +3199,28 @@ class QuestionnaireQuestionViewSet(
31833199
def get_queryset(self):
31843200
return Question.objects.all().order_by("id")
31853201

3202+
@extend_schema(
3203+
deprecated=True,
3204+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3205+
)
3206+
def list(self, request, *args, **kwargs):
3207+
return super().list(request, *args, **kwargs)
3208+
3209+
@extend_schema(
3210+
deprecated=True,
3211+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3212+
)
3213+
def retrieve(self, request, *args, **kwargs):
3214+
return super().retrieve(request, *args, **kwargs)
3215+
31863216

31873217
class QuestionnaireAnswerViewSet(
31883218
viewsets.ReadOnlyModelViewSet,
31893219
dojo_mixins.AnswerSubClassFieldsMixin,
3220+
DeprecationNoticeMixin,
31903221
):
3222+
deprecated = True
3223+
end_of_life_date = datetime(2026, 6, 1)
31913224
serializer_class = serializers.QuestionnaireAnswerSerializer
31923225
queryset = Answer.objects.none()
31933226
filter_backends = (DjangoFilterBackend,)
@@ -3199,10 +3232,27 @@ class QuestionnaireAnswerViewSet(
31993232
def get_queryset(self):
32003233
return Answer.objects.all().order_by("id")
32013234

3235+
@extend_schema(
3236+
deprecated=True,
3237+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3238+
)
3239+
def list(self, request, *args, **kwargs):
3240+
return super().list(request, *args, **kwargs)
3241+
3242+
@extend_schema(
3243+
deprecated=True,
3244+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3245+
)
3246+
def retrieve(self, request, *args, **kwargs):
3247+
return super().retrieve(request, *args, **kwargs)
3248+
32023249

32033250
class QuestionnaireGeneralSurveyViewSet(
32043251
viewsets.ReadOnlyModelViewSet,
3252+
DeprecationNoticeMixin,
32053253
):
3254+
deprecated = True
3255+
end_of_life_date = datetime(2026, 6, 1)
32063256
serializer_class = serializers.QuestionnaireGeneralSurveySerializer
32073257
queryset = General_Survey.objects.none()
32083258
filter_backends = (DjangoFilterBackend,)
@@ -3214,10 +3264,27 @@ class QuestionnaireGeneralSurveyViewSet(
32143264
def get_queryset(self):
32153265
return General_Survey.objects.all().order_by("id")
32163266

3267+
@extend_schema(
3268+
deprecated=True,
3269+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3270+
)
3271+
def list(self, request, *args, **kwargs):
3272+
return super().list(request, *args, **kwargs)
3273+
3274+
@extend_schema(
3275+
deprecated=True,
3276+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3277+
)
3278+
def retrieve(self, request, *args, **kwargs):
3279+
return super().retrieve(request, *args, **kwargs)
3280+
32173281

32183282
class QuestionnaireEngagementSurveyViewSet(
32193283
viewsets.ReadOnlyModelViewSet,
3284+
DeprecationNoticeMixin,
32203285
):
3286+
deprecated = True
3287+
end_of_life_date = datetime(2026, 6, 1)
32213288
serializer_class = serializers.QuestionnaireEngagementSurveySerializer
32223289
queryset = Engagement_Survey.objects.none()
32233290
filter_backends = (DjangoFilterBackend,)
@@ -3230,13 +3297,29 @@ def get_queryset(self):
32303297
return Engagement_Survey.objects.all().order_by("id")
32313298

32323299
@extend_schema(
3233-
request=OpenApiTypes.NONE,
3234-
parameters=[
3235-
OpenApiParameter(
3236-
"engagement_id", OpenApiTypes.INT, OpenApiParameter.PATH,
3237-
),
3238-
],
3239-
responses={status.HTTP_200_OK: serializers.QuestionnaireAnsweredSurveySerializer},
3300+
deprecated=True,
3301+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3302+
)
3303+
def list(self, request, *args, **kwargs):
3304+
return super().list(request, *args, **kwargs)
3305+
3306+
@extend_schema(
3307+
deprecated=True,
3308+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3309+
)
3310+
def retrieve(self, request, *args, **kwargs):
3311+
return super().retrieve(request, *args, **kwargs)
3312+
3313+
@extend_schema(
3314+
deprecated=True,
3315+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3316+
request=OpenApiTypes.NONE,
3317+
parameters=[
3318+
OpenApiParameter(
3319+
"engagement_id", OpenApiTypes.INT, OpenApiParameter.PATH,
3320+
),
3321+
],
3322+
responses={status.HTTP_200_OK: serializers.QuestionnaireAnsweredSurveySerializer},
32403323
)
32413324
@action(
32423325
detail=True, methods=["post"], url_path=r"link_engagement/(?P<engagement_id>\d+)",
@@ -3258,7 +3341,10 @@ class QuestionnaireAnsweredSurveyViewSet(
32583341
prefetch.PrefetchListMixin,
32593342
prefetch.PrefetchRetrieveMixin,
32603343
viewsets.ReadOnlyModelViewSet,
3344+
DeprecationNoticeMixin,
32613345
):
3346+
deprecated = True
3347+
end_of_life_date = datetime(2026, 6, 1)
32623348
serializer_class = serializers.QuestionnaireAnsweredSurveySerializer
32633349
queryset = Answered_Survey.objects.none()
32643350
filter_backends = (DjangoFilterBackend,)
@@ -3270,6 +3356,20 @@ class QuestionnaireAnsweredSurveyViewSet(
32703356
def get_queryset(self):
32713357
return Answered_Survey.objects.all().order_by("id")
32723358

3359+
@extend_schema(
3360+
deprecated=True,
3361+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3362+
)
3363+
def list(self, request, *args, **kwargs):
3364+
return super().list(request, *args, **kwargs)
3365+
3366+
@extend_schema(
3367+
deprecated=True,
3368+
description="This endpoint is deprecated and will be removed on 2026-06-01.",
3369+
)
3370+
def retrieve(self, request, *args, **kwargs):
3371+
return super().retrieve(request, *args, **kwargs)
3372+
32733373

32743374
# Authorization: configuration
32753375
class AnnouncementViewSet(

0 commit comments

Comments
 (0)