PCv5/app/models/polls/multiple.py

50 lines
1.3 KiB
Python

from app import db
from app.models.poll import Poll, PollAnswer
from collections import Counter
from itertools import chain
class MultiplePoll(Poll):
"""Poll with many answers allowed"""
__tablename__ = 'multiplepoll'
# Names of templates
template = 'multiplepoll.html'
__mapper_args__ = {
'polymorphic_identity': __tablename__,
}
def __init__(self, author, title, choices, **kwargs):
choices = [Choice(i, t) for i, t in enumerate(choices)]
super().__init__(author, title, choices, **kwargs)
# Mandatory methods
def vote(self, user, request):
answers_id = []
for c in self.choices:
if f"pollanswers-{c.id}" in request.form:
answers_id.append(c.id)
return PollAnswer(self, user, answers_id)
@property
def results(self):
values = {c: 0 for c in self.choices}
counter = Counter(values)
for a in self.answers:
counter.update([self.choice_from_id(id) for id in a.answer])
return counter
# Custom method
def choice_from_id(self, id):
for c in self.choices:
if c.id == id:
return c
return None
class Choice():
def __init__(self, id, title):
self.id = id
self.title = title