master
cherif 2024-07-04 19:31:15 +02:00
parent 62dd855456
commit 4fc6463e3c
6 changed files with 3500 additions and 29 deletions

View File

@ -3,10 +3,10 @@
<component name="ChangeListManager">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="ww">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/GlobalVariable.py" beforeDir="false" afterPath="$PROJECT_DIR$/GlobalVariable.py" 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$/emargement.py" beforeDir="false" afterPath="$PROJECT_DIR$/emargement.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" />
<change beforePath="$PROJECT_DIR$/survey_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/survey_mgt.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
@ -77,13 +77,6 @@
<option name="presentableId" value="Default" />
<updated>1680804787304</updated>
</task>
<task id="LOCAL-00293" summary="gdf">
<created>1715422956048</created>
<option name="number" value="00293" />
<option name="presentableId" value="LOCAL-00293" />
<option name="project" value="LOCAL" />
<updated>1715422956049</updated>
</task>
<task id="LOCAL-00294" summary="dd">
<created>1715448610311</created>
<option name="number" value="00294" />
@ -420,7 +413,14 @@
<option name="project" value="LOCAL" />
<updated>1719519702780</updated>
</task>
<option name="localTasksCounter" value="342" />
<task id="LOCAL-00342" summary="ww">
<created>1719675793617</created>
<option name="number" value="00342" />
<option name="presentableId" value="LOCAL-00342" />
<option name="project" value="LOCAL" />
<updated>1719675793618</updated>
</task>
<option name="localTasksCounter" value="343" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">

View File

