From 54d89b6ae4ecd2a45e79a2165da3ea5f68406ebe Mon Sep 17 00:00:00 2001 From: Romain Le Cellier Date: Mon, 27 Feb 2023 17:09:31 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=A9=B9(schema)=20add=20course=20query?= =?UTF-8?q?=20param=20to=20product=20retrieve=20route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit course is a mandatory query param for product.retrieve. we need it in order to correctly generate javascript api client. --- CHANGELOG.md | 1 + src/backend/joanie/core/api.py | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43da76b9e2..2bb617a374 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to - Allow on-demand page size on the order and enrollment endpoints - Add yarn cli to generate joanie api client in TypeScript +- Add course query param to openapi schema on route products.retrieve ### Removed diff --git a/src/backend/joanie/core/api.py b/src/backend/joanie/core/api.py index eb45783b7a..20dcd2cc59 100644 --- a/src/backend/joanie/core/api.py +++ b/src/backend/joanie/core/api.py @@ -6,6 +6,8 @@ from django.http import HttpResponse from django.utils.translation import gettext_lazy as _ +from drf_yasg import openapi +from drf_yasg.utils import swagger_auto_schema from rest_framework import mixins, pagination, permissions, viewsets from rest_framework.decorators import action from rest_framework.exceptions import ValidationError as DRFValidationError @@ -111,6 +113,14 @@ def get_serializer_context(self): return context + @swagger_auto_schema( + manual_parameters=[ + openapi.Parameter("course", in_=openapi.IN_QUERY, type=openapi.TYPE_STRING) + ], + ) + def retrieve(self, *args, **kwargs): + return super().retrieve(*args, **kwargs) + # pylint: disable=too-many-ancestors class EnrollmentViewSet( From d926e7ae01207b0ffe651f3d4443ff8c597f0ea9 Mon Sep 17 00:00:00 2001 From: Romain Le Cellier Date: Tue, 28 Feb 2023 16:18:51 +0100 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A9=B9(schema)=20create=20request/res?= =?UTF-8?q?ponse=20serializers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... for OrderViewSet Each viewset endpoints take and send differentes values. It's currently defined as Order for all ViewSet endpoints. Here we specify which data will be given in the request body and which data will be sent as response. --- src/backend/joanie/core/api.py | 9 ++++++++- src/backend/joanie/core/serializers.py | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/backend/joanie/core/api.py b/src/backend/joanie/core/api.py index 20dcd2cc59..a2b353de6f 100644 --- a/src/backend/joanie/core/api.py +++ b/src/backend/joanie/core/api.py @@ -186,6 +186,10 @@ def perform_create(self, serializer): owner = User.update_or_create_from_request_user(request_user=self.request.user) serializer.save(owner=owner) + @swagger_auto_schema( + request_body=serializers.OrderCreateBodySerializer, + responses={200: serializers.OrderCreateResponseSerializer()}, + ) @transaction.atomic def create(self, request, *args, **kwargs): """Try to create an order and a related payment if the payment is fee.""" @@ -257,7 +261,10 @@ def create(self, request, *args, **kwargs): # Return the fresh new order with payment_info return Response( - {**serializer.data, "payment_info": payment_info}, status=201 + serializers.OrderCreateResponseSerializer( + {**serializer.data, "payment_info": payment_info} + ), + status=201, ) # Else return the fresh new order diff --git a/src/backend/joanie/core/serializers.py b/src/backend/joanie/core/serializers.py index 63697dc362..25561a77ee 100644 --- a/src/backend/joanie/core/serializers.py +++ b/src/backend/joanie/core/serializers.py @@ -545,3 +545,27 @@ class Meta: model = models.Certificate fields = ["id"] read_only_fields = ["id"] + + +class OrderCreateBodySerializer(OrderSerializer): + billing_address = AddressSerializer(required=False) + + class Meta(OrderSerializer.Meta): + fields = OrderSerializer.Meta.fields + ["billing_address"] + read_only_fields = OrderSerializer.Meta.fields + ["billing_address"] + + +class PaymentSerializer(serializers.Serializer): + payment_id = serializers.CharField(required=True) + provider = serializers.CharField(required=True) + url = serializers.CharField(required=True) + is_paid = serializers.BooleanField(required=False) + + +class OrderCreateResponseSerializer(OrderSerializer): + id = serializers.CharField(required=True) + payment_info = PaymentSerializer(required=False) + + class Meta(OrderSerializer.Meta): + fields = OrderSerializer.Meta.fields + ["payment_info"] + read_only_fields = OrderSerializer.Meta.fields + ["payment_info"]