b5e588d17c77d959c5ab46e7ffc0815bcc71c970
[koed-quiz.git] / apps / quiz / models.py
1 # -*- coding: utf-8 -*-
2 # This file is part of KOED-Quiz, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from django.db import models
6 from django.contrib.sites.models import Site
7 from django.utils.translation import ugettext_lazy as _
8
9 from django.conf import settings
10
11
12 class Quiz(Site):
13     description = models.TextField()
14     footer = models.TextField(null=True, blank=True)
15
16     class Meta:
17         verbose_name = _('quiz')
18         verbose_name_plural = _('quizzes')
19
20     @classmethod
21     def current(cls):
22         return cls.objects.get(id=settings.SITE_ID)
23
24     def start(self):
25         return self.question_set.all()[0]
26
27     @models.permalink
28     def get_absolute_url(self):
29         return ('quiz', )
30
31     def where_to(self):
32         try:
33             return Result.objects.get(quiz=self).get_absolute_url()
34         except Result.DoesNotExist:
35             # just go to the beginning
36             return self.get_absolute_url()
37
38
39 class Result(models.Model):
40     quiz = models.ForeignKey(Quiz)
41     slug = models.SlugField(db_index=True)
42     title = models.CharField(max_length=255)
43     text = models.TextField()
44
45     class Meta:
46         verbose_name = _('result')
47         verbose_name_plural = _('results')
48         ordering = ['quiz', 'title']
49
50     def __unicode__(self):
51         return self.title
52
53     @models.permalink
54     def get_absolute_url(self):
55         return ('quiz_result', [self.slug])
56
57
58 class Question(models.Model):
59     quiz = models.ForeignKey(Quiz)
60     slug = models.SlugField(db_index=True)
61     ordering = models.SmallIntegerField()
62     title = models.CharField(max_length=255)
63     text = models.TextField(null=True, blank=True)
64     description = models.TextField(null=True, blank=True)
65
66     class Meta:
67         verbose_name = _('question')
68         verbose_name_plural = _('questions')
69         ordering = ['quiz', 'ordering']
70         unique_together = [['quiz', 'slug'], ['quiz', 'ordering']]
71
72     def __unicode__(self):
73         return self.title
74
75     @models.permalink
76     def get_absolute_url(self):
77         return ('quiz', [self.slug])
78
79     def where_to(self):
80         later = self.quiz.question_set.filter(ordering__gt=self.ordering)
81         if later.exists():
82             return later[0].get_absolute_url()
83         else:
84             return self.quiz.where_to()
85
86
87
88 class Answer(models.Model):
89     title = models.CharField(max_length=255)
90     question = models.ForeignKey(Question)
91     go_to = models.ForeignKey(Question, null=True, blank=True,
92             related_name='go_tos')
93     result = models.ForeignKey(Result, null=True, blank=True)
94     ordering = models.SmallIntegerField()
95
96     class Meta:
97         verbose_name = _('answer')
98         verbose_name_plural = _('answers')
99         ordering = ['question', 'ordering']
100
101     def __unicode__(self):
102         return self.title
103
104     def where_to(self):
105         # follow explicit redirects
106         if self.result:
107             return self.result.get_absolute_url()
108         elif self.go_to:
109             return self.go_to.get_absolute_url()
110
111         # or just get the next question
112         return self.question.where_to()