Skip to content

Instantly share code, notes, and snippets.

@klette
Forked from adamcik/gist:118833
Created May 28, 2009 11:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save klette/119237 to your computer and use it in GitHub Desktop.
Save klette/119237 to your computer and use it in GitHub Desktop.
#encoding: utf-8
import urllib
from django.db import connection
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render_to_response
def generate_ticket_pdf_url(purchase_id):
return 'https://billig.samfundet.no/pdf?%s' % urllib.urlencode(
dict([("ticket%s" % i+1 , "%s" % t) for i,t in enumerate(get_ticket_references(purchase_id))]))
def generate_paynet_url(purchase_id):
return 'https://www.paynet.no/term193/terminal.php?%s' % urllib.urlencode({
'ttype': 'sale',
'id': settings.PAYNET_SHOP_ID,
'subid': settings.PAYNET_SUB_SHOP_ID,
'currency': 'NOK',
'desc': 'Billettsalg',
'utref': purchase_id,
'amount': get_purchase_price(purchase_id),
'PMD': ','.join(get_ticket_references(purchase_id)),
})
def get_ticket_references(purchase_id):
cursor = connection.cursor()
cursor.execute('''SELECT billig.ticket || billig.generate_hmac(ticket) AS ticket_ref
FROM billig.ticket WHERE purchase = %s AND refunded IS NULL''', [purchase_id])
for row in cursor.fetchall():
yield row[0]
def get_purchase_price(purchase_id):
cursor = connection.cursor()
cursor.execute('SELECT billig.purchase_price(%s) AS price', [purchase_id])
return cursor.fetchone()[0]
def get_payment_status(ticket_id):
cursor = connection.cursor()
cursor.execute('''SELECT 1 FROM billig.purchase NATURAL JOIN billig.ticket
WHERE ticket = %s AND paid IS NOT NULL
AND (refunded IS NULL OR refunded < paid ) LIMIT 1''', [ticket_id])
return cursor.rowcount > 0
def get_tickets_from_query(querydict):
pmd = querydict.get('PMD', '')
return pmd.split(',')
def valid_tickets(tickets):
for ticket in tickets:
if not ticket.isdigit():
reutrn False
return True
def wait_for_payment(request):
tickets = get_tickets_from_query(request.GET)
if not tickets:
return HttpResponse('No PMD given', status_code=409)
elif not valid_tickets(tickets):
return HttpResponse('Invalid PMD')
else:
return render_to_response('wait-for-payment', {
'pmd': tickets[0],
})
def check_payment(request):
ticket = request.GET.get('ticket', None)
if ticket is None:
return HttpRespone('...')
elif get_payment_status(ticket):
return HttpResponse("true")
else:
return HttpResponse("false")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment