project/scipycon/registration/views.py
changeset 94 87e77aa18610
child 96 178b89a3ca4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project/scipycon/registration/views.py	Tue Jul 13 17:59:47 2010 +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
+    }))