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