Beispiel #1
0
def admin_review_status(election_id, status):
    ''' Review a new election depending on the status of the candidates. '''
    election = nuancierlib.get_election(SESSION, election_id)

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    if election.election_open:
        flask.flash(
            'This election is already open to public votes and can no '
            'longer be changed', 'error')

    if election.election_public:
        flask.flash(
            'The results of this election are already public, this election'
            ' can no longer be changed', 'error')

    status = flask.request.args.get('status', status)
    if status == 'all':
        _status = None
    elif status in ['pending', 'denied']:
        _status = False
    else:
        _status = True

    candidates = nuancierlib.get_candidates(
        SESSION, election_id, approved=_status
    )
    if status == 'pending':
        candidates = [
            candidate for candidate in candidates
            if candidate.approved_motif in [None, '']
        ]
    elif status == 'denied':
        candidates = [
            candidate for candidate in candidates
            if candidate.approved_motif not in [None, '']
        ]

    template = 'admin_review.html'
    if election.election_public or election.election_open \
            or not nuancier.is_nuancier_admin(flask.g.fas_user):
        template = 'admin_review_ro.html'

    return flask.render_template(
        template,
        election=election,
        form=nuancier.forms.ConfirmationForm(),
        candidates=candidates,
        picture_folder=os.path.join(
            APP.config['PICTURE_FOLDER'], election.election_folder),
        cache_folder=os.path.join(
            APP.config['CACHE_FOLDER'], election.election_folder),
        status=status,
    )
Beispiel #2
0
def admin_review_status(election_id, status):
    ''' Review a new election depending on the status of the candidates. '''
    election = nuancierlib.get_election(SESSION, election_id)

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    if election.election_open:
        flask.flash(
            'This election is already open to public votes and can no '
            'longer be changed', 'error')

    if election.election_public:
        flask.flash(
            'The results of this election are already public, this election'
            ' can no longer be changed', 'error')

    status = flask.request.args.get('status', status)
    if status == 'all':
        _status = None
    elif status in ['pending', 'denied']:
        _status = False
    else:
        _status = True

    candidates = nuancierlib.get_candidates(SESSION,
                                            election_id,
                                            approved=_status)
    if status == 'pending':
        candidates = [
            candidate for candidate in candidates
            if candidate.approved_motif in [None, '']
        ]
    elif status == 'denied':
        candidates = [
            candidate for candidate in candidates
            if candidate.approved_motif not in [None, '']
        ]

    template = 'admin_review.html'
    if election.election_public or election.election_open \
            or not nuancier.is_nuancier_admin(flask.g.fas_user):
        template = 'admin_review_ro.html'

    return flask.render_template(
        template,
        election=election,
        form=nuancier.forms.ConfirmationForm(),
        candidates=candidates,
        picture_folder=os.path.join(APP.config['PICTURE_FOLDER'],
                                    election.election_folder),
        cache_folder=os.path.join(APP.config['CACHE_FOLDER'],
                                  election.election_folder),
        status=status,
    )
Beispiel #3
0
def admin_edit(election_id):
    ''' Edit an election. '''
    if not nuancier.is_nuancier_admin(flask.g.fas_user):
        flask.flash('You are not an administrator of nuancier',
                        'error')
        return flask.redirect(flask.url_for('msg'))

    election = nuancierlib.get_election(SESSION, election_id)

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    form = nuancier.forms.AddElectionForm()
    if flask.request.method == 'GET':
        form = nuancier.forms.AddElectionForm(election=election)

    if form.validate_on_submit():
        try:
            election = nuancierlib.edit_election(
                SESSION,
                election=election,
                election_name=form.election_name.data,
                election_folder=form.election_folder.data,
                election_year=form.election_year.data,
                election_date_start=form.election_date_start.data,
                election_date_end=form.election_date_end.data,
                submission_date_start=form.submission_date_start.data,
                submission_date_end=form.submission_date_end.data,
                election_n_choice=form.election_n_choice.data,
                user_n_candidates=form.user_n_candidates.data,
                election_badge_link=form.election_badge_link.data,
                user=flask.g.fas_user.username,
            )
            SESSION.commit()
            flask.flash('Election updated')
        except SQLAlchemyError as err:
            SESSION.rollback()
            LOG.debug("User: %s could not edit election: %s ",
                      flask.g.fas_user.username, election_id)
            LOG.exception(err)
            flask.flash('Could not edit this election, is this name or '
                        'folder already used?', 'error')
            return flask.render_template(
                'admin_edit.html',
                election=election,
                form=form)

        return flask.redirect(flask.url_for('admin_index'))
    return flask.render_template(
        'admin_edit.html',
        election=election,
        form=form)
