99from commercetools .platform .models ._schemas .order import (
1010 DeliverySchema ,
1111 OrderFromCartDraftSchema ,
12+ OrderImportDraftSchema ,
1213 OrderPagedQueryResponseSchema ,
1314 OrderSchema ,
1415 OrderUpdateSchema ,
1516)
1617from commercetools .platform .models ._schemas .payment import PaymentReferenceSchema
18+ from commercetools .platform .models .common import CentPrecisionMoney
1719from commercetools .testing .abstract import BaseModel , ServiceBackend
1820from commercetools .testing .utils import (
21+ create_commercetools_response ,
22+ create_from_draft ,
23+ money_to_typed ,
1924 set_custom_field ,
2025 set_line_item_custom_field ,
2126 update_attribute ,
@@ -28,30 +33,65 @@ class OrdersModel(BaseModel):
2833 _resource_schema = OrderSchema
2934
3035 def _create_from_draft (
31- self , draft : models .OrderFromCartDraft , id : typing .Optional [str ] = None
36+ self ,
37+ draft : typing .Union [models .OrderFromCartDraft , models .OrderImportDraft ],
38+ id : typing .Optional [str ] = None ,
3239 ) -> models .Order :
3340 """
3441 Note this implementation needs further refinement. For example:
3542 - Copying fields from an existing cart
3643 - Setting custom type fields?
3744 """
45+ id = str (id if id is not None else uuid .uuid4 ())
3846
39- object_id = str (uuid .UUID (id ) if id is not None else uuid .uuid4 ())
47+ if isinstance (draft , models .OrderFromCartDraft ):
48+ return self ._create_from_cart_draft (draft , id )
49+ elif isinstance (draft , models .OrderImportDraft ):
50+ return self ._create_from_import_draft (draft , id )
51+
52+ def _create_from_cart_draft (self , draft : models .OrderFromCartDraft , id : str ):
53+ """
54+ Note this implementation needs further refinement. For example:
55+ - Copying fields from an existing cart
56+ - Setting custom type fields?
57+ """
4058 cart_identifier = models .CartResourceIdentifier (id = draft .id )
4159
4260 cart_data = self ._storage .get_by_resource_identifier (cart_identifier )
4361 cart = None
62+ total_price = None
4463 if cart_data :
4564 cart : models .Cart = CartSchema ().load (cart_data )
65+ total_price = copy .deepcopy (cart .total_price )
66+
67+ order = models .Order (
68+ id = id ,
69+ version = 1 ,
70+ created_at = datetime .datetime .now (datetime .timezone .utc ),
71+ last_modified_at = datetime .datetime .now (datetime .timezone .utc ),
72+ line_items = [],
73+ custom_line_items = [],
74+ total_price = total_price ,
75+ sync_info = [],
76+ last_message_sequence_number = 0 ,
77+ refused_gifts = [],
78+ order_number = draft .order_number ,
79+ payment_state = draft .payment_state ,
80+ order_state = OrderState .OPEN ,
81+ origin = CartOrigin .CUSTOMER ,
82+ )
83+ return order
4684
85+ def _create_from_import_draft (self , draft : models .OrderImportDraft , id : str ):
4786 order = models .Order (
48- id = str ( object_id ) ,
87+ id = id ,
4988 version = 1 ,
5089 created_at = datetime .datetime .now (datetime .timezone .utc ),
5190 last_modified_at = datetime .datetime .now (datetime .timezone .utc ),
5291 line_items = [],
5392 custom_line_items = [],
54- total_price = copy .deepcopy (cart .total_price ),
93+ total_price = money_to_typed (draft .total_price ),
94+ taxed_price = create_from_draft (draft .taxed_price ),
5595 sync_info = [],
5696 last_message_sequence_number = 0 ,
5797 refused_gifts = [],
@@ -138,6 +178,7 @@ def urls(self):
138178 return [
139179 ("^$" , "GET" , self .query ),
140180 ("^$" , "POST" , self .create ),
181+ ("^import$" , "POST" , self .import_ ),
141182 ("^key=(?P<key>[^/]+)$" , "GET" , self .get_by_key ),
142183 ("^key=(?P<key>[^/]+)$" , "POST" , self .update_by_key ),
143184 ("^key=(?P<key>[^/]+)$" , "DELETE" , self .delete_by_key ),
@@ -146,6 +187,14 @@ def urls(self):
146187 ("^(?P<id>[^/]+)$" , "DELETE" , self .delete_by_id ),
147188 ]
148189
190+ def import_ (self , request ):
191+ obj = OrderImportDraftSchema ().loads (request .body )
192+ data = self .model .add (obj )
193+ expanded_data = self ._expand (request , data )
194+ return create_commercetools_response (
195+ request , json = expanded_data , status_code = 201
196+ )
197+
149198 _actions = {
150199 "changeOrderState" : update_enum_attribute ("orderState" , "order_state" ),
151200 "changePaymentState" : update_enum_attribute ("paymentState" , "payment_state" ),
0 commit comments