summaryrefslogtreecommitdiff
path: root/project/scipycon/registration
diff options
context:
space:
mode:
Diffstat (limited to 'project/scipycon/registration')
-rw-r--r--project/scipycon/registration/__init__.py0
-rw-r--r--project/scipycon/registration/admin.py59
-rw-r--r--project/scipycon/registration/forms.py251
-rw-r--r--project/scipycon/registration/labels.py7
-rw-r--r--project/scipycon/registration/migrations/0001_initial.py192
-rw-r--r--project/scipycon/registration/migrations/0002_auto__add_field_payment_acco_confirmed.py117
-rw-r--r--project/scipycon/registration/migrations/0003_auto__add_field_payment_date_confirmed.py118
-rw-r--r--project/scipycon/registration/migrations/0004_auto__chg_field_payment_date_confirmed.py118
-rw-r--r--project/scipycon/registration/migrations/0005_auto__add_field_payment_confirmed_mail__add_field_payment_acco_confirm.py126
-rw-r--r--project/scipycon/registration/migrations/0006_auto__add_field_accommodation_accommodation_on_1st__add_field_accommod.py156
-rw-r--r--project/scipycon/registration/migrations/__init__.py0
-rw-r--r--project/scipycon/registration/models.py167
-rw-r--r--project/scipycon/registration/tests.py19
-rw-r--r--project/scipycon/registration/utils.py38
-rw-r--r--project/scipycon/registration/views.py583
15 files changed, 1951 insertions, 0 deletions
diff --git a/project/scipycon/registration/__init__.py b/project/scipycon/registration/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/project/scipycon/registration/__init__.py
diff --git a/project/scipycon/registration/admin.py b/project/scipycon/registration/admin.py
new file mode 100644
index 0000000..fc79f9b
--- /dev/null
+++ b/project/scipycon/registration/admin.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+#django.contrib
+from django.contrib import admin
+
+#scipycon
+from .models import Accommodation
+from .models import Payment
+from .models import Registration
+from .models import Wifi
+
+class RegistrationAdmin(admin.ModelAdmin):
+ list_display = ('registrant', 'full_name', 'phone_num',
+ 'laptop', 'slug', 'email', 'city',
+ 'organisation', 'occupation', 'postcode',
+ 'tshirt', 'conference', 'tutorial',
+ 'sprint', 'allow_contact')
+ fieldsets = (
+ ('Details', {
+ 'fields': ('slug', 'registrant', 'organisation', 'occupation',
+ 'city', 'tshirt')
+ }),
+ ('Information', {
+ 'fields': ('allow_contact',),
+ }),
+ )
+
+ search_fields = ['registrant__username', 'registrant__email']
+
+ def email(self, obj):
+ return obj.registrant.email
+
+ def full_name(self, obj):
+ return obj.registrant.get_full_name()
+
+ def laptop(self, obj):
+ return obj.registrant.wifi_set.values()[0]['wifi']
+
+admin.site.register(Registration, RegistrationAdmin)
+
+class WifiAdmin(admin.ModelAdmin):
+ list_display = ('user', 'wifi',)
+ list_filter = ('wifi',)
+
+admin.site.register(Wifi, WifiAdmin)
+
+class AccommodationAdmin(admin.ModelAdmin):
+ list_display = ('user', 'sex', 'accommodation_required',
+ 'accommodation_days')
+
+admin.site.register(Accommodation, AccommodationAdmin)
+
+class PaymentAdmin(admin.ModelAdmin):
+ list_display = ('user', 'confirmed', 'acco_confirmed')
+
+admin.site.register(Payment, PaymentAdmin)
+
+
diff --git a/project/scipycon/registration/forms.py b/project/scipycon/registration/forms.py
new file mode 100644
index 0000000..77a8b73
--- /dev/null
+++ b/project/scipycon/registration/forms.py
@@ -0,0 +1,251 @@
+from django import forms
+from django.core.exceptions import ObjectDoesNotExist
+
+from project.scipycon.registration.models import SIZE_CHOICES
+from project.scipycon.registration.models import OCCUPATION_CHOICES
+from project.scipycon.registration.models import Accommodation
+from project.scipycon.registration.models import Payment
+from project.scipycon.registration.models import Wifi
+
+
+class RegistrationSubmitForm(forms.Form):
+ """SciPyCon registration form
+ """
+ #tshirt = forms.ChoiceField(choices=SIZE_CHOICES, required=True,
+ # label=u'T-shirt size', help_text=u'Yes, we all get a t-shirt!')
+ organisation = forms.CharField(required=True, label=u'Organisation',
+ help_text=u'The primary organisation that you are a member of.',
+ max_length=255,
+ widget=forms.TextInput(attrs={'size':'50'}))
+ occupation = forms.ChoiceField(choices=OCCUPATION_CHOICES,
+ required=True, label=u'Occupation',
+ help_text=u'Title of your occupation')
+ city = forms.CharField(required=False, label=u'City',
+ help_text=u'Your city of residence',
+ max_length=255,
+ widget=forms.TextInput(attrs={'size':'50'}))
+ postcode = forms.CharField(required=False, label=u'Postcode',
+ help_text=u'PIN Code of your area',
+ max_length=10,
+ widget=forms.TextInput(attrs={'size':'10'}))
+ phone_num = forms.CharField(required=False, label=u'Phone Number',
+ help_text=u'Phone number. Although optional, please provide it for '
+ 'faster correspondence', max_length=14,
+ widget=forms.TextInput(attrs={'size':'20'}))
+ allow_contact = forms.BooleanField(required=False, label=u'Contact',
+ help_text=u'May organizers of SciPy.in contact you after the event?')
+ conference = forms.BooleanField(required=False, label=u'Conference',
+ help_text=u"""Do you intend to attend SciPy.in 2011 conference?""")
+ tutorial = forms.BooleanField(required=False, label=u'Tutorial',
+ help_text=u'Do you intend to attend the tutorials?')
+ sprint = forms.BooleanField(required=False, label=u'Sprint',
+ help_text=u'Do you intend to attend the sprints?')
+
+ def occupation_fields(self):
+ return (self['organisation'],
+ self['occupation'])
+
+ def demographic_fields(self):
+ return (self['city'],
+ self['postcode'],
+ self['phone_num'])
+
+ def personal_fields(self):
+ return (#self['tshirt'],
+ self['conference'],
+ self['tutorial'],
+ self['sprint'],
+ self['allow_contact'])
+
+
+class RegistrationEditForm(RegistrationSubmitForm):
+ id = forms.CharField(widget=forms.HiddenInput)
+
+class WifiForm(forms.ModelForm):
+ """SciPyCon wifi form
+ """
+
+ def save(self, user, scope):
+ try:
+ wifi = Wifi.objects.get(user=user, scope=scope)
+ except ObjectDoesNotExist:
+ wifi = Wifi(user=user, scope=scope)
+
+ wifi.wifi = self.cleaned_data['wifi']
+ wifi.registration_id = self.cleaned_data['registration_id']
+ wifi.save()
+
+ return wifi
+
+ class Meta:
+ model = Wifi
+ fields = ('wifi', 'registration_id')
+
+
+class AccommodationForm(forms.ModelForm):
+ """SciPyCon Accommodation form
+ """
+
+ def save(self, user, scope):
+ try:
+ acco = Accommodation.objects.get(user=user, scope=scope)
+ except ObjectDoesNotExist:
+ acco = Accommodation(user=user, scope=scope)
+
+ sex = self.cleaned_data['sex']
+ accommodation_required = self.cleaned_data['accommodation_required']
+
+ a1 = self.cleaned_data['accommodation_on_1st']
+ a2 = self.cleaned_data['accommodation_on_2nd']
+ a3 = self.cleaned_data['accommodation_on_3rd']
+ a4 = self.cleaned_data['accommodation_on_4th']
+
+
+ accommodation_days = [a1, a2, a3, a4].count(True)
+
+ acco.sex = sex
+ acco.accommodation_required = accommodation_required
+ acco.accommodation_days = accommodation_days
+
+ acco.accommodation_on_1st = a1
+ acco.accommodation_on_2nd = a2
+ acco.accommodation_on_3rd = a3
+ acco.accommodation_on_4th = a4
+
+
+ acco.save()
+
+ return acco
+
+ def clean(self):
+ """Makes sure that accommodation form is correct, i.e. sex
+ and number of days required are filled in when the accommodation
+ is required.
+ """
+ cleaned = self.cleaned_data
+
+ sex = self.cleaned_data['sex']
+ accommodation_required = self.cleaned_data['accommodation_required']
+
+ a1 = self.cleaned_data['accommodation_on_1st']
+ a2 = self.cleaned_data['accommodation_on_2nd']
+ a3 = self.cleaned_data['accommodation_on_3rd']
+ a4 = self.cleaned_data['accommodation_on_4th']
+
+ selected_a_date = any([a1, a2, a3, a4])
+
+ if accommodation_required and (not sex or not selected_a_date):
+ #or accommodation_days == 0):
+ raise forms.ValidationError(
+ u"If accommodation is required please specify gender and"
+ " select the days number for which accommodation is required.")
+
+ return super(AccommodationForm, self).clean()
+
+ class Meta:
+ model = Accommodation
+ fields = ('accommodation_required',
+ 'sex',
+ 'accommodation_on_1st',
+ 'accommodation_on_2nd',
+ 'accommodation_on_3rd',
+ 'accommodation_on_4th',
+ )
+
+
+class PaymentForm(forms.ModelForm):
+ """SciPyCon Payment form
+ """
+
+ paid = forms.BooleanField(
+ required=False, label="Amount paid",
+ help_text="Check this box if you have already paid the fees.")
+
+ def save(self, user, scope):
+ try:
+ payment = Payment.objects.get(user=user, scope=scope)
+ except ObjectDoesNotExist:
+ payment = Payment(user=user, scope=scope)
+
+ paid = self.cleaned_data['paid']
+ type = self.cleaned_data['type']
+ details = self.cleaned_data['details']
+
+ payment.type = type
+ payment.details = details
+
+ payment.save()
+
+ return payment
+
+ def clean(self):
+ """Makes sure that payment form is correct, i.e. type and details
+ are filled in when the required fees is paid.
+ """
+
+ paid = self.cleaned_data['paid']
+ type = self.cleaned_data['type']
+ details = self.cleaned_data['details']
+
+ if paid and (not type or not details):
+ raise forms.ValidationError(
+ u"If you have already paid the fee it is mandatory to "
+ "fill in the type and mandatory fields.")
+
+ return super(PaymentForm, self).clean()
+
+ class Meta:
+ model = Payment
+ fields = ('paid', 'type', 'details')
+
+
+PC = (
+ ('all', 'all'),
+ ('paid', 'paid'),
+ ('not paid', 'not paid')
+ )
+HC = (
+ ('all', 'all'),
+ ('party', 'party'),
+ ('no party', 'no party')
+ )
+AC = (
+ ('all', 'all'),
+ ('0', '0'),
+ ('10', '10'),
+ ('20', '20'),
+ ('40', '40'),
+ )
+OC = (
+ ('email', 'email'),
+ ('amount', 'amount'),
+ )
+
+IC = (
+ ('Name', 'name'),
+ ('Email', 'email'),
+ ('Amount', 'amount'),
+ ('Organisation', 'organisation'),
+ ('Conference', 'conference'),
+ ('Tutorial', 'tutorial'),
+ ('Sprint', 'sprint'),
+ ('T-size', 'tshirt'),
+ )
+
+
+class RegistrationAdminSelectForm(forms.Form):
+ """
+ Used to make selection for csv download
+ """
+ by_payment = forms.ChoiceField(choices=PC, required=False,
+ label=u'By payment')
+ by_amount = forms.MultipleChoiceField(choices=AC, required=False,
+ label=u'By amount')
+ by_party = forms.ChoiceField(choices=HC, required=False,
+ label=u'by party')
+ by_tshirt = forms.ChoiceField(choices=SIZE_CHOICES, required=False,
+ label=u'by tshirt size')
+ order_by = forms.ChoiceField(choices=OC, required=False,
+ label=u'order results')
+ include = forms.MultipleChoiceField(choices=IC, required=False,
+ label=u'Include fields')
diff --git a/project/scipycon/registration/labels.py b/project/scipycon/registration/labels.py
new file mode 100644
index 0000000..c465f2c
--- /dev/null
+++ b/project/scipycon/registration/labels.py
@@ -0,0 +1,7 @@
+
+WIFI_CHOICES = (
+ ("0", "Yes"),
+ ('1', 'No'),
+ )
+
+WIFI_HELP = """Are you bringing a laptop to the event?"""
diff --git a/project/scipycon/registration/migrations/0001_initial.py b/project/scipycon/registration/migrations/0001_initial.py
new file mode 100644
index 0000000..9c1eb53
--- /dev/null
+++ b/project/scipycon/registration/migrations/0001_initial.py
@@ -0,0 +1,192 @@
+
+from south.db import db
+from django.db import models
+from project.scipycon.registration.models import *
+
+class Migration:
+
+ def forwards(self, orm):
+
+ # Adding model 'Wifi'
+ db.create_table('registration_wifi', (
+ ('id', orm['registration.Wifi:id']),
+ ('scope', orm['registration.Wifi:scope']),
+ ('user', orm['registration.Wifi:user']),
+ ('wifi', orm['registration.Wifi:wifi']),
+ ('registration_id', orm['registration.Wifi:registration_id']),
+ ))
+ db.send_create_signal('registration', ['Wifi'])
+
+ # Adding model 'Accommodation'
+ db.create_table('registration_accommodation', (
+ ('id', orm['registration.Accommodation:id']),
+ ('scope', orm['registration.Accommodation:scope']),
+ ('user', orm['registration.Accommodation:user']),
+ ('sex', orm['registration.Accommodation:sex']),
+ ('accommodation_required', orm['registration.Accommodation:accommodation_required']),
+ ('accommodation_on_1st', orm['registration.Accommodation:accommodation_on_1st']),
+ ('accommodation_on_2nd', orm['registration.Accommodation:accommodation_on_2nd']),
+ ('accommodation_on_3rd', orm['registration.Accommodation:accommodation_on_3rd']),
+ ('accommodation_on_4th', orm['registration.Accommodation:accommodation_on_4th']),
+ ('accommodation_on_5th', orm['registration.Accommodation:accommodation_on_5th']),
+ ('accommodation_on_6th', orm['registration.Accommodation:accommodation_on_6th']),
+ ('accommodation_days', orm['registration.Accommodation:accommodation_days']),
+ ))
+ db.send_create_signal('registration', ['Accommodation'])
+
+ # Adding model 'Payment'
+ db.create_table('registration_payment', (
+ ('id', orm['registration.Payment:id']),
+ ('scope', orm['registration.Payment:scope']),
+ ('user', orm['registration.Payment:user']),
+ ('confirmed', orm['registration.Payment:confirmed']),
+ ('acco_confirmed', orm['registration.Payment:acco_confirmed']),
+ ('date_confirmed', orm['registration.Payment:date_confirmed']),
+ ('confirmed_mail', orm['registration.Payment:confirmed_mail']),
+ ('acco_confirmed_mail', orm['registration.Payment:acco_confirmed_mail']),
+ ('type', orm['registration.Payment:type']),
+ ('details', orm['registration.Payment:details']),
+ ))
+ db.send_create_signal('registration', ['Payment'])
+
+ # Adding model 'Registration'
+ db.create_table('registration_registration', (
+ ('id', orm['registration.Registration:id']),
+ ('scope', orm['registration.Registration:scope']),
+ ('slug', orm['registration.Registration:slug']),
+ ('registrant', orm['registration.Registration:registrant']),
+ ('organisation', orm['registration.Registration:organisation']),
+ ('occupation', orm['registration.Registration:occupation']),
+ ('city', orm['registration.Registration:city']),
+ ('postcode', orm['registration.Registration:postcode']),
+ ('phone_num', orm['registration.Registration:phone_num']),
+ ('tshirt', orm['registration.Registration:tshirt']),
+ ('conference', orm['registration.Registration:conference']),
+ ('tutorial', orm['registration.Registration:tutorial']),
+ ('sprint', orm['registration.Registration:sprint']),
+ ('final_conference', orm['registration.Registration:final_conference']),
+ ('final_tutorial', orm['registration.Registration:final_tutorial']),
+ ('final_sprint', orm['registration.Registration:final_sprint']),
+ ('allow_contact', orm['registration.Registration:allow_contact']),
+ ('submitted', orm['registration.Registration:submitted']),
+ ('last_mod', orm['registration.Registration:last_mod']),
+ ))
+ db.send_create_signal('registration', ['Registration'])
+
+
+
+ def backwards(self, orm):
+
+ # Deleting model 'Wifi'
+ db.delete_table('registration_wifi')
+
+ # Deleting model 'Accommodation'
+ db.delete_table('registration_accommodation')
+
+ # Deleting model 'Payment'
+ db.delete_table('registration_payment')
+
+ # Deleting model 'Registration'
+ db.delete_table('registration_registration')
+
+
+
+ models = {
+ 'auth.group': {
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'unique_together': "(('content_type', 'codename'),)"},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'base.event': {
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'scope': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'turn': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'registration.accommodation': {
+ 'accommodation_days': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'accommodation_on_1st': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'accommodation_on_2nd': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'accommodation_on_3rd': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'accommodation_on_4th': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'accommodation_on_5th': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'accommodation_on_6th': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'accommodation_required': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'sex': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.payment': {
+ 'acco_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'acco_confirmed_mail': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'confirmed_mail': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'date_confirmed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'details': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.registration': {
+ 'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'final_conference': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'final_sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'final_tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_mod': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'occupation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'organisation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'phone_num': ('django.db.models.fields.CharField', [], {'max_length': '14', 'blank': 'True'}),
+ 'postcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'registrant': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+ 'submitted': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'tshirt': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
+ 'tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'})
+ },
+ 'registration.wifi': {
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'registration_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'wifi': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['registration']
diff --git a/project/scipycon/registration/migrations/0002_auto__add_field_payment_acco_confirmed.py b/project/scipycon/registration/migrations/0002_auto__add_field_payment_acco_confirmed.py
new file mode 100644
index 0000000..13bb22f
--- /dev/null
+++ b/project/scipycon/registration/migrations/0002_auto__add_field_payment_acco_confirmed.py
@@ -0,0 +1,117 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Payment.acco_confirmed'
+ db.add_column('registration_payment', 'acco_confirmed', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Payment.acco_confirmed'
+ db.delete_column('registration_payment', 'acco_confirmed')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'base.event': {
+ 'Meta': {'object_name': 'Event'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'scope': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'turn': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'registration.accommodation': {
+ 'Meta': {'object_name': 'Accommodation'},
+ 'accommodation_days': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'accommodation_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'sex': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.payment': {
+ 'Meta': {'object_name': 'Payment'},
+ 'acco_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'details': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.registration': {
+ 'Meta': {'object_name': 'Registration'},
+ 'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_mod': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'occupation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'organisation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'phone_num': ('django.db.models.fields.CharField', [], {'max_length': '14', 'blank': 'True'}),
+ 'postcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'registrant': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'submitted': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'tshirt': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
+ 'tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'registration.wifi': {
+ 'Meta': {'object_name': 'Wifi'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'registration_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'wifi': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['registration']
diff --git a/project/scipycon/registration/migrations/0003_auto__add_field_payment_date_confirmed.py b/project/scipycon/registration/migrations/0003_auto__add_field_payment_date_confirmed.py
new file mode 100644
index 0000000..052a1ac
--- /dev/null
+++ b/project/scipycon/registration/migrations/0003_auto__add_field_payment_date_confirmed.py
@@ -0,0 +1,118 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Payment.date_confirmed'
+ db.add_column('registration_payment', 'date_confirmed', self.gf('django.db.models.fields.DateTimeField')(default=False, blank=True), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Payment.date_confirmed'
+ db.delete_column('registration_payment', 'date_confirmed')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'base.event': {
+ 'Meta': {'object_name': 'Event'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'scope': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'turn': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'registration.accommodation': {
+ 'Meta': {'object_name': 'Accommodation'},
+ 'accommodation_days': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'accommodation_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'sex': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.payment': {
+ 'Meta': {'object_name': 'Payment'},
+ 'acco_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'date_confirmed': ('django.db.models.fields.DateTimeField', [], {'default': 'False', 'blank': 'True'}),
+ 'details': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.registration': {
+ 'Meta': {'object_name': 'Registration'},
+ 'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_mod': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'occupation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'organisation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'phone_num': ('django.db.models.fields.CharField', [], {'max_length': '14', 'blank': 'True'}),
+ 'postcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'registrant': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'submitted': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'tshirt': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
+ 'tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'registration.wifi': {
+ 'Meta': {'object_name': 'Wifi'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'registration_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'wifi': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['registration']
diff --git a/project/scipycon/registration/migrations/0004_auto__chg_field_payment_date_confirmed.py b/project/scipycon/registration/migrations/0004_auto__chg_field_payment_date_confirmed.py
new file mode 100644
index 0000000..6ef942b
--- /dev/null
+++ b/project/scipycon/registration/migrations/0004_auto__chg_field_payment_date_confirmed.py
@@ -0,0 +1,118 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Changing field 'Payment.date_confirmed'
+ db.alter_column('registration_payment', 'date_confirmed', self.gf('django.db.models.fields.DateTimeField')(null=True))
+
+
+ def backwards(self, orm):
+
+ # Changing field 'Payment.date_confirmed'
+ db.alter_column('registration_payment', 'date_confirmed', self.gf('django.db.models.fields.DateTimeField')())
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'base.event': {
+ 'Meta': {'object_name': 'Event'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'scope': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'turn': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'registration.accommodation': {
+ 'Meta': {'object_name': 'Accommodation'},
+ 'accommodation_days': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'accommodation_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'sex': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.payment': {
+ 'Meta': {'object_name': 'Payment'},
+ 'acco_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'date_confirmed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'details': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.registration': {
+ 'Meta': {'object_name': 'Registration'},
+ 'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_mod': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'occupation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'organisation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'phone_num': ('django.db.models.fields.CharField', [], {'max_length': '14', 'blank': 'True'}),
+ 'postcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'registrant': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'submitted': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'tshirt': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
+ 'tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'registration.wifi': {
+ 'Meta': {'object_name': 'Wifi'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'registration_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'wifi': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['registration']
diff --git a/project/scipycon/registration/migrations/0005_auto__add_field_payment_confirmed_mail__add_field_payment_acco_confirm.py b/project/scipycon/registration/migrations/0005_auto__add_field_payment_confirmed_mail__add_field_payment_acco_confirm.py
new file mode 100644
index 0000000..d7aee62
--- /dev/null
+++ b/project/scipycon/registration/migrations/0005_auto__add_field_payment_confirmed_mail__add_field_payment_acco_confirm.py
@@ -0,0 +1,126 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Payment.confirmed_mail'
+ db.add_column('registration_payment', 'confirmed_mail', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+ # Adding field 'Payment.acco_confirmed_mail'
+ db.add_column('registration_payment', 'acco_confirmed_mail', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Payment.confirmed_mail'
+ db.delete_column('registration_payment', 'confirmed_mail')
+
+ # Deleting field 'Payment.acco_confirmed_mail'
+ db.delete_column('registration_payment', 'acco_confirmed_mail')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'base.event': {
+ 'Meta': {'object_name': 'Event'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'scope': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'turn': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'registration.accommodation': {
+ 'Meta': {'object_name': 'Accommodation'},
+ 'accommodation_days': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'accommodation_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'sex': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.payment': {
+ 'Meta': {'object_name': 'Payment'},
+ 'acco_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'acco_confirmed_mail': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed_mail': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'date_confirmed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'details': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.registration': {
+ 'Meta': {'object_name': 'Registration'},
+ 'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_mod': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'occupation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'organisation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'phone_num': ('django.db.models.fields.CharField', [], {'max_length': '14', 'blank': 'True'}),
+ 'postcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'registrant': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'submitted': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'tshirt': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
+ 'tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'registration.wifi': {
+ 'Meta': {'object_name': 'Wifi'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'registration_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'wifi': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['registration']
diff --git a/project/scipycon/registration/migrations/0006_auto__add_field_accommodation_accommodation_on_1st__add_field_accommod.py b/project/scipycon/registration/migrations/0006_auto__add_field_accommodation_accommodation_on_1st__add_field_accommod.py
new file mode 100644
index 0000000..60df42a
--- /dev/null
+++ b/project/scipycon/registration/migrations/0006_auto__add_field_accommodation_accommodation_on_1st__add_field_accommod.py
@@ -0,0 +1,156 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Accommodation.accommodation_on_1st'
+ db.add_column('registration_accommodation', 'accommodation_on_1st', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+ # Adding field 'Accommodation.accommodation_on_2nd'
+ db.add_column('registration_accommodation', 'accommodation_on_2nd', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+ # Adding field 'Accommodation.accommodation_on_3rd'
+ db.add_column('registration_accommodation', 'accommodation_on_3rd', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+ # Adding field 'Accommodation.accommodation_on_4th'
+ db.add_column('registration_accommodation', 'accommodation_on_4th', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+ # Adding field 'Accommodation.accommodation_on_5th'
+ db.add_column('registration_accommodation', 'accommodation_on_5th', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+ # Adding field 'Accommodation.accommodation_on_6th'
+ db.add_column('registration_accommodation', 'accommodation_on_6th', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Accommodation.accommodation_on_1st'
+ db.delete_column('registration_accommodation', 'accommodation_on_1st')
+
+ # Deleting field 'Accommodation.accommodation_on_2nd'
+ db.delete_column('registration_accommodation', 'accommodation_on_2nd')
+
+ # Deleting field 'Accommodation.accommodation_on_3rd'
+ db.delete_column('registration_accommodation', 'accommodation_on_3rd')
+
+ # Deleting field 'Accommodation.accommodation_on_4th'
+ db.delete_column('registration_accommodation', 'accommodation_on_4th')
+
+ # Deleting field 'Accommodation.accommodation_on_5th'
+ db.delete_column('registration_accommodation', 'accommodation_on_5th')
+
+ # Deleting field 'Accommodation.accommodation_on_6th'
+ db.delete_column('registration_accommodation', 'accommodation_on_6th')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'base.event': {
+ 'Meta': {'object_name': 'Event'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'scope': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'status': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'turn': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'registration.accommodation': {
+ 'Meta': {'object_name': 'Accommodation'},
+ 'accommodation_days': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}),
+ 'accommodation_on_1st': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'accommodation_on_2nd': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'accommodation_on_3rd': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'accommodation_on_4th': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'accommodation_on_5th': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'accommodation_on_6th': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'accommodation_required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'sex': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.payment': {
+ 'Meta': {'object_name': 'Payment'},
+ 'acco_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'acco_confirmed_mail': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'confirmed_mail': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'date_confirmed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'details': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+ },
+ 'registration.registration': {
+ 'Meta': {'object_name': 'Registration'},
+ 'allow_contact': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_conference': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'final_tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_mod': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'occupation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'organisation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'phone_num': ('django.db.models.fields.CharField', [], {'max_length': '14', 'blank': 'True'}),
+ 'postcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'registrant': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'sprint': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'submitted': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'tshirt': ('django.db.models.fields.CharField', [], {'max_length': '3'}),
+ 'tutorial': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'registration.wifi': {
+ 'Meta': {'object_name': 'Wifi'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'registration_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'scope': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['base.Event']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+ 'wifi': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['registration']
diff --git a/project/scipycon/registration/migrations/__init__.py b/project/scipycon/registration/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/project/scipycon/registration/migrations/__init__.py
diff --git a/project/scipycon/registration/models.py b/project/scipycon/registration/models.py
new file mode 100644
index 0000000..03013c5
--- /dev/null
+++ b/project/scipycon/registration/models.py
@@ -0,0 +1,167 @@
+from django.db import models
+from django.contrib.auth.models import User
+
+from project.scipycon.base import models as base_models
+
+from project.scipycon.registration.labels import WIFI_CHOICES
+from project.scipycon.registration.labels import WIFI_HELP
+
+
+SIZE_CHOICES = (
+ ('S', 'S'),
+ ('M', 'M'),
+ ('L', 'L'),
+ ('XL', 'XL'),
+ ('XXL', 'XXL'),
+ )
+
+OCCUPATION_CHOICES = (
+ ('Education: Student', 'Education: Student'),
+ ('Education: Faculty', 'Education: Faculty'),
+ ('Education: Research', 'Education: Research'),
+ ('Education: Other', 'Education: Other'),
+ ('Corporate: Research', 'Corporate: Research'),
+ ('Corporate: Other', 'Corporate: Other'),
+ ('Other', 'Other')
+ )
+
+SEX_CHOICES = (
+ ('Male', 'Male'),
+ ('Female', 'Female'),
+ )
+
+PAYMENT_MODE_CHOICES = (
+ ('Cheque', 'Cheque'),
+ ('Demand Draft(DD)', 'Demand Draft(DD)'),
+ ('Net Banking', 'Net Banking')
+ )
+
+
+class Wifi(base_models.ScopedBase):
+ """Defines wifi options at SciPy.in
+ """
+
+ user = models.ForeignKey(User)
+
+ wifi = models.CharField(max_length=50, choices=WIFI_CHOICES,
+ help_text=WIFI_HELP, verbose_name="Laptop")
+
+ registration_id = models.CharField(
+ max_length=255, verbose_name="Identification Number",
+ help_text="- Provide the serial or identification number at the "
+ "back of your laptop using which your laptop can be uniquely "
+ "identified. Ex: 8BDB8FB (Service Tag on Dell Laptops).<br /> - "
+ "This is for security reasons and will be used while you enter and "
+ "leave the venue.<br /> - Please don't provide the model number "
+ "like Dell Inspiron 1545. There may be many laptops of that model "
+ "and hence your laptop cannot be uniquely identified.",
+ blank=True, null=True)
+
+
+class Accommodation(base_models.ScopedBase):
+ """Defines accommodation information for SciPy.in
+ """
+
+ user = models.ForeignKey(User)
+
+ sex = models.CharField(max_length=50, choices=SEX_CHOICES,
+ verbose_name="Gender",
+ blank=True, null=True)
+
+ accommodation_required = models.BooleanField(
+ default=False, blank=True,
+ verbose_name="Accommodation required",
+ help_text="Check if you need accommodation.")
+
+ accommodation_on_1st = models.BooleanField(
+ default=False, verbose_name="Required for Ist Night")
+ accommodation_on_2nd = models.BooleanField(
+ default=False, verbose_name="Required for 2nd Night")
+ accommodation_on_3rd = models.BooleanField(
+ default=False, verbose_name="Required for 3rd Night")
+ accommodation_on_4th = models.BooleanField(
+ default=False, verbose_name="Required for 4th Night")
+
+ accommodation_days = models.IntegerField(
+ default=0, blank=True,
+ verbose_name="Number of days",
+ help_text="Number of days the accommodation is required for?")
+
+
+class Registration(base_models.ScopedBase):
+ """Defines registration at SciPy.in"""
+
+ slug = models.SlugField()
+
+ registrant = models.ForeignKey(User)
+
+ organisation = models.CharField(max_length=255, blank=True)
+
+ occupation = models.CharField(max_length=255,
+ choices=OCCUPATION_CHOICES, blank=True)
+
+ city = models.CharField(max_length=255, blank=True)
+
+ postcode = models.CharField(max_length=255, blank=True)
+
+ phone_num = models.CharField(max_length=14, blank=True)
+
+ tshirt = models.CharField(max_length=3, choices=SIZE_CHOICES)
+
+ conference = models.BooleanField(default=False)
+
+ tutorial = models.BooleanField(default=False)
+
+ sprint = models.BooleanField(default=False)
+
+ final_conference = models.BooleanField(default=False)
+
+ final_tutorial = models.BooleanField(default=False)
+
+ final_sprint = models.BooleanField(default=False)
+
+ allow_contact = models.BooleanField(default=False)
+
+ submitted = models.DateTimeField(auto_now_add=True)
+
+ last_mod = models.DateTimeField(auto_now=True)
+
+ def __unicode__(self):
+ return 'Registration for user: <%s %s> %s' % (
+ self.registrant.first_name,
+ self.registrant.last_name, self.registrant.email)
+
+
+class Payment(base_models.ScopedBase):
+ """Defines payment information for SciPy.in registrants
+ """
+
+ user = models.ForeignKey(User)
+
+ confirmed = models.BooleanField(
+ default=False, blank=True)
+
+ acco_confirmed = models.BooleanField(
+ default=False, blank=True)
+
+ date_confirmed = models.DateTimeField(blank=True, null=True)
+
+ confirmed_mail = models.BooleanField(
+ default=False, blank=True)
+
+ acco_confirmed_mail = models.BooleanField(
+ default=False, blank=True)
+
+ type = models.CharField(max_length=25, choices=PAYMENT_MODE_CHOICES,
+ verbose_name="Type", blank=True, null=True)
+
+ details = models.CharField(
+ max_length=255, verbose_name="Details",
+ help_text="If the payment mode was cheque or DD please provide "
+ "the <font color='red'>cheque or DD number and the name of the bank "
+ "and branch</font>. Example: 4536234, SBI, IIT Powai, Mumbai.<br/> "
+ "If the payment mode was Net Banking please provide the <font "
+ "color='red'>last four digits of the account number and the name "
+ "of the account holder and the bank name</font> from which the "
+ "transfer was made. Example: 8804, Harish Chandra, SBI",
+ blank=True, null=True)
diff --git a/project/scipycon/registration/tests.py b/project/scipycon/registration/tests.py
new file mode 100644
index 0000000..0ea28b2
--- /dev/null
+++ b/project/scipycon/registration/tests.py
@@ -0,0 +1,19 @@
+
+
+def test_save_to_pdf():
+ """
+ >>> from .pdf import save_invoice
+ >>> from django.db.models.loading import get_model
+ >>> userModel = get_model('auth', 'user')
+ >>> user = userModel(username='joe', email='joe@gmail.com',
+ ... first_name='Joe', last_name='Bloggs')
+ >>> user.save()
+ >>> regModel = get_model('registration', 'registration')
+ >>> registration = regModel(registrant=user, amount=40,
+ ... slug='NZPYCON-0001')
+ >>> registration.save()
+
+ >>> save_invoice(user, registration, 'registration/invoice.html')
+
+ """
+ pass
diff --git a/project/scipycon/registration/utils.py b/project/scipycon/registration/utils.py
new file mode 100644
index 0000000..bf4e0cd
--- /dev/null
+++ b/project/scipycon/registration/utils.py
@@ -0,0 +1,38 @@
+from django.core.mail import EmailMessage
+
+
+def send_confirmation(registrant, event ,password=None):
+
+ message = EmailMessage()
+ message.subject = u'Registration to %s' % (event.get_full_name())
+ message.from_email = u'admin@scipy.in'
+ message.to = [registrant.email]
+
+ details = {'name': registrant.get_full_name(),
+ 'username': registrant.username,
+ 'password': password,
+ 'event_name': event.get_full_name(),
+ 'event_scope': event.scope,
+ }
+
+ confirmation_newuser = """Dear %(name)s,
+
+Thank you, for registering for %(event_name)s!
+
+You may log in to the %(event_name)s website at
+http://scipy.in/%(event_scope)s/login using the username -
+%(username)s and the password - %(password)s.
+
+Looking forward to meet you at %(event_name)s.
+
+Regards,
+SciPy.in Team
+
+If you lose your password, visit: http://scipy.in/password-reset
+"""
+
+ message.body = confirmation_newuser %(details)
+
+ message.send()
+
+
diff --git a/project/scipycon/registration/views.py b/project/scipycon/registration/views.py
new file mode 100644
index 0000000..75f0562
--- /dev/null
+++ b/project/scipycon/registration/views.py
@@ -0,0 +1,583 @@
+import csv
+import datetime
+import time
+
+from django.contrib.auth import authenticate
+from django.contrib.auth import login
+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
+from django.core.urlresolvers import reverse
+from django.http import HttpResponse
+from django.http import HttpResponseRedirect
+from django.shortcuts import render_to_response
+from django.template import loader
+from django.template import RequestContext
+
+from project.scipycon.base.models import Event
+from project.scipycon.registration.forms import RegistrationEditForm
+from project.scipycon.registration.forms import RegistrationSubmitForm
+from project.scipycon.registration.forms import AccommodationForm
+from project.scipycon.registration.forms import PaymentForm
+from project.scipycon.registration.forms import WifiForm
+from project.scipycon.registration.models import Accommodation
+from project.scipycon.registration.models import Payment
+from project.scipycon.registration.models import Registration
+from project.scipycon.registration.models import Wifi
+from project.scipycon.registration.utils import send_confirmation
+from project.scipycon.user.forms import RegistrantForm
+from project.scipycon.user.models import UserProfile
+from project.scipycon.user.utils import scipycon_createregistrant
+from project.scipycon.utils import set_message_cookie
+
+
+REG_TOTAL = 1000
+
+
+@login_required
+def registrations(request, scope,
+ template_name='registration/registrations.html'):
+ """Simple page to count registrations"""
+
+ registrations = Registration.objects.all().count()
+
+ user = request.user
+ if user.is_authenticated():
+ registration = Registration.objects.get(registrant=user)
+ else:
+ registration = None
+
+ event = Event.objects.get(scope=scope)
+
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ 'over_reg' : registrations >= REG_TOTAL and True or False,
+ 'registrations' : registrations,
+ 'registration': registration,
+ 'event': event}))
+
+@login_required
+def edit_registration(request, scope, id,
+ template_name='registration/edit-registration.html'):
+ """Allows users that submitted a registration to edit it.
+ """
+
+ scope_entity = Event.objects.get(scope=scope)
+
+ reg = Registration.objects.get(pk=int(id))
+ wifi = Wifi.objects.get(user=reg.registrant)
+
+ # TODO: This is an ugly hack to add accommodation and payment forms
+ # details at later stage for SciPy.in 2010. This must be removed for
+ # SciPy.in 2011
+ acco, acco_created = Accommodation.objects.get_or_create(
+ user=reg.registrant, scope=scope_entity)
+ payment, payment_created = Payment.objects.get_or_create(
+ user=reg.registrant, scope=scope_entity)
+
+ if reg.registrant != request.user:
+ redirect_to = reverse('scipycon_account', kwargs={'scope': scope})
+
+ return set_message_cookie(
+ redirect_to,
+ msg = u'Redirected because the registration you selected' \
+ + ' is not your own.')
+
+ if request.method == 'POST':
+ registration_form = RegistrationEditForm(data=request.POST)
+ wifi_form = WifiForm(data=request.POST)
+ acco_form = AccommodationForm(data=request.POST)
+ payment_form = PaymentForm(data=request.POST)
+
+ if (registration_form.is_valid() and wifi_form.is_valid() and
+ acco_form.is_valid() and payment_form.is_valid()):
+ reg.organisation = registration_form.data.get('organisation')
+ reg.occupation = registration_form.data.get('occupation')
+ reg.city = registration_form.data.get('city')
+ reg.phone_num = registration_form.data.get('phone_num')
+ reg.postcode = registration_form.data.get('postcode')
+ #reg.tshirt = registration_form.data.get('tshirt')
+ reg.allow_contact = registration_form.data.get(
+ 'allow_contact') and True or False
+ reg.conference = registration_form.data.get(
+ 'conference') and True or False
+ reg.tutorial = registration_form.data.get(
+ 'tutorial') and True or False
+ reg.sprint = registration_form.data.get(
+ 'sprint') and True or False
+ reg.save()
+
+ wifi = wifi_form.save(reg.registrant, reg.scope)
+ acco = acco_form.save(reg.registrant, reg.scope)
+ payment = payment_form.save(reg.registrant, reg.scope)
+
+ # Saved.. redirect
+ redirect_to = reverse('scipycon_account', kwargs={'scope': scope})
+
+ return set_message_cookie(redirect_to,
+ msg = u'Your changes have been saved.')
+ else:
+ registration_form = RegistrationEditForm(initial={
+ 'id' : id,
+ 'organisation' : reg.organisation,
+ 'occupation' : reg.occupation,
+ 'city' : reg.city,
+ 'phone_num': reg.phone_num,
+ #'tshirt' : reg.tshirt,
+ 'conference': reg.conference,
+ 'tutorial': reg.tutorial,
+ 'postcode' : reg.postcode,
+ 'sprint' : reg.sprint,
+ 'allow_contact' : reg.allow_contact,
+ })
+ wifi_form = WifiForm(initial={
+ 'user': wifi.user,
+ 'scope': wifi.scope,
+ 'wifi': wifi.wifi,
+ 'registration_id': wifi.registration_id
+ })
+ acco_form = AccommodationForm(initial={
+ 'user': acco.user,
+ 'scope': acco.scope,
+ 'sex': acco.sex,
+ 'accommodation_required': acco.accommodation_required,
+ 'accommodation_on_1st': acco.accommodation_on_1st,
+ 'accommodation_on_2nd': acco.accommodation_on_2nd,
+ 'accommodation_on_3rd': acco.accommodation_on_3rd,
+ 'accommodation_on_4th': acco.accommodation_on_4th,
+ 'accommodation_on_5th': acco.accommodation_on_5th,
+ 'accommodation_on_6th': acco.accommodation_on_6th,
+ })
+ payment_form = PaymentForm(initial={
+ 'user': payment.user,
+ 'scope': payment.scope,
+ 'paid': payment.type or payment.details,
+ 'type': payment.type,
+ 'details': payment.details,
+ })
+
+ return render_to_response(
+ template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ 'registration': {'id': id},
+ 'registration_form': registration_form,
+ 'wifi_form': wifi_form,
+ 'acco_form': acco_form,
+ 'payment_form': payment_form}))
+
+def submit_registration(request, scope,
+ template_name='registration/submit-registration.html'):
+ """Allows user to edit registration
+ """
+
+ user = request.user
+ reg_count = Registration.objects.all().count()
+
+ scope_entity = Event.objects.get(scope=scope)
+
+ if user.is_authenticated():
+ try:
+ profile = user.get_profile()
+ except:
+ profile, new = UserProfile.objects.get_or_create(
+ user=user, scope=scope_entity)
+ if new:
+ profile.save()
+ try:
+ registration = Registration.objects.get(registrant=user)
+ if registration:
+ redirect_to = reverse('scipycon_account',
+ kwargs={'scope': scope})
+ 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)
+ acco_form = AccommodationForm(data=request.POST)
+ payment_form = PaymentForm(data=request.POST)
+
+ if request.POST.get('action', None) == 'login':
+ login_form = AuthenticationForm(data=request.POST)
+ if login_form.is_valid():
+
+ login(request, login_form.get_user())
+
+ redirect_to = reverse('scipycon_submit_registration',
+ kwargs={'scope': scope})
+ 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 = scipycon_createregistrant(
+ request, registrant_form.data, scope)
+
+ # Log in user
+ passwd = User.objects.make_random_password()
+ newuser.set_password(passwd)
+ newuser.save()
+
+ user = authenticate(username=newuser.username, password=passwd)
+
+ login(request, user)
+
+ newuser = user
+
+ else:
+ newuser = user
+
+ if (registration_form.is_valid() and newuser and wifi_form.is_valid()
+ and acco_form.is_valid() and payment_form.is_valid()):
+ allow_contact = registration_form.cleaned_data.get(
+ 'allow_contact') and True or False
+ conference = registration_form.cleaned_data.get(
+ 'conference') and True or False
+ tutorial = registration_form.cleaned_data.get('tutorial') and \
+ True or False
+ sprint = registration_form.cleaned_data.get('sprint') and \
+ True or False
+
+ registrant = User.objects.get(pk=newuser.id)
+
+ reg = Registration(
+ scope=scope_entity,
+ registrant = registrant,
+ organisation = registration_form.cleaned_data.get(
+ 'organisation'),
+ occupation = registration_form.cleaned_data.get('occupation'),
+ city = registration_form.cleaned_data.get('city'),
+ #tshirt = registration_form.data.get('tshirt'),
+ postcode = registration_form.cleaned_data.get('postcode'),
+ phone_num = registration_form.cleaned_data.get('phone_num'),
+ 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 = 'SCIPYIN2010%04d' % id
+ reg.slug = slug
+ reg.save()
+
+ wifi = wifi_form.save(registrant, scope_entity)
+ acco = acco_form.save(registrant, scope_entity)
+ payment = payment_form.save(registrant, scope_entity)
+
+ send_confirmation(registrant, scope_entity, password=passwd)
+
+ redirect_to = reverse('scipycon_registrations',
+ kwargs={'scope': scope})
+ 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()
+ acco_form = AccommodationForm()
+ payment_form = PaymentForm()
+
+ login_form = AuthenticationForm()
+
+
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ 'registration_form': registration_form,
+ 'registrant_form' : registrant_form,
+ 'over_reg' : reg_count >= REG_TOTAL and True or False,
+ 'acco_form': acco_form,
+ 'payment_form': payment_form,
+ 'wifi_form' : wifi_form,
+ 'message' : message,
+ 'login_form' : login_form
+ }))
+
+
+@login_required
+def regstats(request, scope,
+ template_name='registration/regstats.html'):
+ """View that gives the statistics of registrants.
+ """
+
+ if not request.user.is_staff:
+ redirect_to = reverse('scipycon_login', kwargs={'scope': scope})
+ return set_message_cookie(
+ redirect_to, msg = u'You must be a staff on this website to '
+ 'access this page.')
+
+ reg_q = Registration.objects.all()
+ conf_num = reg_q.filter(conference=True).count()
+ tut_num = reg_q.filter(tutorial=True).count()
+ sprint_num = reg_q.filter(sprint=True).count()
+
+ acco_q = Accommodation.objects.all()
+ male = acco_q.filter(sex='Male').count()
+ female = acco_q.filter(sex='Female').count()
+
+ # Day 1 details
+ day1 = acco_q.filter(accommodation_on_1st=True)
+ acco_1 = {
+ 'total': day1.count(),
+ 'male': day1.filter(sex='Male').count(),
+ 'female': day1.filter(sex='Female').count()
+ }
+
+ # Day 2 details
+ day2 = acco_q.filter(accommodation_on_2nd=True)
+ acco_2 = {
+ 'total': day2.count(),
+ 'male': day2.filter(sex='Male').count(),
+ 'female': day2.filter(sex='Female').count()
+ }
+
+ # Day 3 details
+ day3 = acco_q.filter(accommodation_on_3rd=True)
+ acco_3 = {
+ 'total': day3.count(),
+ 'male': day3.filter(sex='Male').count(),
+ 'female': day3.filter(sex='Female').count()
+ }
+
+ # Day 4 details
+ day4 = acco_q.filter(accommodation_on_4th=True)
+ acco_4 = {
+ 'total': day4.count(),
+ 'male': day4.filter(sex='Male').count(),
+ 'female': day4.filter(sex='Female').count()
+ }
+
+
+ # Day 5 details
+ day5 = acco_q.filter(accommodation_on_5th=True)
+ acco_5 = {
+ 'total': day5.count(),
+ 'male': day5.filter(sex='Male').count(),
+ 'female': day5.filter(sex='Female').count()
+ }
+
+ # Day 6 details
+ day6 = acco_q.filter(accommodation_on_6th=True)
+ acco_6 = {
+ 'total': day6.count(),
+ 'male': day6.filter(sex='Male').count(),
+ 'female': day6.filter(sex='Female').count()
+ }
+
+ return render_to_response(template_name, RequestContext(request,
+ {'params': {'scope': scope},
+ 'conf_num': conf_num,
+ 'tut_num': tut_num,
+ 'sprint_num': sprint_num,
+ 'male': male,
+ 'female':female,
+ 'acco_days': [acco_1, acco_2, acco_3, acco_4, acco_5, acco_6],
+ }))
+
+@login_required
+def regstats_download(request, scope):
+ """Sends a downloadable PDF for registration statistics
+ """
+
+ if not request.user.is_staff:
+ redirect_to = reverse('scipycon_login')
+ return HttpResponseRedirect(redirect_to)
+
+ filename = 'regstats%s.csv' % datetime.datetime.strftime(
+ datetime.datetime.now(), '%Y%m%d%H%M%S')
+
+ response = HttpResponse(mimetype='text/csv')
+ response['Content-Disposition'] = 'attachment; filename=%s' % (
+ filename)
+
+ output = csv.writer(response)
+
+ output.writerow(['Name', 'Gender', 'City',
+ 'Registration Fees Paid',
+ 'Attending Conference',
+ 'Attending Tutorial',
+ 'Attending Sprint',
+ 'Laptop Identification Number',
+ 'Accommodation Fees Paid',
+ 'Accommodation on 12th night',
+ 'Accommodation on 13th night',
+ 'Accommodation on 14th night',
+ 'Accommodation on 15th night',
+ 'Accommodation on 16th night',
+ 'Accommodation on 17th night'])
+
+ regs = Registration.objects.order_by(
+ 'registrant__first_name', 'registrant__last_name')
+ for reg in regs:
+ row = []
+
+ payment, create = reg.registrant.payment_set.get_or_create(
+ user=reg.registrant, scope=reg.scope)
+ acco, created = reg.registrant.accommodation_set.get_or_create(
+ user=reg.registrant, scope=reg.scope)
+ wifi, create = reg.registrant.wifi_set.get_or_create(
+ user=reg.registrant, scope=reg.scope)
+
+ row.append('"%s"' % reg.registrant.get_full_name())
+ row.append(acco.sex)
+ row.append(reg.city)
+ row.append('Yes' if payment.confirmed else 'No')
+ row.append('Yes' if reg.conference else 'No')
+ row.append('Yes' if reg.tutorial else 'No')
+ row.append('Yes' if reg.sprint else 'No')
+ row.append(wifi.registration_id)
+ row.append('Yes' if payment.acco_confirmed
+ else 'No')
+ row.append('Yes' if acco.accommodation_on_1st else 'No')
+ row.append('Yes' if acco.accommodation_on_2nd else 'No')
+ row.append('Yes' if acco.accommodation_on_3rd else 'No')
+ row.append('Yes' if acco.accommodation_on_4th else 'No')
+ row.append('Yes' if acco.accommodation_on_5th else 'No')
+ row.append('Yes' if acco.accommodation_on_6th else 'No')
+ output.writerow(row)
+
+ #output.writerow()
+ return response
+
+
+@login_required
+def manage_payments(request, scope,
+ template_name='registration/manage_payments.html'):
+ """View that gives a form to manage payments.
+ """
+
+ if not request.user.is_superuser:
+ redirect_to = reverse('scipycon_login', kwargs={'scope': scope})
+ return set_message_cookie(
+ redirect_to, msg = u'You must be an admin on this website to '
+ 'access this page.')
+
+ message = None
+
+ scope_entity = Event.objects.get(scope=scope)
+
+ if request.method == 'POST':
+ post_data = request.POST
+ list_user_ids = []
+
+ mail_subject = 'SciPy.in 2010: Confirmation of fee payment'
+ mail_template = 'notifications/payment_confirmation2010.html'
+
+ def parse_form():
+ """Helper function that gets the User ID from the
+ form name
+ """
+
+ confirmed_ids = []
+ acco_ids = []
+ date_ids = {}
+
+ for name_string in post_data:
+ id_str_list = name_string.split('_')
+ if (len(id_str_list) == 3 and id_str_list[1] == 'id'):
+ if id_str_list[0] == 'confirmed':
+ confirmed_ids.append(int(id_str_list[2]))
+ if id_str_list[0] == 'acco':
+ acco_ids.append(int(id_str_list[2]))
+ if id_str_list[0] == 'date':
+ date_str = post_data.get(name_string, None)
+ if date_str:
+ date_ids[int(id_str_list[2])] = post_data.get(
+ name_string, '')
+
+ return confirmed_ids, acco_ids, date_ids
+
+ confirmed_ids, acco_ids, date_ids = parse_form()
+
+ confirmed_users = set(User.objects.filter(id__in=confirmed_ids))
+ acco_users = set(User.objects.filter(id__in=acco_ids))
+
+ # Users for whom both registration and accommodation is confirmed
+ for user in confirmed_users & acco_users:
+ payment, created = user.payment_set.get_or_create(
+ user=user, scope=scope_entity)
+
+ payment.confirmed = True
+ payment.acco_confirmed = True
+ payment.save()
+
+ if not payment.confirmed_mail and not payment.acco_confirmed_mail:
+ mail_message = loader.render_to_string(
+ mail_template,
+ dictionary={'name': user.get_full_name(),
+ 'acco': True,
+ 'reg': True})
+ user.email_user(mail_subject, mail_message,
+ from_email='admin@scipy.in')
+ payment.confirmed_mail =True
+ payment.acco_confirmed_mail = True
+ payment.save()
+
+ # Users for whom only registration is confirmed
+ for user in confirmed_users - acco_users:
+ payment, created = user.payment_set.get_or_create(
+ user=user, scope=scope_entity)
+
+ payment.confirmed = True
+ payment.save()
+
+ if not payment.confirmed_mail:
+ mail_message = loader.render_to_string(
+ mail_template,
+ dictionary={'name': user.get_full_name(),
+ 'reg': True})
+ user.email_user(mail_subject, mail_message,
+ from_email='admin@scipy.in')
+ payment.confirmed_mail =True
+ payment.save()
+
+ # Users for whom only accommodation is confirmed
+ for user in acco_users - confirmed_users:
+ payment, created = user.payment_set.get_or_create(
+ user=user, scope=scope_entity)
+
+ payment.acco_confirmed = True
+ payment.save()
+
+ if not payment.acco_confirmed_mail:
+ mail_message = loader.render_to_string(
+ mail_template,
+ dictionary={'name': user.get_full_name(),
+ 'acco': True})
+ user.email_user(mail_subject, mail_message,
+ from_email='admin@scipy.in')
+ payment.acco_confirmed_mail = True
+ payment.save()
+
+ # Users for whom fee payment date is updated
+ for id in date_ids:
+ user = User.objects.get(id=id)
+ payment, created = user.payment_set.get_or_create(
+ user=user, scope=scope_entity)
+
+ time_format = "%m/%d/%Y"
+ date = datetime.datetime.fromtimestamp(time.mktime(
+ time.strptime(date_ids[id], time_format)))
+
+ payment.date_confirmed = date
+ payment.save()
+
+ registrants = Registration.objects.all()
+
+ return render_to_response(template_name, RequestContext(request,
+ {'params': {'scope': scope},
+ 'registrants': registrants,
+ }))