22 Order Serializers
33"""
44
5+ import hashlib
6+ from random import randint
7+
8+ # Utils
9+ from time import sleep
10+
511# Rest Framework
6- from rest_framework .serializers import ModelSerializer
12+ from rest_framework import serializers
13+
14+ # Cart
15+ from wine_store .cart .api .serializers import CartModelSerializer
16+ from wine_store .cart .models import CartItem
717
818# Order
9- from wine_store .orders .models import OrderDetail
19+ from wine_store .orders .models import OrderDetail , OrderItem , OrderPayment
20+ from wine_store .users .api .serializers import UserAddressModelSerializer
1021
22+ # User
23+ from wine_store .users .models import UserAddress , UserPayment
1124
12- class OrderSerializer (ModelSerializer ):
25+
26+ class OrderModelSerializer (serializers .ModelSerializer ):
1327 """Order serializer."""
1428
1529 class Meta :
@@ -18,3 +32,119 @@ class Meta:
1832 model = OrderDetail
1933 fields = "__all__"
2034 read_only_fields = ["user" , "total" , "order_status" , "created_at" , "updated_at" ]
35+
36+
37+ class OrderItemModelSerializer (serializers .ModelSerializer ):
38+ """Order item serializer."""
39+
40+ class Meta :
41+ """Meta options."""
42+
43+ model = OrderItem
44+ fields = "__all__"
45+ read_only_fields = ["order_detail" , "product" , "quantity" , "price" ]
46+
47+
48+ class OrderPaymentModelSerializer (serializers .ModelSerializer ):
49+ """Order payment serializer."""
50+
51+ class Meta :
52+ """Meta options."""
53+
54+ model = OrderPayment
55+ fields = "__all__"
56+ read_only_fields = ["order_detail" , "total" , "payment_method" ]
57+
58+
59+ class OrderReadModelSerializer (serializers .ModelSerializer ):
60+ """Order Detail read serializer."""
61+
62+ user = serializers .StringRelatedField ()
63+ shipping_address = UserAddressModelSerializer (many = False , read_only = True )
64+ payment = OrderPaymentModelSerializer (many = False , read_only = True )
65+ items = OrderItemModelSerializer (many = True , read_only = True )
66+
67+ class Meta :
68+ """Meta options."""
69+
70+ model = OrderDetail
71+ fields = "__all__"
72+ read_only_fields = ["user" , "total" , "order_status" , "created_at" , "updated_at" ]
73+
74+
75+ class OrderSerializer (serializers .Serializer ):
76+ """Order serializer."""
77+
78+ shipping_address = serializers .IntegerField ()
79+ payment_method = serializers .IntegerField ()
80+ cart = CartModelSerializer (many = False , write_only = True )
81+
82+ def validate_shipping_address (self , value ):
83+ try :
84+ user_address = UserAddress .objects .get (id = value )
85+ return user_address
86+ except UserAddress .DoesNotExist :
87+ raise serializers .ValidationError ("The user address does not exist" )
88+
89+ def validate_payment_method (self , value ):
90+ try :
91+ user_payment = UserPayment .objects .get (id = value )
92+ return user_payment
93+ except UserPayment .DoesNotExist :
94+ raise serializers .ValidationError ("The user payment does not exist" )
95+
96+ def validate (self , data ):
97+ items = CartItem .objects .filter (cart = data ["cart" ])
98+ if len (items ) == 0 :
99+ raise serializers .ValidationError ("The cart is empty" )
100+ self .context ["items" ] = items
101+ data ["total" ] = 0
102+ data ["order_status" ] = "PENDING"
103+ return data
104+
105+ def create (self , validated_data ):
106+ """Create order."""
107+ user_payment = validated_data .pop ("user_payment" )
108+ # Create order detail
109+ order = OrderDetail .objects .create (** validated_data )
110+ # Create order items
111+ items = self .context ["items" ]
112+ for item in items :
113+ OrderItem .objects .create (
114+ order_detail = order ,
115+ product = item .product ,
116+ quantity = item .quantity ,
117+ price = item .price ,
118+ )
119+ # making payment
120+ order .total = order .calculate_total ()
121+ order .save ()
122+ payment_status , payment_register = self .make_request_payment (user_payment , order .total )
123+ OrderPayment .objects .create (
124+ order_detail = order ,
125+ total = order .total ,
126+ payment_method = user_payment ,
127+ payment_register = payment_register ,
128+ payment_status = payment_status ,
129+ )
130+
131+ return order
132+
133+ def update (self , instance , validated_data ):
134+ """Update order."""
135+ pass
136+
137+ def make_request_payment (self , user_payment , total ):
138+ """Make request payment.
139+ This is a function simulate the interaction with a payment gateway.
140+ """
141+ sleep (5 )
142+ success_flag = True if randint (0 , 10 ) < 8 else False
143+ if success_flag :
144+ sha_payment = hashlib .sha256 (
145+ f"{ user_payment .id } +{ user_payment .provider } +{ user_payment .payment_method } +{ total } " .encode ()
146+ )
147+ payment_register = sha_payment .hexdigest ()
148+ return ("SUCCESS" , payment_register )
149+ else :
150+ return ("FAILED" , None )
0 commit comments