25/09/2023 - 12h40

master
cherif 2023-09-25 12:42:03 +02:00
parent 152afbf49d
commit 951d495b91
8 changed files with 3004 additions and 20 deletions

View File

@ -1,8 +1,15 @@
<?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="22/09/2023 - 12h53">
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="22/09/2023 - 18h53">
<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$/class_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/class_mgt.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ela_index_bdd_classes.py" beforeDir="false" afterPath="$PROJECT_DIR$/ela_index_bdd_classes.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/partner_order.py" beforeDir="false" afterPath="$PROJECT_DIR$/partner_order.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -66,13 +73,6 @@
<option name="presentableId" value="Default" />
<updated>1680804787304</updated>
</task>
<task id="LOCAL-00060" summary="06/08/23 - 23h">
<created>1691356503671</created>
<option name="number" value="00060" />
<option name="presentableId" value="LOCAL-00060" />
<option name="project" value="LOCAL" />
<updated>1691356503671</updated>
</task>
<task id="LOCAL-00061" summary="08/08/2023 - 16h">
<created>1691504850587</created>
<option name="number" value="00061" />
@ -409,7 +409,14 @@
<option name="project" value="LOCAL" />
<updated>1695380023776</updated>
</task>
<option name="localTasksCounter" value="109" />
<task id="LOCAL-00109" summary="22/09/2023 - 18h53">
<created>1695401442385</created>
<option name="number" value="00109" />
<option name="presentableId" value="LOCAL-00109" />
<option name="project" value="LOCAL" />
<updated>1695401442386</updated>
</task>
<option name="localTasksCounter" value="110" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
@ -424,7 +431,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="26/08/23 - 20h" />
<MESSAGE value="27/08/23 - 13h" />
<MESSAGE value="27/08/23 - 22h" />
<MESSAGE value="28/08/23 - 13h30" />
@ -449,6 +455,7 @@
<MESSAGE value="15/09/2023 - 12h" />
<MESSAGE value="15/09/2023 - 18h" />
<MESSAGE value="22/09/2023 - 12h53" />
<option name="LAST_COMMIT_MESSAGE" value="22/09/2023 - 12h53" />
<MESSAGE value="22/09/2023 - 18h53" />
<option name="LAST_COMMIT_MESSAGE" value="22/09/2023 - 18h53" />
</component>
</project>

View File

