diff options
Diffstat (limited to 'project/scipycon/registration/forms.py')
-rw-r--r-- | project/scipycon/registration/forms.py | 251 |
1 files changed, 251 insertions, 0 deletions
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') |