09/12/2022 - 19h00

master
cherif 2022-12-09 18:59:38 +01:00
parent b44cb928b8
commit e0f4fa3056
10 changed files with 4040 additions and 42 deletions

View File

@ -6,23 +6,12 @@
<change beforePath="$PROJECT_DIR$/GlobalVariable.py" beforeDir="false" afterPath="$PROJECT_DIR$/GlobalVariable.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$/Template/MySy_Create_PRO_account_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_Create_PRO_account_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_Create_User_account_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_Create_User_account_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_Demande_Info_Class_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_Demande_Info_Class_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_Invoice_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_Invoice_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_Sales_Order_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_Sales_Order_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_User_account_change_pwd_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_User_account_change_pwd_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_User_account_enabled_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_User_account_enabled_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_account_pro_enabled_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_account_pro_enabled_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/MySy_confirmation_inscription_formation_tpl.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/MySy_confirmation_inscription_formation_tpl.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Template/invoice.html" beforeDir="false" afterPath="$PROJECT_DIR$/Template/invoice.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Session_Formation.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation.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_factures_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/ela_factures_mgt.py" 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" />
<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$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -45,7 +34,7 @@
&quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/cheri/Documents/myclass.com/Siteweb/Production/Ela_back/MySy_Back_Office&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/cheri/Documents/myclass.com/Siteweb/Branche_design/Ela_back/Back_Office&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable&quot;
}
}</component>
@ -177,6 +166,11 @@
<line>251</line>
<option name="timeStamp" value="1" />
</line-breakpoint>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/Session_Formation.py</url>
<line>4</line>
<option name="timeStamp" value="2" />
</line-breakpoint>
</breakpoints>
</breakpoint-manager>
</component>

View File

@ -232,4 +232,10 @@ O365_SMTP_COUNT_port = 587
"""
Repertoire temporaire de telechargement ou de creation de fichier
"""
TEMPORARY_DIRECTORY = "./temp_direct"
TEMPORARY_DIRECTORY = "./temp_direct"
"""
Nombre maximum de participants importable par csv
"""
MAX_PARTICIPANT_BY_CSV = 50

View File

