11/02/23 - 20h

master
cherif 2023-02-11 20:15:03 +01:00
parent 406a1c0177
commit 8bc7567884
9 changed files with 5527 additions and 78 deletions

View File

@ -1,13 +1,16 @@
<?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="1122d9e2-679f-46d6-8c4f-97e9ae4041b5" name="Changes" comment="09/02/23 - 11h"> <list default="true" id="1122d9e2-679f-46d6-8c4f-97e9ae4041b5" name="Changes" comment="10/02/23 - 12h">
<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$/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$/email_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_mgt.py" 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$/Template/Mysy_attestion_modele2_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/Mysy_attestion_modele2_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" beforeDir="false" afterPath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/class_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/class_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/data_indexees.csv" beforeDir="false" afterPath="$PROJECT_DIR$/data_indexees.csv" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ela_output_test_file_pandas_2.txt" beforeDir="false" afterPath="$PROJECT_DIR$/ela_output_test_file_pandas_2.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/email_inscription_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_inscription_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" />
@ -283,7 +286,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1675938338905</updated> <updated>1675938338905</updated>
</task> </task>
<option name="localTasksCounter" value="31" /> <task id="LOCAL-00031" summary="10/02/23 - 12h">
<created>1676027348546</created>
<option name="number" value="00031" />
<option name="presentableId" value="LOCAL-00031" />
<option name="project" value="LOCAL" />
<updated>1676027348546</updated>
</task>
<option name="localTasksCounter" value="32" />
<servers /> <servers />
</component> </component>
<component name="Vcs.Log.Tabs.Properties"> <component name="Vcs.Log.Tabs.Properties">
@ -298,7 +308,6 @@
</option> </option>
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="23/11/22 - 22h30" />
<MESSAGE value="26/11/22 - 10h30" /> <MESSAGE value="26/11/22 - 10h30" />
<MESSAGE value="26/11/22 - 23h30" /> <MESSAGE value="26/11/22 - 23h30" />
<MESSAGE value="15/12/2022 - 22h00" /> <MESSAGE value="15/12/2022 - 22h00" />
@ -323,7 +332,8 @@
<MESSAGE value="01/02/23 - 22h" /> <MESSAGE value="01/02/23 - 22h" />
<MESSAGE value="05/02/23 - 20h" /> <MESSAGE value="05/02/23 - 20h" />
<MESSAGE value="09/02/23 - 11h" /> <MESSAGE value="09/02/23 - 11h" />
<option name="LAST_COMMIT_MESSAGE" value="09/02/23 - 11h" /> <MESSAGE value="10/02/23 - 12h" />
<option name="LAST_COMMIT_MESSAGE" value="10/02/23 - 12h" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>

View File

@ -2024,13 +2024,27 @@ def SendAttendeeCertification(diction):
my_retrun_dict['email'] = local_Insc_retval['email'] my_retrun_dict['email'] = local_Insc_retval['email']
# Recuperation des infotrmations de la formation # Recuperation des infotrmations de la formation
print(" ## str(local_Insc_retval['class_internal_url']) = ", str(local_Insc_retval['class_internal_url'])) ##print(" ## str(local_Insc_retval['class_internal_url']) = ", str(local_Insc_retval['class_internal_url']))
local_formation = MYSY_GV.dbname['myclass'].find_one( local_formation = MYSY_GV.dbname['myclass'].find_one(
{'internal_url': str(local_Insc_retval['class_internal_url'])}) {'internal_url': str(local_Insc_retval['class_internal_url'])})
my_retrun_dict['title'] = local_formation['title'] my_retrun_dict['title'] = local_formation['title']
"""
field_list_obligatoire = ['partner_recid', 'session_id', 'class_internal_url', 'class_title' ,
'email_participant']
"""
attestation_dict = {}
attestation_dict['partner_recid'] = str(partner_recid)
attestation_dict['session_id'] = str(diction['session_id'])
attestation_dict['class_internal_url'] = str(local_Insc_retval['class_internal_url'])
attestation_dict['class_title'] = local_formation['title']
attestation_dict['email_participant'] = local_Insc_retval['email']
attestation_dict['attestation_tmpl'] = attestation_certificat['template_name']
print(" ### attestation_dict = ", attestation_dict)
# Envoi de l'email de notification au formateur # Envoi de l'email de notification au formateur
local_status, local_message = email_session.SendAttestion_to_attendee_by_email(my_retrun_dict) local_status, local_message = email_session.SendAttestion_to_attendee_by_email(attestation_dict)
return local_status, str(local_message) return local_status, str(local_message)