Beispiel #4
0
def admin_edit(election_id):
    ''' Edit an election. '''
    if not nuancier.is_nuancier_admin(flask.g.fas_user):
        flask.flash('You are not an administrator of nuancier', 'error')
        return flask.redirect(flask.url_for('msg'))

    election = nuancierlib.get_election(SESSION, election_id)

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    form = nuancier.forms.AddElectionForm()
    if flask.request.method == 'GET':
        form = nuancier.forms.AddElectionForm(election=election)

    if form.validate_on_submit():
        try:
            election = nuancierlib.edit_election(
                SESSION,
                election=election,
                election_name=form.election_name.data,
                election_folder=form.election_folder.data,
                election_year=form.election_year.data,
                election_date_start=form.election_date_start.data,
                election_date_end=form.election_date_end.data,
                submission_date_start=form.submission_date_start.data,
                submission_date_end=form.submission_date_end.data,
                election_n_choice=form.election_n_choice.data,
                user_n_candidates=form.user_n_candidates.data,
                election_badge_link=form.election_badge_link.data,
                user=flask.g.fas_user.username,
            )
            SESSION.commit()
            flask.flash('Election updated')
        except SQLAlchemyError as err:
            SESSION.rollback()
            LOG.debug("User: %s could not edit election: %s ",
                      flask.g.fas_user.username, election_id)
            LOG.exception(err)
            flask.flash(
                'Could not edit this election, is this name or '
                'folder already used?', 'error')
            return flask.render_template('admin_edit.html',
                                         election=election,
                                         form=form)

        return flask.redirect(flask.url_for('admin_index'))
    return flask.render_template('admin_edit.html',
                                 election=election,
                                 form=form)
Beispiel #5
0
def admin_new():
    ''' Create a new election. '''
    if not nuancier.is_nuancier_admin(flask.g.fas_user):
        flask.flash('You are not an administrator of nuancier', 'error')
        return flask.redirect(flask.url_for('msg'))

    form = nuancier.forms.AddElectionForm()
    if form.validate_on_submit():

        try:
            election = nuancierlib.add_election(
                SESSION,
                election_name=form.election_name.data,
                election_folder=form.election_folder.data,
                election_year=form.election_year.data,
                election_date_start=form.election_date_start.data,
                election_date_end=form.election_date_end.data,
                submission_date_start=form.submission_date_start.data,
                submission_date_end=form.submission_date_end.data,
                election_n_choice=form.election_n_choice.data,
                user_n_candidates=form.user_n_candidates.data,
                election_badge_link=form.election_badge_link.data,
                user=flask.g.fas_user.username,
            )

            SESSION.commit()
        except SQLAlchemyError as err:
            SESSION.rollback()
            LOG.debug("User: %s could not add an election",
                      flask.g.fas_user.username)
            LOG.exception(err)
            flask.flash(
                'Could not add this election, is this name or '
                'folder already used?', 'error')
            return flask.render_template('admin_new.html', form=form)

        flask.flash('Election created')
        if form.generate_cache.data:
            return admin_cache(election.id)

        return flask.redirect(flask.url_for('admin_index'))
    return flask.render_template('admin_new.html', form=form)
Beispiel #6
0
def admin_new():
    ''' Create a new election. '''
    if not nuancier.is_nuancier_admin(flask.g.fas_user):
        flask.flash('You are not an administrator of nuancier',
                        'error')
        return flask.redirect(flask.url_for('msg'))

    form = nuancier.forms.AddElectionForm()
    if form.validate_on_submit():

        try:
            election = nuancierlib.add_election(
                SESSION,
                election_name=form.election_name.data,
                election_folder=form.election_folder.data,
                election_year=form.election_year.data,
                election_date_start=form.election_date_start.data,
                election_date_end=form.election_date_end.data,
                submission_date_start=form.submission_date_start.data,
                submission_date_end=form.submission_date_end.data,
                election_n_choice=form.election_n_choice.data,
                user_n_candidates=form.user_n_candidates.data,
                election_badge_link=form.election_badge_link.data,
                user=flask.g.fas_user.username,
            )

            SESSION.commit()
        except SQLAlchemyError as err:
            SESSION.rollback()
            LOG.debug("User: %s could not add an election",
                      flask.g.fas_user.username)
            LOG.exception(err)
            flask.flash('Could not add this election, is this name or '
                        'folder already used?', 'error')
            return flask.render_template('admin_new.html', form=form)

        flask.flash('Election created')
        if form.generate_cache.data:
            return admin_cache(election.id)

        return flask.redirect(flask.url_for('admin_index'))
    return flask.render_template('admin_new.html', form=form)
