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"?>
<project version="4">
<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$/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$/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$/tools_cherif/tools_cherif.py" beforeDir="false" afterPath="$PROJECT_DIR$/tools_cherif/tools_cherif.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Session_Formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation.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$/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>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -283,7 +286,14 @@
<option name="project" value="LOCAL" />
<updated>1675938338905</updated>
</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 />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -298,7 +308,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="23/11/22 - 22h30" />
<MESSAGE value="26/11/22 - 10h30" />
<MESSAGE value="26/11/22 - 23h30" />
<MESSAGE value="15/12/2022 - 22h00" />
@ -323,7 +332,8 @@
<MESSAGE value="01/02/23 - 22h" />
<MESSAGE value="05/02/23 - 20h" />
<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 name="XDebuggerManager">
<breakpoint-manager>

View File

@ -2024,13 +2024,27 @@ def SendAttendeeCertification(diction):
my_retrun_dict['email'] = local_Insc_retval['email']
# 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(
{'internal_url': str(local_Insc_retval['class_internal_url'])})
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
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)

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',
'code_postal', 'ville', 'formateur', 'code_session',
'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()
for val in incom_keys:
if val not in field_list:
@ -70,16 +70,14 @@ def Add_Update_SessionFormation(diction):
code_session = ""
if ("code_session" in diction.keys()):
if diction['code_session']:
mydata['code_session'] = diction['code_session']
query_key['code_session'] = diction['code_session']
mydata['code_session'] = diction['code_session']
query_key['code_session'] = diction['code_session']
class_internal_url = ""
if ("class_internal_url" in diction.keys()):
if diction['class_internal_url']:
mydata['class_internal_url'] = diction['class_internal_url']
class_internal_url = diction['class_internal_url']
mydata['class_internal_url'] = diction['class_internal_url']
class_internal_url = diction['class_internal_url']
partner_recid = mycommon.get_parnter_recid_from_token(my_token)
@ -89,39 +87,31 @@ def Add_Update_SessionFormation(diction):
formation_session_id = ""
if ("formation_session_id" in diction.keys()):
if diction['formation_session_id']:
mydata['formation_session_id'] = diction['formation_session_id']
session_id = diction['formation_session_id']
mydata['formation_session_id'] = diction['formation_session_id']
session_id = diction['formation_session_id']
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 diction['date_fin']:
mydata['date_fin'] = diction['date_fin']
mydata['date_fin'] = diction['date_fin']
if ("distantiel" in diction.keys()):
if diction['distantiel']:
mydata['distantiel'] = diction['distantiel']
mydata['distantiel'] = diction['distantiel']
if ("presentiel" in diction.keys()):
if diction['presentiel']:
mydata['presentiel'] = diction['presentiel']
mydata['presentiel'] = diction['presentiel']
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 diction['prix_session']:
mydata['prix_session'] = diction['prix_session']
mydata['prix_session'] = diction['prix_session']
if ("adresse" in diction.keys()):
@ -137,8 +127,6 @@ def Add_Update_SessionFormation(diction):
else:
mydata['code_postal'] = ""
if ("ville" in diction.keys()):
if diction['ville']:
mydata['ville'] = diction['ville']
@ -146,25 +134,23 @@ def Add_Update_SessionFormation(diction):
mydata['ville'] = ""
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 diction['session_status']:
mydata['session_status'] = diction['session_status']
mydata['session_status'] = diction['session_status']
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 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 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())
@ -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',
'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.
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()
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()
local_attestation_certif = ""

View File

