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()
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)
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)
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
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
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)
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)