diff options
Diffstat (limited to 'project/scipycon/registration')
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, + })) |