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')