Ejemplo n.º 1
0
    def post(self, request, *args, **kwargs):
        offer = Offer.objects.get(site=get_site_from_request(request),
                                  slug=self.kwargs["slug"])
        if request.user.is_anonymous:
            request.session['session_cart'] = self.session_cart(request, offer)
        else:
            profile, created = self.request.user.customer_profile.get_or_create(
                site=get_site_from_request(request))

            cart = profile.get_cart_or_checkout_cart()

            if cart.status == Invoice.InvoiceStatus.CHECKOUT:
                cart.status = Invoice.InvoiceStatus.CART
                cart.save()

            if profile.has_product(
                    offer.products.all()) and not offer.allow_multiple:
                messages.info(self.request,
                              _("You Have Already Purchased This Item"))
            elif cart.order_items.filter(
                    offer__products__in=offer.products.all()).count(
                    ) and not offer.allow_multiple:
                messages.info(
                    self.request,
                    _("You already have this product in you cart. You can only buy one"
                      ))
            else:
                messages.info(self.request, _("Added item to cart."))
                cart.add_offer(offer)

        return redirect('vendor:cart')  # Redirect to cart on success
Ejemplo n.º 2
0
    def get(self, request, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        clear_session_purchase_data(request)

        invoice = get_purchase_invoice(request.user,
                                       get_site_from_request(request))
        if not invoice.order_items.count():
            return redirect('vendor:cart')

        invoice.status = Invoice.InvoiceStatus.CHECKOUT
        invoice.save()

        existing_account_address = Address.objects.filter(
            profile__user=request.user,
            profile__site=get_site_from_request(request))

        if existing_account_address:
            # TODO: In future the user will be able to select from multiple saved address
            form = AccountInformationForm(
                initial={'email': request.user.email},
                instance=existing_account_address[0])
        else:
            form = AccountInformationForm(
                initial={
                    'first_name': request.user.first_name,
                    'last_name': request.user.last_name,
                    'email': request.user.email
                })

        context['form'] = form
        context['invoice'] = invoice
        return render(request, self.template_name, context)
Ejemplo n.º 3
0
    def post(self, request, *args, **kwargs):
        offer = Offer.objects.get(site=get_site_from_request(request),
                                  slug=self.kwargs["slug"])
        if request.user.is_anonymous:
            offer_key = str(offer.pk)
            session_cart = get_or_create_session_cart(request.session)

            if offer_key in session_cart:
                session_cart[offer_key]['quantity'] -= 1

            if session_cart[offer_key]['quantity'] <= 0:
                del (session_cart[offer_key])

            request.session['session_cart'] = session_cart
        else:
            profile = self.request.user.customer_profile.get(
                site=get_site_from_request(
                    request))  # Make sure they have a cart

            cart = profile.get_cart_or_checkout_cart()

            if cart.status == Invoice.InvoiceStatus.CHECKOUT:
                cart.status = Invoice.InvoiceStatus.CART
                cart.save()

            cart.remove_offer(offer)

        messages.info(self.request, _("Removed item from cart."))

        return redirect('vendor:cart')  # Redirect to cart on success
Ejemplo n.º 4
0
    def get(self, request, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        if request.user.is_anonymous:
            session_cart = get_or_create_session_cart(request.session)

            context['invoice'] = {}
            if len(session_cart):
                context['order_items'] = [
                    OrderItem(offer=Offer.objects.get(pk=offer),
                              quantity=session_cart[offer]['quantity'])
                    for offer in session_cart.keys()
                ]
            else:
                context['order_items'] = []
            context['invoice']['subtotal'] = sum(
                [item.total for item in context['order_items']])
            context['invoice']['shipping'] = 0
            context['invoice']['tax'] = 0
            context['invoice']['total'] = context['invoice']['subtotal']

            return render(request, self.template_name, context)

        profile, created = self.request.user.customer_profile.get_or_create(
            site=get_site_from_request(request))
        cart = profile.get_cart_or_checkout_cart()
        context['invoice'] = cart
        context['order_items'] = [
            order_item for order_item in cart.order_items.all()
        ]
        return render(request, self.template_name, context)
Ejemplo n.º 5
0
 def get_product_queryset(self):
     """
     Method to get the Product(s) needed for the check.  Can be overridden to handle complex queries.
     """
     return self.model.objects.filter(
         site=get_site_from_request(self.request),
         slug=self.kwargs['slug']).get().products.all()
Ejemplo n.º 6
0
    def post(self, request, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        invoice = get_purchase_invoice(request.user,
                                       get_site_from_request(request))

        if not invoice.order_items.count(
        ) or invoice.status == Invoice.InvoiceStatus.CART:
            messages.info(request, _("Cart changed while in checkout process"))
            return redirect('vendor:cart')

        processor = payment_processor(invoice)

        processor.set_billing_address_form_data(
            request.session.get('billing_address_form'), BillingAddressForm)
        processor.set_payment_info_form_data(
            request.session.get('credit_card_form'), CreditCardForm)

        processor.authorize_payment()

        if processor.transaction_submitted:
            return redirect('vendor:purchase-summary', uuid=invoice.uuid)
        else:
            # TODO: Make message configurable for the site in the settings
            messages.info(self.request,
                          _("The payment gateway did not authorize payment."))
            return redirect('vendor:checkout-account')
Ejemplo n.º 7
0
    def post(self, request, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        invoice = get_purchase_invoice(request.user,
                                       get_site_from_request(request))

        if not invoice.order_items.count(
        ) or invoice.status == Invoice.InvoiceStatus.CART:
            messages.info(request, _("Cart changed while in checkout process"))
            return redirect('vendor:cart')

        credit_card_form = CreditCardForm(request.POST)
        if request.POST.get('same_as_shipping') == 'on':
            billing_address_form = BillingAddressForm(
                instance=invoice.shipping_address)
            billing_address_form.data = billing_address_form.initial
            billing_address_form.is_bound = True
        else:
            billing_address_form = BillingAddressForm(request.POST)

        if not (billing_address_form.is_valid()
                and credit_card_form.is_valid()):
            processor = payment_processor(invoice)
            context['billing_address_form'] = billing_address_form
            context['credit_card_form'] = credit_card_form
            return render(request, self.template_name,
                          processor.get_checkout_context(context=context))
        else:
            billing_address_form.full_clean()
            credit_card_form.full_clean()
            request.session[
                'billing_address_form'] = billing_address_form.cleaned_data
            request.session['credit_card_form'] = credit_card_form.cleaned_data
            return redirect('vendor:checkout-review')
Ejemplo n.º 8
0
    def post(self, request, *args, **kwargs):
        form = AccountInformationForm(request.POST)

        if not form.is_valid():
            return render(request, self.template_name, {'form': form})

        shipping_address = form.save(commit=False)

        invoice = get_purchase_invoice(request.user,
                                       get_site_from_request(request))

        if not invoice.order_items.count(
        ) or invoice.status == Invoice.InvoiceStatus.CART:
            messages.info(request, _("Cart changed while in checkout process"))
            return redirect('vendor:cart')

        invoice.status = Invoice.InvoiceStatus.CHECKOUT
        invoice.customer_notes = {
            'remittance_email': form.cleaned_data['email']
        }
        # TODO: Need to add a drop down to select existing address
        shipping_address, created = invoice.profile.get_or_create_address(
            shipping_address)
        if created:
            shipping_address.profile = invoice.profile
            shipping_address.save()
        invoice.shipping_address = shipping_address
        invoice.save()

        return redirect('vendor:checkout-payment')
Ejemplo n.º 9
0
 def __init__(self, *args, **kwargs):
     request = kwargs.pop('request')
     super(OfferForm, self).__init__(*args, **kwargs)
     self.fields['start_date'].widget.attrs['class'] = 'datepicker'
     self.fields['end_date'].widget.attrs['class'] = 'datepicker'
     self.fields['term_start_date'].widget.attrs['class'] = 'datepicker'
     self.fields['available'].label = _('Available to Purchase')
     self.fields['products'].queryset = Product.objects.filter(site=get_site_from_request(request), available=True)
Ejemplo n.º 10
0
 def get_queryset(self):
     try:
         # The profile and user are site specific so this should only return what's on the site for that user excluding the cart
         return self.request.user.customer_profile.get(
             site=get_site_from_request(self.request)).invoices.filter(
                 status__gt=Invoice.InvoiceStatus.CART)
     except ObjectDoesNotExist:  # Catch the actual error for the exception
         return []  # Return empty list if there is no customer_profile
Ejemplo n.º 11
0
    def get(self, request, *args, **kwargs):
        context = super().get_context_data(**kwargs)

        customer_profile, created = request.user.customer_profile.get_or_create(
            site=get_site_from_request(request))
        subscriptions = customer_profile.get_recurring_receipts()

        context['payments'] = customer_profile.payments.filter(success=True)
        context["offers"] = Offer.objects.filter(
            site=get_site_from_request(request),
            available=True).order_by('terms')

        if subscriptions:
            context['subscription'] = subscriptions.first()
            context['payment'] = subscriptions.first(
            ).order_item.invoice.payments.filter(success=True).first()
            context['payment_form'] = CreditCardForm(
                initial={'payment_type': PaymentTypes.CREDIT_CARD})

        return render(request, self.template_name, context)
Ejemplo n.º 12
0
def convert_session_cart_to_invoice(sender, request, **kwargs):
    if 'session_cart' in request.session:
        profile, created = request.user.customer_profile.get_or_create(
            site=get_site_from_request(request))
        cart = profile.get_cart()

        for offer_key in request.session['session_cart'].keys():
            cart.add_offer(Offer.objects.get(pk=offer_key),
                           quantity=request.session['session_cart'][offer_key]
                           ['quantity'])

        del (request.session['session_cart'])
Ejemplo n.º 13
0
    def get(self, request, *args, **kwargs):
        invoice = get_purchase_invoice(request.user,
                                       get_site_from_request(request))
        if not invoice.order_items.count():
            return redirect('vendor:cart')

        context = super().get_context_data()

        processor = payment_processor(invoice)

        context = processor.get_checkout_context(context=context)

        return render(request, self.template_name, context)
Ejemplo n.º 14
0
 def get_queryset(self):
     try:
         receipts = self.request.user.customer_profile.get(
             site=get_site_from_request(self.request)).receipts.filter(
                 status__gte=PurchaseStatus.COMPLETE)
     except ObjectDoesNotExist:
         raise Http404(_("Not Found"))
     subscriptions = [
         receipt for receipt in receipts.all()
         if receipt.order_item.offer.terms > TermType.PERPETUAL
         and receipt.order_item.offer.terms < TermType.ONE_TIME_USE
     ]
     return subscriptions
Ejemplo n.º 15
0
    def user_has_product(self):
        """
        Check to see if a user has a viable product license based on the get_product_queryset() method.

        TODO: move this to some kind of caching or session variable to avoid hitting the DB on every request.
        """
        if self.request.user.is_anonymous:
            self.product_owned = False
        else:
            products = self.get_product_queryset()
            self.product_owned = self.request.user.customer_profile.filter(
                site=get_site_from_request(self.request)).get().has_product(
                    products)

        return self.product_owned
Ejemplo n.º 16
0
    def post(self, request, *args, **kwargs):
        site = get_site_from_request(request)
        receipt = get_object_or_404(Receipt,
                                    profile__site=site,
                                    uuid=self.request.POST.get('receipt_uuid'))
        offer = get_object_or_404(Offer,
                                  site=site,
                                  uuid=self.request.POST.get('offer_uuid'))

        processor = get_site_payment_processor(site)(
            receipt.order_item.invoice)
        processor.subscription_update_price(receipt, offer.current_price(),
                                            request.user)

        return redirect(request.META.get('HTTP_REFERER', self.success_url))
Ejemplo n.º 17
0
 def get_product_queryset(self):
     """
     Method to get the Product(s) needed for the check.  Can be overridden to handle complex queries.
     """
     if self.product_queryset is None:
         if self.product_model:
             # Only provide list of products on the current site.
             return self.product_model.objects.filter(
                 site=get_site_from_request(self.request))
         else:
             raise ImproperlyConfigured(
                 "%(cls)s is missing a Product QuerySet. Define "
                 "%(cls)s.product_model, %(cls)s.product_queryset, or override "
                 "%(cls)s.get_product_queryset()." %
                 {'cls': self.__class__.__name__})
     return self.product_queryset.all()
Ejemplo n.º 18
0
    def get(self, request, *args, **kwargs):
        invoice = get_purchase_invoice(request.user,
                                       get_site_from_request(request))
        if not invoice.order_items.count():
            return redirect('vendor:cart')

        context = super().get_context_data()

        processor = payment_processor(invoice)
        if 'billing_address_form' in request.session:
            context['billing_address_form'] = BillingAddressForm(
                request.session['billing_address_form'])
        if 'credit_card_form' in request.session:
            context['credit_card_form'] = CreditCardForm(
                request.session['credit_card_form'])

        context = processor.get_checkout_context(context=context)

        return render(request, self.template_name, context)
Ejemplo n.º 19
0
 def get_queryset(self):
     # TODO: Update to handle ranges from a POST
     if hasattr(self.request, 'site'):
         return self.model.objects.filter(
             site=get_site_from_request(self.request))
     return self.model.on_site.all()
Ejemplo n.º 20
0
 def get_queryset(self):
     if hasattr(self.request, 'site'):
         return self.model.objects.filter(
             site=get_site_from_request(self.request))
     return self.model.on_site.all()
Ejemplo n.º 21
0
 def get_queryset(self):
     return self.request.user.customer_profile.get(
         site=get_site_from_request(self.request)).receipts.filter(
             status__gte=PurchaseStatus.COMPLETE)
Ejemplo n.º 22
0
    def get(self, request, *args, **kwargs):
        context = super().get_context_data(**kwargs)

        context['object'] = self.model.objects.get(
            site=get_site_from_request(request), slug=kwargs['slug'])
        return render(request, self.template_name, context)