20/03/2024 - 22h30dss

master
cherif 2024-03-23 00:01:04 +01:00
parent 969bc26918
commit c264ad0ac2
3 changed files with 1599 additions and 111 deletions

View File

@ -1,13 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="20/03/2024 - 22h30">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="20/03/2024 - 22h30d">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/E_Sign_Document.py" beforeDir="false" afterPath="$PROJECT_DIR$/E_Sign_Document.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$/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" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -77,13 +74,6 @@
<option name="presentableId" value="Default" />
<updated>1680804787304</updated>
</task>
<task id="LOCAL-00197" summary="16/01/2024 - 19h">
<created>1705426888964</created>
<option name="number" value="00197" />
<option name="presentableId" value="LOCAL-00197" />
<option name="project" value="LOCAL" />
<updated>1705426888964</updated>
</task>
<task id="LOCAL-00198" summary="19/01/2024 - 16h">
<created>1705677688291</created>
<option name="number" value="00198" />
@ -420,7 +410,14 @@
<option name="project" value="LOCAL" />
<updated>1710970329203</updated>
</task>
<option name="localTasksCounter" value="246" />
<task id="LOCAL-00246" summary="20/03/2024 - 22h30d">
<created>1711130098363</created>
<option name="number" value="00246" />
<option name="presentableId" value="LOCAL-00246" />
<option name="project" value="LOCAL" />
<updated>1711130098364</updated>
</task>
<option name="localTasksCounter" value="247" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -435,7 +432,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="17/02/2024 - 11h" />
<MESSAGE value="18/02/2024 - 14h" />
<MESSAGE value="dd" />
<MESSAGE value="ddr" />
@ -460,6 +456,7 @@
<MESSAGE value="12/03/2024 - 20h30" />
<MESSAGE value="19/03/2024 - 17h30" />
<MESSAGE value="20/03/2024 - 22h30" />
<option name="LAST_COMMIT_MESSAGE" value="20/03/2024 - 22h30" />
<MESSAGE value="20/03/2024 - 22h30d" />
<option name="LAST_COMMIT_MESSAGE" value="20/03/2024 - 22h30d" />
</component>
</project>

View File

