10/09/2023 - 18h30

master
cherif 2023-09-10 18:21:03 +02:00
parent 15be3e0c0c
commit 16f0acb02d
8 changed files with 2809 additions and 35 deletions

View File

@ -1,10 +1,15 @@
<?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="07/09/2023 - 14h"> <list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="08/09/2023 - 18h30">
<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$/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$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_order.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_order.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Session_Formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_inscription_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_document_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_document_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" />
@ -68,13 +73,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1680804787304</updated> <updated>1680804787304</updated>
</task> </task>
<task id="LOCAL-00051" summary="25/07/23 - 21h">
<created>1690313186731</created>
<option name="number" value="00051" />
<option name="presentableId" value="LOCAL-00051" />
<option name="project" value="LOCAL" />
<updated>1690313186731</updated>
</task>
<task id="LOCAL-00052" summary="26/07/23 - 23h"> <task id="LOCAL-00052" summary="26/07/23 - 23h">
<created>1690405587653</created> <created>1690405587653</created>
<option name="number" value="00052" /> <option name="number" value="00052" />
@ -411,7 +409,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1694088060043</updated> <updated>1694088060043</updated>
</task> </task>
<option name="localTasksCounter" value="100" /> <task id="LOCAL-00100" summary="08/09/2023 - 18h30">
<created>1694191147617</created>
<option name="number" value="00100" />
<option name="presentableId" value="LOCAL-00100" />
<option name="project" value="LOCAL" />
<updated>1694191147618</updated>
</task>
<option name="localTasksCounter" value="101" />
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties"> <component name="Vcs.Log.Tabs.Properties">
@ -426,7 +431,6 @@
</option> </option>
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="19/08/23 - 20h30" />
<MESSAGE value="20/08/23 - 23h30" /> <MESSAGE value="20/08/23 - 23h30" />
<MESSAGE value="21/08/23 - 15h" /> <MESSAGE value="21/08/23 - 15h" />
<MESSAGE value="21/08/23 - 21h" /> <MESSAGE value="21/08/23 - 21h" />
@ -451,6 +455,7 @@
<MESSAGE value="06/09/2023 - 11h" /> <MESSAGE value="06/09/2023 - 11h" />
<MESSAGE value="06/09/2023 - 13h" /> <MESSAGE value="06/09/2023 - 13h" />
<MESSAGE value="07/09/2023 - 14h" /> <MESSAGE value="07/09/2023 - 14h" />
<option name="LAST_COMMIT_MESSAGE" value="07/09/2023 - 14h" /> <MESSAGE value="08/09/2023 - 18h30" />
<option name="LAST_COMMIT_MESSAGE" value="08/09/2023 - 18h30" />
</component> </component>
</project> </project>

View File

