21/07/2024 - 12h

master
cherif 2024-07-21 12:18:25 +02:00
parent a0ac2664b3
commit abd8f3b7bb
6 changed files with 11335 additions and 25 deletions

View File

@ -1,11 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="17/07/2024 - 11h30"> <list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="17/07/2024 - 11h30sdf">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" 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$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ressources_humaines.py" beforeDir="false" afterPath="$PROJECT_DIR$/ressources_humaines.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Session_Formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/user_access_right.py" beforeDir="false" afterPath="$PROJECT_DIR$/user_access_right.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/ela_user_account.py" beforeDir="false" afterPath="$PROJECT_DIR$/ela_user_account.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/survey_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/survey_mgt.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -75,13 +77,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1680804787304</updated> <updated>1680804787304</updated>
</task> </task>
<task id="LOCAL-00306" summary="19/05/2024 - 22h15">
<created>1716149736394</created>
<option name="number" value="00306" />
<option name="presentableId" value="LOCAL-00306" />
<option name="project" value="LOCAL" />
<updated>1716149736394</updated>
</task>
<task id="LOCAL-00307" summary="20/05/2024 - 14h00"> <task id="LOCAL-00307" summary="20/05/2024 - 14h00">
<created>1716206194944</created> <created>1716206194944</created>
<option name="number" value="00307" /> <option name="number" value="00307" />
@ -418,7 +413,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1721207839114</updated> <updated>1721207839114</updated>
</task> </task>
<option name="localTasksCounter" value="355" /> <task id="LOCAL-00355" summary="17/07/2024 - 11h30sdf">
<created>1721461819238</created>
<option name="number" value="00355" />
<option name="presentableId" value="LOCAL-00355" />
<option name="project" value="LOCAL" />
<updated>1721461819239</updated>
</task>
<option name="localTasksCounter" value="356" />
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties"> <component name="Vcs.Log.Tabs.Properties">
@ -460,7 +462,6 @@
</option> </option>
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="07/06/2024 - 22h30" />
<MESSAGE value="ssq" /> <MESSAGE value="ssq" />
<MESSAGE value="qqsd" /> <MESSAGE value="qqsd" />
<MESSAGE value="11/06/2024 - 23h30" /> <MESSAGE value="11/06/2024 - 23h30" />
@ -485,6 +486,7 @@
<MESSAGE value="dqsdqs" /> <MESSAGE value="dqsdqs" />
<MESSAGE value="dqsdqss" /> <MESSAGE value="dqsdqss" />
<MESSAGE value="17/07/2024 - 11h30" /> <MESSAGE value="17/07/2024 - 11h30" />
<option name="LAST_COMMIT_MESSAGE" value="17/07/2024 - 11h30" /> <MESSAGE value="17/07/2024 - 11h30sdf" />
<option name="LAST_COMMIT_MESSAGE" value="17/07/2024 - 11h30sdf" />
</component> </component>
</project> </project>

File diff suppressed because one or more lines are too long

View File

@ -6148,7 +6148,7 @@ def Create_Convocation_By_Stagiaire_PDF(diction):
""" """
25/01/2024 : pour loger une action dans la collection ==> courrier_template_tracking_history 25/01/2024 : pour loger une action dans la collection ==> courrier_template_tracking_history
""" """
print(" str(diction['inscription_id']) == ", str(diction['inscription_id'])) #print(" str(diction['inscription_id']) == ", str(diction['inscription_id']))
""" local_status, local_retval = module_editique.Editic_Log_History_Action(my_partner, template_courrier_data, """ local_status, local_retval = module_editique.Editic_Log_History_Action(my_partner, template_courrier_data,
str(diction['session_id']), 'inscription', str(diction['inscription_id'])) str(diction['session_id']), 'inscription', str(diction['inscription_id']))
""" """

View File

@ -1131,8 +1131,7 @@ def Reset_user_pwd_by_token(diction):
return True, "Le mot de passe a bien été mise à jour " return True, "Le mot de passe a bien été mise à jour "
else: else:
mycommon.myprint(str( mycommon.myprint(str(
inspect.stack()[0][3]) + " Impossible de mettre à jour le password du user : recid = " + str( inspect.stack()[0][3]) + " Impossible de mettre à jour le password du user : recid ")
user_recid))
return False, "Impossible de mettre à jour le mot de passe" return False, "Impossible de mettre à jour le mot de passe"
except Exception as e: except Exception as e:

