From 62ccaa23d6d266a2d6aaaf70a0a3b69919725078 Mon Sep 17 00:00:00 2001 From: Dark-Storm Date: Mon, 4 Feb 2019 18:48:31 +0100 Subject: [PATCH] =?UTF-8?q?Modifications=20sur=20la=20gestion=20du=20compt?= =?UTF-8?q?e=20-=20R=C3=A9organisation=20des=20parties=20-=20Ajout=20d'un?= =?UTF-8?q?=20formulaire=20de=20suppression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le formulaire de suppression ne fonctionne pas à cause d'un erreur dans le `session.commit()` (`AssertionError: Failed to add object to the flush context!`). Cela est peut-être du aux relations qui mettent orphelines les contenus dépendants du membre. Cf [delete cascades](https://docs.sqlalchemy.org/en/latest/orm/cascades.html#delete) dans sql alchemy --- app/forms/account.py | 17 +++++++++++------ app/routes/account.py | 21 ++++++++++++++++++--- app/static/css/form.css | 8 ++++---- app/static/css/global.css | 13 +++++++++++++ app/templates/account.html | 23 ++++++++++++++++++++++- app/templates/delete_account.html | 26 ++++++++++++++++++++++++++ app/utils/validators.py | 2 +- 7 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 app/templates/delete_account.html diff --git a/app/forms/account.py b/app/forms/account.py index d1cd463..8a0e404 100644 --- a/app/forms/account.py +++ b/app/forms/account.py @@ -5,8 +5,8 @@ from wtforms.validators import DataRequired, Optional, Email, EqualTo import app.utils.validators as vd class RegistrationForm(FlaskForm): - username = StringField('Pseudonyme :', validators=[DataRequired(), vd.name]) - email = StringField('Adresse Email :', validators=[DataRequired(), Email(), vd.email]) + username = StringField('Pseudonyme', validators=[DataRequired(), vd.name]) + email = StringField('Adresse Email', validators=[DataRequired(), Email(), vd.email]) password = PasswordField('Mot de passe', validators=[DataRequired(), vd.password]) password2 = PasswordField('Répéter le mot de passe', validators=[DataRequired(), EqualTo('password')]) guidelines = BooleanField('J’accepte les CGU', validators=[DataRequired()]) @@ -14,13 +14,18 @@ class RegistrationForm(FlaskForm): submit = SubmitField('S\'enregistrer') class UpdateAccountForm(FlaskForm): - avatar = FileField('Avatar :', validators=[Optional(), vd.avatar]) - email = StringField('Adresse Email :', validators=[Optional(), Email(), vd.email, vd.old_password]) + avatar = FileField('Avatar', validators=[Optional(), vd.avatar]) + email = StringField('Adresse Email', validators=[Optional(), Email(), vd.email, vd.old_password]) password = PasswordField('Mot de passe :', validators=[Optional(), vd.password, vd.old_password]) password2 = PasswordField('Répéter le mot de passe', validators=[Optional(), EqualTo('password')]) - old_password = PasswordField('Ancien mot de passe :', validators=[Optional()]) + old_password = PasswordField('Mot de passe actuel', validators=[Optional()]) birthday = DateField('Anniversaire', validators=[Optional()]) signature = TextAreaField('Signature', validators=[Optional()]) biography = TextAreaField('Présentation', validators=[Optional()]) newsletter = BooleanField('Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.') - submit = SubmitField('Mettre à jour') \ No newline at end of file + submit = SubmitField('Mettre à jour') + +class DeleteAccountForm(FlaskForm): + delete = BooleanField('Supprimer le compte', validators=[DataRequired()], description='Attention, cette opération est irréversible !') + old_password = PasswordField('Mot de passe', validators=[DataRequired(), vd.old_password]) + submit = SubmitField('Supprimer le compte') \ No newline at end of file diff --git a/app/routes/account.py b/app/routes/account.py index edd2674..a068999 100644 --- a/app/routes/account.py +++ b/app/routes/account.py @@ -1,7 +1,7 @@ from flask import redirect, url_for, request, flash -from flask_login import login_required, current_user +from flask_login import login_required, current_user, logout_user from app import app, db -from app.forms.account import UpdateAccountForm, RegistrationForm +from app.forms.account import UpdateAccountForm, RegistrationForm, DeleteAccountForm from app.models.users import Member from app.utils.render import render @@ -9,6 +9,7 @@ from app.utils.render import render @login_required def account(): form = UpdateAccountForm() + del_form = DeleteAccountForm() if request.method == "POST": if form.validate_on_submit(): # Updates to do @@ -32,7 +33,21 @@ def account(): flash('Modifications effectuées', 'ok') else: flash('Erreur lors de la modification', 'error') - return render('account.html', form=form) + + return render('account.html', form=form, del_form=del_form) + +@app.route('/account/delete', methods=['GET', 'POST']) +def delete_account(): + del_form = DeleteAccountForm() + if del_form.validate_on_submit(): + db.session.delete(current_user) + logout_user() + db.session.commit() + flash('Compte supprimé', 'ok') + return redirect(url_for('index')) + else: + flash('Erreur lors de la suppression du compte', 'error') + return render('delete_account.html', del_form=del_form) @app.route('/register', methods=['GET', 'POST']) def register(): diff --git a/app/static/css/form.css b/app/static/css/form.css index 9a2bebe..88ebc31 100644 --- a/app/static/css/form.css +++ b/app/static/css/form.css @@ -47,15 +47,15 @@ .form input[type="submit"] { width: 100%; - background-color: #149641; + /*background-color: #149641; border-color: #1e7408; - color: #ffffff; + color: #ffffff;*/ } .form input[type="submit"]:hover, .form input[type="submit"]:focus, .form input[type="submit"]:active { - background-color: #0f7331; - border-color: #073617; + /*background-color: #0f7331; + border-color: #073617;*/ } .form form .msgerror { diff --git a/app/static/css/global.css b/app/static/css/global.css index 97290d7..e5195db 100644 --- a/app/static/css/global.css +++ b/app/static/css/global.css @@ -102,3 +102,16 @@ input[type="checkbox"] { background-color: #0f7331; border-color: #073617; } + +.bg-red, +.bg-red { + background-color: #c0341d; + border-color: #a62d19; + color: #ffffff; +} +.bg-red:hover, +.bg-red:focus, +.bg-red:active { + background-color: #7b2112; + border-color: #073617; +} diff --git a/app/templates/account.html b/app/templates/account.html index c88c711..7708fd9 100644 --- a/app/templates/account.html +++ b/app/templates/account.html @@ -4,7 +4,7 @@

Gestion du compte

-
+ {{ form.hidden_tag() }}

Général

@@ -78,5 +78,26 @@
{{ form.submit(class_="bg-green") }}
+ +

Supprimer le compte

+
+ {{ del_form.hidden_tag() }} +
+ {{ del_form.delete.label }} + {{ del_form.delete }} +
{{ del_form.delete.description }}
+ {% for error in del_form.delete.errors %} + {{ error }} + {% endfor %} +
+
+ {{ del_form.old_password.label }} + {{ del_form.old_password(placeholder='************') }} + {% for error in del_form.old_password.errors %} + {{ error }} + {% endfor %} +
+
{{ del_form.submit(class_="bg-red") }}
+
{% endblock %} diff --git a/app/templates/delete_account.html b/app/templates/delete_account.html new file mode 100644 index 0000000..92d6bbe --- /dev/null +++ b/app/templates/delete_account.html @@ -0,0 +1,26 @@ +{% extends "base/container.html" %} + +{% block content %} +
+

Supprimer le compte

+
+ {{ del_form.hidden_tag() }} +
+ {{ del_form.delete.label }} + {{ del_form.delete }} +
{{ del_form.delete.description }}
+ {% for error in del_form.delete.errors %} + {{ error }} + {% endfor %} +
+
+ {{ del_form.old_password.label }} + {{ del_form.old_password(placeholder='************') }} + {% for error in del_form.old_password.errors %} + {{ error }} + {% endfor %} +
+
{{ del_form.submit(class_="bg-red") }}
+
+
+{% endblock %} diff --git a/app/utils/validators.py b/app/utils/validators.py index 285523f..3f58c3b 100644 --- a/app/utils/validators.py +++ b/app/utils/validators.py @@ -1,6 +1,6 @@ from flask_login import current_user from wtforms.validators import ValidationError -from app.models.users import Member +from app.models.users import User, Member def name(form, name): member = Member.query.filter_by(name=name.data).first()