@@ -170,10 +170,14 @@ class OrderViewSet(
170170 lookup_field = "pk"
171171 pagination_class = Pagination
172172 permission_classes = [permissions .IsAuthenticated ]
173- serializer_class = serializers .OrderSerializer
174173 filterset_class = filters .OrderViewSetFilter
175174 ordering = ["-created_on" ]
176175
176+ def get_serializer_class (self ):
177+ if self .action == 'create' :
178+ return serializers .OrderCreateBodySerializer
179+ return serializers .OrderSerializer
180+
177181 def get_queryset (self ):
178182 """Custom queryset to limit to orders owned by the logged-in user."""
179183 user = User .update_or_create_from_request_user (request_user = self .request .user )
@@ -182,7 +186,7 @@ def get_queryset(self):
182186 def perform_create (self , serializer ):
183187 """Force the order's "owner" field to the logged-in user."""
184188 owner = User .update_or_create_from_request_user (request_user = self .request .user )
185- serializer .save (owner = owner )
189+ return serializer .save (owner = owner )
186190
187191 @swagger_auto_schema (
188192 request_body = serializers .OrderCreateBodySerializer ,
@@ -192,37 +196,19 @@ def perform_create(self, serializer):
192196 def create (self , request , * args , ** kwargs ):
193197 """Try to create an order and a related payment if the payment is fee."""
194198 serializer = self .get_serializer (data = request .data )
199+
200+ # - Validate data
195201 if not serializer .is_valid ():
196202 return Response (serializer .errors , status = 400 )
197203
198204 product = serializer .validated_data .get ("product" )
199205 course = serializer .validated_data .get ("course" )
200206 billing_address = serializer .validated_data .get ("billing_address" )
207+ credit_card_id = serializer .validated_data .get ("credit_card_id" )
201208
202- # Populate organization field if it is not set and there is only one
203- # on the product
204- if not serializer .validated_data .get ("organization" ):
205- try :
206- organization = product .course_relations .get (
207- course = course
208- ).organizations .get ()
209- except (
210- models .Course .DoesNotExist ,
211- models .Organization .DoesNotExist ,
212- models .Organization .MultipleObjectsReturned ,
213- ):
214- pass
215- else :
216- serializer .validated_data ["organization" ] = organization
217-
218- # If product is not free, we have to create a payment.
219- # To create one, a billing address is mandatory
220- if product .price .amount > 0 and not billing_address :
221- return Response ({"billing_address" : "This field is required." }, status = 400 )
222-
223- # - Validate data then create an order
209+ # then create an order
224210 try :
225- self .perform_create (serializer )
211+ order = self .perform_create (serializer )
226212 except (DRFValidationError , IntegrityError ):
227213 return Response (
228214 (
@@ -234,9 +220,7 @@ def create(self, request, *args, **kwargs):
234220
235221 # Once order has been created, if product is not free, create a payment
236222 if product .price .amount > 0 :
237- order = serializer .instance
238223 payment_backend = get_payment_backend ()
239- credit_card_id = serializer .initial_data .get ("credit_card_id" )
240224
241225 # if payment in one click
242226 if credit_card_id :
@@ -251,25 +235,20 @@ def create(self, request, *args, **kwargs):
251235 credit_card_token = credit_card .token ,
252236 )
253237 except (CreditCard .DoesNotExist , NotImplementedError ):
238+ # TODO question: if paiement fail because we didn't find the card, we didn't cancel the order ?
254239 pass
255240 else :
256241 payment_info = payment_backend .create_payment (
257242 request = request , order = order , billing_address = billing_address
258243 )
259244
260245 # Return the fresh new order with payment_info
246+ order .payment_info = payment_info
261247 return Response (
262- # FIXME: this work but we'll need to make several change in test and clients
263- serializers .OrderCreateResponseSerializer (
264- {
265- "order" : serializer .data ,
266- "payment_info" : payment_info ,
267- }
268- ).data ,
269- status = 201 ,
248+ serializers .OrderCreateResponseSerializer (order ).data , status = 201
270249 )
271250 # Else return the fresh new order
272- return Response (serializer .data , status = 201 )
251+ return Response (serializers . OrderCreateResponseSerializer ( order ) .data , status = 201 )
273252
274253 @swagger_auto_schema (
275254 request_body = serializers .OrderAbortBodySerializer ,
0 commit comments