2011-07-31 10:46:29 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
openslides.poll.models
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
Models for the poll app.
|
|
|
|
|
|
|
|
:copyright: 2011 by the OpenSlides team, see AUTHORS.
|
|
|
|
:license: GNU GPL, see LICENSE for more details.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from django.db import models
|
|
|
|
from django.utils.translation import ugettext as _
|
|
|
|
|
2012-02-15 12:36:50 +01:00
|
|
|
from projector.api import register_slidemodel
|
2012-03-03 09:11:56 +01:00
|
|
|
from projector.models import SlideMixin
|
2012-02-15 12:36:50 +01:00
|
|
|
|
2012-02-19 17:31:17 +01:00
|
|
|
|
2012-02-14 16:31:21 +01:00
|
|
|
class BaseOption(models.Model):
|
|
|
|
poll = models.ForeignKey('BasePoll')
|
2011-07-31 10:46:29 +02:00
|
|
|
|
2012-02-15 13:44:55 +01:00
|
|
|
def get_votes(self):
|
|
|
|
return Vote.objects.filter(option=self)
|
2011-07-31 10:46:29 +02:00
|
|
|
|
2011-09-08 12:30:34 +02:00
|
|
|
|
2012-02-14 16:31:21 +01:00
|
|
|
class TextOption(BaseOption):
|
|
|
|
text = models.CharField(max_length=255)
|
2011-07-31 10:46:29 +02:00
|
|
|
|
|
|
|
def __unicode__(self):
|
2012-02-14 16:31:21 +01:00
|
|
|
return self.text
|
2011-07-31 10:46:29 +02:00
|
|
|
|
|
|
|
|
2012-02-14 16:31:21 +01:00
|
|
|
class Vote(models.Model):
|
|
|
|
option = models.ForeignKey(BaseOption)
|
|
|
|
#profile = models.ForeignKey(Profile) # TODO: we need a person+ here
|
|
|
|
weight = models.IntegerField(default=1)
|
|
|
|
value = models.CharField(max_length=255, null=True)
|
2011-07-31 10:46:29 +02:00
|
|
|
|
2012-02-19 19:27:00 +01:00
|
|
|
def __unicode__(self):
|
|
|
|
return print_value(self.weight)
|
|
|
|
|
2011-07-31 10:46:29 +02:00
|
|
|
|
2012-02-19 17:31:17 +01:00
|
|
|
class CountVotesCast(models.Model):
|
|
|
|
votescast = models.IntegerField(null=True, blank=True, verbose_name=_("Votes cast"))
|
|
|
|
|
|
|
|
def append_pollform_fields(self, fields):
|
|
|
|
fields.append('votescast')
|
|
|
|
|
2012-02-19 19:27:00 +01:00
|
|
|
def print_votescast(self):
|
|
|
|
return print_value(self.votescast)
|
|
|
|
|
2012-02-19 17:31:17 +01:00
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
|
|
|
|
class CountInvalid(models.Model):
|
|
|
|
votesinvalid = models.IntegerField(null=True, blank=True, verbose_name=_("Votes invalid"))
|
|
|
|
|
|
|
|
def append_pollform_fields(self, fields):
|
|
|
|
fields.append('votesinvalid')
|
|
|
|
|
2012-02-19 19:27:00 +01:00
|
|
|
def print_votesinvalid(self):
|
|
|
|
return print_value(self.votesinvalid)
|
|
|
|
|
2012-02-19 17:31:17 +01:00
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
|
2012-03-03 11:16:10 +01:00
|
|
|
class PublishPollMixin(models.Model):
|
|
|
|
published = models.BooleanField(default=False)
|
|
|
|
|
|
|
|
def set_published(self, published):
|
|
|
|
self.published = published
|
|
|
|
self.save()
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
abstract = True
|
|
|
|
|
|
|
|
|
2012-03-03 09:11:56 +01:00
|
|
|
class BasePoll(models.Model, SlideMixin):
|
2012-02-19 17:31:17 +01:00
|
|
|
#TODO: It would be nice if this class wouldn't be a subclass from models.Model. But it is needet aslong
|
|
|
|
# BaseOption has a foreignKey on BasePoll
|
2012-02-15 12:04:11 +01:00
|
|
|
prefix = 'BasePoll'
|
|
|
|
|
2012-02-19 17:31:17 +01:00
|
|
|
description = models.TextField(null=True, blank=True, verbose_name=_("Description")) #TODO: Use this field or delete it.
|
2011-07-31 10:46:29 +02:00
|
|
|
|
2012-02-14 16:31:21 +01:00
|
|
|
option_class = TextOption
|
|
|
|
vote_values = [_('votes')]
|
2011-07-31 10:46:29 +02:00
|
|
|
|
2012-02-15 13:44:55 +01:00
|
|
|
def has_votes(self):
|
|
|
|
if self.get_options().filter(vote__isnull=False):
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
def set_options(self, options_data=[]):
|
2012-02-14 16:31:21 +01:00
|
|
|
for option_data in options_data:
|
|
|
|
option = self.option_class(**option_data)
|
|
|
|
option.poll = self
|
|
|
|
option.save()
|
|
|
|
|
|
|
|
def get_options(self):
|
|
|
|
return self.get_option_class().objects.filter(poll=self)
|
|
|
|
|
|
|
|
def get_option_class(self):
|
|
|
|
return self.option_class
|
|
|
|
|
|
|
|
def get_vote_values(self):
|
|
|
|
return self.vote_values
|
|
|
|
|
|
|
|
def set_form_values(self, option, data):
|
|
|
|
for value in self.get_vote_values():
|
|
|
|
try:
|
|
|
|
vote = Vote.objects.filter(option=option).get(value=value)
|
|
|
|
except Vote.DoesNotExist:
|
|
|
|
vote = Vote(option=option, value=value)
|
|
|
|
vote.weight = data[value]
|
|
|
|
vote.save()
|
|
|
|
|
|
|
|
def get_form_values(self, option_id):
|
|
|
|
values = []
|
|
|
|
for value in self.get_vote_values():
|
|
|
|
try:
|
|
|
|
vote = Vote.objects.filter(option=option_id).get(value=value)
|
|
|
|
weight = vote.weight
|
|
|
|
except Vote.DoesNotExist:
|
|
|
|
weight = None
|
|
|
|
values.append((value, weight))
|
|
|
|
return values
|
|
|
|
|
|
|
|
def get_vote_form(self, **kwargs):
|
2012-02-19 17:31:17 +01:00
|
|
|
from poll.forms import OptionForm
|
2012-02-14 16:31:21 +01:00
|
|
|
return OptionForm(extra=self.get_form_values(kwargs['formid']), **kwargs)
|
|
|
|
|
|
|
|
def get_vote_forms(self, **kwargs):
|
|
|
|
forms = []
|
|
|
|
for option in self.get_options():
|
|
|
|
form = self.get_vote_form(formid=option.id, **kwargs)
|
|
|
|
form.option = option
|
|
|
|
forms.append(form)
|
|
|
|
return forms
|
|
|
|
|
2012-02-15 12:36:50 +01:00
|
|
|
def slide(self):
|
|
|
|
data = super(BasePoll, self).slide()
|
|
|
|
# data['template'] = 'projector/TODO.html'
|
|
|
|
return data
|
|
|
|
|
2012-04-12 16:21:30 +02:00
|
|
|
def get_absolute_url(self):
|
|
|
|
return ''
|
|
|
|
|
2012-02-14 16:31:21 +01:00
|
|
|
|
2012-02-19 19:27:00 +01:00
|
|
|
def print_value(value):
|
|
|
|
if value == -1:
|
|
|
|
return _('majority')
|
|
|
|
elif value == -2:
|
|
|
|
return _('undocumented')
|
|
|
|
return unicode(value)
|
|
|
|
|