Files
@ 830864df2c57
Branch filter:
Location: symposion_app/registripe/views.py - annotation
830864df2c57
3.2 KiB
text/x-python
Adds verification data to the payments form.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | 8334d40fe931 8334d40fe931 f932841cda09 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 8334d40fe931 | import forms
import models
from django.core.exceptions import ValidationError
from django.conf import settings
from django.contrib import messages
from django.db import transaction
from django.http import HttpResponse
from django.shortcuts import redirect, render
from registrasion.controllers.invoice import InvoiceController
from registrasion.models import commerce
from pinax.stripe import actions
from stripe.error import StripeError
from symposion.conference.models import Conference
CURRENCY = settings.INVOICE_CURRENCY
CONFERENCE_ID = settings.CONFERENCE_ID
def pubkey_script(request):
''' Returns a JS snippet that sets the Stripe public key for Stripe.js. '''
script_template = "Stripe.setPublishableKey('%s');"
script = script_template % settings.PINAX_STRIPE_PUBLIC_KEY
return HttpResponse(script, content_type="text/javascript")
def card(request, invoice_id):
form = forms.CreditCardForm(request.POST or None)
inv = InvoiceController.for_id_or_404(str(invoice_id))
if not inv.can_view(user=request.user):
raise Http404()
to_invoice = redirect("invoice", inv.invoice.id)
if request.POST and form.is_valid():
try:
inv.validate_allowed_to_pay() # Verify that we're allowed to do this.
process_card(request, form, inv)
return to_invoice
except StripeError as e:
form.add_error(None, ValidationError(e))
except ValidationError as ve:
form.add_error(None, ve)
data = {
"invoice": inv.invoice,
"form": form,
}
return render(
request, "registrasion/stripe/credit_card_payment.html", data
)
@transaction.atomic
def process_card(request, form, inv):
''' Processes the given credit card form
Arguments:
request: the current request context
form: a CreditCardForm
inv: an InvoiceController
'''
conference = Conference.objects.get(id=CONFERENCE_ID)
amount_to_pay = inv.invoice.balance_due()
token = form.cleaned_data["stripe_token"]
customer = actions.customers.get_customer_for_user(request.user)
if not customer:
customer = actions.customers.create(request.user)
card = actions.sources.create_card(customer, token)
description="Payment for %s invoice #%s" % (
conference.title, inv.invoice.id
)
try:
charge = actions.charges.create(
amount_to_pay,
customer,
currency=CURRENCY,
description=description,
capture=False,
)
receipt = charge.stripe_charge.receipt_number
if not receipt:
receipt = charge.stripe_charge.id
reference = "Paid with Stripe receipt number: " + receipt
# Create the payment object
models.StripePayment.objects.create(
invoice=inv.invoice,
reference=reference,
amount=charge.amount,
charge=charge,
)
except StripeError as e:
raise e
finally:
# Do not actually charge the account until we've reconciled locally.
actions.charges.capture(charge)
inv.update_status()
messages.success(request, "This invoice was successfully paid.")
|