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