19
main.py
View File

@ -10304,6 +10304,25 @@ def Delete_Inscription_Split_Invoice():
"""
API qui recuperer les reponses d'un survey donné dans une fichier pdf
"""
@app.route('/myclass/api/Export_To_Excel_Survey_with_filter_Tab_Survey_Id/<token>/<tab_ids>', methods=['POST','GET'])
@crossdomain(origin='*')
def Export_To_Excel_Survey_with_filter_Tab_Survey_Id(token, tab_ids):
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary(request.form.to_dict())
payload = {}
payload['token'] = str(token)
payload['tab_ids'] = str(tab_ids)
print(" ### Export_To_Excel_Survey_with_filter_Tab_Survey_Id payload = ",payload)
localStatus, response = survey_mgt.Export_To_Excel_Survey_with_filter_Tab_Survey_Id(payload)
if (localStatus):
return response
else:
return False
""" """
API permet de faire des statistiques ou de projections graphiques sur API permet de faire des statistiques ou de projections graphiques sur
sur des reponses, par exemple la moyenne de satisfaction par rapport sur des reponses, par exemple la moyenne de satisfaction par rapport

View File

@ -3,6 +3,7 @@ Ce document permet de gerer les "enquetes" avec utilisation des formulaires
""" """
import ast import ast
from zipfile import ZipFile
import bson import bson
import pymongo import pymongo
@ -1092,6 +1093,8 @@ def Create_One_Survey_To_Except_Inscrit(diction):
""" """
Cette fonction permet d'envoyer la demande d'enquete à la personne concerné Cette fonction permet d'envoyer la demande d'enquete à la personne concerné
/!\ : Cette fontion permet d'envoyer toutes les demande d'enquete, que soit : /!\ : Cette fontion permet d'envoyer toutes les demande d'enquete, que soit :
un questionnaire de positionnement, une demande d'evaluation a chaud, un questionnaire de positionnement, une demande d'evaluation a chaud,
une demande d'evaluation à froid, ou tout autre. une demande d'evaluation à froid, ou tout autre.
@ -1106,6 +1109,8 @@ par exemple :
- si survey.survey_type == 'hot_eval' ==> courrier_template_type_document_ref_interne = "EVAL_FORMATION" et - si survey.survey_type == 'hot_eval' ==> courrier_template_type_document_ref_interne = "EVAL_FORMATION" et
courrier_template.ref_interne = EVAL_FORMATION. courrier_template.ref_interne = EVAL_FORMATION.
/!\ : 21/07/2024 : Dans le cas d'un Renvoi, on va desactiver la question precedenmment envoyée.
""" """
def Send_Survey_TabIds(diction): def Send_Survey_TabIds(diction):
@ -1433,11 +1438,18 @@ def Send_Survey_TabIds(diction):
qry = {'_id': ObjectId(str(my_survey_id)), 'partner_owner_recid': str(my_partner['recid']), qry = {'_id': ObjectId(str(my_survey_id)), 'partner_owner_recid': str(my_partner['recid']),
'valide': '1', 'locked': '0'} 'valide': '1', 'locked': '0'}
result = MYSY_GV.dbname['survey'].find_one_and_update(qry, result = MYSY_GV.dbname['survey'].find_one_and_update(qry,
{'$set':{'statut':'1', 'date_update':str(now), {
'update_by':str(my_partner['_id']), '$unset': {
'date_envoi':now}} 'user_response' : "",
'date_reponse' : ""
},
'$set':{'statut':'1', 'date_update':str(now),
'update_by':str(my_partner['_id']),
'date_envoi':now}
}
) )
courrier_ref_interne = "" courrier_ref_interne = ""
if ("survey_type" in result.keys() and result['survey_type'] == "pos"): if ("survey_type" in result.keys() and result['survey_type'] == "pos"):
courrier_ref_interne = "QUESTION_POSITIONNEMENT" courrier_ref_interne = "QUESTION_POSITIONNEMENT"
@ -1471,20 +1483,19 @@ def Send_Survey_TabIds(diction):
#print(" ### qry 010101 = ", qry) #print(" ### qry 010101 = ", qry)
print(" #### str(local_survey_retval['related_collection']) = ", str(local_survey_retval['related_collection'])) #print(" #### str(local_survey_retval['related_collection']) = ", str(local_survey_retval['related_collection']))
partner_owner_recid = "partner_owner_recid" partner_owner_recid = "partner_owner_recid"
if( str(local_survey_retval['related_collection']) == "ressource_humaine"): if( str(local_survey_retval['related_collection']) == "ressource_humaine"):
partner_owner_recid = "partner_recid" partner_owner_recid = "partner_recid"
print(" #### str(local_survey_retval['related_collection']) = ", """ print(" #### str(local_survey_retval['related_collection']) = ", str(local_survey_retval['related_collection']))
str(local_survey_retval['related_collection'])) """
"""print(" #### qry = ",
print(" #### qry = ",
{'_id': ObjectId(str(local_inscription_id)), {'_id': ObjectId(str(local_inscription_id)),
'valide': '1', 'valide': '1',
str(partner_owner_recid): str(my_partner['recid'])}) str(partner_owner_recid): str(my_partner['recid'])})"""
inscription_data = MYSY_GV.dbname[str(local_survey_retval['related_collection'])].find_one({'_id': ObjectId(str(local_inscription_id)), inscription_data = MYSY_GV.dbname[str(local_survey_retval['related_collection'])].find_one({'_id': ObjectId(str(local_inscription_id)),
'valide': '1', 'valide': '1',
@ -2343,6 +2354,428 @@ def Export_To_Excel_Survey_with_filter(diction):
return False, " Impossible de générer l'export " return False, " Impossible de générer l'export "
"""
Cette fonction pour exporter les resultat d'une enquete dans une fichier excel :
POUR UNE LISTE _ID
"""
def Export_To_Excel_Survey_with_filter_Tab_Survey_Id(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'tab_ids' ]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Les informations fournies sont incorrectes"
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'tab_ids']
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, " Les informations fournies sont incorrectes"
"""
Verification de l'identité et autorisation de l'entité qui
appelle cette API
"""
token = ""
if ("token" in diction.keys()):
if diction['token']:
token = diction['token']
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
my_survey_ids = ""
if ("tab_ids" in diction.keys()):
if diction['tab_ids']:
my_survey_ids = diction['tab_ids']
my_survey_ids = my_survey_ids.replace(".", ",")
tab_my_survey_ids = str(my_survey_ids).split(",")
tab_my_survey_ids = [s.strip() for s in tab_my_survey_ids]
"""
Verifier la validité des survey
"""
for my_survey_id in tab_my_survey_ids:
# Verifier qui la formation n'a pas deja été evaluée
tmp_count = MYSY_GV.dbname['survey'].count_documents({'_id':ObjectId(str(my_survey_id)),
'partner_owner_recid': str(my_partner['recid']),
'valide':'1',
'locked':'0'
})
if (tmp_count != 1):
mycommon.myprint(str(inspect.stack()[0][3]) + " L'identifiant de l'enquête "+str(my_survey_id) +" est invalide ")
return False, " L'identifiant de l'enquête "+str(my_survey_id) +" est invalide "
filt_session_id = {}
if ("session_id" in diction.keys()):
filt_session_id = {'session_id': str(diction['session_id'])}
filt_related_collection = {}
if ("related_collection" in diction.keys()):
filt_related_collection = {'related_collection': str(diction['related_collection'])}
filt_related_collection_id = {}
if ("related_collection_id" in diction.keys()):
related_collection_id = {'related_collection_id': str(diction['related_collection_id'])}
RetObject = []
val_tmp = 0
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
orig_file_name = "Export_Reponse_" + str(ts) + ".xlsx"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
tab_exported_fields_header = ["formation", "code_session", "date_debut_session",
"date_fin_session", "email", "nom", "prenom", "type questionnaire", "date_envoi",
"date_reponse", "question", "reponse"]
tab_exported_fields = ["formation", "code_session", "date_debut_session",
"date_fin_session", "email", "nom", "prenom", "date_envoi",
"date_reponse", "question", "reponse"]
""""
Pour créer le document PDF, on va recuperer les données du Get_Dictionnary_data_For_Template
"""
new_diction = {}
new_diction['token'] = diction['token']
new_diction['list_stagiaire_id'] = []
new_diction['list_session_id'] = []
new_diction['list_class_id'] = []
new_diction['list_client_id'] = []
local_status, local_retval = mycommon.Get_Dictionnary_data_For_Template(new_diction)
if (local_status is False):
return local_status, local_retval
convention_dictionnary_data = local_retval
"""
Recuperer le modèle de document
"""
local_diction = {}
local_diction['ref_interne'] = "EVALUATION_MODEL_PDF"
local_diction['type_doc'] = "pdf"
local_diction['partner_owner_recid'] = str(my_partner['recid'])
courrier_data_status, courrier_data_retval = mycommon.Get_Courrier_Template_Include_Default_Data(local_diction)
if (courrier_data_status is False):
return courrier_data_status, courrier_data_retval
if( "contenu_doc" not in courrier_data_retval.keys() or str(courrier_data_retval['contenu_doc']) == ""):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le modèle de courrier 'EVALUATION_MODEL_PDF' n'est pas correctement configuré ")
return False, " Le modèle de courrier 'EVALUATION_MODEL_PDF' n'est pas correctement configuré "
# Stokage des nom de fichier à zipper
list_file_name_to_zip = []
"""
Creation des data du fichier excel
"""
for my_survey_id in tab_my_survey_ids:
qry = {"partner_owner_recid": str(my_partner['recid']), 'valide': '1', 'locked': '0',
'_id':ObjectId(str(my_survey_id))}
query_with_filter = {'$and': [qry, filt_session_id, filt_related_collection, filt_related_collection_id]}
#print(" ## qry = ", qry)
#print(" ## my_survey_id = ", my_survey_id)
pipe_qry = ([
{'$match': query_with_filter},
{'$project': {'valide': 0, 'locked': 0, }},
{'$lookup': {
'from': 'formulaire',
"let": {'formulaire_id': "$formulaire_id",
'partner_owner_recid': '$partner_owner_recid'},
'pipeline': [
{'$match':
{'$expr':
{'$and':
[
{'$eq': ["$_id", {'$convert': {
'input': "$$formulaire_id",
'to': "objectId",
'onError': {'error': 'true'},
'onNull': {'isnull': 'true'}
}}]},
{'$eq': ["$valide", "1"]},
{'$eq': ["$partner_owner_recid", '$$partner_owner_recid']}
]
}
}
},
],
'as': 'formulaire'
}
},
{
'$unwind': '$formulaire'
}
])
#print(" ### Export_To_Excel_Survey_with_filter_Tab_Survey_Id pipe_qry = ", pipe_qry)
for Survey_Data in MYSY_GV.dbname['survey'].aggregate(pipe_qry):
param_survey_data = {}
"""
Recuperer les données de la session
"""
my_session_data = MYSY_GV.dbname['session_formation'].find_one(
{'_id': ObjectId(str(Survey_Data['session_id'])),
'valide': '1',
'partner_owner_recid': str(my_partner['recid'])})
if (my_session_data is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant de la session de formation est invalide ")
return False, " L'identifiant de la session de formation est invalide "
"""
Recuperer les données de la formation
"""
my_class_data = MYSY_GV.dbname['myclass'].find_one(
{'_id': ObjectId(str(Survey_Data['class_id'])),
'valide': '1',
'partner_owner_recid': str(
my_partner['recid'])}, {'title': 1})
if (my_class_data is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant de la formation est invalide ")
return False, " L'identifiant de la formation est invalide "
# Champ : Titre de la formation
no_html_title = ""
if ("title" in my_class_data.keys()):
no_html_title = my_class_data['title']
param_survey_data['class_title'] = my_class_data['title']
# Champ : Code session
code_session = ""
if ("code_session" in my_session_data.keys()):
code_session = my_session_data['code_session']
param_survey_data['code_session'] = my_session_data['code_session']
# Champ : Date debut session
date_debut_session = ""
if ("code_session" in my_session_data.keys()):
date_debut_session = my_session_data['date_debut']
param_survey_data['session_date_debut'] = my_session_data['date_debut']
# Champ : Date fin session
date_fin_session = ""
if ("date_fin" in my_session_data.keys()):
date_fin_session = my_session_data['date_fin']
param_survey_data['session_date_fin'] = my_session_data['date_fin']
# Champ : Email
email = ""
if ("email" in Survey_Data.keys()):
email = Survey_Data['email']
param_survey_data['email'] = Survey_Data['email']
# Champ : nom
nom = ""
if ("nom" in Survey_Data.keys()):
nom = Survey_Data['nom']
param_survey_data['nom'] = Survey_Data['nom']
# Champ : prenom
prenom = ""
if ("prenom" in Survey_Data.keys()):
prenom = Survey_Data['prenom']
param_survey_data['prenom'] = Survey_Data['prenom']
# Champ : date_envoi
date_envoi = ""
if ("date_envoi" in Survey_Data.keys()):
date_envoi = str(Survey_Data['date_envoi'])[0:16]
param_survey_data['date_envoi'] = str(date_envoi)
# Champ : date_reponse
date_reponse = ""
if ("date_reponse" in Survey_Data.keys()):
date_reponse = str(Survey_Data['date_reponse'])[0:16]
param_survey_data['date_reponse'] = str(date_reponse)
# Gestion des question et reponse
param_survey_data['question_reponse'] = []
if( "user_response" in Survey_Data.keys() ):
question_num = 1
for user_response in Survey_Data['user_response']:
node_question_reponse = {}
question = ""
if ("question" in user_response.keys()):
question = str(user_response['question'])
node_question_reponse['question'] = question
response = ""
if ("response" in user_response.keys()):
response = str(user_response['response'])
node_question_reponse['response'] = response
question_num += 1
# recup type de question pr pdf
question_type = ""
if ("type" in user_response.keys()):
question_type = str(user_response['type'])
node_question_reponse['question_type'] = question_type
param_survey_data['question_reponse'].append(node_question_reponse)
else:
node_question_reponse = {}
node_question_reponse['response'] = "---"
response = "---"
node_question_reponse['response'] = response
# recup type de question pr pdf
question_type = "---"
node_question_reponse['question_type'] = question_type
param_survey_data['question_reponse'].append(node_question_reponse)
convention_dictionnary_data['param_survey_data'] = param_survey_data
body = {
"params": convention_dictionnary_data,
}
#print(" ### param_survey_data - body = ", body)
"""
Creation du fichier PDF
"""
contenu_doc_Template = jinja2.Template(str(courrier_data_retval['contenu_doc']))
sourceHtml = contenu_doc_Template.render(params=body["params"])
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-3:]
tmp_file_name = str(param_survey_data['code_session'])+"_"+str(param_survey_data['nom'])
if(len(str(tmp_file_name)) > 30 ):
tmp_file_name = str(tmp_file_name)[0:30]
orig_file_name = "Evaluation_" + str(tmp_file_name)+ "_" + str(ts) + ".pdf"
outputFilename = str(MYSY_GV.TEMPORARY_DIRECTORY) + "/" + str(orig_file_name)
# open output file for writing (truncated binary)
resultFile = open(outputFilename, "w+b")
# convert HTML to PDF
pisaStatus = pisa.CreatePDF(
src=sourceHtml, # the HTML to convert
dest=resultFile) # file handle to receive result
# close output file
resultFile.close()
list_file_name_to_zip.append(outputFilename)
# Create a ZipFile Object
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-5:]
todays_date = str(date.today().strftime("%d/%m/%Y"))
ts = datetime.now().timestamp()
ts = str(ts).replace(".", "").replace(",", "")[-3:]
zip_file_name = str(MYSY_GV.TEMPORARY_DIRECTORY_V2)+"List_Evaluation_"+str(ts)+".zip"
with ZipFile(zip_file_name, 'w') as zip_object:
for pdf_files in list_file_name_to_zip :
#print(" ### fichier a zipper = ", pdf_files)
zip_object.write(str(pdf_files))
if os.path.exists(zip_file_name):
return True, send_file(zip_file_name, as_attachment=True)
return False, "Impossible de générer l'export (2) "
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de générer l'export "
""" """
Cette fonction permet de faire des statistiques ou de projections graphiques sur Cette fonction permet de faire des statistiques ou de projections graphiques sur
sur des reponses, par exemple la moyenne de satisfaction par rapport sur des reponses, par exemple la moyenne de satisfaction par rapport