Skip to content

Commit 3eb67b9

Browse files
committed
🩹(schema) create request/response serializers
... 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.
1 parent eba8bfa commit 3eb67b9

13 files changed

+139
-9
lines changed

src/backend/joanie/core/api.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,7 @@ def get_serializer_context(self):
114114
return context
115115

116116
@swagger_auto_schema(
117-
manual_parameters=[
118-
openapi.Parameter("course", in_=openapi.IN_QUERY, type=openapi.TYPE_STRING)
119-
],
117+
query_serializer=serializers.ProductRetrieveQuerySerializer,
120118
)
121119
def retrieve(self, *args, **kwargs):
122120
return super().retrieve(*args, **kwargs)
@@ -186,6 +184,10 @@ def perform_create(self, serializer):
186184
owner = User.update_or_create_from_request_user(request_user=self.request.user)
187185
serializer.save(owner=owner)
188186

187+
@swagger_auto_schema(
188+
request_body=serializers.OrderCreateBodySerializer,
189+
responses={201: serializers.OrderCreateResponseSerializer},
190+
)
189191
@transaction.atomic
190192
def create(self, request, *args, **kwargs):
191193
"""Try to create an order and a related payment if the payment is fee."""
@@ -257,12 +259,17 @@ def create(self, request, *args, **kwargs):
257259

258260
# Return the fresh new order with payment_info
259261
return Response(
260-
{**serializer.data, "payment_info": payment_info}, status=201
262+
{**serializer.data, "payment_info": payment_info},
263+
status=201,
261264
)
262265

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

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

288295
return Response(status=204)
289296

297+
@swagger_auto_schema(
298+
query_serializer=serializers.OrderInvoiceQuerySerializer,
299+
responses={
300+
200: openapi.Response(
301+
"File Attachment", schema=openapi.Schema(type=openapi.TYPE_FILE)
302+
),
303+
400: serializers.ErrorResponseSerializer,
304+
404: serializers.ErrorResponseSerializer,
305+
},
306+
produces="application/pdf",
307+
)
290308
@action(detail=True, methods=["GET"])
291309
def invoice(self, request, pk=None): # pylint: disable=no-self-use, invalid-name
292310
"""
@@ -400,6 +418,16 @@ def get_queryset(self):
400418
user = User.update_or_create_from_request_user(request_user=self.request.user)
401419
return models.Certificate.objects.filter(order__owner=user)
402420

421+
@swagger_auto_schema(
422+
responses={
423+
200: openapi.Response(
424+
"File Attachment", schema=openapi.Schema(type=openapi.TYPE_FILE)
425+
),
426+
404: serializers.ErrorResponseSerializer,
427+
422: serializers.ErrorResponseSerializer,
428+
},
429+
produces="application/pdf",
430+
)
403431
@action(detail=True, methods=["GET"])
404432
def download(self, request, pk=None): # pylint: disable=no-self-use, invalid-name
405433
"""
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from .model_serializers import *
2+
from .empty_response_serializer import *
3+
from .error_response_serializer import *
4+
from .order_create_body_serializer import *
5+
from .order_create_response_serializer import *
6+
from .order_abort_body_serializer import *
7+
from .order_invoice_query_serializer import *
8+
from .product_retrieve_query_serializer import *
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""Serializers for empty Response"""
2+
3+
from rest_framework import serializers
4+
5+
6+
class EmptyResponseSerializer(serializers.Serializer):
7+
pass
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"""Serializers for core.api.OrderViewSet.abort Body"""
2+
3+
from rest_framework import serializers
4+
5+
6+
class ErrorResponseSerializer(serializers.Serializer):
7+
details = serializers.CharField(required=True)
8+
9+
class Meta:
10+
fields = ["details"]

src/backend/joanie/core/serializers.py renamed to src/backend/joanie/core/serializers/model_serializers.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Serializers for api."""
1+
"""Serializers for core.models"""
22

33
from django.conf import settings
44
from django.core.cache import cache
@@ -7,8 +7,7 @@
77
from rest_framework import serializers
88

99
from joanie.core import models, utils
10-
11-
from .enums import ORDER_STATE_PENDING, ORDER_STATE_VALIDATED
10+
from joanie.core.enums import ORDER_STATE_PENDING, ORDER_STATE_VALIDATED
1211

1312

1413
class CertificationDefinitionSerializer(serializers.ModelSerializer):
@@ -545,3 +544,10 @@ class Meta:
545544
model = models.Certificate
546545
fields = ["id"]
547546
read_only_fields = ["id"]
547+
548+
549+
class PaymentSerializer(serializers.Serializer):
550+
payment_id = serializers.CharField(required=True)
551+
provider = serializers.CharField(required=True)
552+
url = serializers.CharField(required=True)
553+
is_paid = serializers.BooleanField(required=False)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"""Serializers for core.api.OrderViewSet.abort Body"""
2+
3+
from rest_framework import serializers
4+
5+
from .model_serializers import OrderSerializer, AddressSerializer
6+
7+
8+
class OrderAbortBodySerializer(serializers.Serializer):
9+
payment_id = serializers.CharField(required=True)
10+
11+
class Meta:
12+
fields = ["payment_id"]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""Serializers for core.api.OrderViewSet.create Response"""
2+
3+
from rest_framework import serializers
4+
5+
from .model_serializers import OrderSerializer, PaymentSerializer
6+
7+
8+
class OrderAbortResponseSerializer(OrderSerializer):
9+
id = serializers.CharField(required=True)
10+
payment_info = PaymentSerializer(required=False)
11+
12+
class Meta(OrderSerializer.Meta):
13+
fields = OrderSerializer.Meta.fields + ["payment_info"]
14+
read_only_fields = OrderSerializer.Meta.fields + ["payment_info"]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"""Serializers for core.api.OrderViewSet.create Body"""
2+
3+
from .model_serializers import OrderSerializer, AddressSerializer
4+
5+
6+
class OrderCreateBodySerializer(OrderSerializer):
7+
billing_address = AddressSerializer(required=False)
8+
9+
class Meta(OrderSerializer.Meta):
10+
fields = OrderSerializer.Meta.fields + ["billing_address"]
11+
read_only_fields = OrderSerializer.Meta.fields + ["billing_address"]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""Serializers for core.api.OrderViewSet.create Response"""
2+
3+
from rest_framework import serializers
4+
5+
from .model_serializers import OrderSerializer, PaymentSerializer
6+
7+
8+
class OrderCreateResponseSerializer(OrderSerializer):
9+
id = serializers.CharField(required=True)
10+
payment_info = PaymentSerializer(required=False)
11+
12+
class Meta(OrderSerializer.Meta):
13+
fields = OrderSerializer.Meta.fields + ["payment_info"]
14+
read_only_fields = OrderSerializer.Meta.fields + ["payment_info"]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"""Serializers for core.api.OrderViewSet.abort Body"""
2+
3+
from rest_framework import serializers
4+
5+
6+
class OrderInvoiceQuerySerializer(serializers.Serializer):
7+
reference = serializers.CharField(required=True)
8+
9+
class Meta:
10+
fields = ["reference"]

0 commit comments

Comments
 (0)