Change URLs, add link to keywords
[oweals/karmaworld.git] / karmaworld / apps / quizzes / views.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2014  FinalsClub Foundation
4 from itertools import chain
5 from django.core.exceptions import ObjectDoesNotExist
6 from django.core.urlresolvers import reverse
7 from django.forms.formsets import formset_factory
8 from django.http import HttpResponseRedirect
9
10 from django.views.generic import DetailView, FormView
11 from django.views.generic.detail import SingleObjectMixin
12 from django.views.generic.edit import FormMixin, ProcessFormView
13 from karmaworld.apps.notes.models import Note
14 from karmaworld.apps.quizzes.forms import KeywordForm
15 from karmaworld.apps.quizzes.models import Quiz, ALL_QUESTION_CLASSES, Keyword
16
17
18 class QuizView(DetailView):
19     queryset = Quiz.objects.all()
20     model = Quiz
21     context_object_name = 'quiz'  # name passed to template
22     template_name = 'quizzes/quiz.html'
23
24     def get_context_data(self, **kwargs):
25         all_questions = []
26         for cls in ALL_QUESTION_CLASSES:
27             all_questions.append(
28                 [(cls.__name__, o) for o in cls.objects.filter(quiz=self.object)]
29             )
30
31         result_list = sorted(chain.from_iterable(all_questions),
32                              key=lambda o: o[1].timestamp,
33                              reverse=True)
34
35         kwargs['questions'] = result_list
36
37         return super(QuizView, self).get_context_data(**kwargs)
38
39
40 class KeywordEditView(FormView):
41     template_name = 'quizzes/keyword_edit.html'
42     form_class = formset_factory(KeywordForm)
43
44     def get(self, requests, *args, **kwargs):
45         self.lookup_note()
46         return super(KeywordEditView, self).get(requests, *args, **kwargs)
47
48     def post(self, requests, *args, **kwargs):
49         self.lookup_note()
50         return super(KeywordEditView, self).post(requests, *args, **kwargs)
51
52     def lookup_note(self):
53         self.note = Note.objects.get(slug=self.kwargs['slug'])
54
55     def get_success_url(self):
56         return reverse('keyword_edit', args=(self.note.course.school.slug, self.note.course.slug, self.note.slug))
57
58     def get_initial(self):
59         existing_keywords = self.note.keyword_set.order_by('id')
60         initial_data = [{'keyword': keyword.word, 'definition': keyword.definition, 'id': keyword.pk}
61                         for keyword in existing_keywords]
62         return initial_data
63
64     def get_context_data(self, **kwargs):
65         kwargs['note'] = self.note
66         kwargs['prototype_form'] = KeywordForm
67         return super(KeywordEditView, self).get_context_data(**kwargs)
68
69     def form_valid(self, formset):
70         for form in formset:
71             word = form['keyword'].data
72             definition = form['definition'].data
73             id = form['id'].data
74             if word == '':
75                 continue
76             try:
77                 keyword_object = Keyword.objects.get(id=id)
78             except (ValueError, ObjectDoesNotExist):
79                 keyword_object = Keyword()
80
81             keyword_object.note = self.note
82             keyword_object.word = word
83             keyword_object.definition = definition
84             keyword_object.save()
85
86         return super(KeywordEditView, self).form_valid(formset)
87