def form_valid(self, form): try: context = self.get_context_data() cart_items = self.request.session.get('cart') email_context = { 'carts': cart_items, 'user': self.request.user, 'extra': context['cart_extra'], 'shipping': ShippingLocation.objects.get(id=self.request.POST['shipping']), 'payment': self.request.POST['payment'] } if self.request.POST['payment'] == 'bank': email_context['banks'] = Banks.objects.all() with transaction.atomic(): shipping = ShippingInfo( address=form.cleaned_data['home_address'], first_name=form.cleaned_data['first_name'], last_name=form.cleaned_data['last_name'], phone_number=form.cleaned_data['phone'], email_address=form.cleaned_data['email'], primary=True) shipping.save() order = Order(cart=cart_items, total=context['cart_extra']['total_amount'], shipping_id=self.request.POST['shipping'], user_shipping_id=shipping.id, payment_method=self.request.POST['payment'], status='pending') order.save() email_context['user_shipping'] = ShippingInfo.objects.get( id=shipping.id) email_context['order'] = order self.request.session.modified = True del self.request.session['cart'] self.request.session['cart'] = {} send_order_mail(email_context) order_notification_mail() messages.success( self.request, "Order placed successfully. Check your email to know more about your order" ) except KeyError as err: messages.error( self.request, "An error occurred while trying to process your order. %s is missing" % err) return super().form_invalid(form) return super().form_valid(form)
def test_total_cost_in_order(self): """total_price method should return sum of price * count for every product. """ self.cart.add(self.product1, 10) self.cart.add(self.product2, 3) order = Order(email=self.mail) order.save() order = order.set_positions(self.cart) self.assertEqual(order.total_price, self.product1.price * 10 + self.product2.price * 3)
def test_set_positions_in_order(self): """ We can set all the positions in cart in Order. It will automatically instantiate Position instance for every one. """ self.cart.add(self.product1) self.cart.add(self.product2) order = Order(email=self.mail) order.save() order = order.set_positions(self.cart) saved_order = Order.objects.get(pk=order.id) self.assertEqual(saved_order.positions.count(), 2)
def test_fake_number_order(self): """Order number should be increased by a FAKE_ORDER_NUMBER const""" order = Order() order.save() self.assertGreater(order.fake_order_number, settings.FAKE_ORDER_NUMBER)
def test_create_order(self): """We should be able to create Order with every required filed specified.""" order = Order(email=self.mail) order.save() self.assertEqual(Order.objects.get(pk=order.id), order)