2b2e8754a88636d9efa603023764ac89cef55118
[edumed.git] / stage2 / views.py
1 # -*- coding: utf-8 -*-
2 from django.core.urlresolvers import reverse
3 from django.http import Http404
4 from django.http.response import HttpResponseRedirect, HttpResponse
5 from django.shortcuts import get_object_or_404, render
6 from django.utils import timezone
7 from django.views.decorators.http import require_POST
8
9 from stage2.forms import AttachmentForm
10 from stage2.models import Participant, Assignment, Answer, Attachment
11
12
13 def participant_view(request, participant_id, key):
14     participant = get_object_or_404(Participant, id=participant_id)
15     if not participant.check(key):
16         raise Http404
17     now = timezone.now()
18     assignments = Assignment.objects.all()
19     for assignment in assignments:
20         assignment.active = assignment.deadline >= now
21         assignment.answer = assignment.answer_set.filter(participant=participant).first()
22         assignment.forms = [
23             (AttachmentForm(assignment=assignment, file_no=i, label=label),
24              assignment.answer.attachment_set.filter(file_no=i).first() if assignment.answer else None)
25             for i, label in enumerate(assignment.file_descriptions, 1)]
26     return render(request, 'stage2/participant.html', {
27         'participant': participant,
28         'assignments': assignments})
29
30
31 @require_POST
32 def upload(request, assignment_id, participant_id, key):
33     participant = get_object_or_404(Participant, id=participant_id)
34     if not participant.check(key):
35         raise Http404
36     assignment = get_object_or_404(Assignment, id=assignment_id)
37     now = timezone.now()
38     if assignment.deadline < now:
39         raise Http404  # TODO za późno
40     for i, label in enumerate(assignment.file_descriptions, 1):
41         answer, created = Answer.objects.get_or_create(participant=participant, assignment=assignment)
42         attachment, created = Attachment.objects.get_or_create(answer=answer, file_no=i)
43         form = AttachmentForm(
44             data=request.POST, files=request.FILES,
45             assignment=assignment, file_no=i, label=label, instance=attachment)
46         if form.is_valid():
47             form.save()
48     return HttpResponseRedirect(reverse('stage2_participant', args=(participant_id, key)))
49
50
51 def get_file(request, assignment_id, file_no, participant_id, key):
52     """We want to serve submitted files back to participants, but also validate their keys,
53        so static files are not good"""
54     participant = get_object_or_404(Participant, id=participant_id)
55     if not participant.check(key):
56         raise Http404
57     assignment = get_object_or_404(Assignment, id=assignment_id)
58     answer = get_object_or_404(Answer, participant=participant, assignment=assignment)
59     attachment = get_object_or_404(Attachment, answer=answer, file_no=file_no)
60     response = HttpResponse(content_type='application/force-download')
61     response.write(attachment.file.read())
62     response['Content-Disposition'] = 'attachment; filename="%s"' % attachment.filename()
63     response['Content-Length'] = response.tell()
64     return response