@ -26,12 +26,11 @@ border: 2px solid; ">
serif;color:#454349;font-size:1.2rem; line-height: 2rem;border: none;">
<p style="border: none; text-align: left;">
{% if json_data.num_declation|length > 5 %}
Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de declaration
{{json_data.num_declation}} <br />
Par la presente, l'oganisme de formation {{json_data.partner}} au Numero de déclaration {{json_data.num_declation}} <br />
{% 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 />
{% endif %}
@ -75,15 +74,19 @@ border: 2px solid; ">
<div
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;">
Contenus de la formation : <br />
{{json_data.objectif}}
<div style="width: 100%; margin-bottom: 2rem;">
Contenu de la formation : <br />
<p style=" width: 80%; margin-left: 1rem;font-size: 12px;">
{{json_data.contenu_ftion}}
</p>
</div>
<div style="width: 30%; float: left;">
Fait à {{json_data.mysy_partner_adr_city}} le {{json_data.date_jour}}
</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 />
{% 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)
if( part_status is False):
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
"""
@ -1024,7 +1024,7 @@ def update_class(diction):
if (part_status is False):
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 "
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):
mycommon.myprint(str(
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

View File

@ -1,4 +1,7 @@
,index,mots,occurence,moyenne,id_formation,source_field
0,0,aromatherapie,1,0.33,MYSY_0004,title
1,1,integrative,1,0.33,MYSY_0004,title
2,2,praticien,1,0.33,MYSY_0004,title
0,0,belt,1,0.17,MYSY_0001,title
1,1,ecam,1,0.17,MYSY_0001,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
0 aromatherapie 1 0.33 MYSY_0004 title
1 integrative 1 0.33 MYSY_0004 title
2 praticien 1 0.33 MYSY_0004 title
Empty DataFrame
Columns: [mots, occurence, moyenne, id_formation, source_field]
Index: []

View File

@ -8,7 +8,7 @@ import locale
import datetime
import inspect
import sys, os
from email import encoders
from bson import ObjectId
from pymongo import ReturnDocument
from xhtml2pdf import pisa
@ -580,8 +580,8 @@ def SendAttestion_to_attendee_by_email(diction):
"""
Verification de la liste des champs obligatoires
"""
field_list_obligatoire = ['nom', 'prenom', 'email', 'date_du', 'date_au', 'adresse', 'title',
'attestation_tmpl', 'inscription_id']
field_list_obligatoire = ['partner_recid', 'session_id', 'class_internal_url', 'class_title' ,
'email_participant', 'attestation_tmpl']
for val in field_list_obligatoire:
if val not in diction:
@ -594,10 +594,96 @@ def SendAttestion_to_attendee_by_email(diction):
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['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 = EmailMessage()
@ -611,23 +697,80 @@ def SendAttestion_to_attendee_by_email(diction):
template = templateEnv.get_template(TEMPLATE_FILE)
# This data can come from database query
body = {
"params": {"nom": str(diction['nom']),
"prenom": str(diction['prenom']),
"date_du": str(diction['date_du']),
"date_fin": str(diction['date_au']),
"adresse": str(diction['adresse']),
"title": str(diction['title']),
"email": str(diction['email']),
"params": {"nom": str(nom),
"prenom": str(prenom),
"date_du": str(date_du),
"date_au": str(date_au),
"adresse": str(adresse),
"class_title": str(diction['class_title']),
"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"])
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['Bcc'] = 'contact@mysy-training.com'
msg['Subject'] = 'MySy Training : Votre attestation de formation : ' + str(diction['title'])
msg['To'] = str(diction['email'])
msg['Subject'] = 'MySy Training : Votre attestation de formation : ' + str(diction['class_title'])
msg['To'] = str(diction['email_participant'])
msg.attach(MIMEText(open(outputFilename).read()))
smtpserver.ehlo()
smtpserver.starttls()
@ -639,9 +782,11 @@ def SendAttestion_to_attendee_by_email(diction):
mytoday = datetime.date.today().strftime("%d/%m/%Y")
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
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},
return_document=ReturnDocument.AFTER,)
@ -738,6 +883,7 @@ def SendAttestion_to_attendee_by_email_standalone(diction):
"presentiel": str(diction['presentiel']),
"distantiel": str(diction['distantiel']),
"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),
"mysy_partner_siren": str(mysy_partner_siren),
"mysy_partner_adr_city":str(mysy_partner_adr_city),