for bible
[wolnelektury.git] / src / polls / models.py
1 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
3 #
4 from django.db import models
5 from django.core.exceptions import ValidationError
6 from django.urls import reverse
7
8
9 USED_POLLS_KEY = 'used_polls'
10
11
12 class Poll(models.Model):
13
14     question = models.TextField('pytanie')
15     slug = models.SlugField('slug')
16     open = models.BooleanField('otwarta', default=False)
17
18     class Meta:
19         verbose_name = 'ankieta'
20         verbose_name_plural = 'ankiety'
21
22     def clean(self):
23         if self.open and Poll.objects.exclude(pk=self.pk).filter(slug=self.slug).exists():
24             raise ValidationError('Slug otwartej ankiety musi być unikalny')
25         return super(Poll, self).clean()
26
27     def __str__(self):
28         return self.question[:100] + ' (' + self.slug + ')'
29
30     def get_absolute_url(self):
31         return reverse('poll', args=[self.slug])
32
33     @property
34     def vote_count(self):
35         return self.items.all().aggregate(models.Sum('vote_count'))['vote_count__sum']
36
37     def voted(self, session):
38         return self.id in session.get(USED_POLLS_KEY, [])
39
40
41 class PollItem(models.Model):
42
43     poll = models.ForeignKey(Poll, models.CASCADE, related_name='items')
44     content = models.TextField('treść')
45     vote_count = models.IntegerField('licznik głosów', default=0)
46
47     class Meta:
48         verbose_name = 'pozycja ankiety'
49         verbose_name_plural = 'pozycje ankiety'
50
51     def __str__(self):
52         return self.content + ' @ ' + str(self.poll)
53
54     @property
55     def vote_ratio(self):
56         return (float(self.vote_count) / self.poll.vote_count) * 100 if self.poll.vote_count else 0
57
58     def vote(self, session):
59         self.vote_count += 1
60         self.save()
61         session.setdefault(USED_POLLS_KEY, []).append(self.poll.id)
62         session.save()