File diff suppressed because it is too large Load Diff

View File

@ -41,7 +41,7 @@ def Add_Update_SessionFormation(diction):
field_list = ['token', 'date_debut', 'date_fin', 'nb_participant', 'formation_session_id', 'adresse', field_list = ['token', 'date_debut', 'date_fin', 'nb_participant', 'formation_session_id', 'adresse',
'code_postal', 'ville', 'formateur', 'code_session', 'code_postal', 'ville', 'formateur', 'code_session',
'class_internal_url', 'session_status', 'date_debut_inscription', 'date_fin_inscription', 'class_internal_url', 'session_status', 'date_debut_inscription', 'date_fin_inscription',
'attestation_certif', "distantiel", "presentiel", "prix_session"] 'attestation_certif', "distantiel", "presentiel", "prix_session", 'contenu_ftion']
incom_keys = diction.keys() incom_keys = diction.keys()
for val in incom_keys: for val in incom_keys:
if val not in field_list: if val not in field_list:
@ -70,16 +70,14 @@ def Add_Update_SessionFormation(diction):
code_session = "" code_session = ""
if ("code_session" in diction.keys()): if ("code_session" in diction.keys()):
if diction['code_session']: mydata['code_session'] = diction['code_session']
mydata['code_session'] = diction['code_session'] query_key['code_session'] = diction['code_session']
query_key['code_session'] = diction['code_session']
class_internal_url = "" class_internal_url = ""
if ("class_internal_url" in diction.keys()): if ("class_internal_url" in diction.keys()):
if diction['class_internal_url']: mydata['class_internal_url'] = diction['class_internal_url']
mydata['class_internal_url'] = diction['class_internal_url'] class_internal_url = diction['class_internal_url']
class_internal_url = diction['class_internal_url']
partner_recid = mycommon.get_parnter_recid_from_token(my_token) partner_recid = mycommon.get_parnter_recid_from_token(my_token)
@ -89,39 +87,31 @@ def Add_Update_SessionFormation(diction):
formation_session_id = "" formation_session_id = ""
if ("formation_session_id" in diction.keys()): if ("formation_session_id" in diction.keys()):
if diction['formation_session_id']: mydata['formation_session_id'] = diction['formation_session_id']
mydata['formation_session_id'] = diction['formation_session_id'] session_id = diction['formation_session_id']
session_id = diction['formation_session_id']
if ("date_debut" in diction.keys()): if ("date_debut" in diction.keys()):
if diction['date_debut']: mydata['date_debut'] = diction['date_debut']
mydata['date_debut'] = diction['date_debut']
if ("date_fin" in diction.keys()): if ("date_fin" in diction.keys()):
if diction['date_fin']: mydata['date_fin'] = diction['date_fin']
mydata['date_fin'] = diction['date_fin']
if ("distantiel" in diction.keys()): if ("distantiel" in diction.keys()):
if diction['distantiel']: mydata['distantiel'] = diction['distantiel']
mydata['distantiel'] = diction['distantiel']
if ("presentiel" in diction.keys()): if ("presentiel" in diction.keys()):
if diction['presentiel']: mydata['presentiel'] = diction['presentiel']
mydata['presentiel'] = diction['presentiel']
if ("nb_participant" in diction.keys()): if ("nb_participant" in diction.keys()):
if diction['nb_participant']: mydata['nb_participant'] = diction['nb_participant']
mydata['nb_participant'] = diction['nb_participant']
if ("prix_session" in diction.keys()): if ("prix_session" in diction.keys()):
if diction['prix_session']: mydata['prix_session'] = diction['prix_session']
mydata['prix_session'] = diction['prix_session']
if ("adresse" in diction.keys()): if ("adresse" in diction.keys()):
@ -137,8 +127,6 @@ def Add_Update_SessionFormation(diction):
else: else:
mydata['code_postal'] = "" mydata['code_postal'] = ""
if ("ville" in diction.keys()): if ("ville" in diction.keys()):
if diction['ville']: if diction['ville']:
mydata['ville'] = diction['ville'] mydata['ville'] = diction['ville']
@ -146,25 +134,23 @@ def Add_Update_SessionFormation(diction):
mydata['ville'] = "" mydata['ville'] = ""
if ("attestation_certif" in diction.keys()): if ("attestation_certif" in diction.keys()):
if diction['attestation_certif']: mydata['attestation_certif'] = diction['attestation_certif']
mydata['attestation_certif'] = diction['attestation_certif']
if ("session_status" in diction.keys()): if ("session_status" in diction.keys()):
if diction['session_status']: mydata['session_status'] = diction['session_status']
mydata['session_status'] = diction['session_status']
if ("date_debut_inscription" in diction.keys()): if ("date_debut_inscription" in diction.keys()):
if diction['date_debut_inscription']: mydata['date_debut_inscription'] = diction['date_debut_inscription']
mydata['date_debut_inscription'] = diction['date_debut_inscription']
if ("date_fin_inscription" in diction.keys()): if ("date_fin_inscription" in diction.keys()):
if diction['date_fin_inscription']: mydata['date_fin_inscription'] = diction['date_fin_inscription']
mydata['date_fin_inscription'] = diction['date_fin_inscription']
if ("formateur" in diction.keys()): if ("formateur" in diction.keys()):
if diction['formateur']: mydata['formateur'] = diction['formateur']
mydata['formateur'] = diction['formateur']
if ("contenu_ftion" in diction.keys()):
mydata['contenu_ftion'] = diction['contenu_ftion']
mydata['date_update'] = str(datetime.now()) mydata['date_update'] = str(datetime.now())
@ -531,7 +517,7 @@ def Add_Update_SessionFormation_mass(file=None, Folder=None, diction=None):
''' '''
field_list = ['date_debut', 'date_fin', 'nb_participant', 'adresse', 'code_postal', 'ville', field_list = ['date_debut', 'date_fin', 'nb_participant', 'adresse', 'code_postal', 'ville',
'session_status', 'date_debut_inscription', 'date_fin_inscription', 'attestation', 'formateur', 'session_status', 'date_debut_inscription', 'date_fin_inscription', 'attestation', 'formateur',
'code_session', "distanciel", "presentiel", "prix_session"] 'code_session', "distanciel", "presentiel", "prix_session", 'contenu_ftion']
# Controle du nombre de lignes dans le fichier. # Controle du nombre de lignes dans le fichier.
total_rows = len(df) total_rows = len(df)
@ -671,6 +657,12 @@ def Add_Update_SessionFormation_mass(file=None, Folder=None, diction=None):
local_ville = str(df['ville'].values[n]).strip() local_ville = str(df['ville'].values[n]).strip()
mydata['ville'] = local_ville mydata['ville'] = local_ville
contenu_ftion = ""
if ("contenu_ftion" in df.keys()):
if (str(df['contenu_ftion'].values[n])):
contenu_ftion = str(df['contenu_ftion'].values[n]).strip()
mydata['contenu_ftion'] = contenu_ftion
#mydata['ville'] = str(df['ville'].values[n]).strip() #mydata['ville'] = str(df['ville'].values[n]).strip()
local_attestation_certif = "" local_attestation_certif = ""

