diff options
Diffstat (limited to 'papillon/polls/models.py')
-rw-r--r-- | papillon/polls/models.py | 105 |
1 files changed, 64 insertions, 41 deletions
diff --git a/papillon/polls/models.py b/papillon/polls/models.py index 411e75f..506ad79 100644 --- a/papillon/polls/models.py +++ b/papillon/polls/models.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2008-2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2008-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as @@ -28,39 +28,45 @@ from django.utils.translation import gettext_lazy as _ from papillon.settings import DAYS_TO_LIVE + class Category(models.Model): name = models.CharField(max_length=100) description = models.TextField() + def __unicode__(self): return self.name + class PollUser(models.Model): name = models.CharField(max_length=100) email = models.CharField(max_length=100) password = models.CharField(max_length=100) modification_date = models.DateTimeField(auto_now=True) + class Poll(models.Model): base_url = models.CharField(max_length=100, help_text=_('Copy this \ address and send it to voters who want to participate to this poll')) - admin_url = models.CharField(max_length=100, help_text=_("Address to \ + admin_url = models.CharField(max_length=100, help_text=_("Address to \ modify the current poll")) - author_name = models.CharField(verbose_name=_("Author name"), - max_length=100, help_text=_("Name, firstname or nickname of the author")) + author_name = models.CharField( + verbose_name=_("Author name"), + max_length=100, + help_text=_("Name, firstname or nickname of the author")) author = models.ForeignKey(PollUser, null=True, blank=True) name = models.CharField(max_length=200, verbose_name=_("Poll name"), help_text=_("Global name to present the poll")) - description = models.CharField(max_length=1000, - verbose_name=_("Poll description"), - help_text=_("Precise description of the poll")) + description = models.CharField( + max_length=1000, verbose_name=_("Poll description"), + help_text=_("Precise description of the poll")) category = models.ForeignKey(Category, null=True, blank=True) TYPE = (('P', _('Yes/No poll')), ('B', _('Yes/No/Maybe poll')), ('O', _('One choice poll')), ('V', _('Valuable choice poll')),) type = models.CharField(max_length=1, choices=TYPE, - verbose_name=_("Type of the poll"), - help_text=_("""Type of the poll: + verbose_name=_("Type of the poll"), + help_text=_("""Type of the poll: - "Yes/No poll" is the appropriate type for a simple multi-choice poll - "Yes/No/Maybe poll" allows voters to stay undecided @@ -68,23 +74,27 @@ modify the current poll")) - "Valuable choice poll" permit users to give a note between 0 to 9 to \ different choices """)) - dated_choices = models.BooleanField(verbose_name=_("Choices are dates"), - default=False, help_text=_("Check this option to choose between dates")) - enddate = models.DateTimeField(null=True, blank=True, -verbose_name=_("Closing date"), help_text=_("Closing date for participating to \ -the poll")) + dated_choices = models.BooleanField( + verbose_name=_("Choices are dates"), + default=False, + help_text=_("Check this option to choose between dates")) + enddate = models.DateTimeField( + null=True, blank=True, verbose_name=_("Closing date"), + help_text=_("Closing date for participating to the poll")) modification_date = models.DateTimeField(auto_now=True) - public = models.BooleanField(default=False, -verbose_name=_("Display the poll on main page"), help_text=_("Check this \ -option to make the poll public")) - opened_admin = models.BooleanField(default=False, -verbose_name=_("Allow users to add choices"), help_text=_("Check this option \ -to open the poll to new choices submitted by users")) - hide_choices = models.BooleanField(default=False, -verbose_name=_("Hide votes to new voters"), help_text=_("Check this option to \ -hide poll results to new users")) - open = models.BooleanField(default=True, -verbose_name=_("State of the poll"), help_text=_("Uncheck this option to close \ + public = models.BooleanField( + default=False, verbose_name=_("Display the poll on main page"), + help_text=_("Check this option to make the poll public")) + opened_admin = models.BooleanField( + default=False, verbose_name=_("Allow users to add choices"), + help_text=_("Check this option to open the poll to new choices " + "submitted by users")) + hide_choices = models.BooleanField( + default=False, verbose_name=_("Hide votes to new voters"), + help_text=_("Check this option to hide poll results to new users")) + open = models.BooleanField( + default=True, verbose_name=_("State of the poll"), + help_text=_("Uncheck this option to close \ the poll/check this option to reopen it")) def getTypeLabel(self): @@ -122,8 +132,8 @@ the poll/check this option to reopen it")) if not self.dated_choices: return choices = self.getChoices() - sort_fct = lambda x:datetime.datetime.strptime(x.name, - '%Y-%m-%d %H:%M:%S') + sort_fct = lambda x: datetime.datetime.strptime(x.name, + '%Y-%m-%d %H:%M:%S') choices = sorted(choices, key=sort_fct) for idx, choice in enumerate(choices): choice.order = idx @@ -131,45 +141,57 @@ the poll/check this option to reopen it")) class Admin: pass + class Meta: ordering = ['-modification_date'] + def __unicode__(self): return self.name + class Comment(models.Model): '''Comment for a poll''' poll = models.ForeignKey(Poll, related_name='comments') author_name = models.CharField(max_length=100) text = models.CharField(max_length=1000) date = models.DateTimeField(auto_now_add=True) + class Meta: ordering = ['date'] + class Voter(models.Model): user = models.ForeignKey(PollUser) poll = models.ForeignKey(Poll) creation_date = models.DateTimeField(auto_now_add=True) modification_date = models.DateTimeField(auto_now=True) + class Meta: ordering = ['creation_date'] + def __unicode__(self): - return _("Vote from %(user)s") % {'user':self.user.name} + return _("Vote from %(user)s") % {'user': self.user.name} + def getVotes(self, choice_ids): '''Get votes for a subset of choices ''' query = Vote.objects.filter(voter=self) - query = query.extra(where=['choice_id IN (%s)' \ - % ",".join([str(choice_id) for choice_id in choice_ids])]) + query = query.extra( + where=['choice_id IN (%s)' % ",".join( + [str(choice_id) for choice_id in choice_ids])]) return list(query.order_by('choice')) + class Choice(models.Model): poll = models.ForeignKey(Poll) name = models.CharField(max_length=200) order = models.IntegerField() limit = models.IntegerField(null=True, blank=True) available = models.BooleanField(default=True) + class Admin: pass + class Meta: ordering = ['order'] @@ -180,9 +202,9 @@ class Choice(models.Model): def set_date(self, value): self._date = value - #if not self.poll.dated_choices: - # self.name = value - #self.name = datetime.strftime(value, '%Y-%m-%d %H:%M:%S') + # if not self.poll.dated_choices: + # self.name = value + # self.name = datetime.strftime(value, '%Y-%m-%d %H:%M:%S') date = property(get_date, set_date) def getSum(self, balanced_poll=None): @@ -191,7 +213,7 @@ class Choice(models.Model): for vote in Vote.objects.filter(choice=self, value__isnull=False): sum += vote.value if balanced_poll: - return sum/2 + return sum / 2 return sum def changeOrder(self, idx=1): @@ -208,20 +230,21 @@ class Choice(models.Model): if choice == self: continue if idx < 0 and choice.order < self.order \ - and choice.order >= new_order: - choice.order += 1 - choice.save() + and choice.order >= new_order: + choice.order += 1 + choice.save() if idx > 0 and choice.order > self.order \ - and choice.order <= new_order: - choice.order -= 1 - choice.save() + and choice.order <= new_order: + choice.order -= 1 + choice.save() self.order = new_order self.save() + class Vote(models.Model): voter = models.ForeignKey(Voter) choice = models.ForeignKey(Choice) - VOTE = ((1, (_('Yes'), _('Yes'))), + VOTE = ((1, (_('Yes'), _('Yes'))), (0, (_('No'), _('Maybe')), ), (-1, (_('No'), _('No'))),) value = models.IntegerField(choices=VOTE, blank=True, null=True) |