Esempio n. 1
0
File: poll.py Progetto: whausen/part
 def create(cls, scope, user, action, subject=None, with_vote=False):
     from tally import Tally
     from vote import Vote
     from adhocracy.lib.democracy import Decision
     poll = Poll(scope, user, action, subject=subject)
     meta.Session.add(poll)
     meta.Session.flush()
     if with_vote:
         decision = Decision(user, poll)
         decision.make(Vote.YES)
     Tally.create_from_poll(poll)
     meta.Session.flush()
     return poll
Esempio n. 2
0
 def create(cls, scope, user, action, subject=None, with_vote=False):
     from tally import Tally
     from vote import Vote
     from adhocracy.lib.democracy import Decision
     poll = Poll(scope, user, action, subject=subject)
     meta.Session.add(poll)
     meta.Session.flush()
     if with_vote:
         decision = Decision(user, poll)
         decision.make(Vote.YES)
     Tally.create_from_poll(poll)
     meta.Session.flush()
     return poll
Esempio n. 3
0
    def test_second_identical_vote(self):
        from adhocracy.lib.democracy import Decision
        proposal = tt_make_proposal(voting=True)
        poll = proposal.polls[0]
        self.assertEqual(0, len(list(poll.votes)))
        decision = Decision(proposal.creator, poll)
        votes = decision.make(Vote.YES)
        self.assertEqual(len(votes), 1)
        self.assertEqual(len(decision.votes), 1)
        self.assertEqual(len(poll.votes), 1)

        # a second, identical vote by the same user
        decision = Decision(proposal.creator, poll)
        votes = decision.make(Vote.YES)
        self.assertEqual(len(votes), 1)
        self.assertEqual(len(decision.votes), 2)
        self.assertEqual(len(poll.votes), 2)
Esempio n. 4
0
    def test_second_identical_vote(self):
        from adhocracy.lib.democracy import Decision
        proposal = tt_make_proposal(voting=True)
        poll = proposal.polls[0]
        self.assertEqual(0, len(list(poll.votes)))
        decision = Decision(proposal.creator, poll)
        votes = decision.make(Vote.YES)
        self.assertEqual(len(votes), 1)
        self.assertEqual(len(decision.votes), 1)
        self.assertEqual(len(poll.votes), 1)

        # a second, identical vote by the same user
        decision = Decision(proposal.creator, poll)
        votes = decision.make(Vote.YES)
        self.assertEqual(len(votes), 1)
        self.assertEqual(len(decision.votes), 2)
        self.assertEqual(len(poll.votes), 2)
Esempio n. 5
0
 def test_vote_by_creator(self):
     from adhocracy.lib.democracy import Decision
     proposal = tt_make_proposal(voting=True)
     poll = proposal.polls[0]
     self.assertEqual(0, len(list(poll.votes)))
     decision = Decision(proposal.creator, poll)
     votes = decision.make(Vote.YES)
     self.assertEqual(len(votes), 1)
     self.assertEqual(len(decision.votes), 1)
     self.assertEqual(votes[0].orientation, Vote.YES)
     self.assertEqual(votes[0].user, proposal.creator)
Esempio n. 6
0
 def test_vote_by_creator(self):
     from adhocracy.lib.democracy import Decision
     proposal = tt_make_proposal(voting=True)
     poll = proposal.polls[0]
     self.assertEqual(0, len(list(poll.votes)))
     decision = Decision(proposal.creator, poll)
     votes = decision.make(Vote.YES)
     self.assertEqual(len(votes), 1)
     self.assertEqual(len(decision.votes), 1)
     self.assertEqual(votes[0].orientation, Vote.YES)
     self.assertEqual(votes[0].user, proposal.creator)
Esempio n. 7
0
    def test_vote_by_other_user(self):
        from adhocracy.lib.democracy import Decision
        proposal = tt_make_proposal(voting=True)
        poll = proposal.polls[0]
        self.assertEqual(0, len(list(poll.votes)))

        # make a new user and let him vote
        new_user = tt_make_user()
        decision = Decision(new_user, poll)
        votes = decision.make(Vote.YES)
        self.assertEqual(len(votes), 1)
        self.assertEqual(len(decision.votes), 1)
        self.assertEqual(len(poll.votes), 1)
        self.assertEqual(votes[0].orientation, Vote.YES)
Esempio n. 8
0
    def test_vote_by_other_user(self):
        from adhocracy.lib.democracy import Decision
        proposal = tt_make_proposal(voting=True)
        poll = proposal.polls[0]
        self.assertEqual(0, len(list(poll.votes)))

        # make a new user and let him vote
        new_user = tt_make_user()
        decision = Decision(new_user, poll)
        votes = decision.make(Vote.YES)
        self.assertEqual(len(votes), 1)
        self.assertEqual(len(decision.votes), 1)
        self.assertEqual(len(poll.votes), 1)
        self.assertEqual(votes[0].orientation, Vote.YES)