@ -2277,6 +2277,7 @@ Avec l'import d'un fichier csv
"""
def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
try:
diction = mycommon.strip_dictionary(diction)
'''
# Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés
@ -2400,7 +2401,7 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
'''
field_list = ['formation_code_externe', 'code_session', 'prenom', 'nom', 'employeur',
'telephone', 'email', 'modefinancement','opco', 'status', 'prix', 'adresse', 'code_postal', 'ville',
'pays', 'client_rattachement_email', 'client_rattachement_nom', 'type_apprenant']
'pays', 'client_rattachement_email', 'client_rattachement_nom', 'type_apprenant', 'civilite']
# Controle du nombre de lignes dans le fichier.
@ -2507,6 +2508,22 @@ def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
mydata['type_apprenant'] = type_apprenant
civilite = ""
if ("civilite" in df.keys()):
if (str(df['civilite'].values[n])):
civilite = str(df['civilite'].values[n]).lower()
mydata['civilite'] = str(civilite).lower()
if( civilite not in MYSY_GV.CIVILITE):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Ligne : " + str(
n + 2) + ". La civilité :" + str(
civilite) + " est invalide. Les valeurs acceptées sont : "+str(MYSY_GV.CIVILITE))
return False, " Ligne : " + str(
n + 2) + ". La civilité :" + str(
civilite) + " est invalide. Les valeurs acceptées sont : "+str(MYSY_GV.CIVILITE)
adresse = ""
if ("adresse" in df.keys()):
if (str(df['adresse'].values[n])):
@ -2632,6 +2649,9 @@ Controle du fichier à importer avant import
def Controle_AddStagiairetoClass_mass(saved_file=None, Folder=None, diction=None):
try:
diction = mycommon.strip_dictionary(diction)
'''
# 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
@ -2748,7 +2768,7 @@ def Controle_AddStagiairetoClass_mass(saved_file=None, Folder=None, diction=None
field_list = ['formation_code_externe', 'code_session', 'prenom', 'nom', 'employeur',
'telephone', 'email', 'modefinancement', 'opco', 'status', 'prix', 'adresse', 'code_postal',
'ville',
'pays', 'client_rattachement_email', 'client_rattachement_nom', 'type_apprenant']
'pays', 'client_rattachement_email', 'client_rattachement_nom', 'type_apprenant', 'civilite']
# Controle du nombre de lignes dans le fichier.
total_rows = len(df)
@ -2811,6 +2831,21 @@ def Controle_AddStagiairetoClass_mass(saved_file=None, Folder=None, diction=None
mydata['session_id'] = str(session_data['_id'])
mydata['token'] = str(my_token)
civilite = ""
if ("civilite" in df.keys()):
if (str(df['civilite'].values[n])):
civilite = str(df['civilite'].values[n]).lower()
mydata['civilite'] = str(civilite).lower()
if (civilite not in MYSY_GV.CIVILITE):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Ligne : " + str(
n + 2) + ". La civilité :" + str(
civilite) + " est invalide. Les valeurs acceptées sont : " + str(MYSY_GV.CIVILITE))
return False, " Ligne : " + str(
n + 2) + ". La civilité :" + str(
civilite) + " est invalide. Les valeurs acceptées sont : " + str(MYSY_GV.CIVILITE)
modefinancement = ""
if ("modefinancement" in df.keys()):
if (str(df['modefinancement'].values[n])):
@ -3000,6 +3035,8 @@ Elle fera a peu pret les meme controle qui existe dans la fonction d'import actu
def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=None):
try:
diction = mycommon.strip_dictionary(diction)
'''
# 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
@ -3074,7 +3111,7 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
field_list = ['formation_code_externe', 'code_session', 'prenom', 'nom', 'employeur',
'telephone', 'email', 'modefinancement', 'opco', 'status', 'prix', 'adresse', 'code_postal',
'ville', 'pays', 'client_rattachement_email', 'client_rattachement_nom','facture_client_rattachement_email',
'facture_client_rattachement_nom']
'facture_client_rattachement_nom', 'civilite']
# Controle du nombre de lignes dans le fichier.
@ -3118,8 +3155,8 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
mydata = {}
class_external_code = str(df['formation_code_externe'].values[n])
#mydata['code_session'] = str(df['code_session'].values[n])
mydata['prenom'] = str(df['prenom'].values[n])
mydata['nom'] = str(df['nom'].values[n])
mydata['prenom'] = str(df['prenom'].values[n]).strip()
mydata['nom'] = str(df['nom'].values[n]).strip()
if (len(str(mydata['nom']).strip()) < 2):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le champ 'nom' de la ligne " + str(
@ -3128,9 +3165,9 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
n + 2) + " doit faire plus de deux caractères. "
mydata['employeur'] = str(df['employeur'].values[n])
mydata['telephone'] = str(df['telephone'].values[n])
mydata['email'] = str(df['email'].values[n]).strip()
mydata['employeur'] = str(df['employeur'].values[n]).strip()
mydata['telephone'] = str(df['telephone'].values[n]).strip()
mydata['email'] = str(df['email'].values[n]).strip().strip()
regex = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'
if (not re.fullmatch(regex, str(df['email'].values[n]).strip() )):
mycommon.myprint(
@ -3227,38 +3264,38 @@ def AddStagiairetoClass_mass_for_many_session(file=None, Folder=None, diction=No
modefinancement = ""
if ("modefinancement" in df.keys()):
if (str(df['modefinancement'].values[n])):
modefinancement = str(df['modefinancement'].values[n])
modefinancement = str(df['modefinancement'].values[n]).strip()
mydata['modefinancement'] = modefinancement
opco = ""
if ("opco" in df.keys()):
if (str(df['opco'].values[n])):
opco = str(df['opco'].values[n])
opco = str(df['opco'].values[n]).strip()
mydata['opco'] = opco
adresse = ""
if ("adresse" in df.keys()):
if (str(df['adresse'].values[n])):
adresse = str(df['adresse'].values[n])
adresse = str(df['adresse'].values[n]).strip()
mydata['adresse'] = adresse
code_postal = ""
if ("code_postal" in df.keys()):
if (str(df['code_postal'].values[n])):
code_postal = str(df['code_postal'].values[n])
code_postal = str(df['code_postal'].values[n]).strip()
mydata['code_postal'] = code_postal
ville = ""
if ("ville" in df.keys()):
if (str(df['ville'].values[n])):
ville = str(df['ville'].values[n])
ville = str(df['ville'].values[n]).strip()
mydata['ville'] = ville
pays = ""
if ("pays" in df.keys()):
if (str(df['pays'].values[n])):
pays = str(df['pays'].values[n])
pays = str(df['pays'].values[n]).strip()
mydata['pays'] = pays
@ -3395,7 +3432,7 @@ Fonction de controle du fichier
"""
def Controle_AddStagiairetoClass_mass_for_many_session(saved_file=None, Folder=None, diction=None):
try:
diction = mycommon.strip_dictionary(diction)
'''
# 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
@ -3448,7 +3485,7 @@ def Controle_AddStagiairetoClass_mass_for_many_session(saved_file=None, Folder=N
field_list = ['formation_code_externe', 'code_session', 'prenom', 'nom', 'employeur',
'telephone', 'email', 'modefinancement', 'opco', 'status', 'prix', 'adresse', 'code_postal',
'ville', 'pays', 'client_rattachement_email', 'client_rattachement_nom',
'facture_client_rattachement_email', 'facture_client_rattachement_nom']
'facture_client_rattachement_email', 'facture_client_rattachement_nom', 'civilite']
# Controle du nombre de lignes dans le fichier.
@ -3610,6 +3647,19 @@ def Controle_AddStagiairetoClass_mass_for_many_session(saved_file=None, Folder=N
pays = str(df['pays'].values[n])
mydata['pays'] = pays
civilite = ""
if ("civilite" in df.keys()):
if (str(df['civilite'].values[n])):
civilite = str(df['civilite'].values[n]).lower()
mydata['civilite'] = str(civilite).lower()
if( civilite not in MYSY_GV.CIVILITE):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Ligne : " + str(
n + 2) + ". La civilité :" + str(
civilite) + " est invalide. Les valeurs acceptées sont : "+str(MYSY_GV.CIVILITE))
return False, " Ligne : " + str(
n + 2) + ". La civilité :" + str(
civilite) + " est invalide. Les valeurs acceptées sont : "+str(MYSY_GV.CIVILITE)
""""
Gestion du client de rattachement/

File diff suppressed because it is too large Load Diff

View File

@ -506,7 +506,8 @@ def UpdateUserEmargementDate(diction):
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
# field_list.
'''
field_list = [ 'session_id', 'token', 'email', 'date', 'matin', 'apresmidi', 'class_internal_url', 'is_present', '_id']
field_list = [ 'session_id', 'token', 'email', 'date', 'matin', 'apresmidi', 'class_internal_url', 'is_present', '_id',
]
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
@ -586,6 +587,192 @@ def UpdateUserEmargementDate(diction):
return False, "Impossible de valider l'émargement"
"""
04/07/2024 -
Mise à jour d'une liste d'emargement
"""
def Update_Given_Emargement_Data(diction):
try:
diction = mycommon.strip_dictionary(diction)
'''
# 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 = [ 'session_id', 'token', 'email', 'date', 'matin', 'apresmidi', 'class_internal_url', 'is_present', 'tab_ids', 'comment'
]
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é, Creation partenaire annulée")
return False, "Impossible de créer la liste d'emargement. Toutes les informations fournies ne sont pas valables"
"""
Verification de la liste 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, "Impossible de créer la liste d'emargement, Toutes les informations necessaires n'ont pas été fournies"
my_token = ""
if ("token" in diction.keys()):
if diction['token']:
my_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
partner_recid = str(my_partner['recid'])
# Verifier la validité du token
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
return "Err_Connexion", " La session de connexion n'est pas valide"
tab_ids = ""
if ("tab_ids" in diction.keys()):
if diction['tab_ids']:
tab_ids = diction['tab_ids']
tab_ids_splited = str(tab_ids).split(",")
tab_ids_splited_Objectid = []
for my_id in tab_ids_splited:
# Verifier que les survey sont valides
qry = {'_id': ObjectId(str(my_id)), 'partner_owner_recid': str(my_partner['recid']), 'valide': '1',
'locked': '0'}
print(" qry2 === ", qry)
tmp_count = MYSY_GV.dbname['emargement'].count_documents(qry)
if (tmp_count <= 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant de l'emargement " + str(my_id) + " est invalide ")
return False, " L'identifiant de l'emargement " + str(my_id) + " est invalide "
tab_ids_splited_Objectid.append(ObjectId(str(my_id)))
is_present = ""
if ("is_present" in diction.keys()):
if diction['is_present']:
is_present = diction['is_present']
comment = ""
if ("comment" in diction.keys()):
if diction['comment']:
comment = str(diction['comment']).strip()
mydata = {}
mydata['comment'] = str(comment)
mydata['date_update'] = str(datetime.now())
mydata['update_by'] = str(my_partner['_id'])
query_key = {}
query_key['_id'] ={'$in':tab_ids_splited_Objectid}
query_key['partner_owner_recid'] = str(partner_recid)
query_key['valide'] = "1"
query_key['locked'] = "0"
print(" #### query_key = ", query_key)
print(" #### mydata = ", mydata)
coll_emargement = MYSY_GV.dbname['emargement']
local_ret_val = coll_emargement.find_one_and_update(
query_key,
{"$set": mydata},
upsert=False,
return_document=ReturnDocument.AFTER
)
return True, "La mise à jour a été correctement faite"
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 mettre à jour l'émargement"
"""
Recuperer les données d'un emargemend donnée
"""
def Get_Given_Emargement_Data(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 = [ 'token', '_id' ]
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é, Creation partenaire annulée")
return False, "Impossible de créer la liste d'emargement. Toutes les informations fournies ne sont pas valables"
"""
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = [ 'token', '_id' ]
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 créer la liste d'emargement, Toutes les informations necessaires n'ont pas été fournies"
my_token = ""
if ("token" in diction.keys()):
if diction['token']:
my_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
partner_recid = str(my_partner['recid'])
# Verifier la validité du token
retval = mycommon.check_partner_token_validity("", my_token)
if retval is False:
return "Err_Connexion", " La session de connexion n'est pas valide"
RetObject = []
val_tmp = 0
for New_retVal in MYSY_GV.dbname['survey'].find_one({'_id':ObjectId(str(diction['_id'])),
'valide':'1', 'locked':'0',
'partner_owner_recid':my_partner['recid']}):
user = New_retVal
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
return True, RetObject
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 récuperer les données de l'émargement"
"""
Cette fonction genere un fichier pdf pour les liste d'emargement
"""

27
main.py
View File

@ -2347,6 +2347,33 @@ def GerneratePDFEmargementList(token, session_id, internal_url, courrier_modele_
"""
API pour recuperer les données d'un émargement
"""
@app.route('/myclass/api/Get_Given_Emargement_Data/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Given_Emargement_Data():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Given_Emargement_Data : payload = ",str(payload))
localStatus, message= emargement.Get_Given_Emargement_Data(payload)
return jsonify(status=localStatus, message=message )
"""
API pour mettre à jour une liste d'emargement
"""
@app.route('/myclass/api/Update_Given_Emargement_Data/', methods=['POST','GET'])
@crossdomain(origin='*')
def Update_Given_Emargement_Data():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Update_Given_Emargement_Data : payload = ",str(payload))
localStatus, message= emargement.Update_Given_Emargement_Data(payload)
return jsonify(status=localStatus, message=message )
"""
API d'Envoie de l'email de confirmation de l'inscription
"""

View File

@ -411,6 +411,21 @@ pas que les inscrits, (le cas de enseignants), on va rajouter
"""
def Init_Survey_Tab_For_All_Session_Inscrit(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['session_id', 'token', 'formulaire_id', 'survey_type', 'sending_date', 'related_collection', 'related_collection_id']
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"
field_list_obligatoire = ['session_id', 'token', 'formulaire_id', 'survey_type', 'sending_date']
for val in field_list_obligatoire:
@ -503,8 +518,8 @@ def Init_Survey_Tab_For_All_Session_Inscrit(diction):
server_diction['survey_type'] = diction['survey_type']
server_diction['sending_date'] = diction['sending_date']
server_diction['related_collection'] = "inscription"
server_diction['related_collection_id'] = str(local_Insc_retval['_id'])
server_diction['related_collection'] = str(diction['related_collection'])
server_diction['related_collection_id'] = str(diction['related_collection_id'])
local_status, local_retval = Create_One_Survey_To_Inscrit(server_diction)
@ -709,6 +724,23 @@ Cette fonction envoi un formulaire pour inscrit
"""
def Create_One_Survey_To_Inscrit(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['session_id', 'token', 'inscrit_id', 'formulaire_id', 'survey_type', 'sending_date', 'related_collection',
'related_collection_id', 'class_id']
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"
field_list_obligatoire = ['session_id', 'token', 'inscrit_id', 'formulaire_id', 'survey_type', 'sending_date']
for val in field_list_obligatoire:
@ -789,6 +821,11 @@ def Create_One_Survey_To_Inscrit(diction):
3]) + " L'identifiant de l'inscrit est invalide ")
return False, " L'identifiant de l'inscrit est invalide "
related_collection = ""
related_collection_id = ""
if( "related_collection" in diction.keys() and "related_collection_id" in diction.keys()):
related_collection = diction['related_collection']
related_collection_id = diction['related_collection_id']
new_survey_data = {}
@ -801,6 +838,10 @@ def Create_One_Survey_To_Inscrit(diction):
new_survey_data['session_id'] = str(diction['session_id'])
new_survey_data['class_id'] = str(my_class_data['_id'])
new_survey_data['survey_type'] = str(diction['survey_type'])
new_survey_data['related_collection'] = str(related_collection)
new_survey_data['related_collection_id'] = str(related_collection_id)
new_survey_data['date_envoi'] = ""
new_survey_data['automatique_sending_request_date'] = str(diction['sending_date'])
new_survey_data['automatique_traitement'] = "1"