def combine_polls(cls, polls, at_time=None): from adhocracy.lib.democracy import Decision from vote import Vote if at_time is None: at_time = datetime.utcnow() voters = {Vote.YES: Set(), Vote.NO: Set(), Vote.ABSTAIN: Set()} for poll in polls: for decision in Decision.for_poll(poll, at_time=at_time): if not decision.is_decided(): continue result = decision.result if result is not None: voters_ = voters.get(result) voters_.add(decision.user) # Do the math. We count only non-contradictory votes. yes = voters[Vote.YES] no = voters[Vote.NO] abstain = voters[Vote.ABSTAIN] return Tally(None, len(yes - no - abstain), len(no - yes - abstain), len(abstain - yes - no))
def combine_polls(cls, polls, at_time=None): from adhocracy.lib.democracy import Decision from vote import Vote if at_time is None: at_time = datetime.utcnow() result_voters = {} undecided = [] for poll in polls: for decision in Decision.for_poll(poll, at_time=at_time): if not decision.is_decided(): continue for option in [Vote.YES, Vote.NO, Vote.ABSTAIN]: voters = result_voters.get(option, []) if option == result and decision.user not in voters: voters = voters.append(decision.user) if option != result and decision.user in voters: undecided.append(decision.user) result_voters[option] = voters for option in [Vote.YES, Vote.NO, Vote.ABSTAIN]: users = result_voters.get(option, []) for user in undecided: if user in users: users = users.remove(user) result_voters[option] = users return Tally(None, len(result_voters.get(Vote.YES, [])), len(result_voters.get(Vote.NO, [])), len(result_voters.get(Vote.ABSTAIN, [])))
def create_from_poll(cls, poll, at_time=None): from adhocracy.lib.democracy import Decision from vote import Vote if at_time is None: at_time = datetime.utcnow() results = {} for decision in Decision.for_poll(poll, at_time=at_time): if not decision.is_decided(): continue results[decision.result] = results.get(decision.result, 0) + 1 tally = Tally(poll, results.get(Vote.YES, 0), results.get(Vote.NO, 0), results.get(Vote.ABSTAIN, 0)) tally.create_time = at_time meta.Session.add(tally) meta.Session.flush() return tally
def make_from_poll(tally_cls, poll, at_time=None, user_filter=None): from adhocracy.lib.democracy import Decision from adhocracy.model import Vote if at_time is None: at_time = datetime.utcnow() results = {} decisions = Decision.for_poll(poll, at_time=at_time, user_filter=user_filter) for decision in decisions: if not decision.is_decided(): continue results[decision.result] = results.get(decision.result, 0) + 1 tally = tally_cls(poll, results.get(Vote.YES, 0), results.get(Vote.NO, 0), results.get(Vote.ABSTAIN, 0)) tally.create_time = at_time return tally