def test_add_vote(self): """ Test the add_vote function. """ create_elections(self.session) create_candidates(self.session) nuancierlib.add_vote(session=self.session, candidate_id=2, username='******') self.session.commit() votes = nuancierlib.get_votes_user(self.session, 1, 'pingou') self.assertEqual(1, len(votes)) self.assertEqual(2, votes[0].candidate_id)
def test_add_vote(self): """ Test the add_vote function. """ create_elections(self.session) create_candidates(self.session) nuancierlib.add_vote( session=self.session, candidate_id=2, username='******' ) self.session.commit() votes = nuancierlib.get_votes_user(self.session, 1, 'pingou') self.assertEqual(1, len(votes)) self.assertEqual(2, votes[0].candidate_id)
def process_vote(election_id): ''' Actually register the vote, after checking if the user is actually allowed to vote. ''' form = nuancier.forms.ConfirmationForm() if not form.validate_on_submit(): flask.flash('Wrong input submitted', 'error') return flask.render_template('msg.html') election = nuancierlib.get_election(SESSION, election_id) if not election: flask.flash('No election found', 'error') return flask.render_template('msg.html') if not election.election_open: flask.flash('This election is not open', 'error') return flask.render_template('msg.html') candidates = nuancierlib.get_candidates(SESSION, election_id, approved=True) candidate_ids = set([candidate.id for candidate in candidates]) entries = set( [int(entry) for entry in flask.request.form.getlist('selection')]) # If not enough candidates selected if not entries: flask.flash('You did not select any candidate to vote for.', 'error') return flask.redirect(flask.url_for('vote', election_id=election_id)) # If vote on candidates from other elections if not set(entries).issubset(candidate_ids): flask.flash( 'The selection you have made contains element which are ' 'not part of this election, please be careful.', 'error') return flask.redirect(flask.url_for('vote', election_id=election_id)) # How many votes the user made: votes = nuancierlib.get_votes_user(SESSION, election_id, flask.g.fas_user.username) # Too many votes -> redirect if len(votes) >= election.election_n_choice: flask.flash( 'You have cast the maximal number of votes ' 'allowed for this election.', 'error') return flask.redirect( flask.url_for('election', election_id=election_id)) # Selected more candidates than allowed -> redirect if len(votes) + len(entries) > election.election_n_choice: flask.flash( 'You selected %s wallpapers while you are only allowed ' 'to select %s' % (len(entries), (election.election_n_choice - len(votes))), 'error') return flask.render_template( 'vote.html', form=nuancier.forms.ConfirmationForm(), election=election, candidates=[ nuancierlib.get_candidate(SESSION, candidate_id) for candidate_id in entries ], n_votes_done=len(votes), picture_folder=os.path.join(APP.config['PICTURE_FOLDER'], election.election_folder), cache_folder=os.path.join(APP.config['CACHE_FOLDER'], election.election_folder)) # Allowed to vote, selection sufficient, choice confirmed: process for selection in entries: value = 1 if nuancier.has_weigthed_vote(flask.g.fas_user): value = 2 nuancierlib.add_vote(SESSION, selection, flask.g.fas_user.username, value=value) try: SESSION.commit() except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() LOG.debug( 'ERROR: could not process the vote - user: "******" ' 'election: "%s"', flask.g.fas_user.username, election_id) LOG.exception(err) flask.flash( 'An error occured while processing your votes, please ' 'report this to your lovely admin or see logs for ' 'more details', 'error') flask.flash('Your vote has been recorded, thank you for voting on ' '%s %s' % (election.election_name, election.election_year)) if election.election_badge_link: flask.flash('Do not forget to <a href="%s" target="_blank">claim your ' 'badge!</a>' % election.election_badge_link) return flask.redirect(flask.url_for('elections_list'))
def process_vote(election_id): ''' Actually register the vote, after checking if the user is actually allowed to vote. ''' form = nuancier.forms.ConfirmationForm() if not form.validate_on_submit(): flask.flash('Wrong input submitted', 'error') return flask.render_template('msg.html') election = nuancierlib.get_election(SESSION, election_id) if not election: flask.flash('No election found', 'error') return flask.render_template('msg.html') if not election.election_open: flask.flash('This election is not open', 'error') return flask.render_template('msg.html') candidates = nuancierlib.get_candidates( SESSION, election_id, approved=True) candidate_ids = set([candidate.id for candidate in candidates]) entries = set([int(entry) for entry in flask.request.form.getlist('selection')]) # If not enough candidates selected if not entries: flask.flash('You did not select any candidate to vote for.', 'error') return flask.redirect(flask.url_for('vote', election_id=election_id)) # If vote on candidates from other elections if not set(entries).issubset(candidate_ids): flask.flash('The selection you have made contains element which are ' 'not part of this election, please be careful.', 'error') return flask.redirect(flask.url_for('vote', election_id=election_id)) # How many votes the user made: votes = nuancierlib.get_votes_user(SESSION, election_id, flask.g.fas_user.username) # Too many votes -> redirect if len(votes) >= election.election_n_choice: flask.flash('You have cast the maximal number of votes ' 'allowed for this election.', 'error') return flask.redirect( flask.url_for('election', election_id=election_id)) # Selected more candidates than allowed -> redirect if len(votes) + len(entries) > election.election_n_choice: flask.flash('You selected %s wallpapers while you are only allowed ' 'to select %s' % ( len(entries), (election.election_n_choice - len(votes))), 'error') return flask.render_template( 'vote.html', form=nuancier.forms.ConfirmationForm(), election=election, candidates=[nuancierlib.get_candidate(SESSION, candidate_id) for candidate_id in entries], n_votes_done=len(votes), picture_folder=os.path.join( APP.config['PICTURE_FOLDER'], election.election_folder), cache_folder=os.path.join( APP.config['CACHE_FOLDER'], election.election_folder) ) # Allowed to vote, selection sufficient, choice confirmed: process for selection in entries: value = 1 if nuancier.has_weigthed_vote(flask.g.fas_user): value = 2 nuancierlib.add_vote( SESSION, selection, flask.g.fas_user.username, value=value) try: SESSION.commit() except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() LOG.debug('ERROR: could not process the vote - user: "******" ' 'election: "%s"', flask.g.fas_user.username, election_id) LOG.exception(err) flask.flash('An error occured while processing your votes, please ' 'report this to your lovely admin or see logs for ' 'more details', 'error') flask.flash('Your vote has been recorded, thank you for voting on ' '%s %s' % (election.election_name, election.election_year)) if election.election_badge_link: flask.flash('Do not forget to <a href="%s" target="_blank">claim your ' 'badge!</a>' % election.election_badge_link) return flask.redirect(flask.url_for('elections_list'))