from flask import flash, redirect, url_for from app.utils.priv_required import priv_required from app.models.users import Member from app.models.trophies import Trophy from app.forms.account import AdminUpdateAccountForm, AdminDeleteAccountForm, \ AdminAccountAddTrophyForm, AdminAccountDelTrophyForm from app.utils.render import render from app import app, db @app.route('/admin/account//edit', methods=['GET', 'POST']) @priv_required('access-admin-panel', 'edit-account') def adm_edit_account(user_id): user = Member.query.filter_by(id=user_id).first_or_404() form = AdminUpdateAccountForm(prefix="user") addtrophy_form = AdminAccountAddTrophyForm(prefix="addtrophy") addtrophy_form.trophy.choices = [(t.id, t.name) for t in Trophy.query.all()] deltrophy_form = AdminAccountDelTrophyForm(prefix="deltrophy") deltrophy_form.trophy.choices = [(t.id, t.name) for t in user.trophies] if form.submit.data: 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') if addtrophy_form.submit.data: if addtrophy_form.validate_on_submit(): trophy = Trophy.query.get(addtrophy_form.trophy.data) if trophy is not None: user.add_trophy(trophy) flash('Trophée ajouté', 'ok') else: flash("Erreur lors de l'ajout du trophée", 'error') if deltrophy_form.submit.data: if deltrophy_form.validate_on_submit(): trophy = Trophy.query.get(deltrophy_form.trophy.data) if trophy is not None: user.del_trophy(trophy) flash('Trophée retiré', 'ok') else: flash("Erreur lors du retrait du trophée", 'error') return render('admin/edit_account.html', user=user, form=form, addtrophy_form=addtrophy_form, deltrophy_form=deltrophy_form) @app.route('/admin/account//delete', methods=['GET', 'POST']) @priv_required('access-admin-panel', '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 del_form.submit.data: 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)