diff -r 9a77edda77b7 -r fda1c66b25f9 project/kiwipycon/registration/views.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project/kiwipycon/registration/views.py Fri Oct 30 15:09:12 2009 +0530 @@ -0,0 +1,336 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import cStringIO as StringIO +import csv + +# django +from django.conf import settings +from django.shortcuts import render_to_response +from django.template.loader import render_to_string +from django.shortcuts import get_object_or_404 +from django.template import RequestContext +from django.core.urlresolvers import reverse +from django.http import HttpResponse + +from django.contrib.auth.decorators import login_required +from django.contrib.auth.forms import AuthenticationForm +from django.contrib.auth.models import User +from django.core.exceptions import ObjectDoesNotExist + +#kiwipycon +from project.kiwipycon.utils import set_message_cookie +from project.kiwipycon.utils import slugify +from project.kiwipycon.user.models import UserProfile +from project.kiwipycon.user.utils import kiwipycon_createregistrant +from project.kiwipycon.user.forms import RegistrantForm +from project.kiwipycon.sponsor.models import Sponsor +from project.kiwipycon.talk.models import Talk + +from .models import Registration +from .models import Wifi +from .forms import RegistrationSubmitForm +from .forms import RegistrationEditForm +from .forms import RegistrationAdminSelectForm +from .forms import WifiForm +from .utils import send_confirmation + +from .forms import IC + +REG_TOTAL = 1000 + +@login_required +def download_csv(request, + template_name = 'registration/download-csv.html'): + """ + """ + if not request.user.is_staff: + redirect_to = reverse('kiwipycon_login') + if request.method == "POST": + form = RegistrationAdminSelectForm(request.POST) + if form.is_valid(): + conference = form.cleaned_data['by_conference'] + tutorial = form.cleaned_data['by_tutorial'] + sprint = form.cleaned_data['by_sprint'] + amount = form.cleaned_data['by_amount'] + tshirt = form.cleaned_data['by_tshirt'] + order_by = form.cleaned_data['order_by'] + include = form.cleaned_data['include'] + q = Registration.objects.all() + if conference == 'conference': + q = q.filter(conference=True) + elif conference == 'no conference': + q = q.filter(conference=False) + elif tutorial == 'tutorial': + q = q.filter(tutorial=True) + elif tutorial == 'no tutorial': + q = q.filter(tutorial=False) + if sprint == 'sprint': + q = q.filter(sprint=True) + if sprint == 'no sprint': + q = q.filter(sprint=False) + elif tshirt != 'all': + q = q.filter(tshirt=tshirt) + q = q.order_by('registrant__email') + query = q.query + results = list(q) + if include == []: + # default to include all fields + include = [i[0] for i in IC] + if results: + response = HttpResponse(mimetype='text/csv') + response['Content-Disposition'] = 'attachment; filename=registrations.csv' + output = csv.writer(response) + output.writerow([h for h in include]) + for row in results: + conference = row.conference == True and 'yes' or 'no' + tutorial = row.tutorial == True and 'yes' or 'no' + sprint = row.sprint == True and 'yes' or 'no' + wrow = [] + if 'Name' in include: + wrow.append( + row.registrant.get_full_name().encode('utf-8')) + if 'Email' in include: + wrow.append(row.registrant.email.encode('utf-8')) + if 'Organisation' in include: + wrow.append(row.organisation.encode('utf-8')) + if 'Conference' in include: + wrow.append(conference) + if 'Tutorial' in include: + wrow.append(tutorial) + if 'Sprint' in include: + wrow.append(sprint) + if 'T-size' in include: + wrow.append(row.tshirt) + output.writerow(wrow) + return response + else: + no_results = u'No results found for the query' + + else: + form = RegistrationAdminSelectForm() + return render_to_response(template_name, RequestContext(request, + locals())) + +# NOT REQUIRED FOR SciPy.in +@login_required +def invoice(request, template_name='registration/invoice.html'): + user = request.user + registration = get_object_or_404(Registration, registrant=user) + if registration.sponsor: + redirect_to = reverse('kiwipycon_account') + return set_message_cookie(redirect_to, + msg = u'You are a sponsored guest, no payment required.') + return render_to_response(template_name, RequestContext(request, + {'registration' : registration, 'user': user})) + +@login_required +def pdf_invoice(request, template_name='registration/invoice.html'): + user = request.user + registration = get_object_or_404(Registration, registrant=user) + if registration.sponsor: + redirect_to = reverse('kiwipycon_account') + return set_message_cookie(redirect_to, + msg = u'You are a sponsored guest, no payment required.') + content = render_to_string(template_name, + {'registration' : registration, 'user': user}) + result = StringIO.StringIO() + import ho.pisa + pdf = ho.pisa.pisaDocument(StringIO.StringIO(content.encode("UTF-8")),result) + if not pdf.err: + return HttpResponse(result.getvalue(), mimetype='application/pdf') + return HttpResponse("Gremlins ate your invoice, please try html" \ + " version") + + +def registrations(request, + template_name='registration/registrations.html'): + """Simple page to count registrations""" + #registrations = Registration.objects.filter(payment=True).count() + registrations = Registration.objects.all().count() + return render_to_response(template_name, RequestContext(request, + { + 'over_reg' : registrations >= REG_TOTAL and True or False, + 'registrations' : registrations})) + +@login_required +def edit_registration(request, id, + template_name='registration/edit-registration.html'): + '''Allows users that submitted a registration to edit it. + ''' + reg = Registration.objects.get(pk=id) + + if reg.registrant != request.user: + redirect_to = reverse('kiwipycon_account') + return set_message_cookie(redirect_to, + msg = u'Redirected because the registration you selected' \ + + ' is not your own.') + + if request.method == 'POST': + form = RegistrationEditForm(data=request.POST) + if form.is_valid(): + reg.organisation = form.data.get('organisation') + reg.occupation = form.data.get('occupation') + reg.city = form.data.get('city') + reg.tshirt = form.data.get('tshirt') + reg.allow_contact = form.data.get('allow_contact') and True or False + reg.conference = form.data.get('conference') and True or False + reg.tutorial = form.data.get('tutorial') and True or False + reg.sprint = form.data.get('sprint') and True or False + reg.save() + # Saved.. redirect + redirect_to = reverse('kiwipycon_account') + return set_message_cookie(redirect_to, + msg = u'Your changes have been saved.') + else: + form = RegistrationEditForm(initial={ + 'id' : id, + 'organisation' : reg.organisation, + 'occupation' : reg.occupation, + 'city' : reg.city, + 'tshirt' : reg.tshirt, + 'conference': reg.conference, + 'tutorial': reg.tutorial, + 'postcode' : reg.postcode, + 'sprint' : reg.sprint, + 'allow_contact' : reg.allow_contact, + }) + + return render_to_response(template_name, RequestContext(request, locals())) + +def submit_registration(request, + template_name='registration/submit-registration.html'): + '''Allows user to edit registration + ''' + user = request.user + reg_count = Registration.objects.all().count() + if user.is_authenticated(): + try: + profile = user.get_profile() + except: + profile, new = UserProfile.objects.get_or_create(user=user) + if new: + profile.save() + try: + registration = Registration.objects.get(registrant=user) + if registration: + redirect_to = reverse('kiwipycon_account') + return set_message_cookie(redirect_to, + msg = u'You have already been registered.') + + except ObjectDoesNotExist: + pass + + message = None + + if request.method == 'POST': + registration_form = RegistrationSubmitForm(data=request.POST) + registrant_form = RegistrantForm(data=request.POST) + wifi_form = WifiForm(data=request.POST) + + if request.POST.get('action', None) == 'login': + login_form = AuthenticationForm(data=request.POST) + if login_form.is_valid(): + + from django.contrib.auth import login + login(request, login_form.get_user()) + + redirect_to = reverse('kiwipycon_submit_registration') + return set_message_cookie(redirect_to, + msg = u'You have been logged in please continue' + \ + 'with registration.') + + newuser = None + passwd = None + if not user.is_authenticated(): + if registrant_form.is_valid(): + newuser = kiwipycon_createregistrant(request, registrant_form.data) + # Log in user + passwd = User.objects.make_random_password() + newuser.set_password(passwd) + newuser.save() + from django.contrib.auth import authenticate + user = authenticate(username=newuser.username, password=passwd) + + from django.contrib.auth import login + login(request, user) + + newuser = user + + else: + newuser = user + + if registration_form.is_valid() and newuser: + allow_contact = registration_form.data.get('allow_contact') and \ + True or False + conference = registration_form.data.get('conference') and \ + True or False + tutorial = registration_form.data.get('tutorial') and \ + True or False + sprint = registration_form.data.get('sprint') and \ + True or False + + registrant = User.objects.get(pk=newuser.id) + + presenter = None + talks = Talk.objects.filter( + speaker=registrant).filter(approved=True) + if talks: + for talk in talks: + if talk.duration == '30': + presenter = True + elif talk.duration == '60': + presenter = True + + reg = Registration( + # slug = newuser.username, + registrant = registrant, + organisation = registration_form.data.get('organisation'), + occupation = registration_form.data.get('occupation'), + city = registration_form.data.get('city'), + tshirt = registration_form.data.get('tshirt'), + postcode = registration_form.cleaned_data.get('postcode'), + allow_contact = allow_contact, + conference = conference, + tutorial = tutorial, + sprint = sprint) + reg.save() + + # get id and use as slug and invoice number + id = reg.id + slug = 'KPC09%03d' % id + reg.slug = slug + reg.save() + + # additional tasks: + if wifi_form.is_valid(): + wifi = wifi_form.save(registrant) + + # 1. include random password if we are a new user + if passwd: + send_confirmation(registrant, slug, password=passwd) + else: + # 2. send user email with registration id + send_confirmation(registrant, slug) + + redirect_to = reverse('kiwipycon_registrations') + return set_message_cookie(redirect_to, + msg = u'Thank you, your registration has been submitted '\ + 'and an email has been sent with payment details.') + + else: + registration_form = RegistrationSubmitForm() + registrant_form = RegistrantForm() + wifi_form = WifiForm() + + login_form = AuthenticationForm() + + + return render_to_response(template_name, RequestContext(request, { + 'registration_form': registration_form, + 'registrant_form' : registrant_form, + 'over_reg' : reg_count >= REG_TOTAL and True or False, + 'wifi_form' : wifi_form, + 'message' : message, + 'login_form' : login_form + }))