@ -772,4 +772,174 @@ def DownloadParticipantsList(diction):
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible d'envoyer la confirmation d'inscription"
return False, "Impossible d'envoyer la confirmation d'inscription"
""" Import des inscriptions en masse
Avec l'import d'un fichier csv
"""
def AddStagiairetoClass_mass(file=None, Folder=None, diction=None):
try:
'''
# Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés
# Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
# field_list.
'''
field_list = ['token','session_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, Creation formation annulée")
return False, " Verifier votre API"
'''
Une fois qu'on a controlé que toutes les clés mise dans l'API sont correcte. etape precedente,
On controle que les champs obligatoires sont presents dans la liste
'''
field_list_obligatoire = ['token', 'session_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, " Verifier votre API"
my_token = ""
if ("token" in diction.keys()):
if diction['token']:
my_token = diction['token']
session_id = ""
if ("session_id" in diction.keys()):
if diction['session_id']:
session_id = diction['session_id']
if(len(str(session_id).strip()) <= 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " La session de formation est vide : Impossible d'importer la liste des participants ")
return False, "la session de formation est incorrecte. Impossible d'importer la liste des participants"
partner_recid = mycommon.get_parnter_recid_from_token(my_token)
if (partner_recid is False):
mycommon.myprint(str(inspect.stack()[0][3]) + " - partner_recid KO : Impossible d'importer la liste des participants ")
return False, "les information de connexion sont incorrectes. Impossible d'importer la liste des participants"
status, saved_file = mycommon.Upload_Save_CSV_File(file, Folder)
if (status == False):
return False, "Impossible d'importer la liste des participants, le nom du fichier est incorrect "
#" Lecture du fichier "
#print(" Lecture du fichier : "+saved_file)
nb_line = 0
df = pd.read_csv(saved_file, encoding='utf8', on_bad_lines='skip', sep=';')
# Dictionnaire des champs utilisables
'''
# Verification que les noms des colonne sont bien corrects"
'''
field_list = ['prenom', 'nom', 'employeur', 'telephone', 'email', 'modefinancement',
'opco', 'status', 'prix']
# Controle du nombre de lignes dans le fichier.
total_rows = len(df)
if( total_rows > MYSY_GV.MAX_PARTICIPANT_BY_CSV ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " Le fichier comporte plus de "+str(MYSY_GV.MAX_PARTICIPANT_BY_CSV)+" lignes.")
return False, " Le fichier comporte plus de "+str(MYSY_GV.MAX_PARTICIPANT_BY_CSV)+" lignes."
#print(df.columns)
for val in df.columns:
if str(val).lower() not in field_list:
mycommon.myprint(
str(inspect.stack()[0][3])+" : entete du fichier csv. '" + val + "' n'est pas acceptée")
return False, " Entete du fichier csv. '" + val + "' n'est pas acceptée"
# Recuperation des info de la session.
session_data = MYSY_GV.dbname['session_formation'].find({'formation_session_id':str(session_id)})
if( session_data is None ):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " La session de formation n'existe pas : Impossible d'importer la liste des participants ")
return False, "la session de formation n'existe pas. Impossible d'importer la liste des participants"
x = range(0, total_rows)
for n in x:
mydata = {}
mydata['prenom'] = str(df['prenom'].values[n])
mydata['nom'] = str(df['nom'].values[n])
mydata['employeur'] = str(df['employeur'].values[n])
mydata['telephone'] = str(df['telephone'].values[n])
mydata['email'] = str(df['email'].values[n])
modefinancement = ""
if ("modefinancement" in df.keys()):
if (str(df['modefinancement'].values[n])):
modefinancement = str(df['modefinancement'].values[n])
mydata['modefinancement'] = modefinancement
opco = ""
if ("opco" in df.keys()):
if (str(df['opco'].values[n])):
opco = str(df['opco'].values[n])
mydata['opco'] = opco
local_status = str(df['status'].values[n]).strip()
if( local_status != "0" and local_status != "1" and local_status != "2"):
mycommon.myprint(
str(inspect.stack()[0][
3]) + " Le champs 'status' de ligne "+str(n)+" est incorrecte. les valeurs acceptées sont : 0,1,2")
return False, " Le champs 'status' de ligne "+str(n)+" est incorrecte. les valeurs acceptées sont : 0,1,2"
mydata['status'] = float(local_status)
local_price = str(df['prix'].values[n]).strip()
local_status, new_price = mycommon.IsFloat(local_price)
if( local_status is False ):
mycommon.myprint(
str(inspect.stack()[0][ 3]) + " Le champs 'prix' de ligne " + str( n) + " est incorrecte.")
return False, " Le champs status de ligne " + str(n) + " est incorrecte. "
mydata['price'] = local_price
mydata['session_id'] = str(session_data['formation_session_id'])
tab_date_du = str(session_data['date_debut']).split(" ")
mydata['date_du'] = str(tab_date_du[0])
tab_date_au = str(session_data['date_fin']).split(" ")
mydata['date_au'] = str(tab_date_au[0])
mydata['ville'] = str(session_data['ville'])
mydata['code_postal'] = str(session_data['code_postal'])
mydata['adresse'] = str(session_data['adresse'])
mydata['class_internal_url'] = str(session_data['class_internal_url'])
clean_dict = {k: mydata[k] for k in mydata if ( str(mydata[k]) != "nan") }
print( "#### clean_dict ", clean_dict)
"""status, retval = add_class(clean_dict)
if( status is False ):
return status, retval
"""
print(str(total_rows)+" formations ont été inserées")
return True, str(total_rows)+" formations ont été inserées / Mises à jour"
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
return False, "Impossible d'inserer les formation en masse "

File diff suppressed because one or more lines are too long

View File

@ -19,6 +19,7 @@ import GlobalVariable as MYSY_GV
from math import isnan
import GlobalVariable as MYSY_GV
from datetime import timedelta
from datetime import timedelta
"""
@ -266,14 +267,27 @@ def GetActiveSessionFormation_List(diction):
myquery['class_internal_url'] = class_internal_url
myquery['valide'] = "1"
myquery['session_status'] = "true"
#print(" ##### myquery = "+str(myquery))
RetObject = []
for retval in coll_session.find(myquery):
#print(" ##### retval = " + str(retval))
RetObject.append(mycommon.JSONEncoder().encode(retval))
local_tmp = retval
## Verification des conditions supplementaires :
# en realité c'est parce que c'est chaud de le faire avec pymongo
tmp_debut_inscritp = str(local_tmp['date_debut_inscription']).strip().split(" ")
tmp_fin_inscritp = str(local_tmp['date_fin_inscription']).strip().split(" ")
debut_inscr = datetime.strptime(str(tmp_debut_inscritp[0]).strip(), '%d/%m/%Y')
fin_inscr = datetime.strptime(str(tmp_fin_inscritp[0]).strip(), '%d/%m/%Y')
#print(" #### date_debut_inscription = ", debut_inscr, " date_fin_inscription = ", fin_inscr, " NOW = ",datetime.now())
if(debut_inscr <= datetime.now() and fin_inscr >= datetime.now()):
RetObject.append(mycommon.JSONEncoder().encode(retval))
#print("####RetObject = "+str(RetObject))
return True, RetObject

View File

@ -2486,18 +2486,83 @@ def add_class_mass(file=None, Folder=None, diction=None):
mydata['title'] = str(df['titre'].values[n])
mydata['domaine'] = str(df['domaine'].values[n])
mydata['description'] = str(df['description'].values[n])
mydata['trainer'] = str(df['formateur'].values[n])
mydata['institut_formation'] = str(df['institut_formation'].values[n])
#mydata['distantiel'] = str(df['presentiel'].values[n])
mydata['url'] = str(df['url'].values[n])
mydata['duration'] = float(str(df['duree'].values[n]))
mydata['plus_produit'] = str(df['plus_produit'].values[n])
mydata['mots_cle'] = str(df['mots_cle'].values[n])
mydata['presentiel'] = str(df['presentiel'].values[n])
mydata['distantiel'] = str(df['distantiel'].values[n])
mydata['price'] = str(df['prix'].values[n])
mydata['metier'] = str(df['metier'].values[n])
mydata['published'] = str(df['publie'].values[n])
formateur = ""
if ("formateur" in df.keys()):
if (str(df['formateur'].values[n])):
formateur = str(df['formateur'].values[n])
mydata['trainer'] = formateur
institut_formation = ""
if ("institut_formation" in df.keys()):
if (str(df['institut_formation'].values[n])):
institut_formation = str(df['institut_formation'].values[n])
mydata['institut_formation'] = institut_formation
#mydata['duration'] = float(str(df['duree'].values[n]))
url = ""
if ("url" in df.keys()):
if (str(df['url'].values[n])):
url = str(df['url'].values[n])
mydata['url'] = url
duration = 0
if ("duree" in df.keys()):
if (str(df['duree'].values[n])):
plus_produit = str(df['duree'].values[n])
mydata['duration'] = duration
plus_produit = ""
if ("plus_produit" in df.keys()):
if (str(df['plus_produit'].values[n])):
plus_produit = str(df['plus_produit'].values[n])
mydata['plus_produit'] = plus_produit
mots_cle = ""
if ("mots_cle" in df.keys()):
if (str(df['mots_cle'].values[n])):
presentiel = str(df['mots_cle'].values[n])
mydata['mots_cle'] = mots_cle
presentiel = "0"
if ("presentiel" in df.keys()):
if (str(df['presentiel'].values[n])):
presentiel = str(df['presentiel'].values[n])
mydata['presentiel'] = presentiel
distantiel = "0"
if ("distantiel" in df.keys()):
if (str(df['distantiel'].values[n])):
distantiel = str(df['distantiel'].values[n])
mydata['distantiel'] = distantiel
price = "0"
if ("prix" in df.keys()):
if (str(df['prix'].values[n])):
price = str(df['prix'].values[n])
mydata['price'] = price
metier = "1"
if ("metier" in df.keys()):
if (str(df['metier'].values[n])):
metier = str(df['metier'].values[n])
mydata['metier'] = metier
published = "1"
if ("published" in df.keys()):
if (str(df['published'].values[n])):
published = str(df['published'].values[n])
mydata['published'] = published
if ("cpf" in df.keys()):
if (str(df['cpf'].values[n])):
@ -2608,6 +2673,7 @@ def add_class_mass(file=None, Folder=None, diction=None):
return False, "Impossible d'inserer les formation en masse "
'''
Cette fonction retourne les formation par metier
- la thématique est defini par un nouveau champ appelé "metier"

View File

@ -1,5 +1,4 @@
,index,mots,occurence,moyenne,id_formation,source_field
0,0,framework,1,0.25,3IL_10004,keyword
1,1,php,1,0.25,3IL_10004,keyword
2,2,mobile,1,0.25,3IL_10004,keyword
3,3,p,1,0.25,3IL_10004,keyword
0,0,prise,1,0.33,3IL_10006,title
1,1,parole,1,0.33,3IL_10006,title
2,2,public,1,0.33,3IL_10006,title

1 index mots occurence moyenne id_formation source_field
2 0 0 framework prise 1 0.25 0.33 3IL_10004 3IL_10006 keyword title
3 1 1 php parole 1 0.25 0.33 3IL_10004 3IL_10006 keyword title
4 2 2 mobile public 1 0.25 0.33 3IL_10004 3IL_10006 keyword title
3 3 p 1 0.25 3IL_10004 keyword

View File

@ -1,5 +1,3 @@
mots occurence moyenne id_formation source_field
0 framework 1 0.25 3IL_10004 keyword
1 php 1 0.25 3IL_10004 keyword
2 mobile 1 0.25 3IL_10004 keyword
3 p 1 0.25 3IL_10004 keyword
Empty DataFrame
Columns: [mots, occurence, moyenne, id_formation, source_field]
Index: []

13
main.py
View File

@ -2077,6 +2077,19 @@ def DownloadParticipantsList(sessionid, token):
return local_file
"""
API d'import des stagaires en masse avec un fichier csv
"""
@app.route('/myclass/api/AddStagiairetoClass_mass/', methods=['POST','GET'])
@crossdomain(origin='*')
def AddStagiairetoClass_mass():
# On recupere le corps (payload) de la requete
payload = request.form.to_dict()
print(" ### AddStagiairetoClass_mass : payload = ",str(payload))
localStatus, message= inscription.AddStagiairetoClass_mass(payload)
return jsonify(status=localStatus, message=message )
if __name__ == '__main__':

View File

@ -450,6 +450,18 @@ def tryFloat(val):
except ValueError:
return 0
"""
Verifie si c'est un float.
returl status et la valeur
"""
def IsFloat(val):
try:
val = str(val).replace(",",".")
myfloat = float(val)
return True, myfloat
except ValueError:
return False, 0
'''
Check if string is Int and convert.