django-poll-system / poll / models.py

from django.db import models
from django.utils.translation import gettext as _
from django.contrib.auth.models import User
from django.db.models.manager import Manager
from django.core.exceptions import ValidationError

class PollType(models.Model):
    title = models.CharField(max_length=150, verbose_name=_('Type title'), help_text=_('It will be used as header of the poll'))
    index = models.SmallIntegerField(unique=True, verbose_name=_('Index'), help_text=_('Must be unique'))
    
    def __unicode__(self):
        return '%s (%d)' % (self.title, self.index)
    
    class Meta:
        ordering = ['-index']
        verbose_name = _('PollType')
        verbose_name_plural = _('PollTypes')
        
class PublishManager(Manager):
    def get_query_set(self):
        return super(PublishManager, self).get_query_set().filter(publish=True)

class Poll(models.Model):
    title = models.CharField(max_length=250, verbose_name=_('Title'), help_text=_('The parameter is used as question to user'))
    queue = models.ForeignKey('Queue', blank=True, null=True, verbose_name=_('Queue'), help_text=_('Do you want to use the poll as a stand alone poll or insert it into the queue?'))
    polltype = models.ForeignKey(PollType, verbose_name=_('Poll type'), help_text=_('Choose the poll type'))
    startdate = models.DateField(verbose_name=_('Start date'), help_text=_('Must be unique'))
    publish = models.BooleanField(default=True, verbose_name=_('Publish'))
    votes = models.ManyToManyField('Vote', related_name='%(app_label)s_%(class)s_related', blank=True, verbose_name=_('Votes'), help_text=_('Choose variants of answers'))
    
    objects = models.Manager()
    publish_manager = PublishManager()
    
    def clean(self):
        err_msg = _('The "Start date" param must be unique')
        objs = Poll.objects.filter(startdate=self.startdate)
        count = objs.count()
        
        if count > 1:
            raise ValidationError(err_msg)
        elif count == 1:
            if objs[0] != self:
                raise ValidationError(err_msg)
    
    def get_vote_count(self):
        return Vote.objects.filter(poll=self).count()
    vote_count = property(fget=get_vote_count)
    
    def get_cookie_name(self):
        return str('poll_%s' % (self.pk)) 
    
    def __unicode__(self):
        return self.title
    
    class Meta:
        ordering = ['-startdate']
        verbose_name = _('Poll')
        verbose_name_plural = _('Polls')
        permissions = (("can_vote", _("User can vote")),)
        
class Queue(models.Model):
    title = models.CharField(unique=True, max_length=250, verbose_name=_('Queue name'), help_text=_('It must be unique'))
    auth = models.BooleanField(verbose_name=_('Need auth?'), help_text=_('Do the poll queue is for authenticated users only or not? (If yes, users must have "can_vote" permission to vote)'))
    
    def __unicode__(self):
        if self.auth:
            auth = _('With auth')
        else:
            auth = _('Without auth')
        
        return '%s (%s)' % (self.title, auth)
    
    class Meta:
        ordering = ['-title']
        verbose_name = _('Queue')
        verbose_name_plural = _('Queues')

class Item(models.Model):
    poll = models.ForeignKey(Poll)
    userbox = models.BooleanField(verbose_name=_('Its userbox?'), help_text=_('Set it, if you want user to type its own answer. (show as textbox)'))
    value = models.CharField(max_length=250, verbose_name=_('Value'), help_text=_('Its a title of item'))
    index = models.SmallIntegerField(default='0', verbose_name=_('Position'), help_text=_('Its for positioning only'))
    
    def __unicode__(self):
        return '%s (%d)' % (self.value, self.index)
    
    class Meta:
        ordering = ['index']

class Vote(models.Model):
    poll = models.ForeignKey(Poll, verbose_name=_('Poll'))
    ip = models.IPAddressField(verbose_name=_('User\'s IP'))
    user = models.ForeignKey(User, blank=True, null=True, verbose_name=_('User'))
    datetime = models.DateTimeField(auto_now_add=True)
    choices = models.ManyToManyField(Item, through='Choice', verbose_name=_('Voited items'))
    
    def __unicode__(self):
        if isinstance(self.user, User):
            return self.user.username
        return self.ip
    
    class Meta:
        verbose_name = _('Vote')
        verbose_name_plural = _('Votes')
        
class Choice(models.Model):
    vote = models.ForeignKey(Vote)
    item = models.ForeignKey(Item)
    uservalue = models.CharField(max_length=250, blank=True, null=True)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.