@ -4623,7 +4623,7 @@ On y ajoute la formation concernée
"""
def Get_Statgaire_List_Partner_with_filter(diction):
try:
field_list = ['token', 'class_internal_url', 'code_session', 'status', 'email', 'nom', 'class_title', 'code_session']
field_list = ['token', 'class_internal_url', 'code_session', 'status', 'email', 'nom', 'class_title', 'code_session','client_nom']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
@ -4709,7 +4709,28 @@ def Get_Statgaire_List_Partner_with_filter(diction):
filt_class_partner_recid = {'partner_owner_recid': str(partner_recid)}
query = [{'$match':{ '$and' : [ filt_class_internal_url, filt_session_id, filt_email, filt_nom, {'partner_owner_recid':str(partner_recid)}] } },
# -----
filt_client_nom = {}
sub_filt_client_nom = {}
Lists_partner_client_id = []
if ("client_nom" in diction.keys()):
sub_filt_client_nom = {'nom': {'$regex': str(diction['client_nom']), "$options": "i"},
'partner_recid': str(partner_recid), 'valide': '1', 'locked': '0'}
# Recuperation des '_id' des clients dont le nom match en regexp
# print(" ### sub_filt_client_nom = ", sub_filt_client_nom)
for List_Client_Data in MYSY_GV.dbname['partner_client'].find(sub_filt_client_nom, {'_id': 1}):
Lists_partner_client_id.append(str(List_Client_Data['_id']))
filt_client_nom = {'client_rattachement_id': {'$in': Lists_partner_client_id, }}
# print(' ### filt_client_nom = ', filt_client_nom)
#----
query = [{'$match':{ '$and' : [ filt_class_internal_url, filt_session_id, filt_email, filt_nom, filt_client_nom, {'partner_owner_recid':str(partner_recid)}] } },
{'$lookup':
{
'from': 'myclass',

File diff suppressed because it is too large Load Diff

View File

@ -3794,6 +3794,7 @@ Cette fonction supprime definitivement une formation.
/!\ : Une formation n'est supprimable que si :
1 - Il n'y a aucune session à venir. toutes les sessions sont passée.
2 - Si il y a des sessions, alors impossible de la supprimer. Proposer plus tard la notion d'archivage
3 - Dans la suppression, aller supprimer les champs dans la collection "elaindex"
"""
def delete_Class(diction):
try:
@ -3881,6 +3882,11 @@ def delete_Class(diction):
if( delete_doc.deleted_count > 0 ):
return True, " La formation a été correctement supprimée"
else:
# Une formation a été supprimer, maintenant il faut supprimer les champs associés dans la collection "elaindex"
qry_elaindex_to_delete = {"partner_owner_recid":str(my_partner['recid']), "id_formation":str(Myclass_Data['external_code'])}
MYSY_GV.dbname['elaindex'].delete_many(qry_elaindex_to_delete)
return True, " Aucune formation supprimée"
except Exception as e:
@ -3889,3 +3895,109 @@ def delete_Class(diction):
return False, " Impossible de supprimer la formation "
"""
Cette fonction supprime definitivement une formation, en utilisant l'internal_url
/!\ : Une formation n'est supprimable que si :
1 - Il n'y a aucune session à venir. toutes les sessions sont passée.
2 - Si il y a des sessions, alors impossible de la supprimer. Proposer plus tard la notion d'archivage
3 - Dans la suppression, aller supprimer les champs dans la collection "elaindex"
"""
def delete_Class_by_internal_url(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'class_internal_url', ]
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', 'class_internal_url',]
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']
# Verifier la validité du token
local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction)
if (local_status is not True):
return local_status, my_partner
# Verifier qu'une seule formation sera supprimée
Myclass_Data_count = MYSY_GV.dbname['myclass'].count_documents({'internal_url': str(diction['class_internal_url']),
'partner_owner_recid': str(my_partner['recid'])})
if( Myclass_Data_count <= 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La formation est invalide ")
return False, " La formation est invalide ",
if( Myclass_Data_count > 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'identifiant fourni correspond à plusieurs formation. Suppression annulée ")
return False, " L'identifiant fourni correspond à plusieurs formation. Suppression annulée",
# Receprer le 'internal_url_"
Myclass_Data = MYSY_GV.dbname['myclass'].find_one({'internal_url': str(diction['class_internal_url']),
'partner_owner_recid':str(my_partner['recid'])})
if( Myclass_Data is None):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La formation est invalide ")
return False, " La formation est invalide ",
# Verifier qu'il n'y a pas de session associée à cette formation
existe_Session_count = MYSY_GV.dbname['session_formation'].count_documents({'class_internal_url':str(Myclass_Data['internal_url']),
'partner_owner_recid':str(my_partner['recid']),
'valide':'1'})
if( existe_Session_count > 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La formation a "+str(existe_Session_count)+" session(s) valide(s). Suppression impossible")
return False, " La formation a "+str(existe_Session_count)+" session(s) valide(s). Suppression impossible"
delete_doc = MYSY_GV.dbname['myclass'].delete_many({'_id':ObjectId(str(Myclass_Data['_id'])),
'partner_owner_recid':str(my_partner['recid'])})
if( delete_doc.deleted_count > 0 ):
return True, " La formation a été correctement supprimée"
else:
# Une formation a été supprimer, maintenant il faut supprimer les champs associés dans la collection "elaindex"
qry_elaindex_to_delete = {"partner_owner_recid":str(my_partner['recid']), "id_formation":str(Myclass_Data['external_code'])}
MYSY_GV.dbname['elaindex'].delete_many(qry_elaindex_to_delete)
return True, " Aucune formation supprimée"
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 supprimer la formation "

View File

@ -206,7 +206,7 @@ Pour chaque mot clé,
1 - Ajouter le mot dans la collection "word_not_stem" pour eviter les effets de traduction
2 - Ajouter les mot dans la collection "elaindex" avec une occurrence par defaut de 1000, source_field = 'keyword', moyanne = "1"
"""
def ela_index_class_key_word(external_code="", source_field = ""):
def ela_index_class_key_word(external_code="", source_field = "", partner_owner_recid=""):
try:
if( str(external_code).strip() == "" or str(source_field).strip() == "" ):
@ -233,7 +233,8 @@ def ela_index_class_key_word(external_code="", source_field = ""):
On supprimer les anciens mots indexé
"""
MYSY_GV.dbname['elaindex'].delete_many({ 'source_field': 'keyword',
'id_formation': str(local_class['external_code'])})
'id_formation': str(local_class['external_code']),
'partner_owner_recid':str(partner_owner_recid)})
MYSY_GV.dbname['word_not_stem'].delete_many({'id_formation': str(local_class['external_code'])})
@ -257,7 +258,8 @@ def ela_index_class_key_word(external_code="", source_field = ""):
# Ajouter les mot dans la collection "elaindex" avec une occurrence par defaut de 1000, source_field = 'keyword', moyanne = "1"
MYSY_GV.dbname['elaindex'].insert_one({'mots': str(val).strip().lower(), 'occurence': 1000,
'source_field':'keyword', 'moyenne':"1",
'id_formation':str(local_class['external_code'])})
'id_formation':str(local_class['external_code']),
'partner_owner_recid':str(partner_owner_recid)})