Beispiel #7
0
def admin_review(election_id):
    ''' Review a new election. '''
    election = nuancierlib.get_election(SESSION, election_id)

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    if election.election_open:
        flask.flash(
            'This election is already open to public votes and can no '
            'longer be changed', 'error')

    if election.election_public:
        flask.flash(
            'The results of this election are already public, this election'
            ' can no longer be changed', 'error')

    status = flask.request.args.get('status', 'all')
    if status == 'all':
        status = None

    candidates = nuancierlib.get_candidates(
        SESSION, election_id, approved=status
    )

    template = 'admin_review.html'
    if election.election_public or election.election_open \
            or not nuancier.is_nuancier_admin(flask.g.fas_user):
        template = 'admin_review_ro.html'

    return flask.render_template(
        template,
        election=election,
        form=nuancier.forms.ConfirmationForm(),
        candidates=candidates,
        picture_folder=os.path.join(
            APP.config['PICTURE_FOLDER'], election.election_folder),
        cache_folder=os.path.join(
            APP.config['CACHE_FOLDER'], election.election_folder))
Beispiel #8
0
def admin_process_review(election_id):
    ''' Process the reviewing of a new election. '''
    if not nuancier.is_nuancier_admin(flask.g.fas_user):
        flask.flash('You are not an administrator of nuancier',
                        'error')
        return flask.redirect(flask.url_for('msg'))

    status = flask.request.args.get('status', None)
    endpoint = 'admin_review'
    if status:
        endpoint = 'admin_review_status'

    election = nuancierlib.get_election(SESSION, election_id)

    form = nuancier.forms.ConfirmationForm()
    if not form.validate_on_submit():
        flask.flash('Wrong input submitted', 'error')
        return flask.render_template('msg.html')

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    if election.election_open:
        flask.flash(
            'This election is already open to public votes and can no '
            'longer be changed', 'error')
        return flask.redirect(flask.url_for('results_list'))

    if election.election_public:
        flask.flash(
            'The results of this election are already public, this election'
            ' can no longer be changed', 'error')
        return flask.redirect(flask.url_for('results_list'))

    candidates = nuancierlib.get_candidates(SESSION, election_id)
    candidates_id = [str(candidate.id) for candidate in candidates]

    candidates_selected = flask.request.form.getlist('candidates_id')
    motifs = flask.request.form.getlist('motifs')
    action = flask.request.form.get('action')

    if action:
        action = action.strip()

    if action not in ['Approved', 'Denied']:
        flask.flash(
            'Only the actions "Approved" or "Denied" are accepted',
            'error')
        return flask.redirect(flask.url_for(
                endpoint, election_id=election_id, status=status))

    selections = []
    for cand in candidates_id:
        if cand not in candidates_selected:
            selections.append(None)
        else:
            selections.append(cand)

    if action == 'Denied':
        req_motif = False
        if not motifs:
            req_motif = True
        for cnt in range(len(motifs)):
            motif = motifs[cnt]
            if selections[cnt] and not motif.strip():
                req_motif = True
                break
        if req_motif:
            flask.flash(
                'You must provide a motif to deny a candidate',
                'error')
            return flask.redirect(flask.url_for(
                endpoint, election_id=election_id, status=status))

    cnt = 0
    for candidate in candidates_selected:
        if candidate not in candidates_id:
            flask.flash(
                'One of the candidate submitted was not candidate in this '
                'election', 'error')
            return flask.redirect(flask.url_for(
                endpoint, election_id=election_id, status=status))

    msgs = []

    for candidate in selections:
        if candidate:
            candidate = nuancierlib.get_candidate(SESSION, candidate)
            motif = None
            if len(motifs) > cnt:
                motif = motifs[cnt].strip()
            if action == 'Approved':
                candidate.approved = True
                candidate.approved_motif = motif
            else:
                candidate.approved = False
                candidate.approved_motif = motif
                if APP.config.get(
                        'NUANCIER_EMAIL_NOTIFICATIONS',
                        False):  # pragma: no cover
                    nuancierlib.notifications.email_publish(
                        to_email=candidate.submitter_email,
                        img_title=candidate.candidate_name,
                        motif=motif)
                else:
                    LOG.warning(
                        'Should have sent an email to "%s" about "%s" that has'
                        ' been rejected because of "%s"',
                        candidate.submitter_email,
                        candidate.candidate_name,
                        motif)

            SESSION.add(candidate)
            msgs.append({
                'topic': 'candidate.%s' % (action.lower()),
                'msg': dict(
                    agent=flask.g.fas_user.username,
                    election=election.api_repr(version=1),
                    candidate=candidate.api_repr(version=1),
                )
            })
        cnt += 1

    try:
        SESSION.commit()
    except SQLAlchemyError as err:  # pragma: no cover
        SESSION.rollback()
        LOG.debug('User: "******" could not approve/deny candidate(s) for '
                  'election "%s"', flask.g.fas_user.username,
                  election_id)
        LOG.exception(err)
        flask.flash('Could not approve/deny candidate', 'error')

    flask.flash('Candidate(s) updated')

    for msg in msgs:
        nuancierlib.notifications.publish(
            topic=msg['topic'],
            msg=msg['msg'],
        )

    return flask.redirect(flask.url_for(
        endpoint, election_id=election_id, status=status))
