''' Ce fichier traite tout ce qui est liée à la gestion des formations ''' from pymongo import MongoClient import json from bson import ObjectId import re from datetime import datetime import prj_common as mycommon import secrets import inspect class JSONEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, ObjectId): return str(o) return json.JSONEncoder.default(self, o) CONNECTION_STRING = "mongodb://localhost/cherifdb" client = MongoClient(CONNECTION_STRING) dbname = client['cherifdb'] ''' Cette fonction ajoute une formation elle verifie le token de l'entité qui ajoute la formation. ''' def add_class(diction): try: ''' # 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. ''' field_list = ['external_code', 'title', 'description', 'trainer', 'institut_formation', 'distantiel', 'presentiel', 'price', 'url','duree_formation','partner_mail', 'token', 'plus_produit', 'mots_cle'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: mycommon.myprint(str(inspect.stack()[0][3])+" - Creation formation : Le champ '" + val + "' n'existe pas, Creation formation annulée") return False, " Verifier votre API" ''' 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', 'title', 'description', 'trainer', 'distantiel', 'presentiel', 'partner_mail', 'token'] for val in field_list_obligatoire: if val not in diction: mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans liste ") return False, " Verifier votre API" ''' Verification si le token et l'email sont valident ''' # recuperation des paramettre mydata = {} if ("external_code" in diction.keys()): if diction['external_code']: mydata['external_code'] = diction['external_code'] if ("title" in diction.keys()): if diction['title']: mydata['title'] = diction['title'] if ("description" in diction.keys()): if 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'] if ("institut_formation" in diction.keys()): if diction['institut_formation']: mydata['institut_formation'] = diction['institut_formation'] if ("distantiel" in diction.keys()): if diction['distantiel']: mydata['distantiel'] = diction['distantiel'] if ("presentiel" in diction.keys()): if diction['presentiel']: mydata['presentiel'] = diction['presentiel'] if ("price" in diction.keys()): if diction['price']: mydata['price'] = diction['price'] if ("url" in diction.keys()): if diction['url']: mydata['url'] = diction['url'] if ("duree_formation" in diction.keys()): if diction['duree_formation']: mydata['duree_formation'] = diction['duree_formation'] if ("partner_mail" in diction.keys()): if diction['partner_mail']: mydata['partner_mail'] = diction['partner_mail'] if ("plus_produit" in diction.keys()): if 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'] if ("token" in diction.keys()): if diction['token']: mydata['token'] = diction['token'] mydata['active'] = '1' mydata['locked'] = '0' mydata['indexed'] = '0' mydata['indexed_title'] = '0' mydata['indexed_desc'] = '0' mydata['indexed_obj'] = '0' coll_name = dbname['myclass'] coll_token = dbname['user_token'] # Verification de la validité du token/mail dans le cas des user en mode connecté retval = mycommon.check_token_validity(str(mydata['partner_mail']), str(mydata['token'] ) ) if retval is False: mycommon.myprint(str(inspect.stack()[0][3])+" - L'email ou le token ne sont pas valident") return False, "L'email ou le token ne sont pas valident" ''' Verification si cette formation exite deja . la clé est : external_code ''' tmp = coll_name.find({'external_code': str(mydata['external_code'])}).count() #mycommon.myprint(" TMP = " + str(tmp)) if (tmp > 0): mycommon.myprint(str(inspect.stack()[0][3])+" -la formation avec l'external code " + str(mydata['external_code']) + "' existe deja, impossible de créer le compte partenaire ") return False, "la formation avec l'external code " + str(mydata['external_code']) + "' existe deja, impossible de créer le compte partenaire " coll_name.insert_one(mydata) return True, "La formation a bien été ajoutée" except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - "+str(e)) return False, "Impossible d'ajouter la formation" ''' cette fontion met à jour une formation la clé est : l'external code. seules les formation "valide" et non "locked" sont modifiable ''' def update_class(diction): try: ''' # 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. ''' field_list = ['external_code', 'title', 'description', 'trainer', 'institut_formation', 'distantiel', 'presentiel','price', 'url', 'duree_formation', 'partner_mail','token','plus_produit', 'mots_cle'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: mycommon.myprint( str(inspect.stack()[0][3])+" - Creation partner account : Le champ '" + val + "' n'existe pas, Creation formation annulée") return False, " Impossible de mettre à jour la formation" ''' 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', 'partner_mail', 'token'] for val in field_list_obligatoire: if val not in diction: mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans liste ") return False, " Impossible de mettre à jour la formation" # recuperation des paramettre mydata = {} my_external_code = "" if ("external_code" in diction.keys()): if diction['external_code']: my_external_code = diction['external_code'] if ("title" in diction.keys()): if diction['title']: mydata['title'] = diction['title'] if ("description" in diction.keys()): if 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'] if ("institut_formation" in diction.keys()): if diction['institut_formation']: mydata['institut_formation'] = diction['institut_formation'] if ("distantiel" in diction.keys()): if diction['distantiel']: mydata['distantiel'] = diction['distantiel'] if ("presentiel" in diction.keys()): if diction['presentiel']: mydata['presentiel'] = diction['presentiel'] if ("price" in diction.keys()): if diction['price']: mydata['price'] = diction['price'] if ("url" in diction.keys()): if diction['url']: mydata['url'] = diction['url'] if ("duree_formation" in diction.keys()): if diction['duree_formation']: mydata['duree_formation'] = diction['duree_formation'] if ("partner_mail" in diction.keys()): if diction['partner_mail']: mydata['partner_mail'] = diction['partner_mail'] if ("token" in diction.keys()): if diction['token']: mydata['token'] = diction['token'] if ("plus_produit" in diction.keys()): if 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['date_update'] = str(datetime.now()) mydata['indexed'] = '0' mydata['indexed_title'] = '0' mydata['indexed_desc'] = '0' mydata['indexed_obj'] = '0' coll_name = dbname['myclass'] coll_token = dbname['user_token'] # Verification de la validité du token/mail dans le cas des user en mode connecté retval = mycommon.check_token_validity(str(mydata['partner_mail']), str(mydata['token']) ) if retval is False: mycommon.myprint(str(inspect.stack()[0][3])+" - L'email ou le token ne sont pas valident") return False, " Impossible de mettre à jour la formation" # seules les formation avec locked = 0 et valide=1 sont modifiables ret_val = coll_name.find_and_modify(query={'external_code': str(my_external_code), 'locked': '0', 'valide': '1'}, update={"$set": mydata} ) if (ret_val and ret_val['_id']): mycommon.myprint( str(inspect.stack()[0][3])+" - La formation a bin ete mise à jour =" + str(ret_val['_id'])) return True, " La formation a été mise à jour" else: mycommon.myprint(str(inspect.stack()[0][3])+" - Mise à jour formation ==> KO ") return False, " Impossible de mettre à jour la formation" except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) return False, " Impossible de mettre à jour la formation" ''' Desactivation d'une formation Disable a training ''' def disable_class(diction): try: ''' # 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. ''' field_list = ['external_code', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: mycommon.myprint( str(inspect.stack()[0][3])+" - Creation partner account : Le champ '" + val + "' n'existe pas, Creation formation annulée") return False, " Impossible de mettre à jour la formation" ''' 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'] for val in field_list_obligatoire: if val not in diction: mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans liste ") return False, " Impossible de mettre à jour la formation" # recuperation des paramettre mydata = {} my_external_code = "" if ("external_code" in diction.keys()): if diction['external_code']: my_external_code = diction['external_code'] if ("token" in diction.keys()): if diction['token']: mydata['token'] = diction['token'] mydata['date_update'] = str(datetime.now()) coll_name = dbname['myclass'] coll_token = dbname['user_token'] # Verification de la validité du token/mail dans le cas des user en mode connecté retval = mycommon.check_token_validity("", str(mydata['token']) ) if retval is False: mycommon.myprint(str(inspect.stack()[0][3])+" - L'email ou le token ne sont pas valident") return False, " Impossible de mettre à jour la formation" # seules les formation avec locked = 0 et valide=1 sont modifiables ret_val = coll_name.find_and_modify(query={'external_code': str(my_external_code), 'locked': '0', 'valide': '0'}, update={"$set": mydata} ) if (ret_val and ret_val['_id']): mycommon.myprint( str(inspect.stack()[0][3])+" - La formation a bin ete mise à jour =" + str(ret_val['_id'])) return True, " La formation a été desactivée" else: mycommon.myprint(str(inspect.stack()[0][3])+" - Mise à jour formation ==> KO ") return False, " Impossible de mettre à jour la formation" except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) return False, " Impossible de mettre à jour la formation" ''' reactivation d'une formation Enable a training ''' def enable_class(diction): try: ''' # 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. ''' field_list = ['external_code', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: mycommon.myprint( str(inspect.stack()[0][3])+" - Creation partner account : Le champ '" + val + "' n'existe pas, Creation formation annulée") return False, " Impossible de mettre à jour la formation" ''' 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'] for val in field_list_obligatoire: if val not in diction: mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans liste ") return False, " Impossible de mettre à jour la formation" # recuperation des paramettre mydata = {} my_external_code = "" if ("external_code" in diction.keys()): if diction['external_code']: my_external_code = diction['external_code'] if ("token" in diction.keys()): if diction['token']: mydata['token'] = diction['token'] mydata['date_update'] = str(datetime.now()) coll_name = dbname['myclass'] coll_token = dbname['user_token'] # Verification de la validité du token/mail dans le cas des user en mode connecté retval = mycommon.check_token_validity("", str(mydata['token']) ) if retval is False: mycommon.myprint(str(inspect.stack()[0][3])+" - L'email ou le token ne sont pas valident") return False, " Impossible de mettre à jour la formation" # seules les formation avec locked = 0 et valide=1 sont modifiables ret_val = coll_name.find_and_modify(query={'external_code': str(my_external_code), 'locked': '0', 'valide': '1'}, update={"$set": mydata} ) if (ret_val and ret_val['_id']): mycommon.myprint( str(inspect.stack()[0][3])+" - La formation a bin ete mise à jour =" + str(ret_val['_id'])) return True, " La formation a été desactivée" else: mycommon.myprint(str(inspect.stack()[0][3])+" - Mise à jour formation ==> KO ") return False, " Impossible de mettre à jour la formation" except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) return False, " Impossible de mettre à jour la formation" ''' Desactivation d'une formation unlock a training ''' def unlock_class(diction): try: ''' # 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. ''' field_list = ['external_code', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: mycommon.myprint( str(inspect.stack()[0][3])+" - Creation partner account : Le champ '" + val + "' n'existe pas, Creation formation annulée") return False, " Impossible de mettre à jour la formation" ''' 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'] for val in field_list_obligatoire: if val not in diction: mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans liste ") return False, " Impossible de mettre à jour la formation" # recuperation des paramettre mydata = {} my_external_code = "" if ("external_code" in diction.keys()): if diction['external_code']: my_external_code = diction['external_code'] if ("token" in diction.keys()): if diction['token']: mydata['token'] = diction['token'] mydata['date_update'] = str(datetime.now()) coll_name = dbname['myclass'] coll_token = dbname['user_token'] # Verification de la validité du token/mail dans le cas des user en mode connecté retval = mycommon.check_token_validity("", str(mydata['token']) ) if retval is False: mycommon.myprint(str(inspect.stack()[0][3])+" - L'email ou le token ne sont pas valident") return False, " Impossible de mettre à jour la formation" # seules les formation avec locked = 0 et valide=1 sont modifiables ret_val = coll_name.find_and_modify(query={'external_code': str(my_external_code), 'locked': '0', 'valide': '1'}, update={"$set": mydata} ) if (ret_val and ret_val['_id']): mycommon.myprint( str(inspect.stack()[0][3])+" - La formation a bin ete mise à jour =" + str(ret_val['_id'])) return True, " La formation a été desactivée" else: mycommon.myprint(str(inspect.stack()[0][3])+" - Mise à jour formation ==> KO ") return False, " Impossible de mettre à jour la formation" except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - " +str(e)) return False, " Impossible de mettre à jour la formation" ''' cette fonction recherche et retour une formation. la clé est : l'external code. - le token du partenaire Seules les formation "locked = 0 et valide = 1" sont recuperables par l'API ''' def get_class(diction): try: ''' # 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. ''' field_list = ['external_code', 'token'] incom_keys = diction.keys() for val in incom_keys: if val not in field_list: mycommon.myprint( str(inspect.stack()[0][3])+ " - Creation partner account : Le champ '" + val + "' n'existe pas, Creation formation annulée") return False, " Impossible de recuperer la formation" ''' 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'] for val in field_list_obligatoire: if val not in diction: mycommon.myprint(str(inspect.stack()[0][3])+" - La valeur '" + val + "' n'est pas presente dans liste ") return False, " Impossible de recuperer la formation" # recuperation des paramettre mydata = {} my_external_code = "" my_token = "" if ("external_code" in diction.keys()): if diction['external_code']: my_external_code = diction['external_code'] if ("token" in diction.keys()): if diction['token']: my_token = diction['token'] coll_name = dbname['myclass'] # verifier que le token et l'email sont ok coll_token = dbname['user_token'] # Verification de la validité du token dans le cas des user en mode connecté ''' /!\ Important : si le token est vide, alors c'est une recherche faite en mode non-connecté. on doit l'accepter. le controle de la validé du token est faite que ce dernier n'est pas vide. ''' user_recid = "None" # Verification de la validité du token/mail dans le cas des user en mode connecté if (len(str(my_token)) > 0): retval = mycommon.check_token_validity("", my_token) if retval is False: mycommon.myprint( str(inspect.stack()[0][3])+" - Le token n'est pas valide") return False, " Impossible de recuperer la formation" # Recuperation du recid de l'utilisateur user_recid = mycommon.get_user_recid_from_token(my_token) if user_recid is False: mycommon.myprint(str(inspect.stack()[0][3])+" - Impossible de recuperer le token de l'utilisateur") return False, " Impossible de recuperer la formation" # verifier que la formation existe bien et qu'elle n'est bloquée ni verroulée tmp = coll_name.find( {'external_code': my_external_code, 'valide':'1', 'locked':'0'}) if (tmp.count() <= 0): mycommon.myprint( str(inspect.stack()[0][3])+" - La formation '"+my_external_code+"' n'existe pas") return False, " Impossible de recuperer la formation" RetObject = [] for retVal in coll_name.find({'external_code': my_external_code}): mycommon.myprint(str(retVal)) user = retVal RetObject.append(JSONEncoder().encode(user)) return True, RetObject except Exception as e: mycommon.myprint( str(inspect.stack()[0][3])+" -" +str(e)) return False, " Impossible de recuperer la formation" def get_class_global_search(search_string): try: mycommon.myprint(" search_string", search_string) client = MongoClient(CONNECTION_STRING) dbname = client['cherifdb'] coll_name = dbname['myclass'] val = re.compile(r".*"+search_string+".*") my_regex = "/.*"+search_string+".*/" insertObject = [] for x in coll_name.find({'myindex': { '$regex': re.compile(r".*"+search_string+".*") }}): mycommon.myprint(x) user = x insertObject.append(JSONEncoder().encode(user)) #mycommon.myprint(" insertObject = ", insertObject) return insertObject except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - "+str(e)) return False def get_all_class_by_attribut(attribut, value): try: mycommon.myprint(" attribut", attribut, " value = ",value) coll_name = dbname['myclass'] insertObject = [] for x in coll_name.find({attribut: value}, {"_id": 0}): mycommon.myprint(x) user = x insertObject.append(JSONEncoder().encode(user)) #mycommon.myprint(" insertObject = ", insertObject) return insertObject except Exception as e: mycommon.myprint(str(inspect.stack()[0][3])+" - "+str(e)) return False