Elyos_FI_Back_Office/class_mgt.py

711 lines
26 KiB
Python

'''
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