Esempio n. 9
0
class TestDecisionWithoutDelegation(TestController):
    def setUp(self):
        super(TestDecisionWithoutDelegation, self).setUp()
        self.proposal = tt_make_proposal(voting=True)
        self.poll = Poll.create(self.proposal, self.proposal.creator,
                                Poll.ADOPT)
        self.decision = Decision(self.proposal.creator, self.poll)

    def test_new_decisions_have_no_votes(self):
        self.assertEqual(len(self.decision.votes), 0)
        self.assertEqual(len(self.decision.relevant_votes), 0)
        self.assertEqual(self.decision.result, None,
                         "Not voted yet == not recorded for quorum")
        # TODO: this quorum thing needs additional tests

    def test_new_decisions_are_not_decided(self):
        self.assertFalse(self.decision.is_decided())
        self.assertFalse(self.decision.is_self_decided())

    def test_can_vote_directly(self):
        self.decision.make(Vote.YES)
        self.assertEqual(self.decision.result, Vote.YES)

    def test_decision_with_a_vote_is_decided(self):
        self.decision.make(Vote.YES)
        self.assertTrue(self.decision.is_decided())
        self.assertTrue(self.decision.is_self_decided())

    def test_can_override_previous_choice(self):
        self.decision.make(Vote.YES)
        self.assertEqual(self.decision.result, Vote.YES)
        self.decision.make(Vote.ABSTAIN)
        self.assertEqual(self.decision.result, Vote.ABSTAIN)
        self.decision.make(Vote.NO)
        self.assertEqual(self.decision.result, Vote.NO)

    def test_direct_votes_always_have_only_one_relevant_vote(self):
        self.decision.make(Vote.YES)
        self.decision.make(Vote.NO)
        self.decision.make(Vote.ABSTAIN)
        self.assertEqual(len(self.decision.relevant_votes), 1)

    # History access

    def test_multiple_votes_for_one_decision_are_recorded_for_posterity(self):
        self.decision.make(Vote.YES)
        self.decision.make(Vote.YES)
        self.assertEqual(len(self.decision.votes), 2)

    def test_old_decisions_can_be_retrieved(self):
        self.decision.make(Vote.YES)
        self.decision.make(Vote.YES)
        self.decision.make(Vote.NO)
        # votes are FIFO
        self.assertEqual(self.decision.votes[0].orientation, Vote.NO)
        self.assertEqual(self.decision.votes[1].orientation, Vote.YES)
        self.assertEqual(self.decision.votes[2].orientation, Vote.YES)
