15/09/22 - 15h00
parent
98847be9d5
commit
f8e60897ba
162
class_mgt.py
162
class_mgt.py
|
@ -1705,6 +1705,168 @@ def get_partner_class(diction):
|
||||||
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e)+" - Line : "+ str(exc_tb.tb_lineno) )
|
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e)+" - Line : "+ str(exc_tb.tb_lineno) )
|
||||||
return False, " Impossible de recuperer la formation"
|
return False, " Impossible de recuperer la formation"
|
||||||
|
|
||||||
|
"""
|
||||||
|
Cette fonction retrourne
|
||||||
|
- le code externe,
|
||||||
|
- internal_url
|
||||||
|
des formations d'un partner
|
||||||
|
"""
|
||||||
|
|
||||||
|
def get_partner_class_external_code(diction):
|
||||||
|
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 = ['internal_url', 'token', 'title', 'valide', 'locked', 'external_code']
|
||||||
|
incom_keys = diction.keys()
|
||||||
|
for val in incom_keys:
|
||||||
|
if val not in field_list:
|
||||||
|
mycommon.myprint(str(inspect.stack()[0][
|
||||||
|
3]) + " - get_partner_class : Le champ '" + val + "' n'existe pas, Creation formation annulée")
|
||||||
|
return False, " Impossible de recuperer la formation"
|
||||||
|
|
||||||
|
'''
|
||||||
|
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']
|
||||||
|
|
||||||
|
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, " Impossible de recuperer la formation"
|
||||||
|
|
||||||
|
# recuperation des paramettre
|
||||||
|
mydata = {}
|
||||||
|
my_external_code = ""
|
||||||
|
my_token = ""
|
||||||
|
my_internal_url = ""
|
||||||
|
|
||||||
|
if ("internal_url" in diction.keys()):
|
||||||
|
if diction['internal_url']:
|
||||||
|
my_internal_url = diction['internal_url']
|
||||||
|
|
||||||
|
if ("external_code" in diction.keys()):
|
||||||
|
if diction['external_code']:
|
||||||
|
my_external_code = diction['external_code']
|
||||||
|
|
||||||
|
if ("token" in diction.keys()):
|
||||||
|
if diction['token']:
|
||||||
|
my_token = diction['token']
|
||||||
|
|
||||||
|
'''
|
||||||
|
Gestion des filters.
|
||||||
|
'''
|
||||||
|
|
||||||
|
internal_url_crit = {}
|
||||||
|
if ("internal_url" in diction.keys()):
|
||||||
|
if diction['internal_url']:
|
||||||
|
internal_url_crit['internal_url'] = diction['internal_url']
|
||||||
|
|
||||||
|
external_code_crit = {}
|
||||||
|
if ("external_code" in diction.keys()):
|
||||||
|
if diction['external_code']:
|
||||||
|
external_code_crit['external_code'] = diction['external_code']
|
||||||
|
|
||||||
|
title_crit = {}
|
||||||
|
if ("title" in diction.keys()):
|
||||||
|
if diction['title']:
|
||||||
|
title_crit['title'] = diction['title']
|
||||||
|
|
||||||
|
coll_name = MYSY_GV.dbname['myclass']
|
||||||
|
|
||||||
|
# verifier que le token et l'email sont ok
|
||||||
|
coll_token = MYSY_GV.dbname['user_token']
|
||||||
|
|
||||||
|
# Verification de la validité du token dans le cas des user en mode connecté
|
||||||
|
'''
|
||||||
|
/!\ Important : le token ne doit jamais etre vide car cette fonction a pour objectif
|
||||||
|
de retourner les formation edité par un partenaire.
|
||||||
|
|
||||||
|
Il dont obligatoirement est en mode connecté
|
||||||
|
'''
|
||||||
|
|
||||||
|
user_recid = "None"
|
||||||
|
# Verification de la validité du token/mail dans le cas des user en mode connecté
|
||||||
|
if (len(str(my_token)) > 0):
|
||||||
|
retval = mycommon.check_partner_token_validity("", my_token)
|
||||||
|
|
||||||
|
if retval is False:
|
||||||
|
mycommon.myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide")
|
||||||
|
return False, " Impossible de recuperer la formation"
|
||||||
|
|
||||||
|
# Recuperation du recid de l'utilisateur
|
||||||
|
user_recid = mycommon.get_parnter_recid_from_token(my_token)
|
||||||
|
if user_recid is False:
|
||||||
|
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le token de l'utilisateur")
|
||||||
|
return False, " Impossible de recuperer la formation"
|
||||||
|
|
||||||
|
if (len(str(my_token)) <= 0):
|
||||||
|
mycommon.myprint(str(inspect.stack()[0][3]) + " - Le token est vide")
|
||||||
|
return False, " Impossible de recuperer la formation"
|
||||||
|
|
||||||
|
RetObject = []
|
||||||
|
filt_external_code = {}
|
||||||
|
if ("external_code" in diction.keys()):
|
||||||
|
filt_external_code = {'external_code': str(diction['external_code'])}
|
||||||
|
# print(" GRRRRRRRRRRRRR "+str(filt_external_code))
|
||||||
|
|
||||||
|
filt_title = {}
|
||||||
|
if ("title" in diction.keys()):
|
||||||
|
filt_title = {'title': {'$regex': str(diction['title'])}}
|
||||||
|
|
||||||
|
filt_internal_url = {}
|
||||||
|
if ("internal_url" in diction.keys()):
|
||||||
|
filt_internal_url = {'internal_url': {'$regex': str(diction['internal_url'])}}
|
||||||
|
# print(" filt_internal_url GRRRRRRRRRRRRRRRRRRRRrr "+str(filt_internal_url))
|
||||||
|
|
||||||
|
print(
|
||||||
|
" ATTTTENNTION : GESTION DU CAS OU LA PERSONNE QUI CHERCHE LE COURS EST UN UTILISATEUR : PB avec : partner_owner_recid ")
|
||||||
|
print(" #### avant requete get partner_owner_recid =" + str(user_recid) +
|
||||||
|
" filt_external_code = " + str(filt_external_code) +
|
||||||
|
" filt_internal_url = " + str(filt_internal_url) +
|
||||||
|
" filt_title = " + str(filt_title))
|
||||||
|
|
||||||
|
val_tmp = 1
|
||||||
|
for retVal in coll_name.find({"$and": [{'valide': '1'}, {'locked': '0'},
|
||||||
|
{'partner_owner_recid': user_recid},
|
||||||
|
filt_external_code, filt_title, filt_internal_url]},
|
||||||
|
{'external_code':1, 'internal_url':1},
|
||||||
|
).sort([("external_code",pymongo.ASCENDING),]):
|
||||||
|
# mycommon.myprint(str(retVal))
|
||||||
|
user = retVal
|
||||||
|
user['id'] = str(val_tmp)
|
||||||
|
|
||||||
|
'''
|
||||||
|
Pour des facilité d'affichage coté front
|
||||||
|
on va reformater le champ "zone_diffusion" de sorte à le renvoyer
|
||||||
|
sous la forme "code_pays-ville"
|
||||||
|
'''
|
||||||
|
i = 0
|
||||||
|
tmp_zone_diffusion = ""
|
||||||
|
if ("zone_diffusion" in user.keys()):
|
||||||
|
if (user['zone_diffusion'] and user['zone_diffusion']["city"]):
|
||||||
|
for tmp_val in user['zone_diffusion']["city"]:
|
||||||
|
tmp_zone_diffusion = tmp_zone_diffusion + str(user['zone_diffusion']["country"][i]) + "-" + str(
|
||||||
|
user['zone_diffusion']["city"][i]) + ";"
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
user['zone_diffusion_str'] = str(tmp_zone_diffusion[:-1])
|
||||||
|
RetObject.append(JSONEncoder().encode(user))
|
||||||
|
val_tmp = val_tmp + 1
|
||||||
|
|
||||||
|
# print(str(RetObject))
|
||||||
|
return True, RetObject
|
||||||
|
|
||||||
|
|
||||||
|
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 recuperer la formation"
|
||||||
|
|
||||||
|
|
||||||
def get_class_global_search(search_string):
|
def get_class_global_search(search_string):
|
||||||
|
|
29
main.py
29
main.py
|
@ -287,11 +287,25 @@ def get_partner_class():
|
||||||
# On recupere le corps (payload) de la requete
|
# On recupere le corps (payload) de la requete
|
||||||
payload = request.form.to_dict()
|
payload = request.form.to_dict()
|
||||||
print(" ### payload = ",str(payload)+" IP requester = "+str(request.remote_addr))
|
print(" ### payload = ",str(payload)+" IP requester = "+str(request.remote_addr))
|
||||||
|
|
||||||
status, retval = cm.get_partner_class(payload)
|
status, retval = cm.get_partner_class(payload)
|
||||||
return jsonify(status=status, message=retval)
|
return jsonify(status=status, message=retval)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Cette API retourne le code externe de toutes les formations
|
||||||
|
d'un partenaire
|
||||||
|
"""
|
||||||
|
@app.route('/myclass/api/get_partner_class_external_code/', methods=['POST','GET'])
|
||||||
|
@crossdomain(origin='*')
|
||||||
|
def get_partner_class_external_code():
|
||||||
|
# On recupere le corps (payload) de la requete
|
||||||
|
payload = request.form.to_dict()
|
||||||
|
print(" ### payload = ",str(payload)+" IP requester = "+str(request.remote_addr))
|
||||||
|
status, retval = cm.get_partner_class_external_code(payload)
|
||||||
|
return jsonify(status=status, message=retval)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/myclass/api/update_class/', methods=['POST'])
|
@app.route('/myclass/api/update_class/', methods=['POST'])
|
||||||
@crossdomain(origin='*')
|
@crossdomain(origin='*')
|
||||||
|
@ -1426,6 +1440,19 @@ def Get_X_Best_Class_On_Given_period():
|
||||||
return jsonify(status=status, message=message)
|
return jsonify(status=status, message=message)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Cette API retour les statistiques d'une formation données
|
||||||
|
"""
|
||||||
|
@app.route('/myclass/api/GetStat_class_by_internal_url/', methods=['GET','POST'])
|
||||||
|
@crossdomain(origin='*')
|
||||||
|
def GetStat_class_by_internal_url():
|
||||||
|
# On recupere le corps (payload) de la requete
|
||||||
|
payload = request.form.to_dict()
|
||||||
|
print(" ### payload = ", str(payload))
|
||||||
|
status, message = Stat.GetStat_class_by_internal_url(payload)
|
||||||
|
return jsonify(status=status, message=message)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/myclass/api/test_return/', methods=['GET','POST'])
|
@app.route('/myclass/api/test_return/', methods=['GET','POST'])
|
||||||
@crossdomain(origin='*')
|
@crossdomain(origin='*')
|
||||||
def test_return():
|
def test_return():
|
||||||
|
|
197
statistics.py
197
statistics.py
|
@ -339,6 +339,11 @@ def GetStat_class_view_topX(diction):
|
||||||
categories_val = categories_val+str(day_before)+","
|
categories_val = categories_val+str(day_before)+","
|
||||||
print(" day_before DATE = " + str(day_before)+ " VS "+str(new_from_date))
|
print(" day_before DATE = " + str(day_before)+ " VS "+str(new_from_date))
|
||||||
|
|
||||||
|
if(categories_val.endswith(',') ):
|
||||||
|
categories_val = categories_val[:-1]
|
||||||
|
|
||||||
|
print(" categories_val = "+categories_val)
|
||||||
|
|
||||||
categories['categories'] = str(categories_val)
|
categories['categories'] = str(categories_val)
|
||||||
# Verification de la validité du token
|
# Verification de la validité du token
|
||||||
'''
|
'''
|
||||||
|
@ -594,3 +599,195 @@ def test_return():
|
||||||
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
|
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
|
||||||
return False, "Impossible de test_return"
|
return False, "Impossible de test_return"
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Cette fonction retourne les statistiques d'une formation données
|
||||||
|
"""
|
||||||
|
|
||||||
|
def GetStat_class_by_internal_url(diction):
|
||||||
|
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 = ['external_code', 'internal_url', 'zone_diffusion', 'metier', 'date_lieu',
|
||||||
|
'published', 'token', 'date_start', 'date_end']
|
||||||
|
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'est pas autorisé, 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', '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, " Verifier votre API"
|
||||||
|
|
||||||
|
'''
|
||||||
|
Verification si le token et l'email sont valident
|
||||||
|
'''
|
||||||
|
|
||||||
|
# recuperation des paramettre
|
||||||
|
mydata = {}
|
||||||
|
|
||||||
|
|
||||||
|
if ("token" in diction.keys()):
|
||||||
|
if diction['token']:
|
||||||
|
mydata['token'] = diction['token']
|
||||||
|
|
||||||
|
date_start = ""
|
||||||
|
if ("date_start" in diction.keys()):
|
||||||
|
if diction['date_start']:
|
||||||
|
date_start = diction['date_start']
|
||||||
|
|
||||||
|
date_end = ""
|
||||||
|
if ("date_end" in diction.keys()):
|
||||||
|
if diction['date_end']:
|
||||||
|
date_end = diction['date_end']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
local_status, try_end_date = mycommon.TryToDateYYYMMDD(str(diction['date_end']))
|
||||||
|
new_end_date = try_end_date.date()
|
||||||
|
|
||||||
|
|
||||||
|
local_status, try_from_date = mycommon.TryToDateYYYMMDD(str(diction['date_start']))
|
||||||
|
new_from_date = try_from_date.date()
|
||||||
|
|
||||||
|
day_before = new_end_date - timedelta(days=0)
|
||||||
|
tmp = 0
|
||||||
|
|
||||||
|
categories = {}
|
||||||
|
categories_val = ""
|
||||||
|
while ( tmp > -10 and str(day_before) != str(new_from_date) ) :
|
||||||
|
tmp = tmp - 1
|
||||||
|
day_before = new_end_date + timedelta(days=tmp)
|
||||||
|
categories_val = categories_val+str(day_before)+","
|
||||||
|
print(" day_before DATE = " + str(day_before)+ " VS "+str(new_from_date))
|
||||||
|
|
||||||
|
if(categories_val.endswith(',') ):
|
||||||
|
categories_val = categories_val[:-1]
|
||||||
|
|
||||||
|
print(" categories_val = "+categories_val)
|
||||||
|
|
||||||
|
categories['categories'] = str(categories_val)
|
||||||
|
# Verification de la validité du token
|
||||||
|
'''
|
||||||
|
Important : pour créer une formation, il faut obligatoirement avoir un token.
|
||||||
|
PAS DE CREATION DE FORMATION EN MODE NON CONNECTE.
|
||||||
|
|
||||||
|
CONCERNANT LES CREEES PAR NOS SYSTEME AUTOMATIQUE, IL FAUDRA LEUR PASSER UNE VALEUR MALGRE TOUT
|
||||||
|
|
||||||
|
'''
|
||||||
|
retval = mycommon.check_partner_token_validity("", str(mydata['token']))
|
||||||
|
|
||||||
|
if retval is False:
|
||||||
|
mycommon.myprint(str(inspect.stack()[0][3]) + " - Le token n'est pas valide")
|
||||||
|
return False, "L'email ou le token ne sont pas valident"
|
||||||
|
|
||||||
|
# Recuperation du recid du partenaire
|
||||||
|
user_recid = mycommon.get_parnter_recid_from_token(str(mydata['token']))
|
||||||
|
if user_recid is False:
|
||||||
|
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le recid du partenaire")
|
||||||
|
return False, " Les informations d'identification sont incorrectes"
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Recuperation des id (internal_url) des formations
|
||||||
|
"""
|
||||||
|
liste_formation = []
|
||||||
|
myinternal_url = ""
|
||||||
|
if ("internal_url" in diction.keys()):
|
||||||
|
if diction['internal_url']:
|
||||||
|
myinternal_url = diction['internal_url']
|
||||||
|
liste_formation.append(str(myinternal_url))
|
||||||
|
|
||||||
|
# collection
|
||||||
|
collection = MYSY_GV.dbname["user_recherche_result"]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Pour avoir une requete qui groupe par jour, ou jour-heure
|
||||||
|
on doit jouer avec le
|
||||||
|
"date" : { $substr: [ "$date_update", 0, 25 ] } ==> ou 25 et la largeur de la coupure,
|
||||||
|
"""
|
||||||
|
|
||||||
|
thisweek = datetime.today() - timedelta(days=0)
|
||||||
|
thisweek_format = thisweek.strftime('%Y-%m-%d')
|
||||||
|
|
||||||
|
QUERY_BY = "jour"
|
||||||
|
SUBSTR = 0
|
||||||
|
|
||||||
|
if (QUERY_BY == 'heure'):
|
||||||
|
SUBSTR = 13
|
||||||
|
elif (QUERY_BY == 'jour'):
|
||||||
|
SUBSTR = 10
|
||||||
|
elif (QUERY_BY == 'mois'):
|
||||||
|
SUBSTR = 7
|
||||||
|
|
||||||
|
pipe2 = [
|
||||||
|
{'$match': {'date_update' : { '$gte' : str(date_start), '$lte' : str(date_end)},
|
||||||
|
'token':str(mydata['token']),
|
||||||
|
'internal_url': {'$in': liste_formation},
|
||||||
|
}},
|
||||||
|
{
|
||||||
|
'$group': {
|
||||||
|
'_id': {
|
||||||
|
"Date_view": {"$substr": ["$date_update", 0, SUBSTR]},
|
||||||
|
"INTERNAL URL": "$internal_url",
|
||||||
|
"OWNER": "$owner",
|
||||||
|
|
||||||
|
},
|
||||||
|
'count': {'$count': {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$sort": {"_id": 1}
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
print(" PIP 2 ="+str(pipe2))
|
||||||
|
for result in collection.aggregate(pipe2):
|
||||||
|
print(str(result['_id']) + " ===> " + str(result['count']))
|
||||||
|
|
||||||
|
|
||||||
|
insertObject = []
|
||||||
|
i = 0
|
||||||
|
for tmp in liste_formation :
|
||||||
|
i = i +1
|
||||||
|
print(" Traitement de "+str(tmp))
|
||||||
|
ret_val = {}
|
||||||
|
ret_val['name'+str(i)] = tmp
|
||||||
|
name = tmp
|
||||||
|
tab_valeur = []
|
||||||
|
for result in collection.aggregate(pipe2):
|
||||||
|
print(str(result['_id'])+" ===> "+str(result['count']))
|
||||||
|
if( name in result['_id']['INTERNAL URL']):
|
||||||
|
print(" OKKKKKKKKKKKKKKKKKKKK ")
|
||||||
|
tab_valeur.append(str(result['count']))
|
||||||
|
|
||||||
|
ret_val['data'+str(i)] = tab_valeur
|
||||||
|
print(" valll = "+str(ret_val))
|
||||||
|
insertObject.append(JSONEncoder().encode(ret_val))
|
||||||
|
|
||||||
|
insertObject.append(JSONEncoder().encode(categories))
|
||||||
|
|
||||||
|
# print(result)
|
||||||
|
|
||||||
|
return True, insertObject
|
||||||
|
|
||||||
|
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 de recuperer les stat"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue