From 55288d66274aa38fe0fef1469438fcda2bfa0013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ch=C3=A9rifBALDE?= Date: Sat, 2 Jul 2022 22:24:58 +0200 Subject: [PATCH] 02/07/22 - 14h30 --- GlobalVariable.py | 8 +- class_mgt.py | 328 ++++++++++++++++++++++++++++++++-------------- main.py | 33 +++++ partners.py | 2 +- prj_common.py | 319 +++++++++++++++++++++++++++++++++++++++++++- wrapper.py | 131 +++++++++++++++++- 6 files changed, 715 insertions(+), 106 deletions(-) diff --git a/GlobalVariable.py b/GlobalVariable.py index 58a1b52..f01a4ec 100644 --- a/GlobalVariable.py +++ b/GlobalVariable.py @@ -104,4 +104,10 @@ MAINPAGE_QUERY_LIMIT_ROW = 55 Cette variable definit le nombre de mots retourné dans le cas d'une aide à avec une recherche vide ''' -HELP_WORD_QUERY_LIMIT = 3 \ No newline at end of file +HELP_WORD_QUERY_LIMIT = 3 + + +''' +Les formats d'image accepté +''' +IMG_FORMAT=['jpg', 'jpeg', 'png', 'jpe'] \ No newline at end of file diff --git a/class_mgt.py b/class_mgt.py index 6525a92..4f4961e 100644 --- a/class_mgt.py +++ b/class_mgt.py @@ -44,7 +44,7 @@ def add_class(diction): # field_list. ''' field_list = ['external_code', 'title', 'description', 'trainer', 'institut_formation', 'distantiel', 'presentiel', - 'price', 'url','duree_formation','token', 'plus_produit', 'mots_cle','domaine'] + 'price', 'url','duration','token', 'plus_produit', 'mots_cle','domaine', 'internal_url', 'zone_diffusion'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: @@ -96,7 +96,18 @@ def add_class(diction): mydata['partner_owner_recid'] = user_recid + class_internal_url = "" + if ("internal_url" in diction.keys()): + if diction['internal_url']: + class_internal_url = diction['internal_url'] + ''' + Si l'internal_url reste à vide, alors le système va créer une internal url de la formation + ''' + if( len(class_internal_url) <= 0 ): + status, class_internal_url = mycommon.CreateInternalUrl(diction['title']) + + mydata['internal_url'] = class_internal_url if ("external_code" in diction.keys()): if diction['external_code']: @@ -122,13 +133,18 @@ def add_class(diction): if diction['institut_formation']: mydata['institut_formation'] = diction['institut_formation'] + my_presentiel = "0" + my_distantiel = "0" + if ("distantiel" in diction.keys()): if diction['distantiel']: - mydata['distantiel'] = diction['distantiel'] + my_distantiel = diction['distantiel'] if ("presentiel" in diction.keys()): if diction['presentiel']: - mydata['presentiel'] = diction['presentiel'] + my_presentiel = diction['presentiel'] + + mydata['presentiel'] = {'presentiel': my_presentiel, 'distantiel': my_distantiel} if ("price" in diction.keys()): if diction['price']: @@ -138,9 +154,9 @@ def add_class(diction): if diction['url']: mydata['url'] = diction['url'] - if ("duree_formation" in diction.keys()): - if diction['duree_formation']: - mydata['duree_formation'] = float(str(diction['duree_formation'])) + if ("duration" in diction.keys()): + if diction['duration']: + mydata['duration'] = float(str(diction['duration'])) @@ -168,6 +184,57 @@ def add_class(diction): mydata['domaine'] = diction['domaine'] + + if ("zone_diffusion" in diction.keys()): + if diction['zone_diffusion']: + tmp_str2 = str(diction['zone_diffusion']).lower().replace(",", ";") + + if (not tmp_str2.endswith(";")): + tmp_str2 = tmp_str2 + ";" + + print("tmp_str2 = " + tmp_str2) + + + if (";" not in tmp_str2): + mycommon.myprint(str(inspect.stack()[0][3]) + " - la zone de diffusion de la formation : A" + str( + diction['external_code']) + " est incorrecte") + return False, "La zone de diffusion de la formation " + str(diction['external_code']) + " est incorrecte" + + + tmp_str = tmp_str2.split(";") #==> ce qui va donner un tableau de : Country_Code-City : ['fr-paris', 'fr-marseille', 'bn-cotonou'] + cpt = 0 + tab_country = [] + tab_city = [] + for val in tmp_str: + print(" val = "+str(val)) + if( len(str(val)) <= 0 ): + continue + + if( "-" not in str(val)): + mycommon.myprint(str(inspect.stack()[0][3]) + " - la zone de diffusion de la formation : B" + str( diction['external_code']) + " est incorrecte") + return False, "La zone de diffusion de la formation " + str(diction['external_code']) + " est incorrecte" + + + tab_val = len(val.split("-")) + if( len(val.split("-")) != 1 and len(val.split("-")) != 2 ): + mycommon.myprint( str(inspect.stack()[0][3]) + " - la zone de diffusion de la formation : C" + str(diction['external_code'])+" est incorrecte") + return False, "La zone de diffusion de la formation " + str(diction['external_code'])+" est incorrecte" + + if( val.split("-")[0]): + tab_country.append(val.split("-")[0]) + else: + tab_country.append("") + + if(val.split("-")[1]): + tab_city.append(val.split("-")[1]) + else: + tab_city.append("") + + + mydata['zone_diffusion'] = {'country':tab_country, 'city':tab_city} + + + mydata['valide'] = '1' mydata['locked'] = '0' mydata['indexed'] = '0' @@ -219,8 +286,8 @@ def update_class(diction): # field_list. ''' field_list = ['external_code', 'title', 'description', 'trainer', 'institut_formation', 'distantiel', - 'presentiel','price', 'url', 'duree_formation', 'token','plus_produit', 'mots_cle', - 'domaine', 'internal_code'] + 'presentiel','price', 'url', 'duration', 'token','plus_produit', 'mots_cle', + 'domaine', 'internal_code', 'internal_url','zone_diffusion'] incom_keys = diction.keys() for val in incom_keys: @@ -233,7 +300,7 @@ def update_class(diction): 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 = ['external_code', 'token'] + field_list_obligatoire = ['internal_url', 'token'] for val in field_list_obligatoire: if val not in diction: @@ -272,68 +339,113 @@ def update_class(diction): my_internal_code = "" if ("internal_code" in diction.keys()): - if diction['internal_code']: - my_internal_code = diction['internal_code'] + my_internal_code = diction['internal_code'] + + my_internal_url = "" + if ("internal_url" in diction.keys()): + my_internal_url = diction['internal_url'] if ("external_code" in diction.keys()): - if diction['external_code']: - my_external_code = diction['external_code'] + my_external_code = diction['external_code'] if ("title" in diction.keys()): - if diction['title']: - mydata['title'] = diction['title'] + mydata['title'] = diction['title'] if ("description" in diction.keys()): - if diction['description']: - mydata['description'] = diction['description'] + mydata['description'] = diction['description'] if ("trainer" in diction.keys()): - if diction['trainer']: - mydata['trainer'] = diction['trainer'] - - if ("plus_produit" in diction.keys()): - if diction['plus_produit']: - mydata['plus_produit'] = diction['plus_produit'] + mydata['trainer'] = diction['trainer'] if ("institut_formation" in diction.keys()): - if diction['institut_formation']: - mydata['institut_formation'] = diction['institut_formation'] + mydata['institut_formation'] = diction['institut_formation'] + + my_presentiel = "0" + my_distantiel = "0" if ("distantiel" in diction.keys()): - if diction['distantiel']: - mydata['distantiel'] = diction['distantiel'] + my_distantiel = diction['distantiel'] if ("presentiel" in diction.keys()): - if diction['presentiel']: - mydata['presentiel'] = diction['presentiel'] + my_presentiel = diction['presentiel'] + + mydata['presentiel'] = {'presentiel': my_presentiel, 'distantiel': my_distantiel} if ("price" in diction.keys()): - if diction['price']: + if( diction['price']): mydata['price'] = int(str(diction['price'])) if ("url" in diction.keys()): - if diction['url']: - mydata['url'] = diction['url'] + mydata['url'] = diction['url'] - if ("duree_formation" in diction.keys()): - if diction['duree_formation']: - mydata['duree_formation'] = float(str(diction['duree_formation'])) + if ("duration" in diction.keys()): + mydata['duration'] = float(str(diction['duration'])) if ("plus_produit" in diction.keys()): - if diction['plus_produit']: - mydata['plus_produit'] = diction['plus_produit'] + mydata['plus_produit'] = diction['plus_produit'] if ("mots_cle" in diction.keys()): - if diction['mots_cle']: - mydata['mots_cle'] = diction['mots_cle'] + mydata['mots_cle'] = diction['mots_cle'] if ("domaine" in diction.keys()): if diction['domaine']: mydata['domaine'] = diction['domaine'] + if ("zone_diffusion" in diction.keys()): + tmp_str2 = str(diction['zone_diffusion']).lower().replace(",", ";") + + + + if( not tmp_str2.endswith(";")): + tmp_str2 = tmp_str2+";" + + print("tmp_str2 = " + tmp_str2) + + if (";" not in tmp_str2): + mycommon.myprint(str(inspect.stack()[0][3]) + " - la zone de diffusion de la formation 0: " + str( + my_external_code) + " est incorrecte") + return False, "La zone de diffusion de la formation " + str(my_external_code) + " est incorrecte" + + + tmp_str = tmp_str2.split(";") #==> ce qui va donner un tableau de : Country_Code-City : ['fr-paris', 'fr-marseille', 'bn-cotonou'] + cpt = 0 + tab_country = [] + tab_city = [] + for val in tmp_str: + print(" val = "+str(val)) + + print(" val = " + str(val)) + if (len(str(val)) <= 0): + continue + + + if( "-" not in str(val)): + mycommon.myprint(str(inspect.stack()[0][3]) + " - la zone de diffusion de la formation 1: " + str( my_external_code) + " est incorrecte") + return False, "La zone de diffusion de la formation " + str(my_external_code) + " est incorrecte" + + + tab_val = len(val.split("-")) + if( len(val.split("-")) != 1 and len(val.split("-")) != 2 ): + mycommon.myprint( str(inspect.stack()[0][3]) + " - la zone de diffusion de la formation 2: " + str(my_external_code)+" est incorrecte") + return False, "La zone de diffusion de la formation " + str(my_external_code)+" est incorrecte" + + if( val.split("-")[0]): + tab_country.append(val.split("-")[0]) + else: + tab_country.append("") + + if(val.split("-")[1]): + tab_city.append(val.split("-")[1]) + else: + tab_city.append("") + + + mydata['zone_diffusion'] = {'country':tab_country, 'city':tab_city} + + mydata['date_update'] = str(datetime.now()) @@ -347,7 +459,7 @@ def update_class(diction): # seules les formation avec locked = 0 et valide=1 sont modifiables - ret_val = coll_name.find_one_and_update({'external_code': str(my_external_code), 'partner_owner_recid':partner_recid, 'locked': '0', 'valide': '1'}, + ret_val = coll_name.find_one_and_update({'internal_url': str(my_internal_url), 'partner_owner_recid':partner_recid, 'locked': '0', 'valide': '1'}, {"$set": mydata}, return_document=ReturnDocument.AFTER ) @@ -364,7 +476,8 @@ def update_class(diction): except Exception as e: - mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) + exc_type, exc_obj, exc_tb = sys.exc_info() + mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False, " Impossible de mettre à jour la formation " @@ -383,7 +496,7 @@ def disable_class(diction): # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste # field_list. ''' - field_list = ['external_code', 'token'] + field_list = ['internal_url', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: @@ -395,7 +508,7 @@ def disable_class(diction): 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 = ['external_code', 'token'] + field_list_obligatoire = ['internal_url', 'token'] for val in field_list_obligatoire: if val not in diction: @@ -404,7 +517,7 @@ def disable_class(diction): # recuperation des paramettre mydata = {} - my_external_code = "" + my_internal_url = "" if ("token" in diction.keys()): if diction['token']: @@ -432,9 +545,9 @@ def disable_class(diction): partner_recid = user_recid - if ("external_code" in diction.keys()): - if diction['external_code']: - my_external_code = diction['external_code'] + if ("internal_url" in diction.keys()): + if diction['internal_url']: + my_internal_url = diction['internal_url'] mydata['date_update'] = str(datetime.now()) @@ -446,7 +559,7 @@ def disable_class(diction): # seules les formation avec locked = 0 et valide=1 sont modifiables ret_val = coll_name.find_one_and_update( - {'external_code': str(my_external_code), 'partner_owner_recid': partner_recid, 'locked': '0', + {'internal_url': str(my_internal_url), 'partner_owner_recid': partner_recid, 'locked': '0', 'valide': '1'}, {"$set": mydata}, return_document=ReturnDocument.AFTER @@ -456,16 +569,17 @@ def disable_class(diction): nb_doc = str(ret_val['_id']) mycommon.myprint( str(inspect.stack()[0][3]) + " - La formation a bin ete mise à jour =" + str(nb_doc)) - return True, " La formation "+str(my_external_code)+"a été desactivée" + return True, " La formation "+str(my_internal_url)+"a été desactivée" else: - mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de desactivier : " +str(my_external_code) ) - return False, " Impossible de desactivier la formation : "+str(my_external_code) + mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de desactivier : " +str(my_internal_url) ) + return False, " Impossible de desactivier la formation : "+str(my_internal_url) except Exception as e: - mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) + exc_type, exc_obj, exc_tb = sys.exc_info() + mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False, " Impossible de desactivier la formation " @@ -483,7 +597,7 @@ def enable_class(diction): # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste # field_list. ''' - field_list = ['external_code', 'token'] + field_list = ['internal_url', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: @@ -495,7 +609,7 @@ def enable_class(diction): 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 = ['external_code', 'token'] + field_list_obligatoire = ['internal_url', 'token'] for val in field_list_obligatoire: if val not in diction: @@ -504,7 +618,7 @@ def enable_class(diction): # recuperation des paramettre mydata = {} - my_external_code = "" + my_internal_url = "" if ("token" in diction.keys()): if diction['token']: @@ -532,9 +646,9 @@ def enable_class(diction): partner_recid = user_recid - if ("external_code" in diction.keys()): - if diction['external_code']: - my_external_code = diction['external_code'] + if ("internal_url" in diction.keys()): + if diction['internal_url']: + my_internal_url = diction['internal_url'] mydata['date_update'] = str(datetime.now()) @@ -545,7 +659,7 @@ def enable_class(diction): # seules les formation avec locked = 0 et valide=1 sont modifiables ret_val = coll_name.find_one_and_update( - {'external_code': str(my_external_code), 'partner_owner_recid': partner_recid, 'locked': '0', + {'internal_url': str(my_internal_url), 'partner_owner_recid': partner_recid, 'locked': '0', 'valide': '0'}, {"$set": mydata}, return_document=ReturnDocument.AFTER @@ -555,11 +669,11 @@ def enable_class(diction): nb_doc = str(ret_val['_id']) mycommon.myprint( str(inspect.stack()[0][3]) + " - La formation a bien ete reactivée =" + str(nb_doc)) - return True, " La formation " + str(my_external_code) + "a été reactivée" + return True, " La formation " + str(my_internal_url) + "a été reactivée" else: - mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de desactivier : " + str(my_external_code)) - return False, " Impossible de reactivée la formation : " + str(my_external_code) + mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de desactivier : " + str(my_internal_url)) + return False, " Impossible de reactivée la formation : " + str(my_internal_url) except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) @@ -581,7 +695,7 @@ def unlock_class(diction): # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste # field_list. ''' - field_list = ['external_code', 'token'] + field_list = ['internal_url', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: @@ -593,7 +707,7 @@ def unlock_class(diction): 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 = ['external_code', 'token'] + field_list_obligatoire = ['internal_url', 'token'] for val in field_list_obligatoire: if val not in diction: @@ -602,7 +716,7 @@ def unlock_class(diction): # recuperation des paramettre mydata = {} - my_external_code = "" + my_internal_url = "" if ("token" in diction.keys()): if diction['token']: @@ -632,9 +746,9 @@ def unlock_class(diction): - if ("external_code" in diction.keys()): - if diction['external_code']: - my_external_code = diction['external_code'] + if ("internal_url" in diction.keys()): + if diction['internal_url']: + my_internal_url = diction['internal_url'] mydata['date_update'] = str(datetime.now()) @@ -644,7 +758,7 @@ def unlock_class(diction): # seules les formation avec locked = 1 et valide=1 sont 'unlockable' ret_val = coll_name.find_one_and_update( - {'external_code': str(my_external_code), 'partner_owner_recid': partner_recid, 'locked': '1', + {'internal_url': str(my_internal_url), 'partner_owner_recid': partner_recid, 'locked': '1', 'valide': '1'}, {"$set": mydata}, return_document=ReturnDocument.AFTER @@ -654,11 +768,11 @@ def unlock_class(diction): nb_doc = str(ret_val['_id']) mycommon.myprint( str(inspect.stack()[0][3]) + " - La formation a bien ete debloquée =" + str(nb_doc)) - return True, " La formation " + str(my_external_code) + "a été debloquée" + return True, " La formation " + str(my_internal_url) + "a été debloquée" else: - mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de debloquer : " + str(my_external_code)) - return False, " Impossible de debloquer la formation : " + str(my_external_code) + mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de debloquer : " + str(my_internal_url)) + return False, " Impossible de debloquer la formation : " + str(my_internal_url) @@ -683,7 +797,7 @@ def lock_class(diction): # Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste # field_list. ''' - field_list = ['external_code', 'token'] + field_list = ['internal_url', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: @@ -696,7 +810,7 @@ def lock_class(diction): 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 = ['external_code', 'token'] + field_list_obligatoire = ['internal_url', 'token'] for val in field_list_obligatoire: if val not in diction: @@ -706,7 +820,7 @@ def lock_class(diction): # recuperation des paramettre mydata = {} - my_external_code = "" + my_internal_url = "" if ("token" in diction.keys()): if diction['token']: @@ -734,9 +848,9 @@ def lock_class(diction): partner_recid = user_recid - if ("external_code" in diction.keys()): - if diction['external_code']: - my_external_code = diction['external_code'] + if ("internal_url" in diction.keys()): + if diction['internal_url']: + my_internal_url = diction['internal_url'] mydata['date_update'] = str(datetime.now()) @@ -746,7 +860,7 @@ def lock_class(diction): # seules les formation avec locked = 1 et valide=1 sont 'unlockable' ret_val = coll_name.find_one_and_update( - {'external_code': str(my_external_code), 'partner_owner_recid': partner_recid, 'locked': '0', + {'internal_url': str(my_internal_url), 'partner_owner_recid': partner_recid, 'locked': '0', 'valide': '1'}, {"$set": mydata}, return_document=ReturnDocument.AFTER @@ -756,13 +870,11 @@ def lock_class(diction): nb_doc = str(ret_val['_id']) mycommon.myprint( str(inspect.stack()[0][3]) + " - La formation a bien ete verrouillée =" + str(nb_doc)) - return True, " La formation " + str(my_external_code) + "a été verrouillée" + return True, " La formation " + str(my_internal_url) + "a été verrouillée" else: - mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de verrouiller la formation : " + str(my_external_code)) - return False, " Impossible de verrouiller la formation : " + str(my_external_code) - - + mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de verrouiller la formation : " + str(my_internal_url)) + return False, " Impossible de verrouiller la formation : " + str(my_internal_url) except Exception as e: mycommon.myprint(str(inspect.stack()[0][3]) + " - " + str(e)) @@ -1146,9 +1258,9 @@ def get_partner_class(diction): RetObject = [] - filt_external_code = {} - if ("external_code" in diction.keys()): - filt_external_code = {'internal_url':{'$regex':str(diction['internal_url'])}} + filt_external_code= {} + if ("internal_url" in diction.keys()): + filt_external_code = {'internal_url':str(diction['internal_url'])} filt_title = {} if ("title" in diction.keys()): @@ -1161,13 +1273,28 @@ def get_partner_class(diction): " filt_title = "+str(filt_title)) val_tmp = 1 - for retVal in coll_name.find( {'valide':'1'},{'locked':'0'}, + for retVal in coll_name.find( {"$and":[ {'valide':'1'},{'locked':'0'}, {'partner_owner_recid':user_recid} , - filt_external_code, - filt_title): - mycommon.myprint(str(retVal)) + filt_external_code, filt_title]}, + ): + #mycommon.myprint(str(retVal)) user = retVal user['id'] = str(val_tmp) + + ''' + Pour des facilité d'affichage coté front + on va reformater le champ "zone_diffusion" de sorte à le renvoyer + sous la forme "code_pays-ville" + ''' + i = 0 + tmp_zone_diffusion = "" + if( "zone_diffusion" in user.keys()): + if( user['zone_diffusion'] and user['zone_diffusion']["city"]): + for tmp_val in user['zone_diffusion']["city"]: + tmp_zone_diffusion = tmp_zone_diffusion + str(user['zone_diffusion']["country"][i])+"-"+str(user['zone_diffusion']["city"][i])+";" + i = i+1 + + user['zone_diffusion_str'] = str(tmp_zone_diffusion[:-1]) RetObject.append(JSONEncoder().encode(user)) val_tmp = val_tmp + 1 @@ -1278,7 +1405,7 @@ def add_class_mass(file=None, Folder=None, diction=None): # Verification que les noms des colonne sont bien corrects" ''' field_list = ['external_code', 'title', 'description', 'trainer', 'institut_formation', 'distantiel', 'presentiel', - 'price', 'domaine', 'url','duree_formation', 'plus_produit', 'mots_cle'] + 'price', 'domaine', 'url','duration', 'plus_produit', 'mots_cle', 'zone_diffusion'] total_rows = len(df) @@ -1300,11 +1427,15 @@ def add_class_mass(file=None, Folder=None, diction=None): mydata['description'] = str(df['description'].values[n]) mydata['trainer'] = str(df['trainer'].values[n]) mydata['institut_formation'] = str(df['institut_formation'].values[n]) - mydata['distantiel'] = str(df['presentiel'].values[n]) + #mydata['distantiel'] = str(df['presentiel'].values[n]) mydata['url'] = str(df['url'].values[n]) - mydata['duree_formation'] = float(str(df['duree_formation'].values[n])) + mydata['duration'] = float(str(df['duration'].values[n])) mydata['plus_produit'] = str(df['plus_produit'].values[n]) mydata['mots_cle'] = str(df['mots_cle'].values[n]) + mydata['presentiel'] = str(df['presentiel'].values[n]) + mydata['distantiel'] = str(df['distantiel'].values[n]) + + ''' Verification du nombre de mots clée : limite MAX_KEYWORD (3) ''' @@ -1315,8 +1446,13 @@ def add_class_mass(file=None, Folder=None, diction=None): return False, " La formation "+str(mydata['external_code'])+" a plus de "+ str(MAX_KEYWORD)+" mots clés" - mydata['distantiel'] = str(df['distantiel'].values[n]) - mydata['presentiel'] = str(df['presentiel'].values[n]) + ''' + Traitement de la zone de diffusion + ''' + if ("zone_diffusion" in df.keys()): + if(str(df['zone_diffusion'].values[n])): + mydata['zone_diffusion'] =str(df['zone_diffusion'].values[n]) + if ("token" in diction.keys()): if diction['token']: diff --git a/main.py b/main.py index 25aa03c..43d6814 100644 --- a/main.py +++ b/main.py @@ -859,6 +859,39 @@ def add_class_mass(): return jsonify(status=status, message=retval) +''' +test d'enregistrement d'une image +''' +@app.route('/myclass/api/recordImage/', methods=['POST','GET']) +@crossdomain(origin='*') +def recordImage(): + # 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= mycommon.recordImage(f, app.config['UPLOAD_FOLDER'], payload) + + return jsonify(status=status) + +''' +Test de recuperation d'une image enregistrée +''' + +@app.route('/myclass/api/getRecodedImage/', methods=['POST','GET']) +@crossdomain(origin='*') +def getRecodedImage(): + # On recupere le corps (payload) de la requete + payload = request.form.to_dict() + print(" ### payload = ",payload) + status, myimg= mycommon.getRecodedImage(payload) + return jsonify(status=status, message=myimg) + + ''' diff --git a/partners.py b/partners.py index e1bb9b7..27c0cba 100644 --- a/partners.py +++ b/partners.py @@ -701,7 +701,7 @@ def partner_login(diction): ) if ret_val and ret_val['_id']: - mycommon.myprint(str(inspect.stack()[0][3]) + " Connexion partener "+email+" : OK, Date : "+ str(now)+" , _id = " + str(ret_val['_id'])) + mycommon.myprint(str(inspect.stack()[0][3]) + " Connexion partnair "+email+" : OK, Date : "+ str(now)+" , _id = " + str(ret_val['_id'])) # Vu que les credentials sont ok, alors enregistrement de la connexion dans la table "partner token" #print(" GRRRRRRRRRRRRRRRRRRR "+str(ret_val)) diff --git a/prj_common.py b/prj_common.py index c3c85d6..11dde7c 100644 --- a/prj_common.py +++ b/prj_common.py @@ -1,5 +1,8 @@ import hashlib +import _pickle as cPickle +import pickle +import bson from pymongo import MongoClient import pymongo from difflib import SequenceMatcher @@ -7,7 +10,7 @@ import textdistance from datetime import datetime import logging import secrets - +import base64 from bson import ObjectId from pymongo import MongoClient import inspect @@ -27,6 +30,13 @@ import prj_common as mycommon import re import email_mgt as email_mgt import random +import json + +class JSONEncoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, ObjectId): + return str(o) + return json.JSONEncoder.default(self, o) def myprint(message = ""): logging.info(str(datetime.now()) + " : "+str(message) ) @@ -81,6 +91,48 @@ def Upload_Save_CSV_File(file=None, Folder=None): myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False, None +''' +Controle de l'import des images. +les formats acceptés sont : +- 'jpg', +- 'jpeg', +- 'png' +''' +def Upload_Save_IMG_File(file=None, Folder=None): + try: + basename = os.path.basename(file.filename) + basename2 = basename.split(".") + + ''' + 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") + 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)) + return False, None + + + + timestr = time.strftime("%Y%m%d%H%M%S") + new_file_name = str(basename2[0]) + "_" + str(timestr) + "." + str(basename2[1]) + file.filename = new_file_name + file.save(os.path.join(str(Folder), secure_filename(file.filename))) # t + + Global_file_name = "./Data/"+file.filename + + + + return True, Global_file_name + + except Exception as e : + exc_type, exc_obj, exc_tb = sys.exc_info() + myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) + return False, None + + @@ -249,8 +301,8 @@ Cette fonction créer la reference interne d'une formation def Create_internal_call_ref(): retval = None now = datetime.now() - retval = "Mysy_"+now - return retval + retval = "Mysy_"+str(now) + return str(retval) def textdist(): val = textdistance.mra("doe", "dough") @@ -1138,9 +1190,268 @@ def clean_emoji(sentence=None): return new_sentence - 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 "" + + +''' +test d'enregistrement d'une image +''' +def recordImage(file=None, Folder=None, diction=None): + try: + + # Dictionnaire des champs utilisables + field_list = ['token'] + 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(): + mycommon.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'] + for val in field_list_obligatoire: + if str(val).lower() not in diction: + mycommon.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 = "" + myuserrecid = "" + # recuperation des paramettre + if ("token" in diction.keys()): + if diction['token']: + mytoken = diction['token'] + + + ''' + Verification de la validité du token et recuperation du recid du user + ''' + retval = check_user_validity("", str(mytoken)) + + if retval is False: + mycommon.myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide") + return False, "L'email ou le token ne sont pas valident" + + # Recuperation du recid de la personne + user_recid = get_user_recid_from_token(str(mytoken)) + if user_recid is False: + mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le recid du user") + return False, " Les informations d'identification sont incorrectes" + + myuserrecid = user_recid + + + status, saved_file = mycommon.Upload_Save_IMG_File(file, Folder) + if (status == False): + return False, "Impossible d'inserer les formation en masse " + + + # " 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' + new_diction['recid'] = myuserrecid + 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"}, + {"$set": {"img":strimg, "date_update":str(datetime.now()), + "type":"profil","recid":myuserrecid, "valide":"1", + "locked":"0" }}, + upsert=True, + return_document=ReturnDocument.AFTER + ) + + + if ret_val and ret_val['_id']: + mycommon.myprint(" L'image a bien ete enregistrée. ") + return True + else: + mycommon.myprint(" IMPOSSIBLE D'ENREGISTRER L'IMAGE") + 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 + + +''' +Test de recuperation d'une image +''' + + +def getRecodedImage(diction=None): + try: + # Dictionnaire des champs utilisables + field_list = ['token'] + 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(): + mycommon.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'] + for val in field_list_obligatoire: + if str(val).lower() not in diction: + mycommon.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 = "" + myuserrecid = "" + # recuperation des paramettre + if ("token" in diction.keys()): + if diction['token']: + mytoken = diction['token'] + + ''' + Verification de la validité du token et recuperation du recid du user + ''' + retval = check_user_validity("", str(mytoken)) + + if retval is False: + mycommon.myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide") + return False, "L'email ou le token ne sont pas valident" + + # Recuperation du recid de la personne + user_recid = get_user_recid_from_token(str(mytoken)) + if user_recid is False: + mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le recid du user") + 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"} ): + 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, "" + + + + + +''' +Cette fonction replace les caractères speciaux et ponctuation par des space +''' +def Ela_Remove_Ponct_Special_Caractere(sentence): + try: + text = sentence.lower() # mettre les mots en minuscule + + # Retirons les caractères spéciaux : + text = re.sub(r"[,\!\?\%\(\)\/\"]", " ", text) + text = re.sub(r"\&\S*\s", " ", text) + text = re.sub(r"\-", " ", text) + + list_noises = ['...', '.', ';', ',', ':', '!', '?', ')', '(', '[', ']', '\'', '"', '’', '`','©', '–', + '{', '}', '-', '=', '°', '#', '-', '/', '~', '&', '\\', '.', '^', '$', '*', '+','\\n','\n', + '?', '{', '}', '[', ']', '|', '(', ')', '-', '>', '<', '@','®', '™', '«', '»'] + + sentence = text + for noise in list_noises: + #print(" suppression de : '"+str(noise)+"' ") + sentence = sentence.replace(str(noise), " ") + + #print(" AFTER REPLACE NOISES = "+str(sentence)) + return True, sentence + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + print(str(inspect.stack()[0][3]) + " -" + str(e)+" - Line : "+ str(exc_tb.tb_lineno) ) + return False, " Impossible Ela_Remove_Ponct_Special_Caractere" + + + + +''' +Cette fonction prend un titre (une phrase) et retrounre +l'internal url associé +''' +def CreateInternalUrl(sentence=None): + try: + + internal_url = "" + + if( len(sentence) <= 0 ): + return False, "" + + my_internal_url = sentence + local_status, my_internal_url = Ela_Remove_Ponct_Special_Caractere(my_internal_url) + my_internal_url = unidecode(my_internal_url.lower()) + my_internal_url = my_internal_url.replace("--", "-") + my_internal_url = my_internal_url.replace(" ", "-") + my_internal_url = my_internal_url.replace("/", "-") + if (my_internal_url.startswith('-')): + my_internal_url = my_internal_url[1:] + + if (my_internal_url.endswith('-')): + my_internal_url = my_internal_url[:-1] + + suffix = hashlib.md5(my_internal_url.encode()).hexdigest() + final_internal_url = str(my_internal_url) + "-" + str(suffix[-3:]) + final_internal_url = final_internal_url.replace("--", "-") + internal_url = final_internal_url + + return True, internal_url + + 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, "" + diff --git a/wrapper.py b/wrapper.py index d0e3d4a..f386702 100644 --- a/wrapper.py +++ b/wrapper.py @@ -179,16 +179,23 @@ def get_all_class(diction): #print(" My Data ="+str(mydata)) + status, tab_training_inzone = get_training_in_user_zone(diction) + + nb_formation_a_jouter = MYSY_GV.MAINPAGE_QUERY_LIMIT_ROW - len(tab_training_inzone) + + print(" NB = tab_training_inzone : "+str(len(tab_training_inzone))) + print(" tab_training_inzone = ############# "+str(tab_training_inzone)) + coll_name = MYSY_GV.dbname['myclass'] - val_tmp = 1 + val_tmp = len(tab_training_inzone) insertObject = [] for x in coll_name.find({ "$or": [ {'valide':'1', 'locked':'0', 'isalaune':'1'}, { 'coeur': 1 } ] }, {"_id": 0, "indexed": 0, "indexed_desc": 0, "indexed_obj": 0, "indexed_title": 0, "valide": 0, "locked": 0, "partner_owner_recid": 0, }).\ - limit(MYSY_GV.MAINPAGE_QUERY_LIMIT_ROW).\ + limit(nb_formation_a_jouter).\ sort( [ ("coeur", pymongo.DESCENDING), ("price", pymongo.ASCENDING), ("date_update", pymongo.DESCENDING),]): @@ -207,16 +214,132 @@ def get_all_class(diction): user = x user['id'] = str(val_tmp) insertObject.append(JSONEncoder().encode(user)) + + tab_training_inzone.append(JSONEncoder().encode(user)) val_tmp = val_tmp + 1 - #print(" insertObject = ", str(insertObject)) - return True, insertObject + #print(" insertObject = ", str(tab_training_inzone)) + #return True, insertObject + return True, tab_training_inzone except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False, " Impossible de recuperer les formations" +''' +Cette Fonction recuperer les formation dans la zone de l'utilisateur. +Par zone utilisateur j'entends : ville or pays + +/!\ IMPORTANT : +Si on veut UNIQUEMENT diffuser une formation dans une ville, alors il faut : +- reseigner le champs : zone_diffusion.city +- Laisser le champs : zone_diffusion.country à VIDE. + +Par defaut, le système cherche les diffuser dans un pays ou dans une ville. +le champs pays est renseigner, alors la formation a est diffuser dans tous le pays. + +Si le la collection "zone_diffusion" est vide ou n'existe pas, alors les formations sont diffusées partout dans le monde. +''' +def get_training_in_user_zone(diction): + try: + insertObject = [] + # Dictionnaire des champs utilisables + field_list = ['token', 'user_ip', 'user_country_code', 'user_country_name', 'user_city', + 'user_postal', 'user_latitude', 'user_longitude', 'user_state', 'search_text', 'certif', + 'support', 'type', 'lang', 'price', 'distance', 'duration'] + + 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(): + mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé") + return False, " Recherche impossible" + + # Recuperation des parametres + mydata = {} + if ("user_ip" in diction.keys()): + if diction['user_ip']: + mydata['user_ip'] = diction['user_ip'] + + if ("user_country_code" in diction.keys()): + if diction['user_country_code']: + mydata['user_country_code'] = diction['user_country_code'] + + if ("user_country_name" in diction.keys()): + if diction['user_country_name']: + mydata['user_country_name'] = diction['user_country_name'] + + if ("user_city" in diction.keys()): + if diction['user_city']: + mydata['user_city'] = diction['user_city'] + + if ("user_postal" in diction.keys()): + if diction['user_postal']: + mydata['user_postal'] = diction['user_postal'] + + if ("user_latitude" in diction.keys()): + if diction['user_latitude']: + mydata['user_latitude'] = diction['user_latitude'] + + if ("user_longitude" in diction.keys()): + if diction['user_longitude']: + mydata['user_longitude'] = diction['user_longitude'] + + if ("user_state" in diction.keys()): + if diction['user_state']: + mydata['user_state'] = diction['user_state'] + + # print(" My Data ="+str(mydata)) + + coll_name = MYSY_GV.dbname['myclass'] + + val_tmp = 1 + insertObject = [] + + print(" critère de recherche : user_country_code = "+str(mydata['user_country_code']).lower()+" ---- user_city = "+str(mydata['user_city']).lower()) + + for x in coll_name.find({ "$or": [ {'valide':'1', 'locked':'0', "zone_diffusion.country":str(mydata['user_country_code']).lower()}, + {'valide':'1', 'locked':'0', "zone_diffusion.city":str(mydata['user_city']).lower()} ] }, + {"_id": 0, "indexed": 0, "indexed_desc": 0, "indexed_obj": 0, "indexed_title": 0, + "valide": 0, "locked": 0, "partner_owner_recid": 0, }).\ + limit(MYSY_GV.MAINPAGE_QUERY_LIMIT_ROW).\ + sort( + [ ("price", pymongo.ASCENDING), ("date_update", pymongo.DESCENDING),]): + + + + #print("AVANT ==> "+str(x['description'])) + val = x['description'] + if( len(x['description']) > MYSY_GV.MAX_CARACT ): + x['description'] = val[:MYSY_GV.MAX_CARACT]+" ..." + + else: + x['description'] = val[:MYSY_GV.MAX_CARACT] + + #mycommon.myprint("APRES ==> " + str(x['description'])) + + user = x + user['id'] = str(val_tmp) + insertObject.append(JSONEncoder().encode(user)) + val_tmp = val_tmp + 1 + + + return True, insertObject + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) + return False, " Impossible de recuperer les formations dans la zone de l'utilisateur" + + + + ''' Cette fonction recherche les formations correspondant à un text