Beispiel #9
0
def admin_process_review(election_id):
    ''' Process the reviewing of a new election. '''
    if not nuancier.is_nuancier_admin(flask.g.fas_user):
        flask.flash('You are not an administrator of nuancier', 'error')
        return flask.redirect(flask.url_for('msg'))

    status = flask.request.args.get('status', None)
    endpoint = 'admin_review'
    if status:
        endpoint = 'admin_review_status'

    election = nuancierlib.get_election(SESSION, election_id)

    form = nuancier.forms.ConfirmationForm()
    if not form.validate_on_submit():
        flask.flash('Wrong input submitted', 'error')
        return flask.render_template('msg.html')

    if not election:
        flask.flash('No election found', 'error')
        return flask.render_template('msg.html')

    if election.election_open:
        flask.flash(
            'This election is already open to public votes and can no '
            'longer be changed', 'error')
        return flask.redirect(flask.url_for('results_list'))

    if election.election_public:
        flask.flash(
            'The results of this election are already public, this election'
            ' can no longer be changed', 'error')
        return flask.redirect(flask.url_for('results_list'))

    candidates = nuancierlib.get_candidates(SESSION, election_id)
    candidates_id = [str(candidate.id) for candidate in candidates]

    candidates_selected = flask.request.form.getlist('candidates_id')
    motifs = flask.request.form.getlist('motifs')
    action = flask.request.form.get('action')

    if action:
        action = action.strip()

    if action not in ['Approved', 'Denied']:
        flask.flash('Only the actions "Approved" or "Denied" are accepted',
                    'error')
        return flask.redirect(
            flask.url_for(endpoint, election_id=election_id, status=status))

    selections = []
    for cand in candidates_id:
        if cand not in candidates_selected:
            selections.append(None)
        else:
            selections.append(cand)

    if action == 'Denied':
        req_motif = False
        if not motifs:
            req_motif = True
        for cnt in range(len(motifs)):
            motif = motifs[cnt]
            if selections[cnt] and not motif.strip():
                req_motif = True
                break
        if req_motif:
            flask.flash('You must provide a reason to deny a candidate',
                        'error')
            return flask.redirect(
                flask.url_for(endpoint, election_id=election_id,
                              status=status))

    cnt = 0
    for candidate in candidates_selected:
        if candidate not in candidates_id:
            flask.flash(
                'One of the candidate submitted was not candidate in this '
                'election', 'error')
            return flask.redirect(
                flask.url_for(endpoint, election_id=election_id,
                              status=status))

    msgs = []

    for candidate in selections:
        if candidate:
            candidate = nuancierlib.get_candidate(SESSION, candidate)
            motif = None
            if len(motifs) > cnt:
                motif = motifs[cnt].strip()
            if action == 'Approved':
                candidate.approved = True
                candidate.approved_motif = motif
            else:
                candidate.approved = False
                candidate.approved_motif = motif
                if APP.config.get('NUANCIER_EMAIL_NOTIFICATIONS',
                                  False):  # pragma: no cover
                    nuancierlib.notifications.email_publish(
                        to_email=candidate.submitter_email,
                        img_title=candidate.candidate_name,
                        motif=motif)
                else:
                    LOG.warning(
                        'Should have sent an email to "%s" about "%s" that has'
                        ' been rejected because of "%s"',
                        candidate.submitter_email, candidate.candidate_name,
                        motif)

            SESSION.add(candidate)
            msgs.append({
                'topic':
                'candidate.%s' % (action.lower()),
                'msg':
                dict(
                    agent=flask.g.fas_user.username,
                    election=election.api_repr(version=1),
                    candidate=candidate.api_repr(version=1),
                )
            })
        cnt += 1

    try:
        SESSION.commit()
    except SQLAlchemyError as err:  # pragma: no cover
        SESSION.rollback()
        LOG.debug(
            'User: "******" could not approve/deny candidate(s) for '
            'election "%s"', flask.g.fas_user.username, election_id)
        LOG.exception(err)
        flask.flash('Could not approve/deny candidate', 'error')

    flask.flash('Candidate(s) updated')

    for msg in msgs:
        nuancierlib.notifications.publish(
            topic=msg['topic'],
            msg=msg['msg'],
        )

    return flask.redirect(
        flask.url_for(endpoint, election_id=election_id, status=status))