Пример #1
0
    def add_to_cart(self, chain, request, product_slug, product=None,
                    formset=None, purchases=None, context=None,
                    next='cart.cart', invalid='cart.cart', 
                    messages=None, **kwargs):
                    
        if messages is None:
            messages = FlashMessages()

        # Next and invalid params are allowed to be present into query
        next = request.POST.get(
            'next', request.GET.get('next', next))
        invalid = request.POST.get(
            'invalid', request.GET.get('invalid', invalid))

        if product is None:
            try:
                product = modules.product.Product.objects.polymorphic().get(
                    slug=product_slug)
            except modules.product.Product.DoesNotExist:
                raise Http404

        if context is None:
            context = {}

        if formset is None:
            formset = self.get_add_to_cart_formset(
                product=product, data=request.POST)
        
        redirection = redirect(next)
        
        # Purchase will in most cases not yet be assigned, 
        # it could be assigned however during the capture fase.
        if purchases is None:

            purchases = []

            # We require a valid formset
            if formset.is_valid():
                # get data from form
                for form in formset:
                    purchase_args = self.get_purchase_args(
                        product=product, form=form)
                    try:
                        purchase = modules.store.make_purchase(
                            request=request, **purchase_args)
                    except PurchaseInvalid as error:
                        messages.error(request, _("{0} could not be added to "
                                                  "your cart.")
                                                  .format(product))
                        messages.error(request, error)
                        redirection = redirect(invalid)
                        # We will redirect to invalid, but keep on adding
                        # valid purchases (in case multiple purchases are made)
                        continue
                    
                    purchases.append(purchase)
                    
            else:
                messages.error(request, _("Your cart could not be updated."))
                messages.error(request, get_error_message(formset))
                redirection = redirect(invalid)

        # Get the cart
        cart = self.get_cart(request=request, messages=messages)

        if purchases:
            # Add purchases to cart
            for purchase in purchases:
                try:
                    self.add_purchase(
                        request=request, purchase=purchase, cart=cart)
                    messages.success(request, _("{0} has been added to your "
                                              "cart.")
                                              .format(purchase.product))
                except PurchaseInvalid as error:
                    messages.error(request, _("{0} could not be added to "
                                              "your cart.")
                                              .format(purchase.product))
                    messages.error(request, error)
                    redirection = redirect(invalid)

            # Keep track of our cart
            cart.track(request)

        if chain:
            return chain.execute(
                request, product=product, purchases=purchases,
                formset=formset, context=context, redirection=redirection,
                next=next, invalid=invalid, messages=messages, **kwargs)

        messages.transmit()
        return redirection
Пример #2
0
    def edit_purchase(self, chain, request, purchase_id, purchase=None,
                      form=None, context=None, next='cart.cart', 
                      invalid='cart.cart', messages=None, **kwargs):

        if messages is None:
            messages = FlashMessages()

        # Next and invalid params are allowed to be present into query
        next = request.POST.get(
            'next', request.GET.get('next', next))
        invalid = request.POST.get(
            'invalid', request.GET.get('invalid', invalid))

        if purchase is None:
            try:
                purchase = modules.store.Purchase.objects.polymorphic().get(
                    pk=purchase_id)
            except modules.store.Purchase.DoesNotExist:
                raise Http404

        if form is None:
            form = self.get_edit_purchase_form(
                purchase=purchase, data=request.POST)

        # Get the cart
        cart = self.get_cart(request=request, messages=messages)
        
        redirection = redirect(next)
        
        if 'remove' in request.POST:
            self.remove_purchase(request=request, purchase=purchase, cart=cart)
        else:
            # We require a valid form
            if form.is_valid():
                purchase_args = self.get_edit_purchase_args(
                    purchase=purchase, form=form)
                try:
                    purchase = modules.store.make_purchase(
                        request=request, **purchase_args)
                    self.update_purchase(
                        request=request, purchase=purchase, cart=cart)
                    messages.success(request, _("Your cart has been "
                                                "updated."))
                except PurchaseInvalid as error:
                    messages.error(request, _("Your cart could not be "
                                              "updated."))
                    messages.error(request, error)
                    redirection = redirect(invalid)
            else:
                messages.error(request, _("Your cart could not be "
                                          "updated."))
                messages.error(request, get_error_message(form))
                redirection = redirect(invalid)
        
        if chain:
            return chain.execute(
                request, purchase=purchase, form=form, context=context, 
                redirection=redirection, messages=messages, **kwargs)
        
        messages.transmit()
        return redirection