@ -34,8 +34,13 @@ Enregistrement d'un stagiaire
Voici les valeurs possibles du statut d'un stagiaire Voici les valeurs possibles du statut d'un stagiaire
# 0 ==> Preinscription # 0 ==> Preinscription
# 1 ==> Inscription validée # 1 ==> Inscription validée
# 2 ==> Encours d'inscription. Ce statut est surtout utilisé quand on fait de inscription depuis le backoffice par un gestionnaire de formation.
# -1 ==> Inscription annulée # -1 ==> Inscription annulée
/!\ : Cette foncton est utilisé aussi bien en mode non-connecté qu'en mode connecté
il ne faut donc controler le token que s'il est fourni avec une valeur donnée
/!\ 2 : le 'partner_owner_recid' doit etre celui de la session de formation, EN AUCUN CAS CELUI DE LA PERSONNE CONNECTEE
""" """
def AddStagiairetoClass(diction): def AddStagiairetoClass(diction):
@ -79,6 +84,17 @@ def AddStagiairetoClass(diction):
mydata['session_id'] = str(diction['session_id']).strip() mydata['session_id'] = str(diction['session_id']).strip()
session_id = str(diction['session_id']).strip() session_id = str(diction['session_id']).strip()
"""
Verififier l'existance et la valididé de la session
"""
my_session_data_qry = {"_id":ObjectId(str(session_id)), 'valide':'1' }
#print(" AddStagiairetoClass my_session_data_qry = ", my_session_data_qry)
my_session_data = MYSY_GV.dbname['session_formation'].find_one(my_session_data_qry)
if( my_session_data is None ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " L'identifiant de la session est invalide session_id = ", str(session_id))
return False, " L'identifiant de la session est invalide"
mytoken = "" mytoken = ""
if ("token" in diction.keys()): if ("token" in diction.keys()):
@ -86,12 +102,6 @@ def AddStagiairetoClass(diction):
mytoken = str(diction['token']).strip() mytoken = str(diction['token']).strip()
partner_recid = mycommon.get_parnter_recid_from_token(mytoken)
if (partner_recid is False):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer les données du partenaire ")
return False, "Impossible de recuperer les données du partenaire "
mydata['partner_owner_recid'] = str(partner_recid)
""" """
Recuperation des info de la session de formation Recuperation des info de la session de formation
""" """
@ -109,6 +119,7 @@ def AddStagiairetoClass(diction):
for tmp_val in MYSY_GV.dbname['session_formation'].find({"_id":ObjectId(str(session_id)), 'valide':'1' }): for tmp_val in MYSY_GV.dbname['session_formation'].find({"_id":ObjectId(str(session_id)), 'valide':'1' }):
mydata['date_du'] = tmp_val['date_debut'] mydata['date_du'] = tmp_val['date_debut']
mydata['date_au'] = tmp_val['date_fin'] mydata['date_au'] = tmp_val['date_fin']
mydata['partner_owner_recid'] = tmp_val['partner_owner_recid']
if ("prix_session" in tmp_val.keys()): if ("prix_session" in tmp_val.keys()):
if tmp_val['prix_session']: if tmp_val['prix_session']:
@ -139,7 +150,7 @@ def AddStagiairetoClass(diction):
## Verifier l'existance du client de rattachement ## Verifier l'existance du client de rattachement
local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents( {'_id': ObjectId(diction['client_rattachement_id']), local_client_retval_count = MYSY_GV.dbname['partner_client'].count_documents( {'_id': ObjectId(diction['client_rattachement_id']),
'valide': '1','locked': '0', 'partner_recid': str(partner_recid)}) 'valide': '1','locked': '0', 'partner_recid': str(my_session_data['partner_owner_recid'])})
if( local_client_retval_count != 1 ): if( local_client_retval_count != 1 ):
mycommon.myprint( mycommon.myprint(
@ -279,11 +290,13 @@ def AddStagiairetoClass(diction):
Donc pas d'email si le statut est (2 => 'encours de creation' Donc pas d'email si le statut est (2 => 'encours de creation'
On doit donner la possibilité a l'utilisateur de saisir une inscription avec un statut en cours de creation : 'creation' On doit donner la possibilité a l'utilisateur de saisir une inscription avec un statut en cours de creation : 'creation'
""" """
if( inserted_id ): if( inserted_id ):
# On verifie que le statut de l'inscription n'est pas (2 : en cours) avant de declencher des envoies d'email # On verifie que le statut de l'inscription n'est pas (2 : en cours) avant de declencher des envoies d'email
if( new_status != "2"): if( new_status != "2"):
# Le stagaire a bien ete inseré, on declenche l'envoi des emaisl # Le stagaire a bien ete inseré, on declenche l'envoi des emaisl
print(" ### l'inscription est ok, il faut declenché l'envoi des email")
## Envoie de l'email de preinscription ## Envoie de l'email de preinscription
mail_data = {} mail_data = {}
mail_data['email'] = diction['email'] mail_data['email'] = diction['email']
@ -951,7 +964,7 @@ def SendPre_InscriptionEmail(diction):
""" """
Verification de la liste des champs obligatoires Verification de la liste des champs obligatoires
""" """
print(" ## GRRRR = ", diction)
field_list_obligatoire = [ 'email', 'session_id', 'inscription_id'] field_list_obligatoire = [ 'email', 'session_id', 'inscription_id']
for val in field_list_obligatoire: for val in field_list_obligatoire:
if val not in diction: if val not in diction:
@ -977,6 +990,7 @@ def SendPre_InscriptionEmail(diction):
data_mail['nom'] = local_session[0]['nom'] data_mail['nom'] = local_session[0]['nom']
data_mail['prenom'] = local_session[0]['prenom'] data_mail['prenom'] = local_session[0]['prenom']
data_mail['email'] = local_session[0]['email'] data_mail['email'] = local_session[0]['email']
data_mail['partner_owner_recid'] = local_session[0]['partner_owner_recid']
if ("employeur" in local_session[0].keys()): if ("employeur" in local_session[0].keys()):

File diff suppressed because it is too large Load Diff

View File

@ -477,6 +477,9 @@ def GetSessionFormation(diction):
""" """
Cette fonction recupere la liste de toutes les sessions de formation actives et valides Cette fonction recupere la liste de toutes les sessions de formation actives et valides
d'une formation données ET les sessions "on demande" d'une formation données ET les sessions "on demande"
/!\ : Cette fonction est utilisée en mode non connecté et en mode non connecté.
Donc faire attention au controle de la connexion
""" """
def GetActiveSessionFormation_List(diction): def GetActiveSessionFormation_List(diction):
try: try:
@ -492,13 +495,15 @@ def GetActiveSessionFormation_List(diction):
""" """
Verification de la liste des champs obligatoires Verification de la liste des champs obligatoires
""" """
field_list_obligatoire = [ 'token', 'class_internal_url', ] field_list_obligatoire = [ 'class_internal_url', ]
for val in field_list_obligatoire: for val in field_list_obligatoire:
if val not in diction: if val not in diction:
mycommon.myprint( mycommon.myprint(
str(inspect.stack()[0][3]) + " - : La valeur '" + val + "' n'est pas presente dans liste ") str(inspect.stack()[0][3]) + " - : La valeur '" + val + "' n'est pas presente dans liste ")
return False, "Impossible de recuperer la liste des session de formation" return False, "Impossible de recuperer la liste des session de formation"
# Le controle de token n'est effectué que une valeur est fournie dans le token
if( 'token' in diction.keys() and len(str(diction['token'])) > 0) :
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction) local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True): if (local_status is not True):
return local_status, my_partner return local_status, my_partner
@ -515,14 +520,15 @@ def GetActiveSessionFormation_List(diction):
coll_session = MYSY_GV.dbname['session_formation'] coll_session = MYSY_GV.dbname['session_formation']
myquery = {} myquery = {}
myquery['class_internal_url'] = class_internal_url myquery['class_internal_url'] = class_internal_url
myquery['partner_owner_recid'] = str(my_partner['recid'])
myquery['valide'] = "1" myquery['valide'] = "1"
myquery['session_status'] = "true" myquery['session_status'] = "1"
RetObject = [] RetObject = []
print(" ### myquery = ", myquery) #print(" ### GetActiveSessionFormation_List myquery = ", myquery)
for retval in coll_session.find(myquery): for retval in coll_session.find(myquery):
local_tmp = retval local_tmp = retval
@ -544,7 +550,7 @@ def GetActiveSessionFormation_List(diction):
#print("####RetObject = "+str(RetObject)) print("#### GetActiveSessionFormation_List RetObject = "+str(RetObject))
return True, RetObject return True, RetObject

View File

@ -98,7 +98,7 @@ def incription_training_confirmation_mail(diction):
# on rentre les renseignements pris sur le site du fournisseur # on rentre les renseignements pris sur le site du fournisseur
# msg = MIMEMultipart("alternative") # msg = MIMEMultipart("alternative")
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
msg = EmailMessage() msg = EmailMessage()
local_code_postal = "" local_code_postal = ""
@ -154,6 +154,52 @@ def incription_training_confirmation_mail(diction):
msg.set_content(sourceHtml, subtype='html') msg.set_content(sourceHtml, subtype='html')
"""
Update du 10/09/2023 :
Utiliser les documents personnalisés qui sont stockés en base de données plutot que des format de fichiers plats.
Regles d'utilisation :
1 - Recuperer les fichier personnalisé pour le partenaire (partner_owner_recid et ref_interne).
2 - Si aucun fichier de personnalisation pour le partenaire, alors utiliser le fichier par defaut (partner_owner_recid = "default" et ref_interne).
3 - Pour le cas de pre-inscription, la ref_interne du fichier est 'PRE_INSCRIPTION'
"""
partner_document_CONF_INSCRIPTION_data_qry = {'partner_owner_recid': str(diction['partner_owner_recid']),
'valide': '1', 'locked': '0', 'ref_interne': 'CONF_INSCRIPTION'}
print(" ### partner_document_CONF_INSCRIPTION_data_qry = ", partner_document_CONF_INSCRIPTION_data_qry)
partner_document_CONF_INSCRIPTION_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': str(diction['partner_owner_recid']),
'valide': '1', 'locked': '0', 'ref_interne': 'PRE_INSCRIPTION'})
if (partner_document_CONF_INSCRIPTION_data is None):
# Il n'existe pas de personnalisation de la preinscription pour ce partenaire, on va aller recuperer la presinscription pa defaut
partner_document_CONF_INSCRIPTION_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': 'default',
'valide': '1', 'locked': '0', 'ref_interne': 'CONF_INSCRIPTION'})
if (partner_document_CONF_INSCRIPTION_data is None):
mycommon.myprint(
str(inspect.stack()[0][
3]) + "-Impossible d'envoyer l'email de la preinscription. Aucun document parametré ")
return False, " Impossible d'envoyer l'email de la preinscription. Aucun document parametré "
if ("contenu_doc" not in partner_document_CONF_INSCRIPTION_data or len(
str(partner_document_CONF_INSCRIPTION_data['contenu_doc'])) <= 0):
mycommon.myprint(str(inspect.stack()[0][
3]) + " -Impossible d'envoyer l'email de la preinscription. Le parametrage du document est invalide")
return False, " Impossible d'envoyer l'email de la preinscription. Le parametrage du document est invalide "
CONF_INSCRIPTION_contenu_doc_Template = jinja2.Template(
str(partner_document_CONF_INSCRIPTION_data['contenu_doc']))
sourceHtml = CONF_INSCRIPTION_contenu_doc_Template.render(params=body["params"])
# print(" ### PRE_INSCRIPTION_contenu_doc = ",str(sourceHtml))
msg.set_content(sourceHtml, subtype='html')
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com' msg['Bcc'] = 'contact@mysy-training.com'
@ -228,7 +274,7 @@ def incription_training_refused_mail(diction):
# on rentre les renseignements pris sur le site du fournisseur # on rentre les renseignements pris sur le site du fournisseur
# msg = MIMEMultipart("alternative") # msg = MIMEMultipart("alternative")
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
msg = EmailMessage() msg = EmailMessage()
# JINJA2 # JINJA2
@ -269,8 +315,53 @@ def incription_training_refused_mail(diction):
sourceHtml = template.render(params=body["params"]) sourceHtml = template.render(params=body["params"])
msg.set_content(sourceHtml, subtype='html') msg.set_content(sourceHtml, subtype='html')
"""
Update du 10/09/2023 :
Utiliser les documents personnalisés qui sont stockés en base de données plutot que des format de fichiers plats.
Regles d'utilisation :
1 - Recuperer les fichier personnalisé pour le partenaire (partner_owner_recid et ref_interne).
2 - Si aucun fichier de personnalisation pour le partenaire, alors utiliser le fichier par defaut (partner_owner_recid = "default" et ref_interne).
3 - Pour le cas de pre-inscription, la ref_interne du fichier est 'PRE_INSCRIPTION'
"""
partner_document_REFUS_INSCRIPTION_data_qry = {'partner_owner_recid': str(diction['partner_owner_recid']),
'valide': '1', 'locked': '0', 'ref_interne': 'REFUS_INSCRIPTION'}
print(" ### partner_document_REFUS_INSCRIPTION_data_qry = ", partner_document_REFUS_INSCRIPTION_data_qry)
partner_document_REFUS_INSCRIPTION_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': str(diction['partner_owner_recid']),
'valide': '1', 'locked': '0', 'ref_interne': 'REFUS_INSCRIPTION'})
if (partner_document_REFUS_INSCRIPTION_data is None):
# Il n'existe pas de personnalisation de la preinscription pour ce partenaire, on va aller recuperer la presinscription pa defaut
partner_document_PRE_INSCRIPTION_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': 'default',
'valide': '1', 'locked': '0', 'ref_interne': 'REFUS_INSCRIPTION'})
if (partner_document_REFUS_INSCRIPTION_data is None):
mycommon.myprint(
str(inspect.stack()[0][
3]) + "-Impossible d'envoyer l'email de la preinscription. Aucun document parametré ")
return False, " Impossible d'envoyer l'email de la preinscription. Aucun document parametré "
if ("contenu_doc" not in partner_document_REFUS_INSCRIPTION_data or len(
str(partner_document_REFUS_INSCRIPTION_data['contenu_doc'])) <= 0):
mycommon.myprint(str(inspect.stack()[0][
3]) + " -Impossible d'envoyer l'email de la preinscription. Le parametrage du document est invalide")
return False, " Impossible d'envoyer l'email de la preinscription. Le parametrage du document est invalide "
REFUS_INSCRIPTION_contenu_doc_Template = jinja2.Template(
str(partner_document_REFUS_INSCRIPTION_data['contenu_doc']))
sourceHtml = REFUS_INSCRIPTION_contenu_doc_Template.render(params=body["params"])
# print(" ### PRE_INSCRIPTION_contenu_doc = ",str(sourceHtml))
msg.set_content(sourceHtml, subtype='html')
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com' msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = '[MySy Training]: Inscription formation refusée' msg['Subject'] = '[MySy Training]: Inscription formation refusée'
@ -418,7 +509,7 @@ def Pre_incription_training_confirmation_mail(diction):
""" """
Verification de la liste des champs obligatoires Verification de la liste des champs obligatoires
""" """
field_list_obligatoire = ['nom', 'prenom', 'email', 'date_du', 'date_au', 'title', 'distantiel', 'presentiel'] field_list_obligatoire = ['nom', 'prenom', 'email', 'date_du', 'date_au', 'title', 'distantiel', 'presentiel', 'partner_owner_recid']
for val in field_list_obligatoire: for val in field_list_obligatoire:
if val not in diction: if val not in diction:
mycommon.myprint( mycommon.myprint(
@ -430,7 +521,7 @@ def Pre_incription_training_confirmation_mail(diction):
tomorrow = datetime.date.today() + datetime.timedelta(days=1) tomorrow = datetime.date.today() + datetime.timedelta(days=1)
tomorrow_day = tomorrow.strftime("%A") tomorrow_day = tomorrow.strftime("%A")
print("debut envoi mail de test ") print(" Pre_incription_training_confirmation_mail : debut envoi mail de test ")
# on rentre les renseignements pris sur le site du fournisseur # on rentre les renseignements pris sur le site du fournisseur
msg = MIMEMultipart("alternative") msg = MIMEMultipart("alternative")
@ -442,7 +533,7 @@ def Pre_incription_training_confirmation_mail(diction):
# msg = MIMEMultipart("alternative") # msg = MIMEMultipart("alternative")
msg = EmailMessage() msg = EmailMessage()
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
local_adress = "" local_adress = ""
if ("adresse" in diction.keys()): if ("adresse" in diction.keys()):
@ -481,6 +572,50 @@ def Pre_incription_training_confirmation_mail(diction):
msg.set_content(sourceHtml, subtype='html') msg.set_content(sourceHtml, subtype='html')
"""
Update du 10/09/2023 :
Utiliser les documents personnalisés qui sont stockés en base de données plutot que des format de fichiers plats.
Regles d'utilisation :
1 - Recuperer les fichier personnalisé pour le partenaire (partner_owner_recid et ref_interne).
2 - Si aucun fichier de personnalisation pour le partenaire, alors utiliser le fichier par defaut (partner_owner_recid = "default" et ref_interne).
3 - Pour le cas de pre-inscription, la ref_interne du fichier est 'PRE_INSCRIPTION'
"""
partner_document_PRE_INSCRIPTION_data_qry = {'partner_owner_recid':str(diction['partner_owner_recid']),
'valide':'1', 'locked':'0', 'ref_interne': 'CONF_PRE_INSCRIPTION'}
print(" ### partner_document_PRE_INSCRIPTION_data_qry = ",partner_document_PRE_INSCRIPTION_data_qry)
partner_document_PRE_INSCRIPTION_data = MYSY_GV.dbname['courrier_template'].find_one({'partner_owner_recid':str(diction['partner_owner_recid']),
'valide':'1', 'locked':'0', 'ref_interne': 'CONF_PRE_INSCRIPTION'})
if( partner_document_PRE_INSCRIPTION_data is None ):
# Il n'existe pas de personnalisation de la preinscription pour ce partenaire, on va aller recuperer la presinscription pa defaut
partner_document_PRE_INSCRIPTION_data = MYSY_GV.dbname['courrier_template'].find_one(
{'partner_owner_recid': 'default',
'valide': '1', 'locked': '0', 'ref_interne': 'CONF_PRE_INSCRIPTION'})
if( partner_document_PRE_INSCRIPTION_data is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + "-Impossible d'envoyer l'email de la preinscription. Aucun document parametré ")
return False, " Impossible d'envoyer l'email de la preinscription. Aucun document parametré "
if( "contenu_doc" not in partner_document_PRE_INSCRIPTION_data or len(str(partner_document_PRE_INSCRIPTION_data['contenu_doc'])) <= 0 ):
mycommon.myprint( str(inspect.stack()[0][3]) + " -Impossible d'envoyer l'email de la preinscription. Le parametrage du document est invalide")
return False, " Impossible d'envoyer l'email de la preinscription. Le parametrage du document est invalide "
PRE_INSCRIPTION_contenu_doc_Template = jinja2.Template(str(partner_document_PRE_INSCRIPTION_data['contenu_doc']))
sourceHtml = PRE_INSCRIPTION_contenu_doc_Template.render(params=body["params"])
#print(" ### PRE_INSCRIPTION_contenu_doc = ",str(sourceHtml))
msg.set_content(sourceHtml, subtype='html')
smtpserver = smtplib.SMTP(MYSY_GV.O365_SMTP_COUNT_smtpsrv, MYSY_GV.O365_SMTP_COUNT_port)
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['Bcc'] = 'contact@mysy-training.com' msg['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = '[MySy Training] : pre-inscription formation' msg['Subject'] = '[MySy Training] : pre-inscription formation'

View File

@ -1826,7 +1826,7 @@ def SendEmargementMail( diction):
# JINJA2 # JINJA2
templateLoader = jinja2.FileSystemLoader(searchpath="./") templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader) templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "Template/MySy_Emargement.html" TEMPLATE_FILE = "Template/ MySy_Emargement.html"
template = templateEnv.get_template(TEMPLATE_FILE) template = templateEnv.get_template(TEMPLATE_FILE)
# This data can come from database query # This data can come from database query
# envoie de l'emargement du matin # envoie de l'emargement du matin

97
main.py
View File

@ -51,6 +51,7 @@ import Activite as Activite
import ressources_humaines as ressources_humaines import ressources_humaines as ressources_humaines
import ressources_materiels as ressources_materiels import ressources_materiels as ressources_materiels
import partner_order as partner_order import partner_order as partner_order
import partner_document_mgt as partner_document_mgt
app = Flask(__name__) app = Flask(__name__)
cors = CORS(app, resources={r"/foo": {"origins": "*"}}) cors = CORS(app, resources={r"/foo": {"origins": "*"}})
@ -4377,6 +4378,102 @@ def Get_Given_Partner_Order_Lines_From_order_ref_interne():
return jsonify(status=status, message=retval) return jsonify(status=status, message=retval)
"""
API qui permet d'ajouter un document personnalisable
"""
@app.route('/myclass/api/Add_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Add_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Add_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Add_Partner_Document(payload)
return jsonify(status=status, message=retval)
"""
API qui permet de modifier un document personnalisable
"""
@app.route('/myclass/api/Update_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Update_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Update_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Update_Partner_Document(payload)
return jsonify(status=status, message=retval)
"""
API qui permet de recuperer un document personnalisable donné
"""
@app.route('/myclass/api/Get_Given_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Given_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Given_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Get_Given_Partner_Document(payload)
return jsonify(status=status, message=retval)
"""
API de recuperation d'un document d'orignine (template)
"""
@app.route('/myclass/api/Get_Default_Partner_Document_By_Internal_Ref/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_Default_Partner_Document_By_Internal_Ref():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_Default_Partner_Document_By_Internal_Ref payload = ",payload)
status, retval = partner_document_mgt.Get_Default_Partner_Document_By_Internal_Ref(payload)
return jsonify(status=status, message=retval)
"""
API qui permet de supprimer un document personnalisable
"""
@app.route('/myclass/api/Delete_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Delete_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Delete_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Delete_Partner_Document(payload)
return jsonify(status=status, message=retval)
"""
API qui permet de recuperer la liste des documents personnalisables d'un partenaire
"""
@app.route('/myclass/api/Get_List_Partner_Document/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_List_Partner_Document():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_List_Partner_Document payload = ",payload)
status, retval = partner_document_mgt.Get_List_Partner_Document(payload)
return jsonify(status=status, message=retval)
"""
API qui permet de recuperer la liste des documents personnalisables d'un partenaire sans filtre
"""
@app.route('/myclass/api/Get_List_Partner_Document_no_filter/', methods=['POST','GET'])
@crossdomain(origin='*')
def Get_List_Partner_Document_no_filter():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Get_List_Partner_Document_no_filter payload = ",payload)
status, retval = partner_document_mgt.Get_List_Partner_Document_no_filter(payload)
return jsonify(status=status, message=retval)
if __name__ == '__main__': if __name__ == '__main__':
print(" debut api") print(" debut api")
context = SSL.Context(SSL.SSLv23_METHOD) context = SSL.Context(SSL.SSLv23_METHOD)

View File

@ -619,4 +619,77 @@ def Get_List_Partner_Document_no_filter(diction):
"""
Pour permettre de rénitialiser un template 'detruit' par un user,
Cette fonction permet de recuperer les données d'origine du template
"""
def Get_Default_Partner_Document_By_Internal_Ref(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'ref_interne']
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")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'ref_interne']
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
"""
Clés de mise à jour
"""
data_cle = {}
data_cle['partner_owner_recid'] = 'default'
data_cle['ref_interne'] = str(diction['ref_interne'])
data_cle['valide'] = "1"
data_cle['locked'] = "0"
RetObject = []
val_tmp = 1
#print(" ### data_cle = ", data_cle)
for retval in MYSY_GV.dbname['courrier_template'].find(data_cle):
user = retval
user['id'] = str(val_tmp)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" ### RetObject = ", RetObject)
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) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de recuperer le modèle de document d'origine "