Source code for oioioi.oi.forms

import datetime

from django import forms
from django.forms import ValidationError
from django.forms.widgets import SelectDateWidget
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _

from oioioi.oi.models import PROVINCES, OIRegistration, School


[docs]class AddSchoolForm(forms.ModelForm):
[docs] class Meta(object):
[docs] model = School
[docs] exclude = ['is_active', 'is_approved']
[docs]def city_options(province): cities = ( School.objects.filter(province=province, is_active=True) .order_by('city') .distinct() .values_list('city', flat=True) ) cities = list(zip(cities, cities)) cities.insert(0, ('', _("-- Choose city --"))) return cities
[docs]def school_options(province, city): schools = ( School.objects.filter(province=province, city=city, is_active=True) .order_by('name') .only('name', 'address') ) schools = [(s.id, u'%s (%s)' % (s.name, s.address)) for s in schools] schools.insert(0, ('', _("-- Choose school --"))) return schools
[docs]class SchoolSelect(forms.Select):
[docs] def render(self, name, value, attrs=None, renderer=None): # check if this is the default renderer if renderer is not None and not isinstance( renderer, forms.renderers.DjangoTemplates ): raise AssertionError school_id = -1 province = '' city = '' if value: try: school = School.objects.get(id=value) school_id = school.id province = school.province city = school.city except School.DoesNotExist: pass provinces = [('', _("-- Choose province --"))] + list(PROVINCES) cities = city_options(province) schools = school_options(province, city) attr = {'name': name, 'id': 'id_' + name} options = [ ('_province', provinces, province), ('_city', cities, city), ('', schools, school_id), ] selects = { 'attr': attr, 'options': options, # Do not show 'add new' link in admin view. Hack. 'show_add_new': 'oi_oiregistration' not in name, } return render_to_string('forms/school_select_form.html', selects)
[docs]class OIRegistrationForm(forms.ModelForm):
[docs] class Meta(object):
[docs] model = OIRegistration
[docs] exclude = ['participant']
[docs] class Media(object):
[docs] css = {'all': ('oi/reg.css',)}
[docs] js = ('oi/reg.js',)
def __init__(self, *args, **kwargs): super(OIRegistrationForm, self).__init__(*args, **kwargs) this_year = datetime.date.today().year years = list(reversed(range(this_year - 100, this_year + 1))) self.fields['birthday'].widget = SelectDateWidget(years=years) self.fields['school'].widget = SchoolSelect()
[docs] def set_terms_accepted_text(self, terms_accepted_phrase): if terms_accepted_phrase is None: self.fields['terms_accepted'].label = _("terms accepted") else: self.fields['terms_accepted'].label = mark_safe(terms_accepted_phrase.text)
[docs] def clean_school(self): school = self.cleaned_data['school'] if not school.is_active: raise forms.ValidationError(_("This school is no longer active.")) return school
[docs] def clean_terms_accepted(self): if not self.cleaned_data['terms_accepted']: raise forms.ValidationError(_("Terms not accepted")) return True