def update_order(order: Order, send_order_summary=False) -> Order: if order.current_status is DRAFT: # update order_items based on order.draft_cart order_item_ids_processed = [] for cart_index_string, cart_item in order.draft_cart.items(): if not cart_index_string.startswith("i"): continue if 'item_id' not in cart_item: raise OrderException("missing item_id in cart item") if 'quantity' not in cart_item: raise OrderException("missing quantity in cart item") order_item = OrderItem.objects.none() if 'order_item_id' in cart_item: if cart_item['order_item_id'] in order_item_ids_processed: raise OrderException("duplicate order_item_id found") if cart_item['order_item_id']: order_item = OrderItem.objects.filter( id=cart_item['order_item_id']).first() if all([ not order_item, cart_item.get('item_id'), cart_item.get('quantity'), ]): order_item = OrderItem.objects.create( order=order, item_id=cart_item['item_id']) order_item.quantity = Decimal(cart_item['quantity']) if len(cart_item.get('note', "")): note = order_item.notes.first() if note: note.text = cart_item['note'] note.save() else: order_item.add_note(cart_item['note']) order_item.save() order_item_ids_processed.append(order_item.id) order.order_items.exclude(id__in=order_item_ids_processed).delete() order.save() if send_order_summary and order.is_ready_for_checkout: # send order summary to customer order.line_channel_membership.send_order_status(order) if order.current_status is PLACED and order.next_status is SHOP_CONFIRMED: pursue_shop_confirmation(order) return order
def create(self, validated_data): order_list = validated_data.pop("orders") order_line = OrderLine.objects.create(**validated_data) while len(order_list) > 0: order_data = order_list.pop() order = Order(order_line=order_line, **order_data) item = Item.objects.get(pk=order.object_id) order.content_object = item order.price = item.price order.save() order_line.pay() return order_line