Elyos_FI_Back_Office/user_access_right.py

459 lines
17 KiB
Python

"""
Ce fichier permet de gerer les droits d'acces des utilisateur au systeme
"""
import pymongo
from pymongo import MongoClient
import json
from bson import ObjectId
import re
from datetime import datetime
import prj_common as mycommon
import secrets
import inspect
import sys, os
import csv
import pandas as pd
from pymongo import ReturnDocument
import GlobalVariable as MYSY_GV
from math import isnan
import GlobalVariable as MYSY_GV
import ela_index_bdd_classes as eibdd
import email_mgt as email
import ast
"""
Ajouter & mise jour des acces d'un user
Cette fonction prend :
- token
- user_id (collection employee_id)
- tab_access ==> Tableau des droit d'acces
==> [{module_name: 'val', 'read':val, 'write':val}, {module_name: 'val', 'read':val, 'write':val}, ...]
"""
def Add_Update_User_Access_Right(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'user_id', 'tab_access']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'user_id', 'tab_access' ]
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 validide du user_id
is_user_existe_count = MYSY_GV.dbname['ressource_humaine'].count_documents({'_id':ObjectId(str(diction['user_id'])),
'partner_recid':str(my_partner['recid']),
'valide':'1',
'locked':'0'})
if( is_user_existe_count <= 0 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'utilisateur est invalide ")
return False, " L'utilisateur est invalide ",
rh_id_data = MYSY_GV.dbname['ressource_humaine'].find_one(
{'_id': ObjectId(str(diction['user_id'])),
'partner_recid': str(my_partner['recid']),
'valide': '1',
'locked': '0'})
if( is_user_existe_count > 1 ):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - L'identifiant utilisateur correspond à plusieurs personnes")
return False, "L'identifiant utilisateur correspond à plusieurs personnes ",
tab_access_data = diction['tab_access']
tab_access_data = str(tab_access_data).replace("false", '"false"').replace("true", '"true"')
tab_access_data = str(tab_access_data).replace('""false""', '"false"').replace('""true""', '"true"')
tab_access = ast.literal_eval(tab_access_data)
# Process de verification des infos d'acces
for module_access in tab_access:
if( "module_name" in module_access.keys() and "read" in module_access.keys() and "write" in module_access.keys() ):
if( str(module_access['read']).lower().strip() not in ['true', 'false'] or str(module_access['write']).lower().strip() not in ['true', 'false']):
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La matrice des droits est incorrecte (2) - Les champs 'read' et 'write' ne sont pas boolean")
return False, "La matrice des droits est incorrecte (2).Les champs 'read' et 'write' ne sont pas boolean",
if( MYSY_GV.dbname['application_modules'].count_documents({'module_name':module_access['module_name']}) != 1 ):
mycommon.myprint( str(inspect.stack()[0][3]) + " - Module "+str(module_access['module_name'])+" metier inconnue ")
return False, "Module "+str(module_access['module_name'])+" metier inconnue ",
else:
mycommon.myprint(
str(inspect.stack()[0][3]) + " - La matrice des droits est incorrecte")
return False, "La matrice des droits est incorrecte ",
#print(" ## ACCESS DATA ==> Mise à jour ", module_access)
# Process de mise à jour
for module_access in tab_access:
my_data = {}
my_data['locked'] = '0'
my_data['valide'] = '1'
my_data['update_by'] = str(my_partner['_id'])
my_data['date_update'] = str(datetime.now())
my_data['module'] = module_access['module_name']
if( str(module_access['read']).lower().strip() == "true"):
my_data['read'] = True
else:
my_data['read'] = False
if (str(module_access['write']).lower().strip() == "true"):
my_data['write'] = True
else:
my_data['write'] = False
my_data['partner_owner_recid'] = str(my_partner['recid'])
my_data['user_id'] = str(diction['user_id'])
result = MYSY_GV.dbname['user_access_right'].find_one_and_update(
{'module_name':module_access['module_name'], 'user_id':str(diction['user_id'])},
{"$set": my_data},
upsert=True,
return_document=ReturnDocument.AFTER
)
if (result is None or "_id" not in result.keys()):
mycommon.myprint(
" Impossible mettre à jour les droits d'acces du user_id" + str(diction['user_id']))
return False, " Impossible mettre à jour les droits d'acces "
"""
# Ajout de l'evenement dans l'historique
"""
now = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
history_event_dict = {}
history_event_dict['token'] = str(diction['token'])
history_event_dict['related_collection'] = "ressource_humaine"
history_event_dict['related_collection_recid'] = str(rh_id_data['_id'])
history_event_dict['action_date'] = str(now)
history_event_dict['technical_comment'] = "Nouveaux droits d'accès = "+ str(tab_access)
history_event_dict['action_description'] = " Mise à jour des droits d'accès au système "
local_status, local_retval = mycommon.Collection_Historique.Add_Historique_Event(history_event_dict)
if (local_status is False):
mycommon.myprint(
" WARNING : Impossible de logguer l'historique : " + str(rh_id_data['_id']) )
return True, " Les droits d'accès ont été correctement mis à jour"
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'ajouter la ressource "
"""
Recuperation de la matrice de droit d'un user (ressource_humaine_id)
"""
def Get_Matrix_Acces_Right(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'user_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'user_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
RetObject = []
val_tmp = 1
for retval in MYSY_GV.dbname['application_modules'].find({'valide':'1', 'locked':'0'}):
user = retval
user['id'] = str(val_tmp)
user['read'] = False
user['write'] = False
# Pour le module en question, on va aller recuperer les eventuels droits de l'utilisateur
user_acces_right_qry = {'valide':'1', 'locked':'0', 'user_id':str(diction['user_id']),
'partner_owner_recid':str(my_partner['recid']),
'module':str(retval['module_name'])}
#print(" ### user_acces_right_qry = ", user_acces_right_qry)
user_acces_right = MYSY_GV.dbname['user_access_right'].find_one(user_acces_right_qry)
if( user_acces_right is not None ):
if( 'read' in user_acces_right.keys()):
user['read'] = user_acces_right['read']
else:
user['read'] = False
if ('write' in user_acces_right.keys()):
user['write'] = user_acces_right['write']
else:
user['write'] = False
#print(" ### user_acces_right - user = ", user)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
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 récupérer la matrice des droits "
"""
Recuperation de la matrice des acces associé à un profil utilisateur (ex : enseignant, directeur, etc
"""
def Get_Matrix_Acces_Right_By_Profil(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'ressource_humaine_profil_id']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'ressource_humaine_profil_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
RetObject = []
val_tmp = 1
for retval in MYSY_GV.dbname['application_modules'].find({'valide': '1', 'locked': '0'}):
user = retval
user['id'] = str(val_tmp)
user['read'] = False
user['write'] = False
"""
Pour le module en question, on va aller recuperer les droits paramettrés sur le profil (collection : 'ressource_humaine_profil')
"""
user_acces_right_qry = {'valide': '1', 'locked': '0',
'_id':ObjectId(str(diction['ressource_humaine_profil_id']))}
user_acces_right = MYSY_GV.dbname['ressource_humaine_profil'].find_one(user_acces_right_qry)
if (user_acces_right and "profil_access_right" in user_acces_right.keys() and
len(user_acces_right['profil_access_right']) > 0 ) :
for tmp_access in user_acces_right['profil_access_right']:
print(" tmp_access = ", tmp_access)
print(" retval = ", retval)
if( tmp_access['module_name'] == retval['module_name'] ):
if ('read' in tmp_access.keys()):
user['read'] = tmp_access['read']
else:
user['read'] = False
if ('write' in tmp_access.keys()):
user['write'] = tmp_access['write']
else:
user['write'] = False
# print(" ### user_acces_right - user = ", user)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
#print(" Get_Matrix_Acces_Right_By_Profil RetObject = ", 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 récupérer la matrice des droits "
def Get_Matrix_Acces_Right_By_Profil_SAVE(diction):
try:
diction = mycommon.strip_dictionary(diction)
"""
Verification des input acceptés
"""
field_list = ['token', 'profile_name']
incom_keys = diction.keys()
for val in incom_keys:
if val not in field_list and val.startswith('my_') is False:
mycommon.myprint(str(
inspect.stack()[0][3]) + " Le champ '" + val + "' n'est pas autorisé")
return False, " Les informations fournies sont incorrectes",
"""
Verification des champs obligatoires
"""
field_list_obligatoire = ['token', 'profile_name']
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
RetObject = []
val_tmp = 1
for retval in MYSY_GV.dbname['application_modules'].find({'valide': '1', 'locked': '0'}):
user = retval
user['id'] = str(val_tmp)
user['read'] = False
user['write'] = False
# Pour le module en question, on va aller recuperer les eventuels droits de l'utilisateur
user_acces_right_qry = {'valide': '1', 'locked': '0', 'profile_name': str(diction['profile_name']),
'partner_owner_recid': str(my_partner['recid']),
'module': str(retval['module_name'])}
# print(" ### user_acces_right_qry = ", user_acces_right_qry)
user_acces_right = MYSY_GV.dbname['user_access_right'].find_one(user_acces_right_qry)
if (user_acces_right is not None):
if ('read' in user_acces_right.keys()):
user['read'] = user_acces_right['read']
else:
user['read'] = False
if ('write' in user_acces_right.keys()):
user['write'] = user_acces_right['write']
else:
user['write'] = False
# print(" ### user_acces_right - user = ", user)
val_tmp = val_tmp + 1
RetObject.append(mycommon.JSONEncoder().encode(user))
print(" RetObject = ", 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 récupérer la matrice des droits "