diff --git a/app/forms/account.py b/app/forms/account.py index 9e6f7ca..ab60ed1 100644 --- a/app/forms/account.py +++ b/app/forms/account.py @@ -29,4 +29,19 @@ class UpdateAccountForm(FlaskForm): class DeleteAccountForm(FlaskForm): delete = BooleanField('Confirmer la suppression', 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') + + +class AdminUpdateAccountForm(FlaskForm): + avatar = FileField('Avatar', validators=[Optional(), vd.avatar]) + email = StringField('Adresse Email', validators=[Optional(), Email(), vd.email]) + password = PasswordField('Mot de passe :', validators=[Optional(), vd.password]) + 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') + +class AdminDeleteAccountForm(FlaskForm): + delete = BooleanField('Confirmer la suppression', validators=[DataRequired()], description='Attention, cette opération est irréversible !') submit = SubmitField('Supprimer le compte') \ No newline at end of file diff --git a/app/routes/account.py b/app/routes/account.py index 4e5b0e7..2b5a108 100644 --- a/app/routes/account.py +++ b/app/routes/account.py @@ -7,7 +7,7 @@ from app.utils.render import render @app.route('/account', methods=['GET', 'POST']) @login_required -def account(): +def edit_account(): form = UpdateAccountForm() if request.method == "POST": if form.validate_on_submit(): diff --git a/app/routes/admin.py b/app/routes/admin.py index a64b586..1e8d091 100644 --- a/app/routes/admin.py +++ b/app/routes/admin.py @@ -1,10 +1,12 @@ +from flask import request, flash, redirect, url_for, abort from flask_login import login_required +from app.utils.priv_required import priv_required from flask_wtf import FlaskForm from wtforms import SubmitField from app.models.users import Member, Group, GroupPrivilege from app.models.privs import SpecialPrivilege +from app.forms.account import AdminUpdateAccountForm, AdminDeleteAccountForm from app.utils.render import render -from app.utils.priv_required import priv_required from app import app, db @app.route('/admin', methods=['GET', 'POST']) @@ -55,4 +57,50 @@ def admin(): users = Member.query.all() groups = Group.query.all() - return render('admin.html', users=users, groups=groups, form=form) + return render('admin/index.html', users=users, groups=groups, form=form) + +@app.route('/admin/edit-account/', methods=['GET', 'POST']) +@priv_required('edit-account') +def adm_edit_account(user_id): + user = Member.query.filter_by(id=user_id).first() + if not user: + abort(404) + form = AdminUpdateAccountForm() + if request.method == "POST": + if form.validate_on_submit(): + if form.avatar.data: + f = form.avatar.data + f.save("./app/static/"+user.avatar) + user.update( + email = form.email.data or None, + password = form.password.data or None, + birthday = form.birthday.data, + signature = form.signature.data, + bio = form.biography.data, + newsletter = form.newsletter.data + ) + db.session.merge(user) + db.session.commit() + flash('Modifications effectuées', 'ok') + else: + flash('Erreur lors de la modification', 'error') + + return render('admin/edit_account.html', user=user, form=form) + +@app.route('/admin/edit-account//delete', methods=['GET', 'POST']) +@priv_required('delete-account') +def adm_delete_account(user_id): + user = Member.query.filter_by(id=user_id).first() + if not user: + abort(404) + del_form = AdminDeleteAccountForm() + if request.method == "POST": + if del_form.validate_on_submit(): + db.session.delete(user) + db.session.commit() + flash('Compte supprimé', 'ok') + return redirect(url_for('admin')) + else: + flash('Erreur lors de la suppression du compte', 'error') + del_form.delete.data = False # Force to tick to delete the account + return render('admin/delete_account.html', user=user, del_form=del_form) diff --git a/app/routes/users.py b/app/routes/users.py index 111389b..b9165b5 100644 --- a/app/routes/users.py +++ b/app/routes/users.py @@ -16,5 +16,5 @@ def user(username): def user_by_id(user_id): user = Member.query.filter_by(id=user_id).first() if not user: - abort(404) + abort(404) return redirect(url_for('user', username=user.name)) diff --git a/app/static/css/navbar.css b/app/static/css/navbar.css index c3545b5..5f78c8e 100644 --- a/app/static/css/navbar.css +++ b/app/static/css/navbar.css @@ -138,12 +138,23 @@ nav a:focus { font-family: Raleway; font-size: 18px; color: #ffffff; } +#menu h2 a { + margin: 0; + display: flex; + flex-direction: row; + align-items: center; + font-size: inherit; opacity: inherit; +} #menu h2 > svg { width: 42px; vertical-align: middle; } #menu h2 img { width: 64px; border-radius: 50%; vertical-align: middle; margin-right: 10px; } +#menu h2 a:hover, +#menu h2 a:focus { + text-decoration: underline; +} #menu h3 { margin: 20px 0 20px 40px; diff --git a/app/templates/account.html b/app/templates/account.html index 7c4aa88..dc77b6d 100644 --- a/app/templates/account.html +++ b/app/templates/account.html @@ -4,7 +4,7 @@

