Ajouts dans le panel admin
This commit is contained in:
parent
936d0e2e8e
commit
eca5fe488b
|
@ -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')
|
|
@ -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():
|
||||
|
|
|
@ -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/<user_id>', 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/<user_id>/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)
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<section class="form">
|
||||
<h1>Gestion du compte</h1>
|
||||
|
||||
<form action="{{ url_for('account') }}" method="post" enctype="multipart/form-data">
|
||||
<form action="{{ url_for('edit_account') }}" method="post" enctype="multipart/form-data">
|
||||
{{ form.hidden_tag() }}
|
||||
|
||||
<h2>Général</h2>
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
{% extends "base/container.html" %}
|
||||
|
||||
{% block content %}
|
||||
<section class="form">
|
||||
<h1>Suppression du compte</h2>
|
||||
<form action="{{ url_for('adm_delete_account', user_id=user.id) }}" method="post">
|
||||
{{ del_form.hidden_tag() }}
|
||||
<div>
|
||||
{{ del_form.delete.label }}
|
||||
{{ del_form.delete(checked=False) }}
|
||||
<div style="font-size:80%;color:rgba(0,0,0,.5)">{{ del_form.delete.description }}</div>
|
||||
{% for error in del_form.delete.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>{{ del_form.submit(class_="bg-red") }}</div>
|
||||
</form>
|
||||
</section>
|
||||
{% endblock %}
|
|
@ -0,0 +1,72 @@
|
|||
{% extends "base/container.html" %}
|
||||
|
||||
{% block content %}
|
||||
<section class="form">
|
||||
<h1>Gestion du compte</h1>
|
||||
|
||||
<form action="{{ url_for('adm_edit_account', user_id=user.id) }}" method="post" enctype="multipart/form-data">
|
||||
{{ form.hidden_tag() }}
|
||||
|
||||
<h2>Général</h2>
|
||||
<div>
|
||||
{{ form.avatar.label }}
|
||||
<div>
|
||||
<img class="avatar" src="{{ url_for('static', filename=user.avatar) }}" meta="{{ user.avatar }}" />
|
||||
{{ form.avatar }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
{{ form.email.label }}
|
||||
{{ form.email(placeholder=user.email) }}
|
||||
{% for error in form.email.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
{{ form.password.label }}
|
||||
{{ form.password(placeholder='************') }}
|
||||
{% for error in form.password.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<h2>À propos</h2>
|
||||
<div>
|
||||
{{ form.birthday.label }}
|
||||
{{ form.birthday(value=user.birthday) }}
|
||||
{% for error in form.birthday.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
{{ form.signature.label }}
|
||||
<textarea id="{{ form.signature.name }}" name="{{ form.signature.name }}">{{ user.signature }}</textarea>
|
||||
{% for error in form.signature.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
{{ form.biography.label }}
|
||||
<textarea id="{{ form.biography.name }}" name="{{ form.biography.name }}">{{ user.bio }}</textarea>
|
||||
{% for error in form.biography.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<h2>Préférences</h2>
|
||||
<div>
|
||||
{{ form.newsletter.label }}
|
||||
{{ form.newsletter(checked=user.newsletter) }}
|
||||
<div style="font-size:80%;color:rgba(0,0,0,.5)">{{ form.newsletter.description }}</div>
|
||||
{% for error in form.newsletter.errors %}
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>{{ form.submit(class_="bg-green") }}</div>
|
||||
</form>
|
||||
|
||||
<h2 style="margin-top:30px;">Supprimer le compte</h2>
|
||||
<a href="{{ url_for('adm_delete_account', user_id=user.id) }}" class="button bg-red">Supprimer le compte</a>
|
||||
|
||||
</section>
|
||||
{% endblock %}
|
|
@ -11,14 +11,16 @@
|
|||
|
||||
<table style="width:70%; margin: auto;">
|
||||
<tr><th>Name</th><th>Email</th><th>Register</th><th>XP</th><th>Inn.</th>
|
||||
<th>Newsletter</th></tr>
|
||||
<th>Newsletter</th><th>Edit</th></tr>
|
||||
|
||||
{% for user in users %}
|
||||
<tr><td><a href="{{ url_for('user_by_id', user_id=user.id) }}" >{{ user.name }}</a></td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ user.register_date }}</td><td>{{ user.xp }}</td>
|
||||
<td>{{ user.innovation }}</td>
|
||||
<td>{{ "Yes" if user.newsletter else "No" }}</td></tr>
|
||||
<td>{{ "Yes" if user.newsletter else "No" }}</td>
|
||||
<td><a href="{{ url_for('adm_edit_account', user_id=user.id) }}" class="button">Edit</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
{% if current_user.is_authenticated %}
|
||||
<div>
|
||||
<h2>
|
||||
<img src="{{ url_for('static', filename=current_user.avatar) }}">
|
||||
{{ current_user.name }}
|
||||
<a href="{{ url_for('user', username=current_user.name) }}">
|
||||
<img src="{{ url_for('static', filename=current_user.avatar) }}">
|
||||
<div>{{ current_user.name }}</div>
|
||||
</a>
|
||||
</h2>
|
||||
<a href="#">
|
||||
<svg viewBox="0 0 24 24">
|
||||
|
@ -31,7 +33,7 @@
|
|||
|
||||
<hr />
|
||||
|
||||
<a href="{{ url_for('account') }}">
|
||||
<a href="{{ url_for('edit_account') }}">
|
||||
<svg viewBox="0 0 24 24">
|
||||
<path fill="#ffffff" d="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z"></path>
|
||||
</svg>
|
||||
|
|
Loading…
Reference in New Issue