Esempio n. 10
0
class TestDecisionWithDelegation(TestController):
    def setUp(self):
        super(TestDecisionWithDelegation, self).setUp()
        self.me = tt_make_user(name='me')
        self.high_delegate = tt_make_user(name='high_delegate')
        self.low_delegate = tt_make_user(name='low_delegate')

        self.proposal = tt_make_proposal(creator=self.me, voting=True)
        self.poll = Poll.create(self.proposal, self.proposal.creator,
                                Poll.ADOPT)
        self.decision = Decision(self.me, self.poll)
        self.instance = tt_get_instance()

    def _do_delegate(self, from_user, delegatee, scope):
        from adhocracy.model.delegation import Delegation
        delegation = Delegation.create(from_user, delegatee, scope)
        return delegation

    def test_delegation_without_vote_is_no_vote(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self.decision.reload()
        self.assertEqual(len(self.decision.votes), 0)
        self.assertFalse(self.decision.is_decided())
        self.assertEqual(self.decision.result, None)

    def test_can_do_general_delegate_to_other_user(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)

    def test_delegation_can_decide_a_decision(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.decision.reload()
        self.assertTrue(self.decision.is_decided())

    def test_delegated_decisions_are_not_self_decided(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.decision.reload()
        self.assertFalse(self.decision.is_self_decided())

    def test_two_delegations_at_the_same_level_that_disagree_cancel_each_other(
            self):
        # This is meant as a safeguard: if I don't fully trust my delegates
        # I can delegate to n delegates, and my vote will only be autocast
        # if they all agree
        # If not, I need to decide myself
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        Decision(self.low_delegate, self.poll).make(Vote.NO)
        self.assertEqual(self.decision.reload().result, None,
                         "needs to cast his own vote")

    def test_two_delegations_at_the_same_level_that_agree_reinforce_each_other(
            self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        Decision(self.low_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)

    def test_two_delegations_at_the_same_level_are_both_relevant_votes(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        Decision(self.low_delegate, self.poll).make(Vote.YES)
        self.assertEqual(len(self.decision.reload().relevant_votes), 2)

    def test_own_vote_overrides_delegations(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.decision.make(Vote.NO)
        self.assertEqual(self.decision.reload().result, Vote.NO)

    def test_delegation_is_recorded_as_just_another_vote(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self.assertEqual(len(self.decision.reload().votes), 0)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(len(self.decision.reload().votes), 1)

    def test_delegation_is_transitive(self):
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        self._do_delegate(self.low_delegate, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)

    def test_delegation_is_transitive_across_delegation_levels(self):
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        self._do_delegate(self.low_delegate, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)
Esempio n. 11
0
class TestDecisionWithoutDelegation(TestController):

    def setUp(self):
        self.proposal = tt_make_proposal(voting=True)
        self.poll = Poll.create(self.proposal, self.proposal.creator,
                                Poll.ADOPT)
        self.decision = Decision(self.proposal.creator, self.poll)

    def test_new_decisions_have_no_votes(self):
        self.assertEqual(len(self.decision.votes), 0)
        self.assertEqual(len(self.decision.relevant_votes), 0)
        self.assertEqual(self.decision.result, None,
                      "Not voted yet == not recorded for quorum")
        # TODO: this quorum thing needs additional tests

    def test_new_decisions_are_not_decided(self):
        self.assertFalse(self.decision.is_decided())
        self.assertFalse(self.decision.is_self_decided())

    def test_can_vote_directly(self):
        self.decision.make(Vote.YES)
        self.assertEqual(self.decision.result, Vote.YES)

    def test_decision_with_a_vote_is_decided(self):
        self.decision.make(Vote.YES)
        self.assertTrue(self.decision.is_decided())
        self.assertTrue(self.decision.is_self_decided())

    def test_can_override_previous_choice(self):
        self.decision.make(Vote.YES)
        self.assertEqual(self.decision.result, Vote.YES)
        self.decision.make(Vote.ABSTAIN)
        self.assertEqual(self.decision.result, Vote.ABSTAIN)
        self.decision.make(Vote.NO)
        self.assertEqual(self.decision.result, Vote.NO)

    def test_direct_votes_always_have_only_one_relevant_vote(self):
        self.decision.make(Vote.YES)
        self.decision.make(Vote.NO)
        self.decision.make(Vote.ABSTAIN)
        self.assertEqual(len(self.decision.relevant_votes), 1)

    # History access

    def test_multiple_votes_for_one_decision_are_recorded_for_posterity(self):
        self.decision.make(Vote.YES)
        self.decision.make(Vote.YES)
        self.assertEqual(len(self.decision.votes), 2)

    def test_old_decisions_can_be_retrieved(self):
        self.decision.make(Vote.YES)
        self.decision.make(Vote.YES)
        self.decision.make(Vote.NO)
        # votes are FIFO
        self.assertEqual(self.decision.votes[0].orientation, Vote.NO)
        self.assertEqual(self.decision.votes[1].orientation, Vote.YES)
        self.assertEqual(self.decision.votes[2].orientation, Vote.YES)
Esempio n. 12
0
class TestDecisionWithDelegation(TestController):

    def setUp(self):
        self.me = tt_make_user(name='me')
        self.high_delegate = tt_make_user(name='high_delegate')
        self.low_delegate = tt_make_user(name='low_delegate')

        self.proposal = tt_make_proposal(creator=self.me, voting=True)
        self.poll = Poll.create(self.proposal, self.proposal.creator,
                                Poll.ADOPT)
        self.decision = Decision(self.me, self.poll)
        self.instance = tt_get_instance()

    def _do_delegate(self, from_user, delegatee, scope):
        from adhocracy.model.delegation import Delegation
        delegation = Delegation.create(from_user, delegatee, scope)
        return delegation

    def test_delegation_without_vote_is_no_vote(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self.decision.reload()
        self.assertEqual(len(self.decision.votes), 0)
        self.assertFalse(self.decision.is_decided())
        self.assertEqual(self.decision.result, None)

    def test_can_do_general_delegate_to_other_user(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)

    def test_delegation_can_decide_a_decision(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.decision.reload()
        self.assertTrue(self.decision.is_decided())

    def test_delegated_decisions_are_not_self_decided(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.decision.reload()
        self.assertFalse(self.decision.is_self_decided())

    def test_two_delegations_at_the_same_level_that_disagree_cancel_each_other(
        self):
        # This is meant as a safeguard: if I don't fully trust my delegates
        # I can delegate to n delegates, and my vote will only be autocast
        # if they all agree
        # If not, I need to decide myself
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        Decision(self.low_delegate, self.poll).make(Vote.NO)
        self.assertEqual(self.decision.reload().result, None,
                         "needs to cast his own vote")

    def test_two_delegations_at_the_same_level_that_agree_reinforce_each_other(
        self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        Decision(self.low_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)

    def test_two_delegations_at_the_same_level_are_both_relevant_votes(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        Decision(self.low_delegate, self.poll).make(Vote.YES)
        self.assertEqual(len(self.decision.reload().relevant_votes), 2)

    def test_own_vote_overrides_delegations(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.decision.make(Vote.NO)
        self.assertEqual(self.decision.reload().result, Vote.NO)

    def test_delegation_is_recorded_as_just_another_vote(self):
        self._do_delegate(self.me, self.high_delegate, self.proposal)
        self.assertEqual(len(self.decision.reload().votes), 0)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(len(self.decision.reload().votes), 1)

    def test_delegation_is_transitive(self):
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        self._do_delegate(self.low_delegate, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)

    def test_delegation_is_transitive_across_delegation_levels(self):
        self._do_delegate(self.me, self.low_delegate, self.proposal)
        self._do_delegate(self.low_delegate, self.high_delegate, self.proposal)
        Decision(self.high_delegate, self.poll).make(Vote.YES)
        self.assertEqual(self.decision.reload().result, Vote.YES)