Gestion des avatars, deuxième et dernier (?) passage
This commit is contained in:
parent
9341c5883c
commit
6afb6085d1
|
@ -1,8 +1,9 @@
|
|||
from datetime import date
|
||||
from app import app, db
|
||||
from flask import flash
|
||||
from flask_login import UserMixin
|
||||
from os.path import isfile
|
||||
from PIL import Image
|
||||
from app import app, db
|
||||
from app.models.privs import SpecialPrivilege, Group, GroupMember, \
|
||||
GroupPrivilege
|
||||
from app.models.trophies import Trophy, TrophyMember
|
||||
|
@ -156,6 +157,8 @@ class Member(User):
|
|||
"signature" str Post signature
|
||||
"birthday" date Birthday date
|
||||
"newsletter" bool Newsletter setting
|
||||
"xp" int Experience points
|
||||
"avatar" File Avatar image
|
||||
For future compatibility, other attributes are silently ignored. None
|
||||
values can be specified and are ignored.
|
||||
|
||||
|
@ -182,11 +185,22 @@ class Member(User):
|
|||
self.birthday = data["birthday"]
|
||||
if "newsletter" in data:
|
||||
self.newsletter = data["newsletter"]
|
||||
if "avatar" in data:
|
||||
self.set_avatar(data["avatar"])
|
||||
|
||||
# For admins only
|
||||
if "xp" in data:
|
||||
self.xp = data["xp"]
|
||||
|
||||
def set_avatar(self, avatar):
|
||||
try:
|
||||
size = 128, 128
|
||||
im = Image.open(avatar)
|
||||
im.thumbnail(size, Image.ANTIALIAS)
|
||||
im.save(V5Config.AVATARS_FOLDER + self.avatar, 'PNG')
|
||||
except IOError:
|
||||
flash("Avatar invalide", 'error')
|
||||
|
||||
def get_public_data(self):
|
||||
"""Returns the public information of the member."""
|
||||
return {
|
||||
|
@ -383,8 +397,10 @@ class Member(User):
|
|||
# TODO: Trophy "actif"
|
||||
|
||||
if context in ["on-profile-update", None]:
|
||||
if isfile(V5Config.UPLOAD_FOLDER + '/avatars/' + filename):
|
||||
if isfile(V5Config.AVATARS_FOLDER + self.avatar):
|
||||
self.add_trophy("Artiste")
|
||||
else:
|
||||
self.del_trophy("Artiste")
|
||||
|
||||
db.session.merge(self)
|
||||
db.session.commit()
|
||||
|
|
|
@ -14,12 +14,8 @@ def edit_account():
|
|||
form = UpdateAccountForm()
|
||||
if form.submit.data:
|
||||
if form.validate_on_submit():
|
||||
if form.avatar.data:
|
||||
f = form.avatar.data
|
||||
f.save(V5Config.UPLOAD_FOLDER + '/avatars/'
|
||||
+ current_user.avatar)
|
||||
current_user.update_trophies('on-profile-update')
|
||||
current_user.update(
|
||||
avatar=form.avatar.data or None,
|
||||
email=form.email.data or None,
|
||||
password=form.password.data or None,
|
||||
birthday=form.birthday.data,
|
||||
|
@ -31,6 +27,7 @@ def edit_account():
|
|||
db.session.commit()
|
||||
current_user.update_trophies("on-profile-update")
|
||||
flash('Modifications effectuées', 'ok')
|
||||
return redirect(request.url)
|
||||
else:
|
||||
flash('Erreur lors de la modification', 'error')
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from flask import flash, redirect, url_for
|
||||
from flask import flash, redirect, url_for, request
|
||||
from flask_login import current_user
|
||||
from wtforms import BooleanField
|
||||
from app.utils.priv_required import priv_required
|
||||
|
@ -29,16 +29,15 @@ def adm_edit_account(user_id):
|
|||
|
||||
if form.submit.data:
|
||||
if form.validate_on_submit():
|
||||
if form.avatar.data:
|
||||
f = form.avatar.data
|
||||
f.save(V5Config.UPLOAD_FOLDER + '/avatars/'
|
||||
+ current_user.avatar)
|
||||
|
||||
newname = form.username.data
|
||||
names = list(Member.query.filter(Member.id != user.id).values(Member.name))
|
||||
if newname in names:
|
||||
# TODO: avoid this exception
|
||||
# You cannot user vd.name_available because name will always be
|
||||
# invalid! Maybe you can add another validator with arguments
|
||||
raise Exception(f'{newname} is not available')
|
||||
user.update(
|
||||
avatar=form.avatar.data or None,
|
||||
name=form.username.data or None,
|
||||
email=form.email.data or None,
|
||||
password=form.password.data or None,
|
||||
|
@ -53,6 +52,7 @@ def adm_edit_account(user_id):
|
|||
# TODO: send an email to member saying his account has been modified
|
||||
user.notify(f"Vos informations personnelles ont été modifiées par {current_user.name}.")
|
||||
flash('Modifications effectuées', 'ok')
|
||||
return redirect(request.url)
|
||||
else:
|
||||
flash('Erreur lors de la modification', 'error')
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ def user_by_id(user_id):
|
|||
@app.route('/avatar/<filename>')
|
||||
def avatar(filename):
|
||||
filename = secure_filename(filename) # No h4ckers allowed
|
||||
if os.path.isfile(V5Config.UPLOAD_FOLDER + '/avatars/' + filename):
|
||||
return send_from_directory(V5Config.UPLOAD_FOLDER + '/avatars',
|
||||
filename)
|
||||
if os.path.isfile(V5Config.AVATARS_FOLDER + filename):
|
||||
return send_from_directory(V5Config.AVATARS_FOLDER, filename)
|
||||
return redirect(url_for('static', filename='images/default_avatar.png'))
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
DB_NAME = "pcv5"
|
||||
USE_LDAP = False
|
||||
LDAP_PASSWORD = "openldap"
|
||||
LDAP_ORGANIZATION = "o=planet-casio"
|
||||
SECRET_KEY = "a-random-secret-key" # CHANGE THIS VALUE *NOW*
|
||||
class LocalConfig(object):
|
||||
DB_NAME = "pcv5"
|
||||
USE_LDAP = True
|
||||
LDAP_PASSWORD = "openldap"
|
||||
LDAP_ORGANIZATION = "o=planet-casio"
|
||||
SECRET_KEY = "a-random-secret-key" # CHANGE THIS VALUE *NOW*
|
||||
AVATARS_FOLDER = '/home/pc/data/avatars/'
|
||||
|
|
Loading…
Reference in New Issue