from flask import request, flash, redirect, url_for from app.utils.priv_required import priv_required from app.models.users import Member from app.forms.account import AdminUpdateAccountForm, AdminDeleteAccountForm from app.utils.render import render from app import app, db @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_or_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) newname = form.username.data names = list(Member.query.filter(Member.id != user.id).values(Member.name)) if newname in names: raise Exception(f'{newname} is not available') user.update( name=form.username.data or None, 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, xp=form.xp.data or None, ) db.session.merge(user) db.session.commit() # TODO: send an email to member saying his account has been modified 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_or_404() # Note: A user deleting their own account will be disconnected. # TODO: Add an overview of what will be deleted. # * How many posts will be turned into guest posts # * Option: purely delete the posts in question # * How many PMs will be deleted (can't unassign PMs) # * etc. del_form = AdminDeleteAccountForm() if request.method == "POST": if del_form.validate_on_submit(): user.delete() flash('Compte supprimé', 'ok') return redirect(url_for('adm')) 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)