def create_from_cart(self, cart, request): """ This creates a new Order object (and all the rest) from a passed Cart object. Specifically, it creates an Order with corresponding OrderItems and eventually corresponding ExtraPriceFields This will only actually commit the transaction once the function exits to minimize useless database access. The `state` parameter is further passed to process_cart_item, process_cart, and post_process_cart, so it can be used as a way to store per-request arbitrary information. Emits the ``processing`` signal. """ # must be imported here! from shop.models.ordermodel import ( ExtraOrderItemPriceField, ExtraOrderPriceField, OrderItem, ) from shop.models.cartmodel import CartItem # First, let's remove old orders self.remove_old_orders(cart) # Create an empty order object order = self.create_order_object(cart, request) order.save() # Let's serialize all the extra price arguments in DB for field in cart.extra_price_fields: eoi = ExtraOrderPriceField() eoi.order = order eoi.label = unicode(field[0]) eoi.value = field[1] if len(field) == 3: eoi.data = field[2] eoi.save() # There, now move on to the order items. cart_items = CartItem.objects.filter(cart=cart) for item in cart_items: item.update(request) order_item = OrderItem() order_item.order = order order_item.product_reference = item.product.get_product_reference() order_item.product_name = item.product.get_name() order_item.product = item.product order_item.unit_price = item.product.get_price() order_item.quantity = item.quantity order_item.line_total = item.line_total order_item.line_subtotal = item.line_subtotal order_item.save() # For each order item, we save the extra_price_fields to DB for field in item.extra_price_fields: eoi = ExtraOrderItemPriceField() eoi.order_item = order_item # Force unicode, in case it has àö... eoi.label = unicode(field[0]) eoi.value = field[1] if len(field) == 3: eoi.data = field[2] eoi.save() processing.send(self.model, order=order, cart=cart) return order