You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.1 KiB
Python

from datetime import timedelta
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound
from django.views.decorators.csrf import csrf_exempt
from django.utils import timezone
from .forms import NewPaymentForm
from .models import Payment, BACKENDS
monthly_price = settings.PAYMENTS_MONTHLY_PRICE
@login_required
def new(request):
if request.method != 'POST':
return redirect('account:index')
form = NewPaymentForm(request.POST)
if not form.is_valid():
return redirect('account:index')
months = int(form.cleaned_data['time'])
payment = Payment(
user=request.user,
backend_id=form.cleaned_data['method'],
status='new',
time=timedelta(days=30 * months),
amount=monthly_price * months
)
if not payment.backend.backend_enabled:
return HttpResponseNotFound()
payment.save()
r = payment.backend.new_payment(payment)
if not r:
payment.status = 'error'
payment.save()
raise Exception("Failed to initialize payment #%d" % payment.id)
if isinstance(r, str):
return render(request, 'payments/form.html', dict(html=r))
elif r is None:
return redirect('payments:view', payment.id)
return r
@csrf_exempt
def callback_paypal(request, id):
""" PayPal IPN """
if not BACKENDS['paypal'].backend_enabled:
return HttpResponseNotFound()
p = Payment.objects.get(id=id)
if BACKENDS['paypal'].callback(p, request):
return HttpResponse()
else:
return HttpResponseBadRequest()
@csrf_exempt
@login_required
def callback_stripe(request, id):
""" Stripe button POST """
if not BACKENDS['stripe'].backend_enabled:
return HttpResponseNotFound()
p = Payment.objects.get(id=id)
BACKENDS['stripe'].callback(p, request)
return redirect(reverse('payments:view', args=(id,)))
@csrf_exempt
def callback_coinbase(request):
if not BACKENDS['coinbase'].backend_enabled:
return HttpResponseNotFound()
if BACKENDS['coinbase'].callback(Payment, request):
return HttpResponse()
else:
return HttpResponseBadRequest()
@login_required
@csrf_exempt
def view(request, id):
p = Payment.objects.get(id=id, user=request.user)
return render(request, 'payments/view.html', dict(payment=p))
@login_required
def cancel(request, id):
p = Payment.objects.get(id=id, user=request.user)
if p.status == 'new':
p.status = 'cancelled'
p.save()
return render(request, 'payments/view.html', dict(payment=p))
@login_required
def list_payments(request):
# Only show recent cancelled payments
cancelled_limit = timezone.now() - timedelta(days=3)
objects = request.user.payment_set.exclude(status='cancelled',
created__lte=cancelled_limit)
return render(request, 'payments/list.html', dict(payments=objects))