10/12/22 - 16h30

master
cherif 2022-12-10 16:34:08 +01:00
parent 7be42da29d
commit efb7260214
6 changed files with 1623 additions and 33 deletions

View File

@ -5,7 +5,9 @@
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/Inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Session_Formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />

View File

@ -73,18 +73,14 @@ def AddStagiairetoClass(diction):
Recuperation des info de la session de formation
"""
for tmp_val in MYSY_GV.dbname['myclass'].find({"datelieu.session_id":str(session_id)}):
for tmp_val in MYSY_GV.dbname['session_formation'].find({"formation_session_id":str(session_id)}):
mydata['date_du'] = tmp_val['date_debut']
mydata['date_au'] = tmp_val['date_fin']
mydata['ville'] = tmp_val['ville']
mydata['code_postal'] = tmp_val['code_postal']
mydata['adresse'] = tmp_val['adresse']
tmp_date_lieu = tmp_val['datelieu']
print(" #### tmp_date_lieu = "+str(tmp_date_lieu))
for val in tmp_date_lieu:
if( val['session_id'] == str(session_id) ):
mydata['date_du'] = val['date_du']
mydata['date_au'] = val['date_au']
mydata['ville'] = val['ville']
mydata['code_postal'] = val['code_postal']
mydata['adresse'] = val['adresse']
print(" #### mydata = "+str(mydata))
@ -604,6 +600,7 @@ def SendPre_InscriptionEmail(diction):
local_class = MYSY_GV.dbname['myclass'].find({'internal_url':str(diction['class_internal_url'])})
data_mail['title'] = local_class[0]['title']
partner_recid = local_class[0]['partner_owner_recid']
# 1-BIS : Recuperation des donnees de l'editeur de la formation
local_partner = MYSY_GV.dbname['partnair_account'].find_one({'recid':str(partner_recid)})
data_mail['partner_mail'] = local_partner['email']
@ -807,7 +804,7 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas, Creation formation annulée")
mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas, Creation participants annulée")
return False, " Verifier votre API"
'''
@ -910,6 +907,12 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
mydata['status'] = str(df['status'].values[n]).strip()
if( str(mydata['status']) != "0" and str(mydata['status']) != "1" and str(mydata['status']) != "2"):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champs 'status' de ligne " + str(n) + " est incorrecte. Valeurs acceptées : 0,1,2")
return False, " Le champs status de ligne " + str(n) + " est incorrecte. Valeurs acceptées : 0,1,2"
mydata['class_internal_url'] = str(session_data['class_internal_url'])
@ -918,27 +921,11 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
if( local_status is False ):
mycommon.myprint(
str(inspect.stack()[0][ 3]) + " Le champs 'prix' de ligne " + str( n) + " est incorrecte.")
return False, " Le champs status de ligne " + str(n) + " est incorrecte. "
return False, " Le champs prix de ligne " + str(n) + " est incorrecte. "
mydata['price'] = local_price
"""mydata['session_id'] = str(session_data['formation_session_id'])
tab_date_du = str(session_data['date_debut']).split(" ")
mydata['date_du'] = str(tab_date_du[0])
tab_date_au = str(session_data['date_fin']).split(" ")
mydata['date_au'] = str(tab_date_au[0])
mydata['ville'] = str(session_data['ville'])
mydata['code_postal'] = str(session_data['code_postal'])
mydata['adresse'] = str(session_data['adresse'])
mydata['class_internal_url'] = str(session_data['class_internal_url'])
"""
clean_dict = {k: mydata[k] for k in mydata if ( str(mydata[k]) != "nan") }
print( "#### clean_dict ", clean_dict)
@ -947,12 +934,12 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
if( status is False ):
return status, retval
print(str(total_rows)+" formations ont été inserées")
print(str(total_rows)+" participants ont été inserés")
return True, str(total_rows)+" formations ont été inserées / Mises à jour"
return True, str(total_rows)+" participants ont été inserées / Mises à jour"
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 d'inserer les formation en masse "
return False, "Impossible d'importer les participants en masse "

File diff suppressed because it is too large Load Diff

View File

@ -350,3 +350,195 @@ def GetAllValideSessionFormation_List(diction):
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 la liste des sessions de formation valides et actives."
"""
Cette fonction crée les sessions de formation en mass
par exemple avec l'import d'un fichier csv
"""
def Add_Update_SessionFormation_mass(file=None, Folder=None, diction=None):
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 = ['token', 'class_internal_url']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'existe pas, Creation session 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 = ['token', 'class_internal_url']
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"
my_token = ""
if ("token" in diction.keys()):
if diction['token']:
my_token = diction['token']
class_internal_url = ""
if ("class_internal_url" in diction.keys()):
if diction['class_internal_url']:
class_internal_url = diction['class_internal_url']
if (len(str(class_internal_url).strip()) <= 0):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " Le code de la formation est vide : Impossible d'importer la liste des sessions ")
return False, "Le code de la formation est vide. Impossible d'importer la liste des sessions"
partner_recid = mycommon.get_parnter_recid_from_token(my_token)
if (partner_recid is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - partner_recid KO : Impossible d'importer la liste des sessions ")
return False, "les information de connexion sont incorrectes. Impossible d'importer la liste des sessions"
status, saved_file = mycommon.Upload_Save_CSV_File(file, Folder)
if (status == False):
return False, "Impossible d'importer la liste des sessions, le nom du fichier est incorrect "
# " Lecture du fichier "
# print(" Lecture du fichier : "+saved_file)
nb_line = 0
df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';')
# Dictionnaire des champs utilisables
'''
# Verification que les noms des colonne sont bien corrects"
'''
field_list = ['date_debut', 'date_fin', 'nb_participant', 'adresse', 'code_postal', 'ville',
'session_status', 'date_debut_inscription', 'date_fin_inscription']
# Controle du nombre de lignes dans le fichier.
total_rows = len(df)
if (total_rows > MYSY_GV.MAX_PARTICIPANT_BY_CSV):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le fichier comporte plus de " + str(
MYSY_GV.MAX_PARTICIPANT_BY_CSV) + " lignes.")
return False, " Le fichier comporte plus de " + str(MYSY_GV.MAX_PARTICIPANT_BY_CSV) + " lignes."
# print(df.columns)
for val in df.columns:
if str(val).lower() not in field_list:
mycommon.myprint(
str(inspect.stack()[0][3]) + " : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée"
# Recuperation des info de la formation.
formation_data = MYSY_GV.dbname['myclass'].find_one({'internal_url': str(class_internal_url)})
if (formation_data is None):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La session de formation n'existe pas : Impossible d'importer la liste des participants ")
return False, "la session de formation n'existe pas. Impossible d'importer la liste des participants"
x = range(0, total_rows)
for n in x:
mydata = {}
mydata['date_debut'] = str(df['date_debut'].values[n]).strip().split(" ")[0]
mydata['date_fin'] = str(df['date_fin'].values[n]).strip().split(" ")[0]
## Verification de la cohérence des dates. Date_du doit <= Date_au
if (datetime.strptime(str(mydata['date_debut']).strip(), '%d/%m/%Y') > datetime.strptime(
str(mydata['date_fin']).strip(), '%d/%m/%Y')):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Impossible de créer la session de formation : La date debut " + str(mydata['date_debut']) +
" est posterieure à la date de fin " + str(mydata['date_fin']) + " pour la ligne "+str(n)+" ")
return False, " Impossible de créer la session de formation : La date debut " + str(mydata['date_debut']) +\
" est posterieure à la date de fin " + str(mydata['date_fin']) + " pour la ligne "+str(n)+" "
local_nb_participants = str(df['nb_participant'].values[n]).strip()
local_status, new_participants = mycommon.IsInt(local_nb_participants)
if (local_status is False):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champs 'nb_participant' de ligne " + str(n) + " est incorrecte.")
return False, " Le champs nb_participant de ligne " + str(n) + " est incorrecte. "
mydata['nb_participant'] = str(new_participants)
mydata['adresse'] = str(df['adresse'].values[n]).strip()
mydata['code_postal'] = str(df['code_postal'].values[n]).strip()
mydata['ville'] = str(df['ville'].values[n]).strip()
local_session = str(df['session_status'].values[n]).strip()
if( str(local_session) != "0" and str(local_session) != "1" and str(local_session) != "2"):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champs 'session_status' de ligne " + str(n) + " est incorrecte. Les valeurs acceptées sont 0,1,2")
return False, " Le champs nb_participant de ligne " + str(n) + " est incorrecte. Les valeurs acceptées sont 0,1,2"
if( str(local_session) == "1"):
mydata['session_status'] = str("true")
mydata['date_debut_inscription'] = str(df['date_debut_inscription'].values[n]).strip().split(" ")[0]
mydata['date_fin_inscription'] = str(df['date_fin_inscription'].values[n]).strip().split(" ")[0]
## Verification de la cohérence des dates. Date_du doit <= Date_au
if (datetime.strptime(str(mydata['date_debut_inscription']).strip(), '%d/%m/%Y') > datetime.strptime(
str(mydata['date_fin_inscription']).strip(), '%d/%m/%Y')):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " - Impossible de créer la session de formation : La date debut des inscriptions " + str(
mydata['date_debut_inscription']) +
" est posterieure à la date de fin des inscriptions " + str(mydata['date_fin_inscription']) + " pour la ligne "+str(n)+" ")
return False, " Impossible de créer la session de formation : La date debut des inscriptions " + str(
mydata['date_debut_inscription']) + \
" est posterieure à la date de fin des inscriptions" + str(mydata['date_fin_inscription']) + " pour la ligne "+str(n)+" "
mydata['token'] = str(my_token)
mydata['class_internal_url'] = str(class_internal_url)
print(" ### mydata ", mydata)
diction_for_session_id = {}
diction_for_session_id['date_du'] = str(mydata['date_debut']).split(" ")[0]
diction_for_session_id['date_au'] = str(mydata['date_fin']).split(" ")[0]
diction_for_session_id['code_postal'] = str(mydata['code_postal'] )
diction_for_session_id['adresse'] = str(mydata['adresse'])
print(" ### diction_for_session_id ", diction_for_session_id)
local_status, local_session_id = mycommon.CreateTrainingSession_id(diction_for_session_id)
if( local_status is False):
return False, local_session_id
mydata['formation_session_id'] = str(local_session_id)
clean_dict = {k: mydata[k] for k in mydata if (str(mydata[k]) != "nan")}
print("#### Add_Update_SessionFormation_mass : clean_dict ", clean_dict)
status, retval = Add_Update_SessionFormation(clean_dict)
if (status is False):
return status, retval
print(str(total_rows) + " sessions ont été inserées")
return True, str(total_rows) + " sessions ont été inserées / Mises à jour"
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 d'importer les sessions de formation en masse "

18
main.py
View File

@ -2098,7 +2098,25 @@ def AddStagiairetoClass_mass():
return jsonify(status=localStatus, message=message)
"""
API d'import en masse des sessions de formation
"""
@app.route('/myclass/api/Add_Update_SessionFormation_mass/', methods=['POST','GET'])
@crossdomain(origin='*')
def Add_Update_SessionFormation_mass():
# On recupere le corps (payload) de la requete
payload = request.form.to_dict()
print(" ### Add_Update_SessionFormation_mass payload = ",payload)
#print(request.files)
if request.method == 'POST':
# Create variable for uploaded file
f = request.files['File']
localStatus, message = SF.Add_Update_SessionFormation_mass(f, app.config['UPLOAD_FOLDER'], payload)
#status, retval = cm.add_class_mass(f, app.config['UPLOAD_FOLDER'], payload)
return jsonify(status=localStatus, message=message)
if __name__ == '__main__':

View File

@ -471,11 +471,25 @@ def tryInt(val):
try:
val = str(val).replace(",",".")
tab_val = val.split(".")
myfloat = int(tab_val[0])
return myfloat
myint = int(tab_val[0])
return myint
except ValueError:
return 0
"""
Verifie si c'est un entier.
return status et la valeur
"""
def IsInt(val):
try:
val = str(val).replace(",", ".")
tab_val = val.split(".")
myint = int(tab_val[0])
return True, myint
except ValueError:
return False, 0
'''
Cette fonction verifie si une chaine est de type date jj/mm/aaaa
@ -2405,3 +2419,57 @@ def UserEmargementValidation(diction):
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, False
"""
Cette fonction prends une session de formation,
Créer l'ID fonctionnel associé : session_id
la regles est :
Session_id = date_du+date_au+code_postal+adresse
/!\ : les dates sont au formation : jjmmaaaa.
exemple de session_id : 10022023150220230enligne => du 10/02/2023 au 15/02/2023, au CP : 0, à l'adresse : 'en ligne'
"""
def CreateTrainingSession_id(diction):
try:
field_list_obligatoire = ['date_du', 'date_au', 'code_postal', 'adresse']
for val in field_list_obligatoire:
if val not in diction:
myprint(
str(inspect.stack()[0][3]) + " Impossible de créer la session de formation - La valeur '" + val + "' n'est pas presente dans liste ")
return False, " Impossible de créer la session de formation"
if( CheckisDate(str(diction['date_du'])) is False or CheckisDate(str(diction['date_au'])) is False):
myprint(
str(inspect.stack()[0][3]) + " - Les dates de debut ou de fin sont incorrecte. Les formats attendus : jj/mm/aaaa. Verifiez les dates : "+ str(diction['date_du'])+" et "+str(diction['date_au']))
return False, " Impossible de créer la session de formation : Les dates de debut ou de fin sont incorrecte. Les formats attendus : jj/mm/aaaa.Verifiez les dates : "+ str(diction['date_du'])+" et "+str(diction['date_au'])
## Verification de la cohérence des dates. Date_du doit <= Date_au
if (datetime.strptime(str(diction['date_du']).strip(), '%d/%m/%Y') > datetime.strptime(str(diction['date_au']).strip(), '%d/%m/%Y')):
myprint(
str(inspect.stack()[0][
3]) + " - Impossible de créer la session de formation : La date debut "+str(diction['date_du'])+" est posterieure à la date de fin "+str(diction['date_au'])+" pour la formation ")
return False, " Impossible de créer la session de formation : La date debut "+str(diction['date_du'])+" est posterieure à la date de fin "+str(diction['date_au'])+" pour la formation "
session_id = str(
str(diction['date_du']).strip() +
str(diction['date_au']).strip() +
str(diction['code_postal']).strip() +
str(diction['adresse']).strip() ).replace(' ', '')
session_id = remove_non_ascii(session_id)
session_id = re.sub(r'[^a-zA-Z0-9]', '', session_id)
return True, session_id
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, False