From cea96845d707ec7af41d20833cad78e2928ddce5 Mon Sep 17 00:00:00 2001 From: vincenzoarcidiacono Date: Fri, 13 Sep 2024 14:05:18 +0200 Subject: [PATCH] fix(form): Update contact logic. --- schedula/utils/form/server/contact.py | 58 +++++++++++++++++++-------- setup.py | 6 ++- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/schedula/utils/form/server/contact.py b/schedula/utils/form/server/contact.py index 0116286fe..00cc92872 100644 --- a/schedula/utils/form/server/contact.py +++ b/schedula/utils/form/server/contact.py @@ -20,10 +20,13 @@ from flask_mail import Message, Mail as _Mail from werkzeug.datastructures import MultiDict from flask_wtf.recaptcha import RecaptchaField -from flask_babel import lazy_gettext, get_locale -from flask import flash, Blueprint -from flask_security.utils import base_render_json, suppress_form_csrf +from flask_babel import get_locale +from flask import flash, Blueprint, redirect, request, current_app as ca +from flask_security.utils import ( + base_render_json, suppress_form_csrf, get_post_action_redirect +) from flask_security.forms import Required, StringField, Form, EmailField +from .locale import lazy_gettext log = logging.getLogger(__name__) bp = Blueprint('contact', __name__) @@ -81,9 +84,12 @@ class ContactForm(Form): recaptcha = RecaptchaField('g-recaptcha-response') +def get_post_contact_redirect(): + return get_post_action_redirect("SCHEDULA_POST_CONTACT_VIEW", request.form) + + @bp.route('/contact', methods=['POST']) def contact(): - from flask import request, current_app as ca data = MultiDict( request.get_json() ) if request.is_json else request.form @@ -94,18 +100,30 @@ def contact(): data['name'] = f'{cu.firstname} {cu.lastname}' form = ContactForm(data, meta=suppress_form_csrf()) if form.validate_on_submit(): - ca.extensions['schedula_mail'].send_rst( - to=[form.data['email'], ca.config.get('MAIL_DEFAULT_SENDER')], - rst='contact', reply_to=form.data['email'], data={ - 'user': cu, 'data': data, - 'created': datetime.datetime.now().strftime("%d/%m/%Y-%H:%M:%S") - } - ) - flash( - str(lazy_gettext('Your message has been successfully sent!')), - 'success' - ) - return base_render_json(form) + try: + ca.extensions['schedula_mail'].send_rst( + to=[form.data['email'], ca.config.get('MAIL_DEFAULT_SENDER')], + rst='contact', reply_to=form.data['email'], data={ + 'user': cu, 'data': data, + 'created': datetime.datetime.now().strftime( + "%d/%m/%Y-%H:%M:%S") + } + ) + flash(str(lazy_gettext( + 'Your message has been successfully sent!', + domain='contact' + )), 'success') + except Exception as ex: + flash(str(lazy_gettext( + "A system error has occurred. Please try again later. " + "If the problem persists, contact technical support.", + domain='contact' + )), 'error') + return redirect(request.referrer or '/') + + if ca.extensions["security"]._want_json(request): + return base_render_json(form) + return redirect(get_post_contact_redirect()) class Contact(Mail): @@ -114,5 +132,13 @@ def __init__(self, app): def init_app(self, app): super().init_app(app) + app.config['SCHEDULA_POST_CONTACT_VIEW'] = app.config.get( + 'SCHEDULA_POST_CONTACT_VIEW', os.environ.get( + 'SCHEDULA_POST_CONTACT_VIEW', app.config.get( + "APPLICATION_ROOT", "/" + ) + ) + ) + app.register_blueprint(bp, url_prefix='/mail') app.extensions['schedula_mail'] = self diff --git a/setup.py b/setup.py index 570585193..1bef408f9 100755 --- a/setup.py +++ b/setup.py @@ -92,7 +92,7 @@ def get_long_description(cleanup=True, core=False): 'itsdangerous', 'rst2txt', 'flask-sqlalchemy', 'sqlalchemy', 'docutils', 'flask-babel', 'flask-wtf', 'flask-security-too[common]', 'flask-admin', 'flask-principal', 'flask-mail', 'gunicorn', 'stripe', 'click_log', - 'click', 'asteval', 'sherlock','sqlalchemy-file', 'fasteners', + 'click', 'asteval', 'sherlock', 'sqlalchemy-file', 'fasteners', 'python-dateutil' ] extras['sphinx'] = ['sphinx>=7.2', 'sphinx-click'] + extras['plot'] @@ -108,7 +108,9 @@ def get_long_description(cleanup=True, core=False): 'tests', 'tests.*', 'examples', 'examples.*', 'micropython', 'micropython.*', - 'requirements', 'binder', 'bin' + 'requirements', 'binder', 'bin', + 'schedula.utils.form.react', 'schedula.utils.form.react.*', + 'schedula.utils.form.server.bin', 'schedula.utils.form.server.bin.*', ] kw = {'entry_points': { 'console_scripts': [