36
main.py
View File

@ -2132,7 +2132,7 @@ def RenseignementClass():
"""
Cette API permet de supprimer une formation si elle n'a aucune session
de formation valide
de formation valide. la fonction utilise l'_id
"""
@app.route('/myclass/api/delete_Class/', methods=['POST','GET'])
@crossdomain(origin='*')
@ -2143,6 +2143,21 @@ def delete_Class():
localStatus, message= cm.delete_Class(payload)
return jsonify(status=localStatus, message=message )
"""
Cette API permet de supprimer une formation si elle n'a aucune session
de formation valide. la fonction utilise l'internal_url
"""
@app.route('/myclass/api/delete_Class_by_internal_url/', methods=['POST','GET'])
@crossdomain(origin='*')
def delete_Class_by_internal_url():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### delete_Class_by_internal_url : payload = ",str(payload))
localStatus, message= cm.delete_Class_by_internal_url(payload)
return jsonify(status=localStatus, message=message )
"""
API d'envoi de la liste d'emargement
@ -3529,6 +3544,25 @@ def Get_Given_Partner_Client():
return jsonify(status=localStatus, message=message)
"""
API de suppression d'un client
Avant il faut verifier :
1 - pas de stagiaire associé
2 - Pas de devis associé
3 - Pas de commande associé
"""
@app.route('/myclass/api/Delete_Given_Partner_Client/', methods=['POST','GET'])
@crossdomain(origin='*')
def Delete_Given_Partner_Client():
# On recupere le corps (payload) de la requete
payload = mycommon.strip_dictionary (request.form.to_dict())
print(" ### Delete_Given_Partner_Client : payload = ",payload)
localStatus, message = partner_client.Delete_Given_Partner_Client(payload)
return jsonify(status=localStatus, message=message)
"""
API qui permet de modifier un contact donnée (nested list) d'un client de partenaire
"""

View File

@ -1061,4 +1061,103 @@ def Add_Partner_Client_mass(file=None, Folder=None, diction=None):
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 d'importer les client en masse "
return False, " Impossible d'importer les client en masse "
"""
Cette fonction supprime un client.
Avant il faut verifier :
1 - pas de stagiaire associé
2 - Pas de devis associé
3 - Pas de commande associé
"""
def Delete_Given_Partner_Client(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', '_id']
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','_id' ]
for val in field_list_obligatoire:
if val not in diction:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
return False, " 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
# Verification de la validé du client
is_existe_client_count = MYSY_GV.dbname['partner_client'].count_documents({'_id':ObjectId(str(diction['_id'])), 'partner_recid':str(my_partner['recid'])})
if( is_existe_client_count <= 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Le client n'est pas valide ")
return False, " - Le client n'est pas valide ",
if (is_existe_client_count > 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Plusieurs clients ont le même identifiant. Suppression annulée")
return False, " - Plusieurs clients ont le même identifiant. Suppression annulée",
# Verifier qu'il n'y pas de stagiaire associé
is_Stagiaire_Count = MYSY_GV.dbname['inscription'].count_documents({'client_rattachement_id':str(diction['_id']),
'partner_owner_recid':str(my_partner['recid']),
'valide':'1'})
if( is_Stagiaire_Count > 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Le client a "+str(is_Stagiaire_Count)+" stagiaire(s) valide(s). Suppression annulée ")
return False, " - Le client a "+str(is_Stagiaire_Count)+" stagiaire(s) valide(s). Suppression annulée ",
# Verifier qu'il n'y pas de devis ou commande associé
is_devis_cmd_Count = MYSY_GV.dbname['partner_order_header'].count_documents(
{'order_header_client_id': str(diction['_id']),
'partner_owner_recid': str(my_partner['recid']),
'valide': '1'})
if (is_devis_cmd_Count > 0):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - Le client a " + str(
is_devis_cmd_Count) + " commande(s) ou devis valide(s). Suppression annulée ")
return False, " - Le client a " + str(
is_devis_cmd_Count) + " commande(s) ou devis valide(s). Suppression annulée"
# Supression à faire
MYSY_GV.dbname['partner_client'].delete_one({'_id':ObjectId(str(diction['_id'])), 'partner_recid':str(my_partner['recid'])})
return True, "La suppression du client a été correctement faite."
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de supprimer le client "

View File

@ -431,12 +431,25 @@ def Add_Partner_Order(diction):
"""
### 1 - Creation de l'entete
"""
/!\ Update du 24/09/2023 :
Si on ne trouve pas une sequence propre au partenaire (partner_owner_recid), alors on va chercher
la sequence par defaut dont partner_owner_recid = 'default'
"""
# Rcuperation de la sequence de l'objet "lms_user_id" dans la collection : "mysy_sequence"
# Rcuperation de la sequence de l'objet "partner_order_header" dans la collection : "mysy_sequence"
retval_sequence_order = MYSY_GV.dbname['mysy_sequence'].find_one({'related_mysy_object': 'partner_order_header',
'valide': '1', 'partner_owner_recid':str(my_partner['recid'])})
if (retval_sequence_order is None):
# Il n'y pas de sequence pour le partenaire, on va aller chercher la sequence par defaut
retval_sequence_order = MYSY_GV.dbname['mysy_sequence'].find_one(
{'related_mysy_object': 'partner_order_header',
'valide': '1', 'partner_owner_recid': 'default'})
if (retval_sequence_order is None or "current_val" not in retval_sequence_order.keys()):
# Il n'y aucune sequence meme par defaut.
mycommon.myprint(" Impossible de récupérer la sequence 'retval_sequence_order' ")
return False, "Impossible de récupérer la sequence 'retval_sequence_order'", False
@ -904,12 +917,26 @@ def Add_Partner_Quotation(diction):
### 1 - Creation de l'entete
# Rcuperation de la sequence de l'objet "lms_user_id" dans la collection : "mysy_sequence"
# Rcuperation de la sequence de l'objet "partner_quotation_header" dans la collection : "mysy_sequence"
"""
/!\ Update du 24/09/2023 :
Si on ne trouve pas une sequence propre au partenaire (partner_owner_recid), alors on va chercher
la sequence par defaut dont partner_owner_recid = 'default'
"""
retval_sequence_order = MYSY_GV.dbname['mysy_sequence'].find_one({'related_mysy_object': 'partner_quotation_header',
'valide': '1', 'partner_owner_recid': str(
my_partner['recid'])})
if( retval_sequence_order is None ):
# Il n'y pas de sequence pour le partenaire, on va aller chercher la sequence par defaut
retval_sequence_order = MYSY_GV.dbname['mysy_sequence'].find_one(
{'related_mysy_object': 'partner_quotation_header',
'valide': '1', 'partner_owner_recid': 'default'})
if (retval_sequence_order is None or "current_val" not in retval_sequence_order.keys()):
# Il n'y a aucune sequence, meme par defaut.
mycommon.myprint(" Impossible de récupérer la sequence 'retval_sequence_order' ")
return False, "Impossible de récupérer la sequence 'retval_sequence_order'", False