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