From 5a69ada0416690d6951b678e1fac74bec2f83ce3 Mon Sep 17 00:00:00 2001 From: Pierre Jaury Date: Fri, 19 Aug 2016 10:36:13 +0200 Subject: [PATCH] Add an action confirmation form, related to #20 --- admin/freeposte/admin/forms.py | 4 ++++ admin/freeposte/admin/templates/confirm.html | 14 ++++++++++++++ admin/freeposte/admin/utils.py | 20 +++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 admin/freeposte/admin/templates/confirm.html diff --git a/admin/freeposte/admin/forms.py b/admin/freeposte/admin/forms.py index 8c8c4844..0bda4ee9 100644 --- a/admin/freeposte/admin/forms.py +++ b/admin/freeposte/admin/forms.py @@ -31,6 +31,10 @@ class DestinationField(fields.SelectMultipleField): raise validators.ValidationError("Invalid email address.") +class ConfirmationForm(Form): + submit = fields.SubmitField('Confirm') + + class LoginForm(Form): email = fields.StringField('E-mail', [validators.Email()]) pw = fields.PasswordField('Password', [validators.DataRequired()]) diff --git a/admin/freeposte/admin/templates/confirm.html b/admin/freeposte/admin/templates/confirm.html new file mode 100644 index 00000000..c95db696 --- /dev/null +++ b/admin/freeposte/admin/templates/confirm.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %} +Confirm action +{% endblock %} + +{% block subtitle %} +{{ action }} +{% endblock %} + +{% block box_content %} +

You are about to {{ action }}. Please confirm your action.

+{{ macros.form(form) }} +{% endblock %} diff --git a/admin/freeposte/admin/utils.py b/admin/freeposte/admin/utils.py index 6e9d60f8..6deaf53c 100644 --- a/admin/freeposte/admin/utils.py +++ b/admin/freeposte/admin/utils.py @@ -1,7 +1,25 @@ -from freeposte.admin import models +from freeposte.admin import models, forms import flask import flask_login +import functools + + +def confirmation_required(action): + """ View decorator that asks for a confirmation first. + """ + def inner(function): + @functools.wraps(function) + def wrapper(*args, **kwargs): + form = forms.ConfirmationForm() + if form.validate_on_submit(): + return function(*args, **kwargs) + return flask.render_template( + "confirm.html", action=action.format(*args, **kwargs), + form=form + ) + return wrapper + return inner def get_domain_admin(domain_name):