示例#1
0
def commit_data(request, order_form, cart, cart_upvotes):
    '''
    Save the order, features and feature upvotes in the backend database
    '''
    order = order_form.save(commit=False)
    order.save()

    for item in cart:
        ticket = Ticket(title=item['title'],
                        type='Feature',
                        description=item['description'],
                        requester=request.user)
        ticket.save()
        order_transaction = OrderTransaction(order=order,
                                             ticket=ticket,
                                             cost=item['feature_cost'])
        order_transaction.save()

    for item in cart_upvotes:
        ticket = Ticket.objects.get(pk=item['id'])
        if ticket.upvotes is None:
            ticket.upvotes = 0
        ticket.upvotes += 1
        ticket.save()
        upvoter = TicketUpvoter(upvoter_ticket=ticket,
                                upvoter_user=request.user)
        upvoter.save()
示例#2
0
def checkout(request):
    '''
    Combined payment form and order form to register new features and feature upvotes, both
    of which must be paid for by the end user.
    '''
    cart_upvotes = request.session.get('cart_upvotes', [])
    cart = request.session.get('cart', [])
    total = sum(float(i['cost']) for i in cart_upvotes) + sum(
        float(i['feature_cost']) for i in cart)

    if request.method == 'POST':
        payment_form = PaymentForm(request.POST)
        order_form = OrderForm(request.POST)
        if payment_form.is_valid() and order_form.is_valid():
            # Process the payment using the Stripe API, feeding back any error messages
            # to this site if unsuccessful
            try:
                charge_customer = stripe.Charge.create(
                    amount=int(total * 100),
                    currency='gbp',
                    description=request.user.email,
                    card=payment_form.cleaned_data['stripe_id'],
                )
            except stripe.error.CardError:
                messages.error(request, 'Your card was declined')
            # Only if the Stripe payment is successful, save the order, features
            # and feature upvotes in the backend database
            if charge_customer.paid:
                order = order_form.save(commit=False)
                order.save()

                for item in cart:
                    ticket = Ticket(title=item['title'],
                                    type='Feature',
                                    description=item['description'],
                                    requester=request.user)
                    ticket.save()
                    order_transaction = OrderTransaction(
                        order=order, ticket=ticket, cost=item['feature_cost'])
                    order_transaction.save()

                for item in cart_upvotes:
                    ticket = Ticket.objects.get(pk=item['id'])
                    if ticket.upvotes is None:
                        ticket.upvotes = 0
                    ticket.upvotes += 1
                    ticket.save()
                    upvoter = TicketUpvoter(upvoter_ticket=ticket,
                                            upvoter_user=request.user)
                    upvoter.save()

                request.session['cart'] = []
                request.session['cart_upvotes'] = []

                messages.info(request, 'Your payment was successful')
                return redirect(reverse('ticket_listing'))
            else:
                messages.error(request, 'Your payment could not be processed')
    else:
        payment_form = PaymentForm()
        order_form = OrderForm()

    return render(
        request, 'checkout.html', {
            'order_form': order_form,
            'payment_form': payment_form,
            'total': total,
            'publishable': settings.STRIPE_PUBLISHABLE
        })