Gestion du compte

-
+ {{ form.hidden_tag() }}

Général

diff --git a/app/templates/admin/delete_account.html b/app/templates/admin/delete_account.html new file mode 100644 index 0000000..9821af1 --- /dev/null +++ b/app/templates/admin/delete_account.html @@ -0,0 +1,19 @@ +{% extends "base/container.html" %} + +{% block content %} +
+

Suppression du compte

+ + {{ 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-red") }}
+ +
+{% endblock %} diff --git a/app/templates/admin/edit_account.html b/app/templates/admin/edit_account.html new file mode 100644 index 0000000..e766372 --- /dev/null +++ b/app/templates/admin/edit_account.html @@ -0,0 +1,72 @@ +{% extends "base/container.html" %} + +{% block content %} +
+

Gestion du compte

+ +
+ {{ form.hidden_tag() }} + +

Général

+
+ {{ form.avatar.label }} +
+ + {{ form.avatar }} +
+
+
+ {{ form.email.label }} + {{ form.email(placeholder=user.email) }} + {% for error in form.email.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form.password.label }} + {{ form.password(placeholder='************') }} + {% for error in form.password.errors %} + {{ error }} + {% endfor %} +
+ +

À propos

+
+ {{ form.birthday.label }} + {{ form.birthday(value=user.birthday) }} + {% for error in form.birthday.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form.signature.label }} + + {% for error in form.signature.errors %} + {{ error }} + {% endfor %} +
+
+ {{ form.biography.label }} + + {% for error in form.biography.errors %} + {{ error }} + {% endfor %} +
+ +

Préférences

+
+ {{ form.newsletter.label }} + {{ form.newsletter(checked=user.newsletter) }} +
{{ form.newsletter.description }}
+ {% for error in form.newsletter.errors %} + {{ error }} + {% endfor %} +
+
{{ form.submit(class_="bg-green") }}
+
+ +

Supprimer le compte

+ Supprimer le compte + +
+{% endblock %} diff --git a/app/templates/admin.html b/app/templates/admin/index.html similarity index 83% rename from app/templates/admin.html rename to app/templates/admin/index.html index d0498e6..65e1267 100644 --- a/app/templates/admin.html +++ b/app/templates/admin/index.html @@ -11,14 +11,16 @@ - + {% for user in users %} - + + + {% endfor %}
NameEmailRegisterXPInn.Newsletter
NewsletterEdit
{{ user.name }} {{ user.email }} {{ user.register_date }}{{ user.xp }} {{ user.innovation }}{{ "Yes" if user.newsletter else "No" }}
{{ "Yes" if user.newsletter else "No" }}Edit
diff --git a/app/templates/base/navbar/account.html b/app/templates/base/navbar/account.html index f00fa42..d381a88 100644 --- a/app/templates/base/navbar/account.html +++ b/app/templates/base/navbar/account.html @@ -1,8 +1,10 @@ {% if current_user.is_authenticated %}

- - {{ current_user.name }} + + +
{{ current_user.name }}
+

@@ -31,7 +33,7 @@
-
+