Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
def order_pre_creation_signal(sender, instance, raw, **kwargs):
    if not instance.pk:
        instance.number = Order.generate_number()
Ejemplo n.º 11
0
 def setUpClass(cls):
     """Set up testing Order instance."""
     super(TestMailer, cls).setUpClass()
     cls.order = Order(name='John Doe',
                       email='*****@*****.**',
                       phone='222222222222')
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
 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)
Ejemplo n.º 15
0
 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)