hook mailchimp to contact forms
[edumed.git] / wtem / views.py
index d47a2be..1dea093 100644 (file)
@@ -1,13 +1,16 @@
 # -*- 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
 
@@ -16,6 +19,28 @@ from .forms import WTEMForm, WTEMSingleForm
 from .models import Submission, DEBUG_KEY, exercises, CompetitionState
 
 
 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()
 @csrf_exempt
 def form(request, submission_id, key):
     state = CompetitionState.get_state()
@@ -24,11 +49,14 @@ def form(request, submission_id, key):
     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')
 
 
@@ -81,7 +109,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 +130,25 @@ 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
             return HttpResponseRedirect(reverse('wtem_form', kwargs={'submission_id': submission_id, 'key': key}))
         else:
             raise Exception
 
 
             return HttpResponseRedirect(reverse('wtem_form', kwargs={'submission_id': submission_id, 'key': key}))
         else:
             raise Exception
 
 
-@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')