20/09/22 - 12h00

master
ChérifBALDE 2022-09-20 11:40:17 +02:00 committed by cherif
parent b57764c980
commit b70e6a74f2
4 changed files with 334 additions and 10 deletions

View File

@ -76,7 +76,7 @@ LOG_FILE_NAME = "./Log/log_file.log"
upload_folder = "./Data/" 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) 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"] 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é Les formats d'image accepté
''' '''
IMG_FORMAT=['jpg', 'jpeg', 'png', 'jpe'] IMG_FORMAT=['jpg', 'jpeg', 'png', 'jpe', 'webp']

View File

@ -1854,7 +1854,7 @@ def get_partner_class_external_code(diction):
" filt_title = " + str(filt_title)) " filt_title = " + str(filt_title))
val_tmp = 1 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}, {'partner_owner_recid': user_recid},
filt_external_code, filt_title, filt_internal_url]}, filt_external_code, filt_title, filt_internal_url]},
{'external_code':1, 'internal_url':1}, {'external_code':1, 'internal_url':1},

53
main.py
View File

@ -916,7 +916,7 @@ def add_class_mass():
return jsonify(status=status, message=retval) 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']) @app.route('/myclass/api/recordImage/', methods=['POST','GET'])
@crossdomain(origin='*') @crossdomain(origin='*')
@ -1475,7 +1475,7 @@ def removeLSaccount():
return jsonify(status=status, message=message) return jsonify(status=status, message=message)
""" """
Correction Correction data - api oneshot
""" """
@app.route('/myclass/api/correction_collection/', methods=['GET','POST']) @app.route('/myclass/api/correction_collection/', methods=['GET','POST'])
@crossdomain(origin='*') @crossdomain(origin='*')
@ -1485,6 +1485,55 @@ def correction_collection():
status, message = mycommon.correction_collection() status, message = mycommon.correction_collection()
return jsonify(status=status, message=message) 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__': if __name__ == '__main__':
print(" debut api") print(" debut api")
context = SSL.Context(SSL.SSLv23_METHOD) context = SSL.Context(SSL.SSLv23_METHOD)

View File

@ -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 "." 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 ): 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 return False, None
if( str(basename2[1]).lower() not in MYSY_GV.IMG_FORMAT): 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 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): def recordImage(file=None, Folder=None, diction=None):
try: try:
@ -1342,13 +1342,134 @@ def recordImage(file=None, Folder=None, diction=None):
exc_type, exc_obj, exc_tb = sys.exc_info() 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)) print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False 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): def getRecodedImage(diction=None):
try: try:
# Dictionnaire des champs utilisables # 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, ""
''' '''