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_cost_for_item(self): """cost should return price of an item multiplied by its count.""" order = Order(email=self.mail) item = Position(order=order, product_id=self.product1.id, name=self.product1.name, price=10, quantity=30) self.assertEqual(item.total_price, 10 * 30)
def update_exam_authorization_order(sender, instance, **kwargs): # pylint: disable=unused-argument """ Signal handler to trigger an exam profile and authorization for Order fulfillment. """ if not Order.is_fulfilled(instance.status): return paid_edx_course_keys = instance.line_set.values_list('course_key', flat=True) for course_run in CourseRun.objects.filter( edx_course_key__in=paid_edx_course_keys ).select_related('course__program'): authorize_user_for_schedulable_exam_runs(instance.user, course_run)
def update_exam_authorization_order(sender, instance, **kwargs): # pylint: disable=unused-argument """ Signal handler to trigger an exam profile and authorization for Order fulfillment. """ if not Order.is_fulfilled(instance.status): return paid_edx_course_keys = instance.line_set.values_list('course_key', flat=True) for course_run in CourseRun.objects.filter( edx_course_key__in=paid_edx_course_keys).select_related( 'course__program'): authorize_user_for_schedulable_exam_runs(instance.user, course_run)
def post(self, request, *args, **kwargs): # pylint: disable=unused-argument """ Confirmation from CyberSource which fulfills an existing Order. """ try: reference_number = request.data.get("req_reference_number", "") if reference_number.startswith(B2BOrder.get_reference_number_prefix()): fulfill_b2b_order(request.data) elif reference_number.startswith(Order.get_reference_number_prefix()): fulfill_order(request.data) else: raise ParseException( f"Unknown prefix '{reference_number}' for reference number" ) except: # Not sure what would cause an error here but make sure we save the receipt Receipt.objects.create(data=request.data) raise # The response does not matter to CyberSource return Response(status=status.HTTP_200_OK)
def order_pre_creation_signal(sender, instance, raw, **kwargs): if not instance.pk: instance.number = Order.generate_number()
def setUpClass(cls): """Set up testing Order instance.""" super(TestMailer, cls).setUpClass() cls.order = Order(name='John Doe', email='*****@*****.**', phone='222222222222')
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)