Skip to content

Commit

Permalink
🩹(schema) create request/response serializers
Browse files Browse the repository at this point in the history
... for OrderViewSet
t s
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.
  • Loading branch information
rlecellier committed Mar 2, 2023
1 parent d354f98 commit 884666c
Show file tree
Hide file tree
Showing 13 changed files with 139 additions and 9 deletions.
36 changes: 32 additions & 4 deletions src/backend/joanie/core/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,7 @@ def get_serializer_context(self):
return context

@swagger_auto_schema(
manual_parameters=[
openapi.Parameter("course", in_=openapi.IN_QUERY, type=openapi.TYPE_STRING)
],
query_serializer=serializers.ProductRetrieveQuerySerializer,
)
def retrieve(self, *args, **kwargs):
return super().retrieve(*args, **kwargs)
Expand Down Expand Up @@ -186,6 +184,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={201: serializers.OrderCreateResponseSerializer},
)
@transaction.atomic
def create(self, request, *args, **kwargs):
"""Try to create an order and a related payment if the payment is fee."""
Expand Down Expand Up @@ -257,12 +259,17 @@ def create(self, request, *args, **kwargs):

# Return the fresh new order with payment_info
return Response(
{**serializer.data, "payment_info": payment_info}, status=201
{**serializer.data, "payment_info": payment_info},
status=201,
)

# Else return the fresh new order
return Response(serializer.data, status=201)

@swagger_auto_schema(
request_body=serializers.OrderAbortBodySerializer,
responses={204: serializers.EmptyResponseSerializer},
)
@action(detail=True, methods=["POST"])
def abort(self, request, pk=None): # pylint: disable=no-self-use, invalid-name
"""Abort a pending order and the related payment if there is one."""
Expand All @@ -287,6 +294,17 @@ def abort(self, request, pk=None): # pylint: disable=no-self-use, invalid-name

return Response(status=204)

@swagger_auto_schema(
query_serializer=serializers.OrderInvoiceQuerySerializer,
responses={
200: openapi.Response(
"File Attachment", schema=openapi.Schema(type=openapi.TYPE_FILE)
),
400: serializers.ErrorResponseSerializer,
404: serializers.ErrorResponseSerializer,
},
produces="application/pdf",
)
@action(detail=True, methods=["GET"])
def invoice(self, request, pk=None): # pylint: disable=no-self-use, invalid-name
"""
Expand Down Expand Up @@ -400,6 +418,16 @@ def get_queryset(self):
user = User.update_or_create_from_request_user(request_user=self.request.user)
return models.Certificate.objects.filter(order__owner=user)

@swagger_auto_schema(
responses={
200: openapi.Response(
"File Attachment", schema=openapi.Schema(type=openapi.TYPE_FILE)
),
404: serializers.ErrorResponseSerializer,
422: serializers.ErrorResponseSerializer,
},
produces="application/pdf",
)
@action(detail=True, methods=["GET"])
def download(self, request, pk=None): # pylint: disable=no-self-use, invalid-name
"""
Expand Down
8 changes: 8 additions & 0 deletions src/backend/joanie/core/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from .model_serializers import *
from .empty_response_serializer import *
from .error_response_serializer import *
from .order_create_body_serializer import *
from .order_create_response_serializer import *
from .order_abort_body_serializer import *
from .order_invoice_query_serializer import *
from .product_retrieve_query_serializer import *
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""Serializers for empty Response"""

from rest_framework import serializers


class EmptyResponseSerializer(serializers.Serializer):
pass
10 changes: 10 additions & 0 deletions src/backend/joanie/core/serializers/error_response_serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Serializers for core.api.OrderViewSet.abort Body"""

from rest_framework import serializers


class ErrorResponseSerializer(serializers.Serializer):
details = serializers.CharField(required=True)

class Meta:
fields = ["details"]
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Serializers for api."""
"""Serializers for core.models"""

from django.conf import settings
from django.core.cache import cache
Expand All @@ -7,8 +7,7 @@
from rest_framework import serializers

from joanie.core import models, utils

from .enums import ORDER_STATE_PENDING, ORDER_STATE_VALIDATED
from joanie.core.enums import ORDER_STATE_PENDING, ORDER_STATE_VALIDATED


class CertificationDefinitionSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -545,3 +544,10 @@ class Meta:
model = models.Certificate
fields = ["id"]
read_only_fields = ["id"]


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)
12 changes: 12 additions & 0 deletions src/backend/joanie/core/serializers/order_abort_body_serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""Serializers for core.api.OrderViewSet.abort Body"""

from rest_framework import serializers

from .model_serializers import OrderSerializer, AddressSerializer


class OrderAbortBodySerializer(serializers.Serializer):
payment_id = serializers.CharField(required=True)

class Meta:
fields = ["payment_id"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Serializers for core.api.OrderViewSet.create Response"""

from rest_framework import serializers

from .model_serializers import OrderSerializer, PaymentSerializer


class OrderAbortResponseSerializer(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"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
"""Serializers for core.api.OrderViewSet.create Body"""

from .model_serializers import OrderSerializer, AddressSerializer


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"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Serializers for core.api.OrderViewSet.create Response"""

from rest_framework import serializers

from .model_serializers import OrderSerializer, PaymentSerializer


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"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Serializers for core.api.OrderViewSet.abort Body"""

from rest_framework import serializers


class OrderInvoiceQuerySerializer(serializers.Serializer):
reference = serializers.CharField(required=True)

class Meta:
fields = ["reference"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Serializers for core.api.OrderViewSet.abort Body"""

from rest_framework import serializers


class ProductRetrieveQuerySerializer(serializers.Serializer):
course = serializers.CharField(required=True)

class Meta:
fields = ["course"]
2 changes: 1 addition & 1 deletion src/openApiClientJs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"private": true,
"description": "Tool to generate Typescript api client for joanie",
"scripts": {
"generate:api:client:local": "./scripts/openapi-typescript-codegen/generate_api_client_local.sh $1"
"generate:api:client:local": "./scripts/openapi-typescript-codegen/generate_api_client_local.sh"
},
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion src/openApiClientJs/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ neo-async@^2.6.0:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==

openapi-typescript-codegen@^0.23.0:
[email protected]:
version "0.23.0"
resolved "https://registry.yarnpkg.com/openapi-typescript-codegen/-/openapi-typescript-codegen-0.23.0.tgz#702a651eefc536b27e87e4ad54a80a31d36487f0"
integrity sha512-gOJXy5g3H3HlLpVNN+USrNK2i2KYBmDczk9Xk34u6JorwrGiDJZUj+al4S+i9TXdfUQ/ZaLxE59Xf3wqkxGfqA==
Expand Down

0 comments on commit 884666c

Please sign in to comment.