View File

@ -26,12 +26,11 @@ border: 2px solid; ">
serif;color:#454349;font-size:1.2rem; line-height: 2rem;border: none;"> serif;color:#454349;font-size:1.2rem; line-height: 2rem;border: none;">
<p style="border: none; text-align: left;"> <p style="border: none; text-align: left;">
{% if json_data.num_declation|length > 5 %} {% if json_data.num_declation|length > 5 %}
Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de declaration Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de déclaration {{json_data.num_declation}} <br />
{{json_data.num_declation}} <br />
{% else %} {% else %}
Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de SIREN Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de SIRET
{{json_data.mysy_partner_siren}} <br /> {{json_data.mysy_partner_siren}} <br />
{% endif %} {% endif %}
@ -75,15 +74,19 @@ border: 2px solid; ">
<div <div
style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:1.2rem"> style="padding:12px 0px;text-align:left;font-family:Georgia, 'Times New Roman', Times, serif;color:#454349;font-size:1.2rem">
<div style="width: 100%; margin-bottom: 5rem;"> <div style="width: 100%; margin-bottom: 2rem;">
Contenus de la formation : <br /> Contenu de la formation : <br />
{{json_data.objectif}} <p style=" width: 80%; margin-left: 1rem;font-size: 12px;">
{{json_data.contenu_ftion}}
</p>
</div> </div>
<div style="width: 30%; float: left;"> <div style="width: 30%; float: left;">
Fait à {{json_data.mysy_partner_adr_city}} le {{json_data.date_jour}} Fait à {{json_data.mysy_partner_adr_city}} le {{json_data.date_jour}}
</div> </div>
<div style="width: 70%; float: left;text-align: right;"> <div style="width: 65%; float: left;text-align: right;">
Pour l'organisme de formation <br /> Pour l'organisme de formation <br />
{% if json_data.cachet_signature %} {% if json_data.cachet_signature %}

