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