@ -41,7 +41,6 @@ Chaque signataire reçoit par mail une notification pour signer ainsi quun co
import base64
import bson
import pymongo
from pymongo import MongoClient
@ -364,37 +363,94 @@ def Get_Given_E_Document_Not_Signed_No_Token(diction):
# Creation de l'email à enoyer
msg = MIMEMultipart("alternative")
html = """\
<html>
<body>
<br />
<div style="text-align: center;">
<nav style="text-align: center; font-weight: bold;">LOGO</nav>
<br />
<div style="text-align: center;">
<nav style="text-align: center; font-weight: bold;">SIGNATURE ELECTRONIQUE</nav>
<br />
</div>
</div>
<div>
Bonjour
</div>
<div >
Vous venez de lancer une procedure de signature digitale. Voici le code de validation : <br/>
""" + secret_key_for_sign + """<br>
</p>
Cordialement.
</div>
</body>
</html>
"""
Recupération du modele de courrier.
le principe est de prendre le module du partenaire. si pas de modele du partenaire on
prend le modele par default
"""
courrier_template_model = MYSY_GV.dbname['courrier_template'].count_documents(
{'ref_interne': "E_DOCUMENT_SIGNATURE_CODE",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': str(local_partner_owner_recid)}
)
if (courrier_template_model == 1):
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one(
{'ref_interne': "E_DOCUMENT_SIGNATURE_CODE",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': str(local_partner_owner_recid)}
)
# contenu_doc_Template = jinja2.Template(str(courrier_template_data['contenu_doc']))
# sourceHtml = contenu_doc_Template.render(params=body["params"])
else:
courrier_template_model = MYSY_GV.dbname['courrier_template'].count_documents(
{'ref_interne': "E_DOCUMENT_SIGNATURE_CODE",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': "default"}
)
if (courrier_template_model == 1):
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one(
{'ref_interne': "E_DOCUMENT_SIGNATURE_CODE",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': "default"}
)
else:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Aucun modèle de document configuré pour envoyer les e-documents signés ")
return False, " Aucun modèle de document configuré pour envoyer les e-documents signés "
if ("contenu_doc" not in courrier_template_data.keys() or str(
courrier_template_data['contenu_doc']).strip() == ""):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le modèle de document ne contient pas de valeur 'contenu_doc' ")
return False, " Le modèle de document ne contient pas de valeur 'contenu_doc' "
"""
On est sur une fonction sans token, mais pour recuperer des infos en mode connecté comme le dictionnaire
je vais aller prendre le token du compte admin
"""
temp_admin_account = MYSY_GV.dbname['partnair_account'].find_one({'recid':str(local_partner_owner_recid),
'active':'1',
'is_partner_admin_account':'1',
'locked':'0'})
if( temp_admin_account is None ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Impossible de recupérer les données du partenaire ")
return False, " Impossible de recupérer les données du partenaire "
contenu_doc_Template = jinja2.Template(str(courrier_template_data['contenu_doc']))
# Creation du dictionnaire d'information à utiliser pour la creation du doc
convention_dictionnary_data = {}
new_diction = {}
new_diction['token'] = temp_admin_account['token']
new_diction['list_stagiaire_id'] = []
new_diction['list_session_id'] = []
new_diction['list_class_id'] = []
new_diction['list_client_id'] = []
new_diction['list_apprenant_id'] = []
local_status, local_retval = mycommon.Get_Dictionnary_data_For_Template(new_diction)
if (local_status is False):
return local_status, local_retval
convention_dictionnary_data = local_retval
convention_dictionnary_data["secret_key_signature"] = str(secret_key_for_sign)
body = {
"params": convention_dictionnary_data
}
html = contenu_doc_Template.render(params=body["params"])
html_mime = MIMEText(html, 'html')
@ -594,7 +650,7 @@ def Create_E_Signature_For_E_Document(diction):
str(inspect.stack()[0][3]) + " L'idientifiant du E-Document est invalide ")
return False, " L'idientifiant du E-Document est invalide "
local_partner_owner_recid = e_document_data['partner_owner_recid']
"""
@ -631,17 +687,50 @@ def Create_E_Signature_For_E_Document(diction):
with open(qr_code_img_file, "rb") as image2string:
qr_code_converted_string = base64.b64encode(image2string.read()).decode()
print(" ### qr_code_converted_string = ", qr_code_converted_string)
img_qr_code = "data:image/png;base64," + str(qr_code_converted_string)
print(" ### img_qr_code = ", img_qr_code)
"""
On est sur une fonction sans token, mais pour recuperer des infos en mode connecté comme le dictionnaire
je vais aller prendre le token du compte admin
"""
temp_admin_account = MYSY_GV.dbname['partnair_account'].find_one({'recid': str(local_partner_owner_recid),
'active': '1',
'is_partner_admin_account': '1',
'locked': '0'})
if (temp_admin_account is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Impossible de recupérer les données du partenaire ")
return False, " Impossible de recupérer les données du partenaire "
Create_E_Signature_For_E_Document
# Creation du dictionnaire d'information à utiliser pour la creation du doc
convention_dictionnary_data = {}
new_diction = {}
new_diction['token'] = temp_admin_account['token']
new_diction['list_stagiaire_id'] = []
new_diction['list_session_id'] = []
new_diction['list_class_id'] = []
new_diction['list_client_id'] = []
new_diction['list_apprenant_id'] = []
local_status, local_retval = mycommon.Get_Dictionnary_data_For_Template(new_diction)
if (local_status is False):
return local_status, local_retval
convention_dictionnary_data = local_retval
convention_dictionnary_data["mysy_signature_digitale"] = str(local_signature_digitale)
convention_dictionnary_data["mysy_url_securite"] = local_url_securite
convention_dictionnary_data["mysy_qrcode_securite"] = "data:image/png;base64," + qr_code_converted_string,
body = {
"params": {"mysy_signature_digitale":str(local_signature_digitale),
'mysy_url_securite':local_url_securite,
'mysy_qrcode_securite': "data:image/png;base64," + qr_code_converted_string,
}
"params": convention_dictionnary_data
}
source_data = str(e_document_data['source_document']) + "<div> cherifffffffff </div> <br/> <div> {{ mysy_url_securite }} </div> <br/> <div> &nbsp;</div>"
contenu_doc_Template = jinja2.Template(str(e_document_data['source_document']))
sourceHtml = contenu_doc_Template.render(params=body["params"])
@ -672,6 +761,7 @@ def Create_E_Signature_For_E_Document(diction):
'secret_key_signature': str(diction['secret_key_signature']),
'email_destinataire': str(diction['email_destinataire'])}
new_data = {}
new_data['document_data_signed'] = final_encoded_pdf_to_string
result = MYSY_GV.dbname['e_document_signe'].find_one_and_update(
@ -703,34 +793,95 @@ def Create_E_Signature_For_E_Document(diction):
new_node = {"attached_file": file_to_attache_to_mail}
tab_files_to_attache_to_mail.append(new_node)
html = """\
<html>
<body>
<br />
<div style="text-align: center;">
<nav style="text-align: center; font-weight: bold;">LOGO</nav>
<br />
<div style="text-align: center;">
<nav style="text-align: center; font-weight: bold;">SIGNATURE ELECTRONIQUE</nav>
<br />
</div>
</div>
<div>
Bonjour
</div>
<div >
Merci de trouver en pièce jointe le document signé electroniquement
<br>
</p>
Cordialement.
</div>
</body>
</html>
"""
Recupération du modele de courrier.
le principe est de prendre le module du partenaire. si pas de modele du partenaire on
prend le modele par default
"""
courrier_template_model = MYSY_GV.dbname['courrier_template'].count_documents(
{'ref_interne': "E_DOCUMENT_SIGNED",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': str(local_partner_owner_recid)}
)
if( courrier_template_model == 1 ):
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one(
{'ref_interne': "E_DOCUMENT_SIGNED",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': str(local_partner_owner_recid)}
)
else:
courrier_template_model = MYSY_GV.dbname['courrier_template'].count_documents(
{'ref_interne': "E_DOCUMENT_SIGNED",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': "default"}
)
if (courrier_template_model == 1):
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one(
{'ref_interne': "E_DOCUMENT_SIGNED",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': "default"}
)
else:
mycommon.myprint(str(inspect.stack()[0][3]) + " Aucun modèle de document configuré pour envoyer les e-documents signés ")
return False, " Aucun modèle de document configuré pour envoyer les e-documents signés "
if( "contenu_doc" not in courrier_template_data.keys() or str(courrier_template_data['contenu_doc']).strip() == ""):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le modèle de document ne contient pas de valeur 'contenu_doc' ")
return False, " Le modèle de document ne contient pas de valeur 'contenu_doc' "
contenu_doc_Template = jinja2.Template(str(courrier_template_data['contenu_doc']))
"""
On est sur une fonction sans token, mais pour recuperer des infos en mode connecté comme le dictionnaire
je vais aller prendre le token du compte admin
"""
temp_admin_account = MYSY_GV.dbname['partnair_account'].find_one({'recid': str(local_partner_owner_recid),
'active': '1',
'is_partner_admin_account': '1',
'locked': '0'})
if (temp_admin_account is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Impossible de recupérer les données du partenaire ")
return False, " Impossible de recupérer les données du partenaire "
# Creation du dictionnaire d'information à utiliser pour la creation du doc
convention_dictionnary_data = {}
new_diction = {}
new_diction['token'] = temp_admin_account['token']
new_diction['list_stagiaire_id'] = []
new_diction['list_session_id'] = []
new_diction['list_class_id'] = []
new_diction['list_client_id'] = []
new_diction['list_apprenant_id'] = []
local_status, local_retval = mycommon.Get_Dictionnary_data_For_Template(new_diction)
if (local_status is False):
return local_status, local_retval
convention_dictionnary_data = local_retval
body = {
"params": convention_dictionnary_data
}
html = contenu_doc_Template.render(params=body["params"])
html_mime = MIMEText(html, 'html')
# Creation de l'email à enoyer
msg = MIMEMultipart("alternative")
@ -912,7 +1063,7 @@ def Sent_E_Document_Signature_Request(diction):
"""
url_signature = MYSY_GV.CLIENT_URL_BASE+"E_Signature/"+str(e_document_data['_id'])
local_partner_owner_recid = e_document_data['partner_owner_recid']
"""
Recuperation des parametre SMTP du partner si le client a decidé d'utiliser son propre smpt
@ -966,40 +1117,84 @@ def Sent_E_Document_Signature_Request(diction):
# Creation de l'email à enoyer
msg = MIMEMultipart("alternative")
html = """\
<html>
<body>
<br />
<div style="text-align: center;">
<nav style="text-align: center; font-weight: bold;">LOGO</nav>
<br />
<div style="text-align: center;">
<nav style="text-align: center; font-weight: bold;">SIGNATURE ELECTRONIQUE</nav>
<br />
</div>
</div>
<div>
Bonjour
</div>
<div >
Cliquez sur le lien ci-dessous pour signer electroniquement le document : <br/>
""" + url_signature + """<br>
</p>
<p>
Le code d'ouverture du document est : """+ str(e_document_open_code) +"""
</p>
Cordialement.
</div>
</body>
</html>
"""
Recupération du modele de courrier.
le principe est de prendre le module du partenaire. si pas de modele du partenaire on
prend le modele par default
"""
courrier_template_model = MYSY_GV.dbname['courrier_template'].count_documents(
{'ref_interne': "E_DOCUMENT_SIGNATURE_REQUEST",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': str(local_partner_owner_recid)}
)
if (courrier_template_model == 1):
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one(
{'ref_interne': "E_DOCUMENT_SIGNATURE_REQUEST",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': str(local_partner_owner_recid)}
)
else:
courrier_template_model = MYSY_GV.dbname['courrier_template'].count_documents(
{'ref_interne': "E_DOCUMENT_SIGNATURE_REQUEST",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': "default"}
)
if (courrier_template_model == 1):
courrier_template_data = MYSY_GV.dbname['courrier_template'].find_one(
{'ref_interne': "E_DOCUMENT_SIGNATURE_REQUEST",
'valide': '1',
'locked': '0',
'type_doc': 'email',
'partner_owner_recid': "default"}
)
else:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Aucun modèle de document configuré pour envoyer les e-documents signés ")
return False, " Aucun modèle de document configuré pour envoyer les e-documents signés "
if ("contenu_doc" not in courrier_template_data.keys() or str(
courrier_template_data['contenu_doc']).strip() == ""):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le modèle de document ne contient pas de valeur 'contenu_doc' ")
return False, " Le modèle de document ne contient pas de valeur 'contenu_doc' "
contenu_doc_Template = jinja2.Template(str(courrier_template_data['contenu_doc']))
# Creation du dictionnaire d'information à utiliser pour la creation du doc
convention_dictionnary_data = {}
new_diction = {}
new_diction['token'] = diction['token']
new_diction['list_stagiaire_id'] = []
new_diction['list_session_id'] = []
new_diction['list_class_id'] = []
new_diction['list_client_id'] = []
new_diction['list_apprenant_id'] = []
local_status, local_retval = mycommon.Get_Dictionnary_data_For_Template(new_diction)
if (local_status is False):
return local_status, local_retval
convention_dictionnary_data = local_retval
convention_dictionnary_data["e_document_open_code"] = str(e_document_data['secret_key_open'])
convention_dictionnary_data["url_signature"] = str(url_signature)
body = {
"params": convention_dictionnary_data
}
html = contenu_doc_Template.render(params=body["params"])
html_mime = MIMEText(html, 'html')
#contenu_doc_Template = jinja2.Template(str(courrier_template_data['contenu_doc']))
#sourceHtml = contenu_doc_Template.render(params=body["params"])

File diff suppressed because one or more lines are too long