diff --git a/cvat/apps/engine/views.py b/cvat/apps/engine/views.py index 15fd2aae..0c607e7f 100644 --- a/cvat/apps/engine/views.py +++ b/cvat/apps/engine/views.py @@ -319,8 +319,6 @@ class ProjectViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, iam_organization_field = 'organization' def get_serializer_class(self): - # TODO: fix separation into read and write serializers for requests and responses - # probably with drf-rw-serializers if self.request.path.endswith('tasks'): return TaskReadSerializer else: diff --git a/cvat/apps/organizations/views.py b/cvat/apps/organizations/views.py index 3e4da2f3..6aaa974c 100644 --- a/cvat/apps/organizations/views.py +++ b/cvat/apps/organizations/views.py @@ -31,11 +31,6 @@ from .serializers import ( responses={ '200': OrganizationReadSerializer(many=True), }), - update=extend_schema( - summary='Method updates an organization by id', - responses={ - '200': OrganizationWriteSerializer, - }), partial_update=extend_schema( summary='Methods does a partial update of chosen fields in an organization', responses={ @@ -102,11 +97,6 @@ class OrganizationViewSet(viewsets.GenericViewSet, responses={ '200': MembershipReadSerializer(many=True), }), - update=extend_schema( - summary='Method updates a membership by id', - responses={ - '200': MembershipWriteSerializer, - }), partial_update=extend_schema( summary='Methods does a partial update of chosen fields in a membership', responses={ @@ -201,7 +191,7 @@ class InvitationViewSet(viewsets.GenericViewSet, permission = InvitationPermission.create_scope_list(self.request) return permission.filter(queryset) - def perform_create(self, serializer): + def perform_create(self, serializer, **kwargs): extra_kwargs = { 'owner': self.request.user, 'key': get_random_string(length=64), diff --git a/cvat/apps/webhooks/views.py b/cvat/apps/webhooks/views.py index b39e1bc0..1e84d338 100644 --- a/cvat/apps/webhooks/views.py +++ b/cvat/apps/webhooks/views.py @@ -39,14 +39,18 @@ from .signals import signal_ping, signal_redelivery ), update=extend_schema( summary="Method updates a webhook by id", - responses={"200": WebhookWriteSerializer}, + request=WebhookWriteSerializer, + responses={"200": WebhookReadSerializer}, # check WebhookWriteSerializer.to_representation ), partial_update=extend_schema( summary="Methods does a partial update of chosen fields in a webhook", - responses={"200": WebhookWriteSerializer}, + request=WebhookWriteSerializer, + responses={"200": WebhookReadSerializer}, # check WebhookWriteSerializer.to_representation ), create=extend_schema( - summary="Method creates a webhook", responses={"201": WebhookWriteSerializer} + request=WebhookWriteSerializer, + summary="Method creates a webhook", + responses={"201": WebhookReadSerializer} # check WebhookWriteSerializer.to_representation ), destroy=extend_schema( summary="Method deletes a webhook", @@ -65,9 +69,11 @@ class WebhookViewSet(viewsets.ModelViewSet): iam_organization_field = "organization" def get_serializer_class(self): - if self.request.path.endswith("redelivery") or self.request.path.endswith( - "ping" - ): + # Early exit for drf-spectacular compatibility + if getattr(self, 'swagger_fake_view', False): + return WebhookReadSerializer + + if self.request.path.endswith("redelivery") or self.request.path.endswith("ping"): return None else: if self.request.method in SAFE_METHODS: @@ -164,11 +170,15 @@ class WebhookViewSet(viewsets.ModelViewSet): ) return Response(serializer.data) - @extend_schema(summary="Method redeliver a specific webhook delivery") + @extend_schema(summary="Method redeliver a specific webhook delivery", + request=None, + responses={200: None} + ) @action( detail=True, methods=["POST"], url_path=r"deliveries/(?P\d+)/redelivery", + serializer_class=None ) def redelivery(self, request, pk, delivery_id): delivery = WebhookDelivery.objects.get(webhook_id=pk, id=delivery_id) @@ -179,6 +189,7 @@ class WebhookViewSet(viewsets.ModelViewSet): @extend_schema( summary="Method send ping webhook", + request=None, responses={"200": WebhookDeliveryReadSerializer}, ) @action( diff --git a/cvat/settings/base.py b/cvat/settings/base.py index 52fc7dca..1f1ecfd7 100644 --- a/cvat/settings/base.py +++ b/cvat/settings/base.py @@ -577,6 +577,8 @@ SPECTACULAR_SETTINGS = { 'JobStage': 'cvat.apps.engine.models.StageChoice', 'StorageType': 'cvat.apps.engine.models.StorageChoice', 'SortingMethod': 'cvat.apps.engine.models.SortingMethod', + 'WebhookType': 'cvat.apps.webhooks.models.WebhookTypeChoice', + 'WebhookContentType': 'cvat.apps.webhooks.models.WebhookContentTypeChoice', }, # Coercion of {pk} to {id} is controlled by SCHEMA_COERCE_PATH_PK. Additionally,