View File

@ -103,7 +103,7 @@ def add_class(diction):
part_status, part_pack, part_pack_nb_training_auto = mycommon.Partner_Get_pack_nbTraining(user_recid) part_status, part_pack, part_pack_nb_training_auto = mycommon.Partner_Get_pack_nbTraining(user_recid)
if( part_status is False): if( part_status is False):
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le pack et le nombre de formation du partenaire") mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le pack et le nombre de formation du partenaire")
return False, "Votre pack / abonnement ne permet pas créer les formations. Verifiez votre abonnement " return False, "Votre pack / abonnement ne permet pas de créer les formations. Verifiez votre abonnement "
""" """
Recuperation du nombre de formations actif de ce partner Recuperation du nombre de formations actif de ce partner
""" """
@ -1024,7 +1024,7 @@ def update_class(diction):
if (part_status is False): if (part_status is False):
mycommon.myprint(str(inspect.stack()[0][ mycommon.myprint(str(inspect.stack()[0][
3]) + " - Impossible de recuperer le pack et le nombre de formation du partenaire") 3]) + " - Impossible de recuperer le pack et le nombre de formation du partenaire")
return False, "Votre pack / abonnement ne permet pas créer les formations. Verifiez votre abonnement " return False, "Votre pack / abonnement ne permet pas de créer les formations. Verifiez votre abonnement "
coll_pack = MYSY_GV.dbname['pack'] coll_pack = MYSY_GV.dbname['pack']
@ -2678,7 +2678,7 @@ def add_class_mass(file=None, Folder=None, diction=None):
if (part_status is False): if (part_status is False):
mycommon.myprint(str( mycommon.myprint(str(
inspect.stack()[0][3]) + " - Impossible de recuperer le pack et le nombre de formations du partenaire") inspect.stack()[0][3]) + " - Impossible de recuperer le pack et le nombre de formations du partenaire")
return False, "Votre pack / abonnement ne permet pas créer les formations. Verifiez votre abonnement " return False, "Votre pack / abonnement ne permet pas de créer les formations. Verifiez votre abonnement "
""" """
Recuperation du nombre de formations actif de ce partner Recuperation du nombre de formations actif de ce partner

View File

@ -1,4 +1,7 @@
,index,mots,occurence,moyenne,id_formation,source_field ,index,mots,occurence,moyenne,id_formation,source_field
0,0,aromatherapie,1,0.33,MYSY_0004,title 0,0,belt,1,0.17,MYSY_0001,title
1,1,integrative,1,0.33,MYSY_0004,title 1,1,ecam,1,0.17,MYSY_0001,title
2,2,praticien,1,0.33,MYSY_0004,title 2,2,yellow,1,0.17,MYSY_0001,title
3,3,deploiement,1,0.17,MYSY_0001,title
4,4,expert,1,0.17,MYSY_0001,title
5,5,lean,1,0.17,MYSY_0001,title

1 index mots occurence moyenne id_formation source_field
2 0 0 aromatherapie belt 1 0.33 0.17 MYSY_0004 MYSY_0001 title
3 1 1 integrative ecam 1 0.33 0.17 MYSY_0004 MYSY_0001 title
4 2 2 praticien yellow 1 0.33 0.17 MYSY_0004 MYSY_0001 title
5 3 3 deploiement 1 0.17 MYSY_0001 title
6 4 4 expert 1 0.17 MYSY_0001 title
7 5 5 lean 1 0.17 MYSY_0001 title

View File

@ -1,4 +1,3 @@
mots occurence moyenne id_formation source_field Empty DataFrame
0 aromatherapie 1 0.33 MYSY_0004 title Columns: [mots, occurence, moyenne, id_formation, source_field]
1 integrative 1 0.33 MYSY_0004 title Index: []
2 praticien 1 0.33 MYSY_0004 title

View File

