Ejemplo n.º 1
0
 def test_unique_ordering(self, session, user, poll):
     option = PollOption(poll, 'option 0')
     session.add(option)
     vote = Vote(user, option)
     vote.priority = 0
     session.add(vote)
     with pytest.raises(IntegrityError):
         vote_same_index = Vote(user, option)
         vote_same_index.priority = 0
         session.add(vote_same_index)
         session.commit()
Ejemplo n.º 2
0
def init_votes_for_new_options(session, poll: Poll, added_options: List[str]):
    """
    When a new option is added, we need to create new votes
    for all users that have already voted for this poll.
    """
    if not poll.is_priority():
        return

    # Get all newly added options
    new_options = (
        session.query(Option)
        .filter(Option.poll == poll)
        .filter(Option.name.in_(added_options))
        .all()
    )

    # The new options are already flushed.
    # Subtract the amount of new options to get the proper index.
    existing_options_count = len(poll.options) - len(new_options)

    users_that_voted = (
        session.query(User).join(User.votes).filter(Vote.poll == poll).all()
    )

    for user in users_that_voted:
        for index, option in enumerate(new_options):
            vote = Vote(user, option)
            vote.priority = existing_options_count + index
            user.votes.append(vote)
Ejemplo n.º 3
0
    def init_votes_for_new_options(self, session):
        """
        When a new option is added, we need to create new votes
        for all users that have already voted for this poll
        """
        if not self.is_priority():
            return

        from pollbot.models import User, Vote, PollOption
        users = session.query(User) \
            .join(User.votes) \
            .filter(Vote.poll == self) \
            .all()

        new_options = session.query(PollOption) \
            .filter(PollOption.poll == self) \
            .outerjoin(Vote) \
            .filter(Vote.id.is_(None)) \
            .all()

        existing_options_count = len(self.options) - len(new_options)

        for user in users:
            for index, option in enumerate(new_options):
                vote = Vote(user, option)
                vote.priority = existing_options_count + index
                user.votes.append(vote)
Ejemplo n.º 4
0
 def test_cascades_delete_vote(self, session, user, poll):
     option = PollOption(poll, 'option 0')
     session.add(option)
     vote = Vote(user, option)
     vote.priority = 0
     session.add(vote)
     session.commit()
     session.delete(poll)
     session.commit()
     assert session.query(Vote).count() == 0
Ejemplo n.º 5
0
 def test_cascades_dont_delete_poll(self, session, user, poll):
     option = PollOption(poll, 'option 0')
     session.add(option)
     vote = Vote(user, option)
     vote.priority = 0
     session.add(vote)
     session.commit()
     session.delete(vote)
     session.commit()
     poll_exists = session.query(
         exists().where(Poll.id == poll.id)).scalar()
     assert poll_exists
Ejemplo n.º 6
0
def init_votes(session, poll: Poll, user: User):
    """
    Since Priority votes always need priorities, call this to create a vote
    for every option in the poll with a random priority for the given user.
    """
    assert poll.is_priority()

    # Don't init votes, if there already is a vote
    any_vote = (session.query(Vote).filter(Vote.user == user).filter(
        Vote.poll == poll).first())
    if any_vote is not None:
        return

    votes = []
    for index, option in enumerate(
            random.sample(poll.options, len(poll.options))):
        vote = Vote(user, option)
        vote.priority = index
        votes.append(vote)
    session.add_all(votes)
Ejemplo n.º 7
0
    def init_votes(self, session, user):
        """
        Since Priority votes always need priorities, call this to create a vote
        for every option in the poll with a random priority for the given user
        """
        assert self.is_priority()

        from pollbot.models import Vote

        votes_exist = (session.query(Vote).filter(Vote.user == user).filter(
            Vote.poll == self).first() is not None)

        if votes_exist:
            return

        votes = []
        for index, option in enumerate(
                random.sample(self.options, len(self.options))):
            vote = Vote(user, option)
            vote.priority = index
            votes.append(vote)
        session.add_all(votes)