ajout de la route /api/utilisateurs/uploadImage pour uploader une photo de profil de chaque utilisateur

This commit is contained in:
2022-05-02 11:42:35 +02:00
parent 9d56b1efdf
commit 3e86471e7d
+75 -8
View File
@@ -29,7 +29,8 @@ import uuid
import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from werkzeug.exceptions import HTTPException
from werkzeug.exceptions import HTTPException, RequestEntityTooLarge
from werkzeug.utils import secure_filename
import jwt
@@ -127,6 +128,11 @@ app.config["JWT_ACCESS_TOKEN_EXPIRES"] = datetime.timedelta(hours=1)
# This should always be True in production
app.config["JWT_COOKIE_CSRF_PROTECT"] = False
UPLOAD_FOLDER = 'static/img'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'gif', 'jpeg'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 1 * 1000 * 1000 # 1 megabytes
jwt = JWTManager(app)
def dbmanage(func):
@@ -243,7 +249,7 @@ def add_user():
# Test si l'utilisateur courant est actif et Admin ou pas
if not current_user["Actif"] and current_user["Role"] != 'Administrateur':
db.disconnect()
abort(403)
abort(403, description='Utilisateur non autorisé')
# recuperation des attributs (JSON) de la requete
data_json = request.get_json()
@@ -286,14 +292,14 @@ def modif_user(userId):
# Test si l'utilisateur courant est actif ou pas
# Si l'utilisateur courant n'est pas administrateur, il ne peut voir que son profil
if not current_user["Actif"] or current_user["Role"] != "Administrateur" and current_user['userId'] != userId:
db.disconnect()
abort(403)
db.disconnect()
abort(403, description='Utilisateur non autorisé')
# test des attributs (JSON) de la requete
if not request.data.decode("utf-8"):
logger.error("Data not found")
db.disconnect()
abort(400)
abort(400, description='Data not found')
# recuperation des attributs (JSON) de la requete
dataDict = request.get_json()
@@ -322,7 +328,7 @@ def del_user(userId):
# Test si l'utilisateur courant est Admin ou pas
if not current_user["Actif"] or current_user["Role"] != 'Administrateur':
db.disconnect()
abort(403)
abort(403, description='Utilisateur non autorisé')
# test des attributs (JSON) de la requete
if request.data.decode("utf-8"):
@@ -364,7 +370,8 @@ def reset_passwd_user(userId):
# Test si l'utilisateur courant est Admin ou pas
if not current_user["Actif"] or current_user["Role"] != 'Administrateur':
db.disconnect()
abort(403)
abort(403, description='Utilisateur non autorisé')
# Hash du mot de passe
passwd = generate_password_hash('provisoire', method='sha256')
sql_statement = "UPDATE utilisateur SET Password='{}' WHERE userId = {}".format(passwd, userId)
@@ -385,7 +392,7 @@ def login():
if not auth or not auth.username or not auth.password:
logger.error("Login and Password required !")
db.disconnect()
abort(401)
abort(401, description='Login and Password required')
# On vérifie que l'utilisateur existe en base de données
sql_statement = "SELECT * FROM utilisateur WHERE Identifiant = \"{}\"".format(auth.username)
@@ -426,6 +433,66 @@ def logout():
unset_jwt_cookies(content)
return content
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/api/utilisateurs/<int:userId>/uploadImage', methods=['POST'])
@jwt_required()
@dbmanage
def uploadImage(userId):
# Access the identity of the current user with get_jwt_identity
current_user = get_jwt_identity()
# Test si l'utilisateur courant est actif et Admin ou pas
# Si l'utilisateur courant n'est pas administrateur, il ne peut voir que son profil
if not current_user["Actif"] or current_user["Role"] != "Administrateur" and current_user['userId'] != userId:
db.disconnect()
logger.error("Utilisateur non autorisé")
abort(403, description='Utilisateur non autorisé')
# On vérifie que l'utilisateur existe en base de données
sql_statement = "SELECT * FROM utilisateur WHERE userid = {}".format(userId)
# execution de la requete sql
etat, ret = db.execute(sql_statement, None, False)
if not etat:
db.disconnect()
abort(500)
else:
if not ret:
db.disconnect()
abort(404)
user = ret[0]
# check if the post request has the file part
if 'photo' not in request.files:
logger.error('No file part in the request')
abort(400)
try:
photo = request.files['photo']
except RequestEntityTooLarge as e:
logger.error("Fichier trop gros ...")
abort(413)
# If the user does not select a file, the browser submits an empty file without a filename
if photo.filename == '':
logger.error('No selected file')
abort(401)
if photo and allowed_file(photo.filename):
filename = secure_filename(photo.filename)
### DEBUG ###
logger.debug("filename: {}".format(os.path.splitext(filename)))
### END DEBUG ###
filepath = os.path.join(app.config['UPLOAD_FOLDER'], user['Identifiant'] + os.path.splitext(filename)[1])
photo.save(filepath)
sql_statement = "UPDATE utilisateur SET Nom=%s, Prenom=%s, Photo=%s, Identifiant=%s, Password=%s, Role=%s, Actif=%d WHERE userId = {}".format(userId)
data = (user['Nom'], user['Prenom'], filepath, user['Identifiant'], user['Password'], user['Role'], user['Actif'])
# Execution de la requete SQL
etat, ret = db.execute(sql_statement, data, True)
if not etat:
db.disconnect()
abort(500)
content = jsonify({'message': 'photo saved successfuly!'})
return content
def main():
logger.setLevel(log.DEBUG)
fl = log.StreamHandler()