stage 2: nice button
[edumed.git] / wtem / views.py
index d47a2be..fa327c8 100644 (file)
@@ -1,34 +1,64 @@
 # -*- coding: utf-8 -*-
 import json
 from copy import deepcopy
 # -*- coding: utf-8 -*-
 import json
 from copy import deepcopy
+from functools import wraps
 
 from django.conf import settings
 from django.contrib import messages
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseForbidden
 
 from django.conf import settings
 from django.contrib import messages
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseForbidden
-from django.http.response import HttpResponseRedirect
+from django.http.response import HttpResponseRedirect, Http404
 from django.shortcuts import render, get_object_or_404
 from django.shortcuts import render, get_object_or_404
+from django.utils import timezone
+from django.utils.cache import patch_cache_control, add_never_cache_headers
 from django.views.decorators.cache import never_cache
 from django.views.decorators.csrf import csrf_exempt
 
 from django.views.decorators.cache import never_cache
 from django.views.decorators.csrf import csrf_exempt
 
-from wtem.models import Confirmation
+from wtem.models import Confirmation, TeacherConfirmation
 from .forms import WTEMForm, WTEMSingleForm
 from .models import Submission, DEBUG_KEY, exercises, CompetitionState
 
 
 from .forms import WTEMForm, WTEMSingleForm
 from .models import Submission, DEBUG_KEY, exercises, CompetitionState
 
 
+def cache_until_start(view_func):
+    @wraps(view_func)
+    def _wrapped_view_func(request, *args, **kwargs):
+        response = view_func(request, *args, **kwargs)
+        max_age = max(int((CompetitionState.start - timezone.now()).total_seconds()) + 1, 0)
+        if max_age:
+            patch_cache_control(response, max_age=max_age)
+        else:
+            add_never_cache_headers(response)
+        return response
+
+    return _wrapped_view_func
+
+
+def get_submission(submission_id):
+    try:
+        submission_id = int(submission_id)
+    except ValueError:
+        raise Http404
+    return get_object_or_404(Submission, id=submission_id)
+
+
 @csrf_exempt
 def form(request, submission_id, key):
     state = CompetitionState.get_state()
     if state == CompetitionState.DURING:
         state = 'single'
 @csrf_exempt
 def form(request, submission_id, key):
     state = CompetitionState.get_state()
     if state == CompetitionState.DURING:
         state = 'single'
+    if request.META['REMOTE_ADDR'] in getattr(settings, 'WTEM_CONTEST_IP_ALLOW', []):
+        state = 'single'
     return globals()['form_' + state](request, submission_id, key)
 
 
     return globals()['form_' + state](request, submission_id, key)
 
 
+@cache_until_start
 def form_before(request, submission_id, key):
 def form_before(request, submission_id, key):
-    submission = Submission.objects.get(id=submission_id)
+    submission = get_submission(submission_id)
     if submission.key != key:
         return render(request, 'wtem/key_not_found_before.html')
     else:
     if submission.key != key:
         return render(request, 'wtem/key_not_found_before.html')
     else:
+        submission.opened_link = True
+        submission.save()
         return render(request, 'wtem/main_before.html')
 
 
         return render(request, 'wtem/main_before.html')
 
 
@@ -40,9 +70,8 @@ def form_after(request, submission_id, key):
 @csrf_exempt
 def form_during(request, key):
 
 @csrf_exempt
 def form_during(request, key):
 
-    if CompetitionState.get_state() != CompetitionState.DURING:
-        if request.META['REMOTE_ADDR'] not in getattr(settings, 'WTEM_CONTEST_IP_ALLOW', []):
-            return HttpResponseForbidden('Not allowed')
+    if request.META['REMOTE_ADDR'] not in getattr(settings, 'WTEM_CONTEST_IP_ALLOW', []):
+        return HttpResponseForbidden('Not allowed')
 
     try:
         submission = Submission.objects.get(key=key)
 
     try:
         submission = Submission.objects.get(key=key)
@@ -64,7 +93,11 @@ def form_during(request, key):
             for field in exercise['fields']:
                 field['saved_answer'] = field_answers.get(field['id'], '')
     if request.method == 'GET':
             for field in exercise['fields']:
                 field['saved_answer'] = field_answers.get(field['id'], '')
     if request.method == 'GET':
