Source code for oioioi.oi.views
from django.conf import settings
from django.core.exceptions import SuspiciousOperation
from django.db.models import Q
from django.http import Http404, HttpResponse
from django.shortcuts import redirect
from django.template.loader import render_to_string
from django.template.response import SimpleTemplateResponse, TemplateResponse
from django.views.decorators.http import require_GET, require_POST
from oioioi.base.permissions import enforce_condition, not_anonymous
from oioioi.contests.utils import is_contest_admin
from oioioi.dashboard.registry import dashboard_headers_registry
from oioioi.oi.controllers import OIRegistrationController
from oioioi.oi.forms import AddSchoolForm, SchoolSelect, city_options, school_options
from oioioi.oi.models import School
from oioioi.participants.utils import is_participant
@dashboard_headers_registry.register_decorator(order=10)
[docs]def registration_notice_fragment(request):
rc = request.contest.controller.registration_controller()
if (
isinstance(rc, OIRegistrationController)
and request.user.is_authenticated
and not is_contest_admin(request)
and not is_participant(request)
):
return render_to_string('oi/registration_notice.html', request=request)
else:
return None
@require_GET
@enforce_condition(not_anonymous)
[docs]def cities_view(request):
if 'province' not in request.GET:
raise SuspiciousOperation
province = request.GET['province']
options = city_options(province)
return HttpResponse(SchoolSelect(choices=options).render_options([]))
@require_GET
@enforce_condition(not_anonymous)
[docs]def schools_view(request):
if 'province' not in request.GET or 'city' not in request.GET:
raise SuspiciousOperation
province = request.GET['province']
city = request.GET['city']
options = school_options(province, city)
return HttpResponse(SchoolSelect(choices=options).render_options([]))
@enforce_condition(not_anonymous)
[docs]def add_school_view(request):
if request.method == 'POST':
form = AddSchoolForm(request.POST)
if form.is_valid():
school = form.save(commit=False)
school.is_approved = False
school.save()
if 'oi_oiregistrationformdata' in request.session:
data = request.session['oi_oiregistrationformdata']
data['school'] = school.id
request.session['oi_oiregistrationformdata'] = data
return redirect('participants_register', contest_id=request.contest.id)
else:
return redirect('default_contest_view', contest_id=request.contest.id)
else:
form = AddSchoolForm()
return TemplateResponse(request, 'forms/add_school_form.html', {'form': form})
@enforce_condition(not_anonymous)
[docs]def choose_school_view(request, school_id):
if not School.objects.filter(id=school_id, is_active=True).exists():
raise Http404
if 'oi_oiregistrationformdata' in request.session:
data = request.session['oi_oiregistrationformdata']
data['school'] = school_id
# Explicitly mark session data as dirty
request.session['oi_oiregistrationformdata'] = data
return redirect('participants_register', contest_id=request.contest.id)
else:
return redirect('default_contest_view', contest_id=request.contest.id)
@require_POST
@enforce_condition(not_anonymous)
[docs]def schools_similar_view(request):
schools = School.objects.filter(is_active=True)
num_hints = getattr(settings, 'NUM_HINTS', 10)
if 'postal_code' in request.POST and request.POST['postal_code']:
schools = schools.filter(postal_code=request.POST['postal_code'])
elif 'city' in request.POST and request.POST['city']:
schools = schools.filter(city=request.POST['city'])
elif 'province' in request.POST and request.POST['province']:
schools = schools.filter(province=request.POST['province'])
if 'address' in request.POST and request.POST['address']:
address = request.POST['address']
qobj = Q(address=address)
for w in address.split():
qobj |= Q(address__contains=w)
# priority for schools with a matching part of the address
schools = list(schools.filter(qobj)[:num_hints]) + list(
schools.filter(~qobj)[:num_hints]
)
schools = schools[:num_hints]
if schools:
return SimpleTemplateResponse(
'oi/schools_similar_confirm.html', {'schools': schools}
)
else:
return HttpResponse('')