From 938516cb3f3bc74a3753101d3043c3013ba58c12 Mon Sep 17 00:00:00 2001 From: Eldeberen Date: Mon, 22 Feb 2021 23:50:19 +0100 Subject: [PATCH] polls: added admin panel and deletion form --- app/forms/poll.py | 15 ++++++++++++++- app/routes/__init__.py | 4 ++-- app/routes/account/polls.py | 8 ++++++-- app/routes/admin/polls.py | 11 +++++++++++ app/routes/polls/delete.py | 31 +++++++++++++++++++++++++++++++ app/templates/account/polls.html | 1 + app/templates/admin/polls.html | 19 +++++++++++++++++++ app/templates/poll/delete.html | 25 +++++++++++++++++++++++++ 8 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 app/routes/admin/polls.py create mode 100644 app/routes/polls/delete.py create mode 100644 app/templates/admin/polls.html create mode 100644 app/templates/poll/delete.html diff --git a/app/forms/poll.py b/app/forms/poll.py index 58db791..845d7f9 100644 --- a/app/forms/poll.py +++ b/app/forms/poll.py @@ -1,5 +1,6 @@ from flask_wtf import FlaskForm -from wtforms import StringField, SubmitField, TextAreaField, SelectField +from wtforms import StringField, SubmitField, TextAreaField, SelectField, \ + BooleanField from wtforms.fields.html5 import DateTimeField from wtforms.validators import InputRequired, Optional @@ -43,3 +44,15 @@ class PollForm(FlaskForm): submit = SubmitField( 'Créer le sondage' ) + +class DeletePollForm(FlaskForm): + delete = BooleanField( + 'Confirmer la suppression', + validators=[ + InputRequired(), + ], + description='Attention, cette opération est irréversible !' + ) + submit = SubmitField( + 'Supprimer le sondage' + ) diff --git a/app/routes/__init__.py b/app/routes/__init__.py index 28a675d..28cdc9c 100644 --- a/app/routes/__init__.py +++ b/app/routes/__init__.py @@ -3,9 +3,9 @@ from app.routes import index, search, users, tools, development from app.routes.account import login, account, notification, polls from app.routes.admin import index, groups, account, trophies, forums, \ - attachments, config, members + attachments, config, members, polls from app.routes.forum import index, topic -from app.routes.polls import vote +from app.routes.polls import vote, delete from app.routes.posts import edit from app.routes.programs import index from app.routes.api import markdown diff --git a/app/routes/account/polls.py b/app/routes/account/polls.py index 4b58b62..2018462 100644 --- a/app/routes/account/polls.py +++ b/app/routes/account/polls.py @@ -1,16 +1,20 @@ from app import app, db from flask import abort, flash, redirect, request, url_for -from flask_login import current_user +from flask_login import current_user, login_required +from app.models.poll import Poll from app.models.polls.simple import SimplePoll from app.models.polls.multiple import MultiplePoll from app.forms.poll import PollForm from app.utils.render import render + @app.route("/compte/sondages", methods=['GET', 'POST']) +@login_required def account_polls(): form = PollForm() - polls = current_user.polls + polls = (Poll.query.filter(Poll.author == current_user) + .order_by(Poll.end.desc())) polls_types = { 'simplepoll': SimplePoll, 'multiplepoll': MultiplePoll, diff --git a/app/routes/admin/polls.py b/app/routes/admin/polls.py new file mode 100644 index 0000000..22127d5 --- /dev/null +++ b/app/routes/admin/polls.py @@ -0,0 +1,11 @@ +from app import app +from app.utils.priv_required import priv_required +from app.utils.render import render +from app.models.poll import Poll + +@app.route('/admin/sondages', methods=['GET']) +@priv_required('access-admin-panel') +def adm_polls(): + polls = Poll.query.order_by(Poll.end.desc()).all() + + return render('admin/polls.html', polls=polls) diff --git a/app/routes/polls/delete.py b/app/routes/polls/delete.py new file mode 100644 index 0000000..1d41af8 --- /dev/null +++ b/app/routes/polls/delete.py @@ -0,0 +1,31 @@ +from app import app, db +from flask import abort, flash, redirect, request, url_for +from flask_login import current_user +from app.utils.render import render +from app.models.poll import Poll +from app.forms.poll import DeletePollForm + +@app.route("/sondages//supprimer", methods=['GET', 'POST']) +def poll_delete(poll_id): + poll = Poll.query.get(poll_id) + if poll is None: + abort(404) + + if current_user != poll.author and \ + not current_user.priv('delete-posts'): + abort(403) + + form = DeletePollForm() + + if form.validate_on_submit(): + for a in poll.answers: + db.session.delete(a) + db.session.commit() + + db.session.delete(poll) + db.session.commit() + + flash('Le sondage a été supprimé', 'info') + return redirect(url_for('account_polls')) + + return render('poll/delete.html', poll=poll, del_form=form) diff --git a/app/templates/account/polls.html b/app/templates/account/polls.html index d562421..6e6d627 100644 --- a/app/templates/account/polls.html +++ b/app/templates/account/polls.html @@ -54,6 +54,7 @@
{% for p in polls %} {{ poll_widget.wpoll(p) }} + Supprimer le sondage {% endfor %}
diff --git a/app/templates/admin/polls.html b/app/templates/admin/polls.html new file mode 100644 index 0000000..952b246 --- /dev/null +++ b/app/templates/admin/polls.html @@ -0,0 +1,19 @@ +{% extends "base/base.html" %} +{% import "widgets/poll.html" as poll_widget with context %} + +{% block title %} +

Gestion des sondages

+{% endblock %} + +{% block content %} +
+

Tous les sondages

+
+ {% for p in polls %} + {{ poll_widget.wpoll(p) }} + Auteur : {{ p.author.name }} | + Supprimer le sondage + {% endfor %} +
+
+{% endblock %} diff --git a/app/templates/poll/delete.html b/app/templates/poll/delete.html new file mode 100644 index 0000000..0834dc4 --- /dev/null +++ b/app/templates/poll/delete.html @@ -0,0 +1,25 @@ +{% extends "base/base.html" %} +{% import "widgets/poll.html" as poll_widget with context %} + +{% block title %} +

Supprimer un sondage

+{% endblock %} + +{% block content %} +
+ {{ poll_widget.wpoll(poll) }} + +
+ {{ del_form.hidden_tag() }} +
+ {{ del_form.delete.label }} + {{ del_form.delete(checked=False) }} +
{{ del_form.delete.description }}
+ {% for error in del_form.delete.errors %} + {{ error }} + {% endfor %} +
+
{{ del_form.submit(class_="bg-error") }}
+
+
+{% endblock %}