def create_from_cart(self, cart): """ 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. Emits the ``processing`` signal. """ # must be imported here! from shop.models.ordermodel import ExtraOrderItemPriceField, ExtraOrderPriceField, OrderItem from shop.models.cartmodel import CartItem # Let's create the Order itself: order = self.model() order.user = cart.user order.status = self.model.PROCESSING # Processing order.order_subtotal = cart.subtotal_price order.order_total = cart.total_price order.save() # Let's serialize all the extra price arguments in DB for label, value in cart.extra_price_fields: eoi = ExtraOrderPriceField() eoi.order = order eoi.label = str(label) eoi.value = value eoi.save() # There, now move on to the order items. cart_items = CartItem.objects.filter(cart=cart) for item in cart_items: item.update(cart) order_item = OrderItem() order_item.order = order order_item.product_reference = item.product.id 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 label, value in item.extra_price_fields: eoi = ExtraOrderItemPriceField() eoi.order_item = order_item # Force unicode, in case it has àö... eoi.label = unicode(label) eoi.value = value eoi.save() processing.send(self.model, order=order, cart=cart) return order
def create_order_object_from_cart(self): """ This will create an Order object form the current cart, and will pass a reference to the Order on either the User object or the session. """ cart = get_or_create_cart(self.request) cart.update() order = Order.objects.create_from_cart(cart) processing.send(sender=self, order=order) request = self.request add_order_to_request(request, order)
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
def create_from_cart(self, cart): """ 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. Emits the ``processing`` signal. """ # must be imported here! from shop.models.ordermodel import ( ExtraOrderItemPriceField, ExtraOrderPriceField, OrderItem, ) from shop.models.cartmodel import CartItem # Let's create the Order itself: order = self.model() order.user = cart.user order.status = self.model.PROCESSING # Processing order.order_subtotal = cart.subtotal_price order.order_total = cart.total_price order.save() # Let's serialize all the extra price arguments in DB for label, value in cart.extra_price_fields: eoi = ExtraOrderPriceField() eoi.order = order eoi.label = unicode(label) eoi.value = value eoi.save() # There, now move on to the order items. cart_items = CartItem.objects.filter(cart=cart) for item in cart_items: item.update(cart) 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 label, value in item.extra_price_fields: eoi = ExtraOrderItemPriceField() eoi.order_item = order_item # Force unicode, in case it has àö... eoi.label = unicode(label) eoi.value = value eoi.save() processing.send(self.model, order=order, cart=cart) return order