diff options
| author | etienne <etienne@07715635-78ed-41b0-aaf1-0afda6c37f35> | 2010-03-27 17:06:03 +0000 |
|---|---|---|
| committer | etienne <etienne@07715635-78ed-41b0-aaf1-0afda6c37f35> | 2010-03-27 17:06:03 +0000 |
| commit | 95729368a48257b110ea33dfb005785f8ed6734f (patch) | |
| tree | 8b99b375a4b4a2e121a9192910af15485ea2b7c3 /polls/models.py | |
| parent | 8ded76ae513b38d14773449e46543b54cf48ef49 (diff) | |
| download | Papillon-95729368a48257b110ea33dfb005785f8ed6734f.tar.bz2 Papillon-95729368a48257b110ea33dfb005785f8ed6734f.zip | |
Rearrange directories - include documentation
Diffstat (limited to 'polls/models.py')
| -rw-r--r-- | polls/models.py | 227 |
1 files changed, 0 insertions, 227 deletions
diff --git a/polls/models.py b/polls/models.py deleted file mode 100644 index f8b3b22..0000000 --- a/polls/models.py +++ /dev/null @@ -1,227 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2008 É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 -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# See the file COPYING for details. - -''' -Models management -''' - -import datetime - -from django.db import models -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 \ -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 = 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")) - 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: - - - "Yes/No poll" is the appropriate type for a simple multi-choice poll - - "Yes/No/Maybe poll" allows voters to stay undecided - - "One choice poll" gives only one option to choose from - - "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")) - 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 \ -the poll/check this option to reopen it")) - - def getTypeLabel(self): - idx = [type[0] for type in self.TYPE].index(self.type) - return Poll.TYPE[idx][1] - - def checkForErasement(self): - '''Check if the poll has to be deleted''' - if not DAYS_TO_LIVE: - return - now = datetime.datetime.now() - dtl = datetime.timedelta(days=DAYS_TO_LIVE) - if self.modification_date + dtl > now: - return - voters = Voter.objects.filter(poll=self) - for voter in voters: - if voter.modification_date + dtl > now: - return - for voter in voters: - voter.user.delete() - voter.delete() - comments = Comment.objects.filter(poll=self) - for comment in comments: - comment.delete() - self.delete() - - def getChoices(self): - """ - Get choices associated to this vote""" - return Choice.objects.filter(poll=self) - - def reorder(self): - """ - Reorder choices of the poll""" - if not self.dated_choices: - return - choices = self.getChoices() - 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 - choice.save() - - 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) - 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} - 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])]) - 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'] - - def get_date(self): - if not self.poll.dated_choices: - return self.name - return datetime.datetime.strptime(self.name, '%Y-%m-%d %H:%M:%S') - - 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') - date = property(get_date, set_date) - - def getSum(self, balanced_poll=None): - '''Get the sum of votes for this choice''' - sum = 0 - for vote in Vote.objects.filter(choice=self, value__isnull=False): - sum += vote.value - if balanced_poll: - return sum/2 - return sum - - def changeOrder(self, idx=1): - ''' - Change a choice in the list - ''' - if (self.order + idx) < 0: - return - choices = Choice.objects.filter(poll=self.poll) - if self.order + idx > len(choices): - return - new_order = self.order + idx - for choice in choices: - if choice == self: - continue - if idx < 0 and choice.order < self.order \ - 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() - self.order = new_order - self.save() - -class Vote(models.Model): - voter = models.ForeignKey(Voter) - choice = models.ForeignKey(Choice) - VOTE = ((1, (_('Yes'), _('Yes'))), - (0, (_('No'), _('Maybe')), ), - (-1, (_('No'), _('No'))),) - value = models.IntegerField(choices=VOTE, blank=True, null=True) |
