Ela_Back/articles_avis.py

376 lines
14 KiB
Python

'''
Cette class gere les avis et articles sur une formation.
'''
from pymongo import MongoClient
import pymongo
import json
from flask import Flask, request, jsonify
#from flask_mongoengine import MongoEngine
import json
from bson import ObjectId
import re
import numpy as np
import ela_index_bdd_classes as ela_index
import logging
from datetime import datetime
import prj_common as mycommon
import secrets
from pymongo import ReturnDocument
import inspect
import sys, os
import csv
import pandas as pd
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, ObjectId):
return str(o)
print(self)
print(o)
return json.JSONEncoder.default(self, o)
CONNECTION_STRING = "mongodb://localhost/cherifdb"
client = MongoClient(CONNECTION_STRING)
dbname = client['cherifdb']
'''
La taille maximal d'un champs à retourner.
Au dela de 300 caractère, le système rame
'''
MAX_CARACT = 300
'''
Recuperation des tous avis et commentaires
'''
def get_all_articles_avis(diction):
try:
# Dictionnaire des champs utilisables
field_list = ['token', 'user_ip', 'user_country_code', 'user_country_name', 'user_city',
'user_postal', 'user_latitude', 'user_longitude', 'user_state', 'search_text']
incom_keys = diction.keys()
'''
# 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.
'''
for val in incom_keys:
if str(val).lower() not in str(field_list).lower():
mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Impossible de recuperer les articles et avis"
coll_name = dbname['articles_avis']
val_tmp = 1
insertObject = []
for x in coll_name.find({'valide': '1', 'locked': '0'},
{"_id": 0, "indexed": 0, "indexed_desc": 0, "indexed_obj": 0, "indexed_title": 0,
"valide": 0, "locked": 0, "url_formation": 0, }).sort(
[("title_formation",pymongo.ASCENDING), ("date_avis",pymongo.ASCENDING)]):
# mycommon.myprint("AVANT ==> "+str(x['description']))
val = x['qualite']
if (len(x['qualite']) > MAX_CARACT):
x['qualite'] = val[:MAX_CARACT] + " ..."
else:
x['qualite'] = val[:MAX_CARACT]
val = x['avis']
if (len(x['avis']) > MAX_CARACT):
x['avis'] = val[:MAX_CARACT] + " ..."
else:
x['avis'] = val[:MAX_CARACT]
# mycommon.myprint("APRES ==> " + str(x['description']))
user = x
user['id'] = str(val_tmp)
insertObject.append(JSONEncoder().encode(user))
val_tmp = val_tmp + 1
#print(" getObject = ", str(insertObject))
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) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de recuperer les articles et avis"
'''
Cette API recupere et retourne un articles / avis
'''
def get_articles_avis(diction):
try:
# Dictionnaire des champs utilisables
field_list = ['token', 'title_formation', 'user_ip', 'user_country_code', 'user_country_name',
'user_city','user_postal', 'user_latitude', 'user_longitude', 'user_state']
incom_keys = diction.keys()
'''
# 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.
'''
for val in incom_keys:
if str(val).lower() not in str(field_list).lower():
mycommon.myprint(str(inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Impossible de recuperer l'articles/avis"
'''
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', 'title_formation']
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 l'articles/avis"
# Recuperation des parametres
mydata = {}
if ("user_ip" in diction.keys()):
if diction['user_ip']:
mydata['user_ip'] = diction['user_ip']
if ("user_country_code" in diction.keys()):
if diction['user_country_code']:
mydata['user_country_code'] = diction['user_country_code']
if ("user_country_name" in diction.keys()):
if diction['user_country_name']:
mydata['user_country_name'] = diction['user_country_name']
if ("user_city" in diction.keys()):
if diction['user_city']:
mydata['user_city'] = diction['user_city']
if ("user_postal" in diction.keys()):
if diction['user_postal']:
mydata['user_postal'] = diction['user_postal']
if ("user_latitude" in diction.keys()):
if diction['user_latitude']:
mydata['user_latitude'] = diction['user_latitude']
if ("user_longitude" in diction.keys()):
if diction['user_longitude']:
mydata['user_longitude'] = diction['user_longitude']
if ("user_state" in diction.keys()):
if diction['user_state']:
mydata['user_state'] = diction['user_state']
my_title_formation = ''
if ("title_formation" in diction.keys()):
if diction['title_formation']:
mydata['title_formation'] = diction['title_formation']
my_title_formation = diction['title_formation']
print(" My Data =" + str(mydata))
coll_name = dbname['articles_avis']
insertObject = []
for x in coll_name.find({'valide': '1', 'locked': '0', 'title_formation':my_title_formation},
{"_id": 0, "indexed": 0, "indexed_desc": 0, "indexed_obj": 0, "indexed_title": 0,
"valide": 0, "locked": 0, "url_formation": 0, }).sort([("title_formation",pymongo.ASCENDING), ("date_avis",pymongo.ASCENDING)]) :
user = x
insertObject.append(JSONEncoder().encode(user))
#print(" getObject = ", str(insertObject))
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) + " - Line : " + str(exc_tb.tb_lineno))
return False, " Impossible de recuperer l'article/avis"
'''
Cette fonction crée un articles avis, avec les element de traàabilité :
- user_recid,
- IP,
- etc
'''
def add_articles_avis(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 = ['token', 'title_formation', 'user_ip', 'user_country_code', 'user_country_name',
'user_city', 'user_postal', 'user_latitude', 'user_longitude', 'user_state',
'type_formation', 'qualite', 'avis', 'note',
'comment', 'postedby', 'url_formation', 'user_recid']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list:
mycommon.myprint(str(inspect.stack()[0][
3]) + " - Creation formation : 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 = ['title_formation', 'url_formation', 'token', 'avis', 'avis', 'user_ip',
'qualite', 'note']
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 les parametres de votre API"
'''
Verification si le token et l'email sont valident
'''
# recuperation des paramettre
mydata = {}
my_user_recid = 'None'
my_token = 'None'
if ("token" in diction.keys()):
if diction['token']:
my_token = diction['token']
# Verification de la validité du token
'''
Si un token est fourni, c'est que la personne est user connecté. on doit donc verifier la validé du token
si le token est vide, alors c'est un user en mode non connecté
'''
retval = mycommon.check_token_validity("", str(diction['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_user_recid_from_token(my_token)
if user_recid is False:
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de recuperer le recid de l'utilisateur")
return False, " Les informations d'identification sont incorrectes"
my_user_recid = user_recid
print(" ########### RECID = "+user_recid)
mydata['user_recid'] = my_user_recid
mydata['token'] = my_token
if ("title_formation" in diction.keys()):
if diction['title_formation']:
mydata['title_formation'] = diction['title_formation']
if ("user_ip" in diction.keys()):
if diction['user_ip']:
mydata['user_ip'] = diction['user_ip']
if ("user_country_code" in diction.keys()):
if diction['user_country_code']:
mydata['user_country_code'] = diction['user_country_code']
if ("user_country_name" in diction.keys()):
if diction['user_country_name']:
mydata['user_country_name'] = diction['user_country_name']
if ("user_city" in diction.keys()):
if diction['user_city']:
mydata['user_city'] = diction['user_city']
if ("user_postal" in diction.keys()):
if diction['user_postal']:
mydata['user_postal'] = diction['user_postal']
if ("user_latitude" in diction.keys()):
if diction['user_latitude']:
mydata['user_latitude'] = diction['user_latitude']
if ("user_longitude" in diction.keys()):
if diction['user_longitude']:
mydata['user_longitude'] = diction['user_longitude']
if ("user_state" in diction.keys()):
if diction['user_state']:
mydata['user_state'] = diction['user_state']
if ("type_formation" in diction.keys()):
if diction['type_formation']:
mydata['type_formation'] = diction['type_formation']
if ("qualite" in diction.keys()):
if diction['qualite']:
mydata['qualite'] = diction['qualite']
if ("avis" in diction.keys()):
if diction['avis']:
mydata['avis'] = diction['avis']
if ("note" in diction.keys()):
if diction['note']:
mydata['note'] = diction['note']
if ("comment" in diction.keys()):
if diction['comment']:
mydata['comment'] = diction['comment']
if ("postedby" in diction.keys()):
if diction['postedby']:
mydata['postedby'] = diction['postedby']
if ("url_formation" in diction.keys()):
if diction['url_formation']:
mydata['url_formation'] = diction['url_formation']
mydata['valide'] = '0'
mydata['locked'] = '1'
mydata['indexed'] = '0'
mydata['date_update'] = str(datetime.now())
mydata['date_avis'] = str(datetime.now())
print(mydata)
coll_name = dbname['articles_avis']
ret_val = coll_name.insert_one(mydata)
if (ret_val and ret_val.inserted_id):
nb_doc = str(ret_val.inserted_id)
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'article/avis a été bien ajouté =" + str(nb_doc))
return True, " L'article/avis a été bien ajouté"
else:
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible d'ajouter L'article/avis. "+str(mydata) )
return False, "Impossible d'ajouter L'article/avis "
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 créer l'article/avis"