diff --git a/GlobalVariable.py b/GlobalVariable.py index 8c8ebc1..ea2b0a5 100644 --- a/GlobalVariable.py +++ b/GlobalVariable.py @@ -76,7 +76,7 @@ LOG_FILE_NAME = "./Log/log_file.log" upload_folder = "./Data/" -ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} +ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'webp'} logging.basicConfig( level=DEBUG_LEVEL, filename=LOG_FILE_NAME) AUTORIZED_SOURCE_IPV4=["127.0.0.1", "localhost", "88.170.110.220", "192.168.1.21", "192.168.1.48"] @@ -130,7 +130,7 @@ HELP_WORD_QUERY_LIMIT = 3 ''' Les formats d'image accepté ''' -IMG_FORMAT=['jpg', 'jpeg', 'png', 'jpe'] +IMG_FORMAT=['jpg', 'jpeg', 'png', 'jpe', 'webp'] diff --git a/class_mgt.py b/class_mgt.py index 2bc9c30..de6ed68 100644 --- a/class_mgt.py +++ b/class_mgt.py @@ -1854,7 +1854,7 @@ def get_partner_class_external_code(diction): " filt_title = " + str(filt_title)) val_tmp = 1 - for retVal in coll_name.find({"$and": [{'valide': '1'}, {'locked': '0'}, + for retVal in coll_name.find_one({"$and": [{'valide': '1'}, {'locked': '0'}, {'partner_owner_recid': user_recid}, filt_external_code, filt_title, filt_internal_url]}, {'external_code':1, 'internal_url':1}, diff --git a/main.py b/main.py index b1b7998..6a80d43 100644 --- a/main.py +++ b/main.py @@ -916,7 +916,7 @@ def add_class_mass(): return jsonify(status=status, message=retval) ''' -test d'enregistrement d'une image +Enregistrement d'une image de profil d'un utilisateur ''' @app.route('/myclass/api/recordImage/', methods=['POST','GET']) @crossdomain(origin='*') @@ -1475,7 +1475,7 @@ def removeLSaccount(): return jsonify(status=status, message=message) """ -Correction +Correction data - api oneshot """ @app.route('/myclass/api/correction_collection/', methods=['GET','POST']) @crossdomain(origin='*') @@ -1485,6 +1485,55 @@ def correction_collection(): status, message = mycommon.correction_collection() return jsonify(status=status, message=message) + + +""" +Cette API recuperer l'image de profil d'une formation +""" +@app.route('/myclass/api/getRecodedClassImage/', methods=['POST','GET']) +@crossdomain(origin='*') +def getRecodedClassImage(): + # On recupere le corps (payload) de la requete + payload = request.form.to_dict() + print(" ### payload = ",payload) + status, myimg= mycommon.getRecodedClassImage(payload) + return jsonify(status=status, message=myimg) + + +""" +Cette API de Recuperation d'une image de profils d'une formation pour le mode non connecté. c'est a dire depuis le front +""" +@app.route('/myclass/api/getRecodedClassImage_from_front/', methods=['POST','GET']) +@crossdomain(origin='*') +def getRecodedClassImage_from_front(): + # On recupere le corps (payload) de la requete + payload = request.form.to_dict() + print(" ### payload = ",payload) + status, myimg= mycommon.getRecodedClassImage_from_front(payload) + return jsonify(status=status, message=myimg) + + + +''' +Enregistrement d'une image de profil d'une formation +''' +@app.route('/myclass/api/recordClassImage/', methods=['POST','GET']) +@crossdomain(origin='*') +def recordClassImage(): + # On recupere le corps (payload) de la requete + payload = request.form.to_dict() + print(" ### payload = ",payload) + print(request.files) + + if request.method == 'POST': + # Create variable for uploaded file + f = request.files['File'] + + status, message = mycommon.recordClassImage(f, app.config['UPLOAD_FOLDER'], payload) + return jsonify(status=status, message=message) + + + if __name__ == '__main__': print(" debut api") context = SSL.Context(SSL.SSLv23_METHOD) diff --git a/prj_common.py b/prj_common.py index aceaf3c..75670fb 100644 --- a/prj_common.py +++ b/prj_common.py @@ -114,11 +114,11 @@ def Upload_Save_IMG_File(file=None, Folder=None): Verification qu'il s'agit bien d'un fichier image ('jpg', 'jpeg', 'png', 'jpe', ...), dont le nom ne comporte pas de "." ''' if(len(basename2) != 2 ): - myprint(str(inspect.stack()[0][3]) + " - : Le nom du fichier est incorret") + myprint(str(inspect.stack()[0][3]) + " - : Le nom du fichier "+str(file.filename)+" est incorret") return False, None if( str(basename2[1]).lower() not in MYSY_GV.IMG_FORMAT): - myprint(str(inspect.stack()[0][3]) + " - : Ce n'est pas un fichier image :"+str(MYSY_GV.IMG_FORMAT)) + myprint(str(inspect.stack()[0][3]) + " - : le ficier "+str(file.filename)+ ". L'extention '"+str(basename2[1])+"' n'est pas un fichier image. Les extentions autorisées sont :"+str(MYSY_GV.IMG_FORMAT)) return False, None @@ -1222,7 +1222,7 @@ def clean_emoji(sentence=None): ''' -test d'enregistrement d'une image +Fonction d'enregistrement d'une image d'un profils ''' def recordImage(file=None, Folder=None, diction=None): try: @@ -1342,13 +1342,134 @@ def recordImage(file=None, Folder=None, diction=None): exc_type, exc_obj, exc_tb = sys.exc_info() print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False - + ''' -Test de recuperation d'une image +Fonction d'enregistrement d'une image d'un profils d'une formation ''' +def recordClassImage(file=None, Folder=None, diction=None): + try: + + # Dictionnaire des champs utilisables + field_list = ['token', 'type', 'class_external_code'] + incom_keys = diction.keys() + + ''' + # Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés + # Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API + # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste + # field_list. + ''' + for val in incom_keys: + if str(val).lower() not in str(field_list).lower(): + myprint( + str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas accepté dans cette API") + return False, " Impossible de se connecter" + + ''' + Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente, + On controle que les champs obligatoires sont presents dans la liste + ''' + field_list_obligatoire = ['token', 'type', 'class_external_code'] + for val in field_list_obligatoire: + if str(val).lower() not in diction: + myprint( + str(inspect.stack()[0][3]) + " La valeur '" + val + "' n'est pas presente dans liste des champs") + return False, "Impossible de se connecter" + + mydata = {} + mytoken = "" + + # recuperation des paramettre + if ("token" in diction.keys()): + if diction['token']: + mytoken = diction['token'] + + mytype = "" + # recuperation des paramettre + if ("type" in diction.keys()): + if diction['type']: + mytype = diction['type'] + myclassexternalcode = "" + if ("class_external_code" in diction.keys()): + if diction['class_external_code']: + myclassexternalcode = diction['class_external_code'] + + ''' + Verification de la validité du token et recuperation du recid du user + ''' + retval = check_user_validity("", str(mytoken)) + + if retval is False: + myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide") + return False, "L'email ou le token ne sont pas valident" + + + + if (mytype == "partner"): + user_recid = get_parnter_recid_from_token(str(mytoken)) + if user_recid is False: + myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le recid du partner") + return False, " Les informations d'identification sont incorrectes" + else: + myprint(str(inspect.stack()[0][3]) + " - l'API est incorrecte. le type n'est pas renseingé") + return False, " Les informations d'identification sont incorrectes" + + + myuserrecid = user_recid + + status, saved_file = Upload_Save_IMG_File(file, Folder) + if (status == False): + return False, "Impossible d'inserer l'image de la formation " + + # " Lecture du fichier " + print(" Lecture du fichier : " + saved_file + ". le token est :" + str(mytoken)) + nb_line = 0 + coll_name = MYSY_GV.dbname['image_ch'] + + with open(saved_file, "rb") as imageFile: + + # strimg = base64.b64encode(imageFile.read()) + strimg = base64.b64encode(imageFile.read()) + + new_diction = {} + new_diction['img'] = strimg + new_diction['type'] = 'profil_class' + new_diction['recid'] = myuserrecid + new_diction['class_external_code'] = myclassexternalcode + new_diction['valide'] = '1' + new_diction['date_update'] = str(datetime.now()) + new_diction['locked'] = "0" + + ret_val = coll_name.find_one_and_update({"recid": myuserrecid, "valide": "1", "locked": "0", "class_external_code":str(myclassexternalcode)}, + {"$set": {"img": strimg, "date_update": str(datetime.now()), + "type": "profil_class", "recid": myuserrecid, "valide": "1", + "locked": "0", + "class_external_code":str(myclassexternalcode)}}, + upsert=True, + return_document=ReturnDocument.AFTER + ) + + if ret_val and ret_val['_id']: + myprint(" L'image de la formation "+str(myclassexternalcode)+" a bien ete enregistrée. ") + return True, " L'image de la formation "+str(myclassexternalcode)+" a bien ete enregistrée. " + else: + myprint(" IMPOSSIBLE D'ENREGISTRER L'IMAGE de la formation "+str(myclassexternalcode)) + return False, "IMPOSSIBLE D'ENREGISTRER L'IMAGE de la formation "+str(myclassexternalcode) + + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) + return False,"IMPOSSIBLE D'ENREGISTRER L'IMAGE de la formation "+str(myclassexternalcode) + + + +''' +Recuperation d'une image de profils +''' def getRecodedImage(diction=None): try: # Dictionnaire des champs utilisables @@ -1437,6 +1558,160 @@ def getRecodedImage(diction=None): +''' +Recuperation d'une image de profils d'une formation +''' +def getRecodedClassImage(diction=None): + try: + # Dictionnaire des champs utilisables + field_list = ['token', 'type', 'class_external_code'] + incom_keys = diction.keys() + + ''' + # Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés + # Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API + # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste + # field_list. + ''' + for val in incom_keys: + if str(val).lower() not in str(field_list).lower(): + myprint( + str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas accepté dans cette API") + return False, " Impossible de se connecter" + + ''' + Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente, + On controle que les champs obligatoires sont presents dans la liste + ''' + field_list_obligatoire = ['token','type','class_external_code'] + for val in field_list_obligatoire: + if str(val).lower() not in diction: + myprint( + str(inspect.stack()[0][3]) + " La valeur '" + val + "' n'est pas presente dans liste des champs") + return False, "Impossible de se connecter" + + mydata = {} + mytoken = "" + + # recuperation des paramettre + if ("token" in diction.keys()): + if diction['token']: + mytoken = diction['token'] + + mytype = "" + if ("type" in diction.keys()): + if diction['type']: + mytype = diction['type'] + + myclassexternalcode = "" + if ("class_external_code" in diction.keys()): + if diction['class_external_code']: + myclassexternalcode = diction['class_external_code'] + + + ''' + Verification de la validité du token et recuperation du recid du user + ''' + retval = check_user_validity("", str(mytoken)) + + if retval is False: + myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide") + return False, "L'email ou le token ne sont pas valident" + + + if (mytype == "partner"): + user_recid = get_parnter_recid_from_token(str(mytoken)) + if user_recid is False: + myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le recid du user") + return False, " Les informations d'identification sont incorrectes" + + else: + myprint(str(inspect.stack()[0][3]) + " - l'API est incorrecte. le type n'est pas renseingé") + return False, " Les informations d'identification sont incorrectes" + + myuserrecid = user_recid + + + coll_name = MYSY_GV.dbname['image_ch'] + RetObject = [] + + for retVal in coll_name.find({'recid':myuserrecid, "type":"profil_class", "class_external_code":str(myclassexternalcode)} ): + user2={} + user2['date_update'] = retVal['date_update'] + decode = retVal['img'].decode() + user2['img'] = decode + data1 = json.loads(json.dumps(user2)) + + return True, data1 + + return False, "" + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) + return False, "" + + + +''' +Recuperation d'une image de profils d'une formation pour le mode non connecté. c'est a dire depuis le front +''' +def getRecodedClassImage_from_front(diction=None): + try: + # Dictionnaire des champs utilisables + field_list = [ 'class_external_code'] + incom_keys = diction.keys() + + ''' + # Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés + # Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API + # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste + # field_list. + ''' + for val in incom_keys: + if str(val).lower() not in str(field_list).lower(): + myprint( + str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas accepté dans cette API") + return False, " Impossible de se connecter" + + ''' + Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente, + On controle que les champs obligatoires sont presents dans la liste + ''' + field_list_obligatoire = ['class_external_code'] + for val in field_list_obligatoire: + if str(val).lower() not in diction: + myprint( + str(inspect.stack()[0][3]) + " La valeur '" + val + "' n'est pas presente dans liste des champs") + return False, "Impossible de se connecter" + + + myclassexternalcode = "" + if ("class_external_code" in diction.keys()): + if diction['class_external_code']: + myclassexternalcode = diction['class_external_code'] + + + coll_name = MYSY_GV.dbname['image_ch'] + RetObject = [] + + for retVal in coll_name.find({"type":"profil_class", "class_external_code":str(myclassexternalcode)} ): + user2={} + user2['date_update'] = retVal['date_update'] + decode = retVal['img'].decode() + user2['img'] = decode + data1 = json.loads(json.dumps(user2)) + + return True, data1 + + return False, "" + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) + return False, "" + + '''