@ -8,7 +8,7 @@ import locale
import datetime import datetime
import inspect import inspect
import sys, os import sys, os
from email import encoders
from bson import ObjectId from bson import ObjectId
from pymongo import ReturnDocument from pymongo import ReturnDocument
from xhtml2pdf import pisa from xhtml2pdf import pisa
@ -580,8 +580,8 @@ def SendAttestion_to_attendee_by_email(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', 'adresse', 'title', field_list_obligatoire = ['partner_recid', 'session_id', 'class_internal_url', 'class_title' ,
'attestation_tmpl', 'inscription_id'] 'email_participant', 'attestation_tmpl']
for val in field_list_obligatoire: for val in field_list_obligatoire:
if val not in diction: if val not in diction:
@ -594,10 +594,96 @@ def SendAttestion_to_attendee_by_email(diction):
msg = MIMEMultipart("alternative") msg = MIMEMultipart("alternative")
## Recuperation des données du partenaire
local_partnair = MYSY_GV.dbname['partnair_account'].find_one({'recid':str(diction['partner_recid']),
'active':'1', 'locked':'0'})
if( local_partnair is None ):
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 "
mysy_partner_nom = ""
if ("nom" in local_partnair.keys()):
mysy_partner_nom = str(local_partnair['nom'])
mysy_partner_num_declation = ""
if ("num_nda" in local_partnair.keys()):
mysy_partner_num_declation = str(local_partnair['num_nda'])
mysy_partner_adr_city = ""
if ("adr_city" in local_partnair.keys()):
mysy_partner_adr_city = str(local_partnair['adr_city'])
## Recuperation des données de l'inscrit
local_inscription = MYSY_GV.dbname['inscription'].find_one({'session_id': str(diction['session_id']),
'class_internal_url': str(diction['class_internal_url']),
'email':str(diction['email_participant'])})
if (local_inscription is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Impossible de recuperer les données du participants")
return False, " Impossible de recuperer les données du participants "
nom = ""
if ("nom" in local_inscription.keys()):
nom = str(local_inscription['nom'])
prenom = ""
if ("prenom" in local_inscription.keys()):
prenom = str(local_inscription['prenom'])
date_du = ""
if ("date_du" in local_inscription.keys()):
date_du = str(local_inscription['date_du'])[0:10]
date_au = ""
if ("date_au" in local_inscription.keys()):
date_au = str(local_inscription['date_au'])[0:10]
ville = ""
if ("ville" in local_inscription.keys()):
ville = str(local_inscription['ville'])
code_postal = ""
if ("code_postal" in local_inscription.keys()):
code_postal = str(local_inscription['code_postal'])
adresse = ""
if ("adresse" in local_inscription.keys()):
adresse = str(local_inscription['adresse'])
## Recuperation des données de la session
local_session = MYSY_GV.dbname['session_formation'].find_one({'code_session': str(diction['session_id']),
'class_internal_url': str(
diction['class_internal_url']),
'valide':'1'})
if (local_session is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Impossible de recuperer les données de la session")
return False, " Impossible de recuperer les données de la session "
formateur = ""
if ("formateur" in local_session.keys()):
formateur = str(local_session['formateur'])
presentiel = ""
if ("presentiel" in local_session.keys()):
presentiel = str(local_session['presentiel'])
distantiel = ""
if ("distantiel" in local_session.keys()):
distantiel = str(local_session['distantiel'])
contenu_ftion = ""
if ("contenu_ftion" in local_session.keys()):
contenu_ftion = str(local_session['contenu_ftion']).replace('<p>', '').replace('</p>', '')
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
msg['To'] = str(diction['email']) msg['To'] = str(diction['email_participant'])
ct = datetime.datetime.now()
ts = ct.timestamp()
date_jour = ct.strftime("%d/%m/%Y")
# msg = MIMEMultipart("alternative") # msg = MIMEMultipart("alternative")
msg = EmailMessage() msg = EmailMessage()
@ -611,23 +697,80 @@ def SendAttestion_to_attendee_by_email(diction):
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
body = { body = {
"params": {"nom": str(diction['nom']), "params": {"nom": str(nom),
"prenom": str(diction['prenom']), "prenom": str(prenom),
"date_du": str(diction['date_du']), "date_du": str(date_du),
"date_fin": str(diction['date_au']), "date_au": str(date_au),
"adresse": str(diction['adresse']), "adresse": str(adresse),
"title": str(diction['title']), "class_title": str(diction['class_title']),
"email": str(diction['email']), "email": str(diction['email_participant']),
"adresse": str(adresse),
"code_postal": str(code_postal),
"ville": str(ville),
"formateur": str(formateur),
"presentiel": str(presentiel),
"distantiel": str(distantiel),
"partner": str(mysy_partner_nom),
"contenu_ftion": str(contenu_ftion),
"num_declation": str(mysy_partner_num_declation),
"mysy_partner_adr_city":str(mysy_partner_adr_city),
"date_jour":str(date_jour),
"cachet_signature": "https://img.mysy-training.com/perso/mysy_cachet.png",
"logo_url": "https://img.mysy-training.com/1000formation/LOGO-FORMATION1000.png"
}} }}
sourceHtml = template.render(json_data=body["params"]) sourceHtml = template.render(json_data=body["params"])
msg.set_content(sourceHtml, subtype='html') file_name = str("Attestation_" + str(ts) ).replace(".", "")
orig_file_name = str(file_name)+".pdf"
outputFilename = str(MYSY_GV.INVOICE_DIRECTORY) + str(orig_file_name)
print(" ### orig_file_name = ", outputFilename)
# 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()
body = '''Hello,
This is the body of the email
sicerely yours
G.G.
'''
msg.attach(MIMEText(body, 'plain'))
# open the file in bynary
binary_pdf = open(outputFilename, 'rb')
payload = MIMEBase('application', 'octate-stream', Name=outputFilename)
payload.set_payload((binary_pdf).read())
# enconding the binary into base64
encoders.encode_base64(payload)
# add header with pdf name
payload.add_header('Content-Decomposition', 'attachment', filename=outputFilename)
msg.attach(payload)
"""with open(outputFilename, 'rb') as content_file:
content = content_file.read()
msg.add_attachment(content, maintype='application', subtype='pdf', filename='Attestation.pdf')
"""
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 : Votre attestation de formation : ' + str(diction['title']) msg['Subject'] = 'MySy Training : Votre attestation de formation : ' + str(diction['class_title'])
msg['To'] = str(diction['email']) msg['To'] = str(diction['email_participant'])
msg.attach(MIMEText(open(outputFilename).read()))
smtpserver.ehlo() smtpserver.ehlo()
smtpserver.starttls() smtpserver.starttls()
@ -639,9 +782,11 @@ def SendAttestion_to_attendee_by_email(diction):
mytoday = datetime.date.today().strftime("%d/%m/%Y") mytoday = datetime.date.today().strftime("%d/%m/%Y")
my_local_mydata = {'certification_send_date':str(mytoday)} my_local_mydata = {'certification_send_date':str(mytoday)}
print(" ### str(diction['inscription_id']) = ",str(diction['inscription_id']) ) #print(" ### str(diction['inscription_id']) = ",str(diction['inscription_id']) )
## Mise à jour de la date d'envoi du certificat ## Mise à jour de la date d'envoi du certificat
MYSY_GV.dbname['inscription'].find_one_and_update({'_id':ObjectId(str(diction['inscription_id']))}, MYSY_GV.dbname['inscription'].find_one_and_update({'session_id': str(diction['session_id']),
'class_internal_url': str(diction['class_internal_url']),
'email':str(diction['email_participant'])},
{"$set":my_local_mydata}, {"$set":my_local_mydata},
return_document=ReturnDocument.AFTER,) return_document=ReturnDocument.AFTER,)
@ -738,6 +883,7 @@ def SendAttestion_to_attendee_by_email_standalone(diction):
"presentiel": str(diction['presentiel']), "presentiel": str(diction['presentiel']),
"distantiel": str(diction['distantiel']), "distantiel": str(diction['distantiel']),
"partner": str(mysy_partner_nom), "partner": str(mysy_partner_nom),
"contenu_ftion": "Les 10 &eacute;tats d&rsquo;esprit Kaizen<br>Pratique du PDCA et de la R&eacute;solution de probl&egrave;me<br>MODULE 3 P&eacute;rennisation:<br>Les rituels manag&eacute;riaux<br>Piloter un syst&egrave;me Lean",
"num_declation": str(mysy_partner_num_declation), "num_declation": str(mysy_partner_num_declation),
"mysy_partner_siren": str(mysy_partner_siren), "mysy_partner_siren": str(mysy_partner_siren),
"mysy_partner_adr_city":str(mysy_partner_adr_city), "mysy_partner_adr_city":str(mysy_partner_adr_city),