-        return render(request, 'wtem/main.html', {'exercises': exercises_with_answers, 'end_time': submission.end_time})
+        return render(request, 'wtem/main.html', {
+            'exercises': exercises_with_answers,
+            'end_time': submission.end_time,
+            'show_answers': True,
+        })
     elif request.method == 'POST':
         form = WTEMForm(request.POST, request.FILES, instance=submission)
         if form.is_valid():
     elif request.method == 'POST':
         form = WTEMForm(request.POST, request.FILES, instance=submission)
         if form.is_valid():
@@ -81,7 +114,7 @@ def form_single(request, submission_id, key):
         if request.META['REMOTE_ADDR'] not in getattr(settings, 'WTEM_CONTEST_IP_ALLOW', []):
             return HttpResponseForbidden('Not allowed')
 
         if request.META['REMOTE_ADDR'] not in getattr(settings, 'WTEM_CONTEST_IP_ALLOW', []):
             return HttpResponseForbidden('Not allowed')
 
-    submission = Submission.objects.get(id=submission_id)
+    submission = get_submission(submission_id)
     if submission.key != key:
         return render(request, 'wtem/key_not_found.html')
 
     if submission.key != key:
         return render(request, 'wtem/key_not_found.html')
 
@@ -102,23 +135,27 @@ def form_single(request, submission_id, key):
             except ValueError as e:
                 if e.message == 'wrong exercise id':
                     messages.error(request, u'Próba wysłania odpowiedzi ponownie lub poza kolejnością')
             except ValueError as e:
                 if e.message == 'wrong exercise id':
                     messages.error(request, u'Próba wysłania odpowiedzi ponownie lub poza kolejnością')
-            print 'wysyłam redirect', i
+                elif e.message == 'no answer':
+                    messages.error(request, u'Wybierz przynajmniej jedną odpowiedź')
             return HttpResponseRedirect(reverse('wtem_form', kwargs={'submission_id': submission_id, 'key': key}))
         else:
             return HttpResponseRedirect(reverse('wtem_form', kwargs={'submission_id': submission_id, 'key': key}))
         else:
-            raise Exception
+            raise Exception(u'Błędna wartość w formularzu')
 
 
 
 
-@never_cache
+@cache_until_start
 @csrf_exempt
 def start(request, submission_id, key):
     state = CompetitionState.get_state()
     if state in (CompetitionState.BEFORE, CompetitionState.AFTER):
         return globals()['form_' + state](request, submission_id, key)
 
 @csrf_exempt
 def start(request, submission_id, key):
     state = CompetitionState.get_state()
     if state in (CompetitionState.BEFORE, CompetitionState.AFTER):
         return globals()['form_' + state](request, submission_id, key)
 
-    submission = Submission.objects.get(id=submission_id)
+    submission = get_submission(submission_id)
     if submission.key != key:
         return render(request, 'wtem/key_not_found.html')
 
     if submission.key != key:
         return render(request, 'wtem/key_not_found.html')
 
+    submission.opened_link = True
+    submission.save()
+
     i, exercise = submission.current_exercise()
     if not exercise:
         return render(request, 'wtem/thanks_single.html')
     i, exercise = submission.current_exercise()
     if not exercise:
         return render(request, 'wtem/thanks_single.html')
@@ -133,3 +170,19 @@ def confirmation(request, id, key):
         conf.confirmed = True
         conf.save()
     return render(request, 'wtem/confirmed.html', {'confirmation': conf, 'was_confirmed': was_confirmed})
         conf.confirmed = True
         conf.save()
     return render(request, 'wtem/confirmed.html', {'confirmation': conf, 'was_confirmed': was_confirmed})
+
+
+def teacher_confirmation(request, id, key):
+    conf = get_object_or_404(TeacherConfirmation, id=id, key=key)
+    was_confirmed = conf.confirmed
+    if not was_confirmed:
+        conf.confirmed = True
+        conf.save()
+    from contact.forms import contact_forms
+    form_class = contact_forms['olimpiada']
+    if not form_class.is_disabled():
+        pass
+    return render(request, 'wtem/teacher_confirmed.html', {
+        'confirmation': conf,
+        'was_confirmed': was_confirmed,
+    })