Пример #3
0
def edit_purchase(request, purchase_id, **kwargs):

    try:
        purchase = Purchase.objects.polymorphic().get(pk=purchase_id)
    except Purchase.DoesNotExist:
        raise Http404

    cart = cart_from_request(request)
    messages = FlashMessages()
    form = EditPurchaseForm.factory(
        purchase,
        data=request.POST
    )(request.POST)

    if 'remove' in request.POST:
        cart.remove(purchase)
        messages.success(
            request, _(
                "{0} has been removed from your "
                "cart."
            ).format(purchase)
        )
    else:
        # We require a valid form
        if form.is_valid():
            try:
                purchase = Purchase.make(**form.get_edit_purchase_args())
                cart.update(purchase)
                messages.success(request, _("Your cart has been updated."))
            except PurchaseInvalid as error:
                messages.error(
                    request, _(
                        "Your cart could not be "
                        "updated."
                    )
                )
                messages.error(request, error)
        else:
            messages.error(request, _("Your cart could not be updated."))
            messages.error(request, get_error_message(form))

    # Provide default response
    yield redirect(
        reverse(
            request.POST.get(
                'next',
                request.GET.get('next', 'cart:cart')),
            current_app=resolve(request.path).namespace
        )
    )

    yield chaining.update(
        purchase=purchase,
        cart=cart,
        messages=messages)

    if (yield chaining.forward).result is None:
        raise ViewNotImplemented

    if cart.has_changed():
        cart.calculate()
        cart.save()

    messages.transmit()
Пример #4
0
            context = {}

        redirection = None
        form = self.ContactForm(request.POST or None)
        context['contact_form'] = form

        if request.method == 'POST':
            if form.is_valid():
                redirection = redirect(next) if next else None
                mailer.send_mail('contact', {
                    'message' : form.cleaned_data['message'],
                    'name' : form.cleaned_data['name'],
                    'email' : form.cleaned_data['email']
                 })
            else:
                messages.error(request, get_error_message(form))
                redirection = redirect(invalid) if invalid else None

        if chain:
            return chaining.execute(
                request, form=form, context=context, next=next,
                invalid=invalid, redirection=redirection, messages=messages,
                **kwargs)
        elif redirection:
            messages.transmit()
            return redirection
        else:
            messages.clear()
            return render(request, 'store/contact.html', context)
    {% endif %}
Пример #5
0
def add_to_cart(request, **kwargs):

    cart = cart_from_request(request)
    messages = FlashMessages()
    form = AddToCartForm.factory(data=request.POST)(request.POST)

    # Create purchase
    purchase = None
    if form.is_valid():
        try:
            purchase = Purchase.make(**form.get_purchase_args())
        except PurchaseInvalid as error:
            messages.error(request, _("Could not be added to your cart."))
            messages.error(request, error)
    else:
        messages.error(request, _("Your cart could not be updated."))
        messages.error(request, get_error_message(form))

    # Add purchase to cart
    if purchase is not None:
        try:
            cart.add(purchase)
            messages.success(
                request, _(
                    "{0} has been added to your "
                    "cart."
                ).format(purchase)
            )

        except PurchaseInvalid as error:
            messages.error(
                request, _(
                    "{0} could not be added to "
                    "your cart."
                ).format(purchase)
            )
            messages.error(request, error)

    # Provide default response
    yield redirect(
        reverse(
            request.POST.get(
                'next',
                request.GET.get('next', 'cart:cart')),
            current_app=resolve(request.path).namespace
        )
    )

    yield chaining.update(
        purchase=purchase,
        cart=cart,
        messages=messages)

    if (yield chaining.forward).result is None:
        raise ViewNotImplemented

    if cart.has_changed():
        cart.calculate()
        cart.save()
        cart.track(request)

    messages.transmit()