From 6afb6085d1d3e4f3237c321e4233a714d28bc1b0 Mon Sep 17 00:00:00 2001 From: Darks Date: Tue, 10 Dec 2019 00:16:01 +0100 Subject: [PATCH] =?UTF-8?q?Gestion=20des=20avatars,=20deuxi=C3=A8me=20et?= =?UTF-8?q?=20dernier=20(=3F)=20passage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/users.py | 20 ++++++++++++++++++-- app/routes/account/account.py | 7 ++----- app/routes/admin/account.py | 12 ++++++------ app/routes/users.py | 5 ++--- local_config.py.default | 12 +++++++----- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/app/models/users.py b/app/models/users.py index ff3a5ae..edaee13 100644 --- a/app/models/users.py +++ b/app/models/users.py @@ -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() diff --git a/app/routes/account/account.py b/app/routes/account/account.py index b8ca632..5ec1271 100644 --- a/app/routes/account/account.py +++ b/app/routes/account/account.py @@ -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') diff --git a/app/routes/admin/account.py b/app/routes/admin/account.py index f067405..3ef3689 100644 --- a/app/routes/admin/account.py +++ b/app/routes/admin/account.py @@ -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') diff --git a/app/routes/users.py b/app/routes/users.py index 0bff0de..1474252 100644 --- a/app/routes/users.py +++ b/app/routes/users.py @@ -23,7 +23,6 @@ def user_by_id(user_id): @app.route('/avatar/') 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')) diff --git a/local_config.py.default b/local_config.py.default index e21a830..82c0aa4 100644 --- a/local_config.py.default +++ b/local_config.py.default @@ -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/'