""" Ce fichier permet de gerer les ressources matériels Par exemple : - Les cartes - Les projecteurs - Les ordinateurs, imprimantes, scanner, - Les livres, - Les sales reunion - Les empphithéatres - etc En gros toute ressources non humaine Une ressource materiel est defini par : - ref_interne, ref_externe, nom, description, detail, famille, marque, type (à definir), prix_achat (prix d'achat estimé), image, fournisseur, qty_stock (qté en stock), """ 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 """ La clé d'une ressource materielle est : - la ref_interne """ def Add_Ressource_Materielle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', "ref_interne", "nom", "description", "detail", "famille",'marque', 'prix_achat', 'fournisseur', 'qty_stock', 'type', 'site_formation_id', "code_categorie", 'complement_adresse', 'capacite_ideale', 'capacite_max', 'acces_handicape', 'prix_achat_by'] 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', "ref_interne", ] 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 la liste des arguments ") 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 s'il n'existe pas un matereiel avec la meme reference interne """ tmp_count = MYSY_GV.dbname['ressource_materielle'].count_documents({'ref_interne': str(diction['ref_interne']), 'valide': '1', 'partner_recid': my_partner['recid']}) if (tmp_count > 0): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Il existe déjà un matereiel avec cette reference interne = " +str(diction['ref_interne'])) return False, " - Il existe déjà un matereiel avec cette reference interne " +str(diction['ref_interne'])+" " """ Recuperation des données fournies en entrée """ data = {} data['partner_recid'] = my_partner['recid'] ref_interne = "" if ("ref_interne" in diction.keys()): if diction['ref_interne']: ref_interne = diction['ref_interne'] if (len(str(ref_interne)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'ref_interne' fait plus de 255 caractères") return False, " - Le champ 'ref_interne' fait plus de 255 caractères" data['ref_interne'] = ref_interne complement_adresse = "" if ("complement_adresse" in diction.keys()): if diction['complement_adresse']: complement_adresse = diction['complement_adresse'] if (len(str(ref_interne)) > 500): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'complement_adresse' fait plus de 500 caractères") return False, " - Le champ 'complement_adresse' fait plus de 500 caractères" data['complement_adresse'] = complement_adresse capacite_ideale = "0" if ("capacite_ideale" in diction.keys()): if diction['capacite_ideale']: capacite_ideale = diction['capacite_ideale'] local_status, new_participants = mycommon.IsInt(capacite_ideale) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'capacite_ideale' n'est pas un nombre entier") return False, " Le champ 'capacite_ideale' n'est pas un nombre entier " data['capacite_ideale'] = capacite_ideale capacite_max = "0" if ("capacite_max" in diction.keys()): if diction['capacite_max']: capacite_max = diction['capacite_max'] local_status, new_participants = mycommon.IsInt(capacite_max) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'capacite_max' n'est pas un nombre entier") return False, " Le champ 'capacite_max' n'est pas un nombre entier " data['capacite_max'] = capacite_max acces_handicape = "0" if ("acces_handicape" in diction.keys()): if diction['acces_handicape']: acces_handicape = diction['acces_handicape'] local_status, new_participants = mycommon.IsInt(acces_handicape) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'acces_handicape' doit etre '0' ou '1' ") return False, "Le champ 'acces_handicape' doit etre '0' ou '1' " data['acces_handicape'] = acces_handicape prix_achat_by = "" if( "prix_achat_by" in diction.keys() and diction['prix_achat_by']): prix_achat_by = diction['prix_achat_by'] if( diction['prix_achat_by'] not in ['fixe', 'heure', 'jour', 'mois']): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'prix_achat_by' doit etre 'fixe', 'heure', 'jour', 'mois' ") return False, "Le champ 'prix_achat_by' doit etre 'fixe', 'heure', 'jour', 'mois' " data['prix_achat_by'] = prix_achat_by # Si la catégorie est fournie, alors verifier qu'elle existe, si non, mettre par defaut à 'autre" code_categorie = "autre" if( "code_categorie" in diction.keys() and diction['code_categorie']): is_code_categorie_exist = MYSY_GV.dbname['ressource_materielle_categorie'].count_documents({'code':str(diction['code_categorie']).lower(), 'valide':'1', 'locked':'0', 'partner_owner_recid':'default'}) if( is_code_categorie_exist != 1 ): mycommon.myprint( str(inspect.stack()[0][ 3]) + " L'identifiant du code categorie est invalide ") return False, " L'identifiant du code categorie est invalide " code_categorie = str(diction['code_categorie']).lower() data['code_categorie'] = code_categorie nom = "" if ("nom" in diction.keys()): if diction['nom']: nom = diction['nom'] if (len(str(nom)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'nom' fait plus de 255 caractères") return False, " - Le champ 'nom' fait plus de 255 caractères" data['nom'] = nom description = "" if ("description" in diction.keys()): if diction['description']: description = diction['description'] if (len(str(description)) > 500): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'description' fait plus de 500 caractères") return False, " - Le champ 'Detail' fait plus de 500 caractères" data['description'] = description detail = "" if ("detail" in diction.keys()): if diction['detail']: detail = diction['detail'] if(len(str(detail)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'Detail' fait plus de 255 caractères") return False, " - Le champ 'Detail' fait plus de 255 caractères" data['detail'] = detail famille = "" if ("famille" in diction.keys()): if diction['famille']: famille = diction['famille'] data['famille'] = famille marque = "" if ("marque" in diction.keys()): if diction['marque']: marque = diction['marque'] data['marque'] = marque prix_achat = "" if ("prix_achat" in diction.keys()): if diction['prix_achat']: prix_achat = diction['prix_achat'] local_status, local_val = mycommon.IsFloat(prix_achat) if( local_status is False): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le prix d'achat est invalide ") return False, " - Le prix d'achat est invalide " data['prix_achat'] = prix_achat fournisseur = "" if ("fournisseur" in diction.keys()): if diction['fournisseur']: fournisseur = diction['fournisseur'] data['fournisseur'] = fournisseur type = "" if ("type" in diction.keys()): if diction['type']: type = diction['type'] is_valide_type_materiel = MYSY_GV.dbname['ressource_materielle_type'].count_documents({'code':type, 'partner_owner_recid':'default', 'valide':'1', 'locked':'0'}) if( is_valide_type_materiel != 1): mycommon.myprint(" Le type de materiel est invalide ") return False, " Le type de materiel est invalide " data['type'] = type site_formation_id = "" if ("site_formation_id" in diction.keys()): if diction['site_formation_id']: site_formation_id = diction['site_formation_id'] # verifier que le site de formation existe et est valide is_site_formation_valide = MYSY_GV.dbname['site_formation'].count_documents({'_id':ObjectId(str(site_formation_id)), 'partner_owner_recid':str(my_partner['recid']), 'valide':'1', 'locked':'0'}) if( is_site_formation_valide != 1): mycommon.myprint(" L'identifiant du site de formation est invalide ") return False, " L'identifiant du site de formation est invalide " data['site_formation_id'] = site_formation_id qty_stock = "" if ("qty_stock" in diction.keys()): if diction['qty_stock']: qty_stock = diction['qty_stock'] local_status, local_val = mycommon.IsFloat(qty_stock) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - La quantité en stock est invalide ") return False, " - La quantité en stock est invalide " data['qty_stock'] = qty_stock data['valide'] = '1' data['locked'] = '0' data['date_update'] = str(datetime.now()) data['update_by'] = str(my_partner['_id']) # Creation du RecId data['recid'] = mycommon.create_user_recid() inserted_id = "" inserted_id = MYSY_GV.dbname['ressource_materielle'].insert_one(data).inserted_id if (not inserted_id): mycommon.myprint( " Impossible de créer le materiel (2) ") return False, " Impossible de créer le materiel (2) " """ # 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_materielle" history_event_dict['related_collection_recid'] = str(inserted_id) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Création " 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 pour la ressource materielle (ref_interne): " + str(diction['ref_interne'])) return True, " Le materiel a été correctement créé" 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 le materiel " """ Mise à jour d'une ressource matereiel en se basant sur son _id """ def Update_Ressource_Materielle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', "ref_interne", "nom", "description", "detail", "famille",'marque', 'type', 'prix_achat', 'fournisseur', 'qty_stock', '_id', 'site_formation_id', 'code_categorie', 'complement_adresse', 'capacite_ideale', 'capacite_max', 'acces_handicape', 'prix_achat_by'] 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'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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" partner_recid = mycommon.get_parnter_recid_from_token(token) if (partner_recid is False): mycommon.myprint( str(inspect.stack()[0][3]) + " - partner_recid est KO. Les données de connexion sont incorrectes ") return False, " Vous n'etes pas autorisé à utiliser cette API " # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_recid(partner_recid) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire. " """ Verification si ce materiel n'existe pas deja pour ce partner """ qry_update = {'_id': ObjectId(str(diction['_id'])), 'valide': '1', 'partner_recid': str(my_partner['recid']),} #print(" ### qry_update aa = ", qry_update) tmp_count = MYSY_GV.dbname['ressource_materielle'].count_documents(qry_update) if (tmp_count <= 0): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Ce materiel n'existe pas = "+str(diction['nom'])) return False, " -Ce materiel n'existe pas " """ Recuperation des données fournies en entrée """ data_update = {} """ Recuperation des données fournies en entrée """ ref_interne = "" if ("ref_interne" in diction.keys()): ref_interne = diction['ref_interne'] if (len(str(ref_interne)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'ref_interne' fait plus de 255 caractères") return False, " - Le champ 'ref_interne' fait plus de 255 caractères" data_update['ref_interne'] = diction['ref_interne'] # Si la catégorie est fournie, alors verifier qu'elle existe, si non, mettre par defaut à 'autre" if ("code_categorie" in diction.keys() and diction['code_categorie']): is_code_categorie_exist = MYSY_GV.dbname['ressource_materielle_categorie'].count_documents( {'code': str(diction['code_categorie']).lower(), 'valide': '1', 'locked': '0', 'partner_owner_recid': 'default'}) if (is_code_categorie_exist != 1): mycommon.myprint( str(inspect.stack()[0][ 3]) + " L'identifiant du code categorie est invalide ") return False, " L'identifiant du code categorie est invalide " code_categorie = str(diction['code_categorie']).lower() data_update['code_categorie'] = code_categorie complement_adresse = "" if ("complement_adresse" in diction.keys()): if diction['complement_adresse']: complement_adresse = diction['complement_adresse'] if (len(str(ref_interne)) > 500): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'complement_adresse' fait plus de 500 caractères") return False, " - Le champ 'complement_adresse' fait plus de 500 caractères" data_update['complement_adresse'] = complement_adresse capacite_ideale = "0" if ("capacite_ideale" in diction.keys()): if diction['capacite_ideale']: capacite_ideale = diction['capacite_ideale'] local_status, new_participants = mycommon.IsInt(capacite_ideale) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'capacite_ideale' n'est pas un nombre entier") return False, " Le champ 'capacite_ideale' n'est pas un nombre entier " data_update['capacite_ideale'] = capacite_ideale capacite_max = "0" if ("capacite_max" in diction.keys()): if diction['capacite_max']: capacite_max = diction['capacite_max'] local_status, new_participants = mycommon.IsInt(capacite_max) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'capacite_max' n'est pas un nombre entier") return False, " Le champ 'capacite_max' n'est pas un nombre entier " data_update['capacite_max'] = capacite_max if ("acces_handicape" in diction.keys()): acces_handicape = "0" if diction['acces_handicape']: acces_handicape = diction['acces_handicape'] local_status, new_participants = mycommon.IsInt(acces_handicape) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'acces_handicape' doit etre '0' ou '1' ") return False, "Le champ 'acces_handicape' doit etre '0' ou '1' " data_update['acces_handicape'] = acces_handicape prix_achat_by = "" if ("prix_achat_by" in diction.keys() and diction['prix_achat_by']): prix_achat_by = diction['prix_achat_by'] if (diction['prix_achat_by'] not in ['fixe', 'heure', 'jour', 'mois']): mycommon.myprint( str(inspect.stack()[0][3]) + " Le champ 'prix_achat_by' doit etre 'fixe', 'heure', 'jour', 'mois' ") return False, "Le champ 'prix_achat_by' doit etre 'fixe', 'heure', 'jour', 'mois' " data_update['prix_achat_by'] = prix_achat_by nom = "" if ("nom" in diction.keys()): nom = diction['nom'] if (len(str(nom)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'nom' fait plus de 255 caractères") return False, " - Le champ 'nom' fait plus de 255 caractères" data_update['nom'] = diction['nom'] description = "" if ("description" in diction.keys()): description = diction['description'] if (len(str(description)) > 500): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'description' fait plus de 500 caractères") return False, " - Le champ 'Detail' fait plus de 500 caractères" data_update['description'] = diction['description'] detail = "" if ("detail" in diction.keys()): detail = diction['detail'] if (len(str(detail)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le champ 'Detail' fait plus de 255 caractères") return False, " - Le champ 'Detail' fait plus de 255 caractères" data_update['detail'] = diction['detail'] famille = "" if ("famille" in diction.keys()): famille = diction['famille'] data_update['famille'] = diction['famille'] marque = "" if ("marque" in diction.keys()): marque = diction['marque'] data_update['marque'] = diction['marque'] type = "" if ("type" in diction.keys()): if diction['type']: type = diction['type'] is_valide_type_materiel = MYSY_GV.dbname['ressource_materielle_type'].count_documents({'code': type, 'partner_owner_recid': 'default', 'valide': '1', 'locked': '0'}) if (is_valide_type_materiel != 1): mycommon.myprint(" Le type de materiel est invalide ") return False, " Le type de materiel est invalide " data_update['type'] = type site_formation_id = "" if ("site_formation_id" in diction.keys()): if diction['site_formation_id']: site_formation_id = diction['site_formation_id'] # verifier que le site de formation existe et est valide is_site_formation_valide = MYSY_GV.dbname['site_formation'].count_documents( {'_id': ObjectId(str(site_formation_id)), 'partner_owner_recid': str(my_partner['recid']), 'valide': '1', 'locked': '0'}) if (is_site_formation_valide != 1): mycommon.myprint(" L'identifiant du site de formation est invalide ") return False, " L'identifiant du site de formation est invalide " #print(" ##### GGRR site_formation_id = ", site_formation_id) data_update['site_formation_id'] = site_formation_id prix_achat = "" if ("prix_achat" in diction.keys()): prix_achat = diction['prix_achat'] local_status, local_val = mycommon.IsFloat(prix_achat) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - Le prix d'achat est invalide ") return False, " - Le prix d'achat est invalide " data_update['prix_achat'] = diction['prix_achat'] fournisseur = "" if ("fournisseur" in diction.keys()): fournisseur = diction['fournisseur'] data_update['fournisseur'] = diction['fournisseur'] qty_stock = "" if ("qty_stock" in diction.keys()): qty_stock = diction['qty_stock'] local_status, local_val = mycommon.IsFloat(qty_stock) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][ 3]) + " - La quantité en stock est invalide ") return False, " - La quantité en stock est invalide " data_update['qty_stock'] = diction['qty_stock'] data_update['valide'] = '1' data_update['locked'] = '0' data_update['date_update'] = str(datetime.now()) """ Clés de mise à jour """ data_cle = {'_id': ObjectId(str(diction['_id'])), 'valide': '1', 'locked': '0', 'partner_recid': str(my_partner['recid']),} inserted_id = "" result = MYSY_GV.dbname['ressource_materielle'].find_one_and_update( data_cle, {"$set": data_update}, upsert=False, return_document=ReturnDocument.AFTER ) if (result is None or "_id" not in result.keys()): mycommon.myprint( " Impossible de mettre à jour le materiel : email = ") return False, " Impossible de mettre à jour le materiel " """ # 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_materielle" history_event_dict['related_collection_recid'] = str(diction['_id']) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Mise à jour " 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(diction['_id']) ) return True, " Le materiel a é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 de mettre à jour les données " """ Suppression d'une ressource materiel """ def Delete_Ressource_Materielle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', '_id', 'ref_interne', ] 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'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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" partner_recid = mycommon.get_parnter_recid_from_token(token) if (partner_recid is False): mycommon.myprint( str(inspect.stack()[0][3]) + " - partner_recid est KO. Les données de connexion sont incorrectes ") return False, " Vous n'etes pas autorisé à utiliser cette API " # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_recid(partner_recid) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données du partenaire. " """ Verification de l'existance du materiel a supprimer """ existe_employee_count = MYSY_GV.dbname['ressource_materielle'].count_documents({'_id': ObjectId(str(diction['_id'])), 'partner_recid': str(my_partner['recid']),}) if( existe_employee_count <= 0 ): mycommon.myprint(str(inspect.stack()[0][3]) + " - Ce materiel est invalide") return False, str(inspect.stack()[0][3]) + " -Cet materiel est invalide " existe_materiel_data = MYSY_GV.dbname['ressource_materielle'].find_one( {'_id': ObjectId(str(diction['_id'])), 'partner_recid': str(my_partner['recid']), }) """ Suppression des eventuels affectation de ce materiel """ MYSY_GV.dbname['ressource_materielle_affectation'].delete_many({'related_collection_recid': (str(diction['_id'])), 'partner_recid': str(my_partner['recid']), 'related_collection':'ressource_materielle'}) """ Suppression du materiel """ MYSY_GV.dbname['ressource_materielle'].delete_many({'_id': ObjectId(str(diction['_id'])), 'partner_recid': str(my_partner['recid']),}) """ # 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_materielle" history_event_dict['related_collection_recid'] = str(diction['_id']) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Suppression du materiel Nom = "+str(existe_materiel_data['nom'])+", ref_interne = "+str(existe_materiel_data['ref_interne']) 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(diction['_id'])) return True, " Le materiel a été correctement supprimé" 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 materiel " """ Recuperation de la liste des ressources materielle d'une entité en se basant sur - token (partner_recid) """ def Get_List_Ressource_Materielle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', ] 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'existe pas") return False, " Les informations fournies sont incorrectes", """ Verification des champs obligatoires """ 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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_token(token) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur ") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur. " """ Clés de mise à jour """ data_cle = {} data_cle['partner_recid'] = str(my_partner['recid']) data_cle['locked'] = "0" data_cle['valide'] = "1" RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle'].find(data_cle): user = retval user['id'] = str(val_tmp) val_tmp = val_tmp + 1 if ("prix_achat_by" in retval.keys()): user['prix_achat_by'] = retval['prix_achat_by'] else: user['prix_achat_by'] = "" 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 liste du materiel " """ Recherche sans filter - no_filter """ def Get_List_Ressource_Materielle_no_filter(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', ] 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'existe pas") return False, " Les informations fournies sont incorrectes", """ Verification des champs obligatoires """ 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 la liste des arguments ") 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 """ Clés de mise à jour """ data_cle = {} data_cle['partner_recid'] = str(my_partner['recid']) data_cle['locked'] = "0" data_cle['valide'] = "1" find_qry = {'partner_recid': str(my_partner['recid']), 'valide':'1', 'locked':'0' } print(" ### materiel find_qry = ", find_qry) RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle'].find(find_qry): user = retval user['id'] = str(val_tmp) val_tmp = val_tmp + 1 if ("prix_achat_by" in retval.keys()): user['prix_achat_by'] = retval['prix_achat_by'] else: user['prix_achat_by'] = "" 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 liste des ressources materielles " """ Recuperation d'une ressource materielle donnée en se basant sur on token, _id, """ def Get_Given_Ressource_Materielle(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 and val.startswith('my_') is False: 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 la liste des arguments ") 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 """ Clés de mise à jour """ data_cle = {} data_cle['partner_recid'] = str(my_partner['recid']) data_cle['_id'] = ObjectId(str(diction['_id'])) data_cle['valide'] = "1" data_cle['locked'] = "0" RetObject = [] val_tmp = 1 #print(" ### data_cle = ", data_cle) for retval in MYSY_GV.dbname['ressource_materielle'].find(data_cle): user = retval user['id'] = str(val_tmp) val_tmp = val_tmp + 1 if ("prix_achat_by" in retval.keys()): user['prix_achat_by'] = retval['prix_achat_by'] else: user['prix_achat_by'] = "" 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 les données du materiel " """ Cette fonction ajoute une image de profil d'un materiel """ def Update_Ressource_Materielle_Image(file_img=None, Folder=None, diction=None): try: # Dictionnaire des champs utilisables ''' # 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', 'file_img_recid', 'rm_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, " Le champ '" + val + "' n'est pas accepté " ''' 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 la liste des arguments ") return False, " La valeur '" + val + "' n'est pas presente dans la liste des arguments " # recuperation des paramettre 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 rm_id = "" if ("rm_id" in diction.keys()): if diction['rm_id']: rm_id = diction['rm_id'] if( file_img ): recordimage_diction = {} recordimage_diction['token'] = diction['token'] recordimage_diction['related_collection'] = "ressource_materielle" recordimage_diction['type_img'] = "user" recordimage_diction['related_collection_recid'] = str(rm_id) recordimage_diction['image_recid'] = diction['file_img_recid'] local_status, local_message = mycommon.recordClassImage_v2(file_img, MYSY_GV.upload_folder, recordimage_diction) if( local_status is False): return local_status, local_message """ # 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_materielle" history_event_dict['related_collection_recid'] = str(diction['rm_id']) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Modification de l'image " 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(diction['rm_id'])) return True, "L'image a été correctement enregistrée" 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'enregistrer l'image" """ Suppression d'un image d'une ressource humaine """ def DeleteImage_Ressource_Materielle(diction=None): try: # Dictionnaire des champs utilisables field_list = ['token', 'image_recid', ] 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 accepté dans cette API") return False, " Impossible de se connecter" ''' 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', 'image_recid'] for val in field_list_obligatoire: if str(val).lower() not in diction: mycommon.myprint( str(inspect.stack()[0][3]) + " La valeur '" + val + "' n'est pas presente dans la liste des arguments des champs") return False, "Impossible de se connecter" mydata = {} mytoken = "" # recuperation des paramettre if ("token" in diction.keys()): if diction['token']: mytoken = diction['token'] image_recid = "" if ("image_recid" in diction.keys()): if diction['image_recid']: image_recid = diction['image_recid'] local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner # " Lecture du fichier " # print(" Lecture du fichier : " + saved_file + ". le token est :" + str(mytoken)) nb_line = 0 coll_name = MYSY_GV.dbname['mysy_images'] query_delete = {"recid": image_recid,} ret_val = coll_name.delete_one({"recid": image_recid,}, ) print(" ### recordClassImage_v2 :L'image a été correctement supprimée ") return True, "L'image a été correctement supprimée" except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False, "Impossible de supprimer l'image " """ Recuperation de l'image d'un employé /!\ important : on prend le 'related_collection_recid' comme le '_id' de la collection inscription """ def getRecoded_Materielle_Image_from_front(diction=None): try: # Dictionnaire des champs utilisables field_list = ['token', 'rm_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'existe pas, requete annulée") return False, " Impossible de récupérer les informations" ''' 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', 'rm_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 la liste des arguments ") return False, " Impossible de récupérer les informations" local_status, my_partner = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner qery_images = {'locked': '0', 'valide': '1', 'related_collection': 'ressource_materielle', 'related_collection_recid': str(diction['rm_id'])} #print(" ### qery_images = ", qery_images) RetObject = [] employee_images = {} # Recuperation des image 'logo' et 'cachet' si le partenaire en a for retVal in MYSY_GV.dbname['mysy_images'].find(qery_images): if ('type_img' in retVal.keys()): if (retVal['type_img'] == "user"): employee_images['logo_img'] = retVal['img'].decode() employee_images['logo_img_recid'] = retVal['recid'] RetObject.append(mycommon.JSONEncoder().encode(employee_images)) return True, RetObject except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() print(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno)) return False, " Impossible de recupérer l'image de l'employé " """" récupérer les affectations d'un materiel :!\ : Pour le moment une affectation ne peut concerner que - Une formation (collection : myclass) ou - Une session de formation (collection session_formation) ou - Un materiel - rien du tout (cela veut dire que la fonction concene le partenaire, donc l'ecole. exemple : Directeur des etude, etc) """ def Get_List_Ressource_Materielle_Affectation(diction): try: field_list_obligatoire = [ 'token', 'rm_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 la liste des arguments ") return False, " La valeur '" + val + "' n'est pas presente dans la liste des arguments" my_token = "" if ("token" in diction.keys()): if diction['token']: my_token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(my_token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible d'imprimer la fiche detaillée") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data qry_affectation = {'partner_owner_recid':str(my_partner_data['recid']), 'related_collection':'ressource_materielle', 'related_collection_recid':str(diction['rm_id']), 'valide':'1', 'locked':'0'} print(" ### qry_affectation = ",qry_affectation) RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle_affectation'].find(qry_affectation): user = retval user['id'] = str(val_tmp) val_tmp = val_tmp + 1 related_target_collection_id_nom = "" related_target_collection_object = "" # Si l'affectation a un 'related_target_collection_id', alors cela veut dire qu'il faut aller chercheer # la cible de cette affection. if( "related_target_collection_id" in retval.keys() and "related_target_collection" in retval.keys()): if( retval["related_target_collection_id"] and retval["related_target_collection"]): # Si l'affectation concerne une formation if( retval["related_target_collection"] == "myclass"): affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one({"_id":ObjectId(str( retval["related_target_collection_id"])), 'partner_owner_recid':str(partner_recid), 'valide':'1', 'locked':"0"}) if(affectation_target_data is not None): related_target_collection_id_nom = affectation_target_data["title"] related_target_collection_object = "Formation" # Si l'affectation concerne une session de formation elif ( retval["related_target_collection"] == "session_formation") : # Si l'affectation concerne une session affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one( {"_id": ObjectId(str(retval["related_target_collection_id"])), 'partner_owner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): related_target_collection_id_nom = affectation_target_data["code_session"] related_target_collection_object = "Session Formation" # Si l'affectation concerne un salarié elif (retval["related_target_collection"] == "ressource_humaine"): # Si l'affectation concerne un salarié affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one( {"_id": ObjectId(str(retval["related_target_collection_id"])), 'partner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): prenom = "" nom = "" if( "prenom" in affectation_target_data.keys() ): prenom =affectation_target_data['prenom'] if ("nom" in affectation_target_data.keys()): nom = affectation_target_data['nom'] related_target_collection_id_nom = str(prenom+" "+nom) related_target_collection_object = "Employe" # 11/01/2024 - Update : affectation d'un materiel a un materiel # Si l'affectation concerne un materiel (oui car un materiel peut rattaché à un materiel) elif (retval["related_target_collection"] == "ressource_materielle"): # Si l'affectation concerne un materiel affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one( {"_id": ObjectId(str(retval["related_target_collection_id"])), 'partner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): related_target_collection_id_nom = str( affectation_target_data["ref_interne"] + " " + affectation_target_data["nom"]) related_target_collection_object = "Materiel" user['related_target_collection_id_nom'] = related_target_collection_id_nom user['related_target_collection_object'] = related_target_collection_object 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 liste des affectations de l'employé " """ Ajout d'une affectation d'une ressource materiel à une formation ou une session /!\ ou a une employé """ def Add_Affectation_Ressource_Materielle_Poste(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', "rm_id", "poste", "date_du", "date_au", "comment", 'related_target_collection', 'related_target_collection_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', 'rm_id', "poste", 'date_du' ] 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 la liste des arguments ") return False, " Toutes le information obligatoires n'ont pas été fournies" token = "" if ("token" in diction.keys()): if diction['token']: token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de récupérer le partner_recid") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data rm_id = "" if ("rm_id" in diction.keys()): if diction['rm_id']: rm_id = diction['rm_id'] # Verifier que le materiel existe bien materiel_existe_count = MYSY_GV.dbname['ressource_materielle'].count_documents({'_id':ObjectId(str(rm_id)), 'partner_recid':str(partner_recid), 'valide':'1', 'locked':'0'}) if( materiel_existe_count <= 0 ) : mycommon.myprint(str(inspect.stack()[0][3]) + " - Materiel invalide ") return False, " Materiel invalide " if (materiel_existe_count > 1): mycommon.myprint(str(inspect.stack()[0][3]) + " - Materiel incohérent. il a plusieurs materiels avec le meme id ") return False, " Materiel incohérent. il a plusieurs materiels avec le meme id " date_du = "" if ("date_du" in diction.keys()): if diction['date_du']: date_du = str(diction['date_du'])[0:10] # la date_du etant obligatoire, donc normal de faire le controle apres le "IF" local_status = mycommon.CheckisDate(date_du) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " La date de debut d'affectation n'est pas au format 'jj/mm/aaaa' ") return False, "La date de debut d'affectation n'est pas au format 'jj/mm/aaaa'" date_au = "" if ("date_au" in diction.keys()): if diction['date_au']: date_au = str(diction['date_au'])[0:10] local_status = mycommon.CheckisDate(date_au) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][ 3]) + " La date de fin d'affectation n'est pas au format 'jj/mm/aaaa' ") return False, "La date de fin d'affectation n'est pas au format 'jj/mm/aaaa'" comment = "" if ("comment" in diction.keys()): if diction['comment']: comment = diction['comment'] if(len(str(comment)) > 500): mycommon.myprint( str(inspect.stack()[0][ 3]) + " Le champ 'comment' a plus de 500 caractères ") return False, "Le champ 'comment' a plus de 500 caractères " poste = "" if ("poste" in diction.keys()): poste = diction['poste'] if (len(str(poste)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " Le champ 'poste' a plus de 255 caractères ") return False, "Le champ 'poste' a plus de 255 caractères " related_target_collection_id = "" related_target_collection = "" if ("related_target_collection_id" in diction.keys() and "related_target_collection" in diction.keys()): if( diction['related_target_collection_id'] and diction['related_target_collection'] ): related_target_collection_id = diction['related_target_collection_id'] related_target_collection = diction['related_target_collection'] else: if( diction['related_target_collection_id'] != "" or diction['related_target_collection'] != ""): mycommon.myprint( str(inspect.stack()[0][ 3]) + " Les données related_target_collection_id et related_target_collection sont incohérentes") return False, "Les données related_target_collection_id et related_target_collection sont incohérentes " # Verifier qu'on pas une affectation avec le meme poste qui demarre à la meme date. if_affectation_exist_count_qry = {'related_collection':'ressource_materielle', 'related_collection_recid':str(diction['rm_id']), 'partner_owner_recid':str(partner_recid),'valide':'1', 'poste':str(diction['poste']), 'date_du':str(date_du)} if_affectation_exist_count = MYSY_GV.dbname['ressource_materielle_affectation'].count_documents(if_affectation_exist_count_qry) if(if_affectation_exist_count > 0 ): mycommon.myprint( str(inspect.stack()[0][ 3]) + " Ce materiel est deja affecté à ce poste ") return False, "Ce materiel est deja affecté à ce poste" my_data = {} my_data['related_collection'] = 'ressource_materielle' my_data['related_collection_recid'] = str(diction['rm_id']) my_data['partner_owner_recid'] = str(partner_recid) my_data['poste'] = str(poste) my_data['related_target_collection_id'] = str(related_target_collection_id) my_data['related_target_collection'] = str(related_target_collection) my_data['comment'] = str(diction['comment']) my_data['date_du'] = str(date_du) my_data['date_au'] = str(date_au) my_data['valide'] = "1" my_data['locked'] = "0" my_data['date_update'] = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S")) inserted_data = MYSY_GV.dbname['ressource_materielle_affectation'].insert_one(my_data) if( inserted_data is None): return False," Impossible d'affecter le materiel(2)" """ # 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_materielle" history_event_dict['related_collection_recid'] = str(diction['rm_id']) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Affectation du materiel du "+str(date_du)+" au "+str(date_au)+". Poste : "+str(diction['poste'])+" . Cible "+str(related_target_collection)+" ==> "+str(related_target_collection_id) 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(diction['rm_id'])) return True, "L'affectation du materiel 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 d'affecter le materiel " """ Mise à jour d'une affectation """ def Update_Affectation_Ressource_Materielle_Poste(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', "rm_id", "poste", "date_du", "date_au", "comment", "_id", 'related_target_collection', 'related_target_collection_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', '_id', 'date_du', 'poste', "rm_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 la liste des arguments ") return False, " Toutes le information obligatoires n'ont pas été fournies" token = "" if ("token" in diction.keys()): if diction['token']: token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de récupérer le partner_recid") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data update_data = {} rm_id = "" if ("rm_id" in diction.keys()): if diction['rm_id']: rm_id = diction['rm_id'] # Verifier que l'employé existe bien employee_existe_count = MYSY_GV.dbname['ressource_materielle'].count_documents({'_id':ObjectId(str(rm_id)), 'partner_recid':str(partner_recid), 'valide':'1', 'locked':'0'}) if( employee_existe_count <= 0 ) : mycommon.myprint(str(inspect.stack()[0][3]) + " - Materiel invalide ") return False, " Materiel invalide " if (employee_existe_count > 1): mycommon.myprint(str(inspect.stack()[0][3]) + " - Materiel incohérent. il a plusieurs Materiels avec le meme id ") return False, " Materiel incohérent. il a plusieurs Materiels avec le meme id " date_du = "" if ("date_du" in diction.keys()): if diction['date_du']: date_du = str(diction['date_du'])[0:10] # la date_du etant obligatoire, donc normal de faire le controle apres le "IF" local_status = mycommon.CheckisDate(date_du) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][3]) + " La date de debut d'affectation n'est pas au format 'jj/mm/aaaa' ") return False, "La date de debut d'affectation n'est pas au format 'jj/mm/aaaa'" update_data['date_du'] = date_du date_au = "" if ("date_fin" in diction.keys()): date_au = str(diction['date_fin'])[0:10] local_status = mycommon.CheckisDate(date_au) if (local_status is False): mycommon.myprint( str(inspect.stack()[0][ 3]) + " La date de fin d'affectation n'est pas au format 'jj/mm/aaaa' ") return False, "La date de fin d'affectation n'est pas au format 'jj/mm/aaaa'" update_data['date_du'] = date_du comment = "" if ("comment" in diction.keys()): comment = diction['comment'] if(len(str(comment)) > 500): mycommon.myprint( str(inspect.stack()[0][ 3]) + " Le champ 'comment' a plus de 500 caractères ") return False, "Le champ 'comment' a plus de 500 caractères " update_data['comment'] = comment poste = "" if ("poste" in diction.keys()): poste = diction['poste'] if (len(str(poste)) > 255): mycommon.myprint( str(inspect.stack()[0][ 3]) + " Le champ 'poste' a plus de 255 caractères ") return False, "Le champ 'poste' a plus de 255 caractères " update_data['poste'] = poste related_target_collection_id = "" related_target_collection = "" if ("related_target_collection_id" in diction.keys() and "related_target_collection" in diction.keys()): if (diction['related_target_collection_id'] and diction['related_target_collection']): related_target_collection_id = diction['related_target_collection_id'] related_target_collection = diction['related_target_collection'] else: mycommon.myprint( str(inspect.stack()[0][ 3]) + " Les données related_target_collection_id et related_target_collection sont incohérentes") return False, "Les données related_target_collection_id et related_target_collection sont incohérentes " update_data['related_target_collection_id'] = str(related_target_collection_id) update_data['related_target_collection'] = str(related_target_collection) update_data['date_update'] = str(datetime.now().strftime("%d/%m/%Y %H:%M:%S")) # Verifier l'existance de l'affectation affectation_existe_count_qry = {'_id': ObjectId(str(diction['_id'])), 'valide': "1", "locked":"0", 'partner_owner_recid':str(partner_recid)} #print(" ### affectation_existe_count_qry = ", affectation_existe_count_qry) affectation_existe_count = MYSY_GV.dbname['ressource_materielle_affectation'].count_documents( affectation_existe_count_qry) if( affectation_existe_count != 1 ): mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de mettre à jour cette affectation. Données incohérentes ") return False, " Impossible de mettre à jour cette affectation. Données incohérentes " inserted_data = MYSY_GV.dbname['ressource_materielle_affectation'].find_one_and_update( {'_id': ObjectId(str(diction['_id'])), 'valide': "1", "locked":"0", 'partner_owner_recid':str(partner_recid)}, {"$set": update_data}, return_document=ReturnDocument.AFTER, upsert=False, ) if( inserted_data is None ): mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de mettre à jour cette affectation (3)") return False, " Impossible de mettre à jour cette affectation (3) " """ # 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_materielle" history_event_dict['related_collection_recid'] = str(diction['rm_id']) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Modification affectation du materiel " 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(diction['rm_id'])) return True, "L'affectation du materiel a été correctement mise à 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 de mettre à jour cette affectation " """ Supprimer une affectation """ def Delete_Affectation_Ressource_Materielle_Poste(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', "rm_id", "_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', "rm_id", "_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 la liste des arguments ") return False, " Toutes le information obligatoires n'ont pas été fournies" token = "" if ("token" in diction.keys()): if diction['token']: token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de récupérer le partner_recid") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data update_data = {} rm_id = "" if ("rm_id" in diction.keys()): if diction['rm_id']: rm_id = diction['rm_id'] # Verifier que le materiel existe bien employee_existe_count = MYSY_GV.dbname['ressource_materielle'].count_documents({'_id':ObjectId(str(rm_id)), 'partner_recid':str(partner_recid), 'valide':'1', 'locked':'0'}) if( employee_existe_count <= 0 ) : mycommon.myprint(str(inspect.stack()[0][3]) + " - Materiel invalide ") return False, " Materiel invalide " if (employee_existe_count > 1): mycommon.myprint(str(inspect.stack()[0][3]) + " - Materiel incohérent. il a plusieurs Materiels avec le meme id ") return False, " Materiel incohérent. il a plusieurs Materiels avec le meme id " # Verifier l'existance de l'affectation affectation_existe_count = MYSY_GV.dbname['ressource_materielle_affectation'].count_documents( {'_id': ObjectId(str(diction['_id'])), 'valide': "1", "locked":"0", 'partner_owner_recid':str(partner_recid)}) if( affectation_existe_count != 1 ): mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de supprimer cette affectation. Données incohérentes ") return False, " Impossible de supprimer cette affectation. Données incohérentes " inserted_data = MYSY_GV.dbname['ressource_materielle_affectation'].delete_one( {'_id': ObjectId(str(diction['_id'])), 'valide': "1", "locked":"0", 'partner_owner_recid':str(partner_recid)}, ) if( inserted_data is None ): mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de supprimer à jour cette affectation (3)") return False, " Impossible de supprimer cette affectation (3) " """ # 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_materielle" history_event_dict['related_collection_recid'] = str(diction['rm_id']) history_event_dict['action_date'] = str(now) history_event_dict['action_description'] = " Suppression affectation du materiel " 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(diction['rm_id'])) return True, "L'affectation du materiel a été correctement 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 cette affectation " def Get_Given_Affectation_Ressource_Materielle_Poste(diction): try: field_list_obligatoire = ['token', 'affectation_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 la liste des arguments ") return False, " La valeur '" + val + "' n'est pas presente dans la liste des arguments " my_token = "" if ("token" in diction.keys()): if diction['token']: my_token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(my_token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible d'imprimer la fiche detaillée") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data qry_affectation = {'partner_owner_recid': str(my_partner_data['recid']), '_id': ObjectId(str(diction['affectation_id'])), 'valide': '1', 'locked': '0'} print(" ### qry_affectation = ", qry_affectation) RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle_affectation'].find(qry_affectation): user = retval user['id'] = str(val_tmp) val_tmp = val_tmp + 1 related_target_collection_id_nom = "" related_target_collection_object = "" # Si l'affectation a un 'related_target_collection_id', alors cela veut dire qu'il faut aller chercheer # la cible de cette affection. if ("related_target_collection_id" in retval.keys() and "related_target_collection" in retval.keys()): if (retval["related_target_collection_id"] and retval["related_target_collection"]): # Si l'affectation concerne une formation if (retval["related_target_collection"] == "myclass"): affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one( {"_id": ObjectId(str(retval["related_target_collection_id"])), 'partner_owner_recid': str(partner_recid), 'valide': '1', 'locked': "0"}) if (affectation_target_data is not None): related_target_collection_id_nom = affectation_target_data["title"] related_target_collection_object = "Formation" # Si l'affectation concerne une session elif (retval["related_target_collection"] == "session_formation"): # Si l'affectation concerne une session affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one( {"_id": ObjectId(str(retval["related_target_collection_id"])), 'partner_owner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): related_target_collection_id_nom = affectation_target_data["code_session"] related_target_collection_object = "Session de formation" # Si l'affectation concerne un employé elif (retval["related_target_collection"] == "ressource_humaine"): # Si l'affectation concerne un employé affectation_target_data = MYSY_GV.dbname[retval["related_target_collection"]].find_one( {"_id": ObjectId(str(retval["related_target_collection_id"])), 'partner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): related_target_collection_id_nom = str(affectation_target_data["prenom"]+" "+affectation_target_data["nom"]) related_target_collection_object = "Employe" user['related_target_collection_id_nom'] = related_target_collection_id_nom user['related_target_collection_object'] = related_target_collection_object 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 l'affectation du materiel " """ Cette API permet de récupérer la liste des 'related_target_collection_object' avec les 'related_target_collection_id_nom' et de les formater pour une utilisation simple coté front. les collections cibles sont : - les formations et les sessions de formation, les employé et le materiel (oui la cas ou un PC est affecté à une salle) ex : { {'related_target_collection':'session_formation', 'related_target_collection_id':'64e797fd168e0c57cefe4fd0' 'related_target_collection_id_nom' : 'ch_Manual_1' }, {'related_target_collection':'myclass', 'related_target_collection_id':'64e79630ea7b810a3d835ceb' 'related_target_collection_id_nom' : 'PRATICIEN EN AROMATHERAPIE INTEGRATIVE' }, {'related_target_collection':'ressource_humaine', 'related_target_collection_id':'64e4e9ce347aaa05b2d207b0' 'related_target_collection_id_nom' : 'prenom_employe3 nom_employe3u' }, } """ def Get_Related_Target_Materiel_Collection_Data(diction): try: 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 la liste des arguments ") return False, " La valeur '" + val + "' n'est pas presente dans la liste des arguments " my_token = "" if ("token" in diction.keys()): if diction['token']: my_token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(my_token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " -Les informations d'identification sont invalides") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data RetObject = [] # Recuperation des données des formations for retval in MYSY_GV.dbname['myclass'].find({'partner_owner_recid': str(partner_recid), 'valide': '1', 'locked': '0'}, {'_id': 1, 'title': 1}): retval_data = {} retval_data['related_target_collection'] = "myclass" retval_data['related_target_collection_id'] = str(retval['_id']) retval_data['related_target_collection_id_nom'] = str(retval['title']) RetObject.append(mycommon.JSONEncoder().encode(retval_data)) # Recuperation des données des sessions for retval in MYSY_GV.dbname['session_formation'].find({'partner_owner_recid': str(partner_recid), 'valide': '1'}, {'_id': 1, 'code_session': 1}): retval_data = {} retval_data['related_target_collection'] = "session_formation" retval_data['related_target_collection_id'] = str(retval['_id']) retval_data['related_target_collection_id_nom'] = str(retval['code_session']) RetObject.append(mycommon.JSONEncoder().encode(retval_data)) # Recuperation des données des employés for retval in MYSY_GV.dbname['ressource_humaine'].find({'partner_recid': str(partner_recid), 'valide': '1', 'is_partner_admin_account':{ '$ne': '1' } }, {'_id': 1, 'prenom': 1, 'nom':1}): retval_data = {} retval_data['related_target_collection'] = "ressource_humaine" retval_data['related_target_collection_id'] = str(retval['_id']) nom = "" prenom = "" if( "nom" in retval.keys()): nom = retval['nom'] if ("prenom" in retval.keys()): prenom = retval['prenom'] retval_data['related_target_collection_id_nom'] = str(str(nom+" "+prenom)) RetObject.append(mycommon.JSONEncoder().encode(retval_data)) # Recuperation des données du materiel (ceci permet d'affectuer un materiel à une salles de réunion par exmple) for retval in MYSY_GV.dbname['ressource_materielle'].find({'partner_recid': str(partner_recid), 'valide': '1'}, {'_id': 1, 'ref_interne': 1, 'nom':1}): retval_data = {} retval_data['related_target_collection'] = "ressource_materielle" retval_data['related_target_collection_id'] = str(retval['_id']) nom = "" ref_interne = "" if( "nom" in retval.keys()): nom = retval['nom'] if ("ref_interne" in retval.keys()): ref_interne = retval['ref_interne'] retval_data['related_target_collection_id_nom'] = str(str(nom+" "+ref_interne)) RetObject.append(mycommon.JSONEncoder().encode(retval_data)) 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 les informations des cibles " """ Recuperation de la liste des ressources materielles avec des filtres sur - nom - email """ def Get_List_Ressource_Materielle_with_filter(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', 'nom', 'ref_interne', 'formation', 'session', 'employe_email', 'code_categorie'] 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'existe pas") return False, " Les informations fournies sont incorrectes", """ Verification des champs obligatoires """ 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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_token(token) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur ") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur. " filt_nom = {} if ("nom" in diction.keys()): filt_nom = {'nom': {'$regex': str(diction['nom']), "$options": "i"}} filt_ref_interne = {} if ("ref_interne" in diction.keys()): filt_ref_interne = { 'ref_interne': {'$regex': str(diction['ref_interne']), "$options": "i"}} filt_code_categorie = {} if ("code_categorie" in diction.keys()): filt_code_categorie = { 'code_categorie': {'$regex': str(diction['code_categorie']), "$options": "i"}} # Sous Filter pour une formation sub_filt_formation = {} if ("formation" in diction.keys()): sub_filt_formation = { 'external_code': {'$regex': str(diction['formation']), "$options": "i"}, 'partner_owner_recid':str(my_partner['recid'])} # Sous Filter pour une session sub_filt_session = {} if ("session" in diction.keys()): sub_filt_session = { 'code_session': {'$regex': str(diction['session']), "$options": "i"}, 'partner_owner_recid':str(my_partner['recid'])} # Sous Filter pour un employe sub_filt_employee = {} if ("employe_email" in diction.keys()): sub_filt_employee = {'email': {'$regex': str(diction['employe_email']), "$options": "i"}, 'partner_recid': str(my_partner['recid'])} """ Recuperation des id des codes session pouvant correspondre a la valeur fournie par le user (regexp bien sur) """ filt_session = {} Lists_session_id = [] if ("session" in diction.keys()): for Lists_session in MYSY_GV.dbname['session_formation'].find(sub_filt_session, {'_id':1}): Lists_session_id.append(str(Lists_session['_id'])) if( len(Lists_session_id) > 0): filt_session = {'related_target_collection_id': {'$in': Lists_session_id, }, 'related_collection': 'ressource_materielle', 'related_target_collection': 'session_formation', } """ Recuperation des id des formation pouvant correspondre a la valeur fournie par le user (regexp bien sur) """ filt_formation = {} Lists_formation_id = [] if ("formation" in diction.keys()): for Lists_formation in MYSY_GV.dbname['myclass'].find(sub_filt_formation, {'_id': 1}): Lists_formation_id.append(str(Lists_formation['_id'])) if(len(Lists_formation_id) > 0 ): filt_formation = {'related_target_collection_id': {'$in': Lists_formation_id, }, 'related_collection':'ressource_materielle', 'related_target_collection':'myclass', } """ Recuperation des id des employées dont l'email corresponds en mode regexp """ filt_employee = {} Lists_employee_id = [] if ("employe_email" in diction.keys()): for Lists_employee in MYSY_GV.dbname['ressource_humaine'].find(sub_filt_employee, {'_id': 1}): Lists_employee_id.append(str(Lists_employee['_id'])) if (len(Lists_employee_id) > 0): filt_employee = {'related_target_collection_id': {'$in': Lists_employee_id, }, 'related_collection': 'ressource_materielle', 'related_target_collection': 'ressource_humaine', } #print(" ### sub_filt_employee = ", sub_filt_employee) #print(" ### Lists_employee_id = ", Lists_employee_id) #print(" ### filt_employee = ", filt_employee) """ Clés de mise à jour """ data_cle = {} data_cle['partner_recid'] = str(my_partner['recid']) data_cle['locked'] = "0" data_cle['valide'] = "1" find_qry = {'$and':[{'partner_recid': str(my_partner['recid']), 'valide':'1', 'locked':'0' }, filt_nom, filt_ref_interne, filt_code_categorie] } new_myquery = [{'$match': find_qry}, {"$addFields": {"ressource_materielle_Id": {"$toString": "$_id"}}}, {'$lookup': { 'from': 'ressource_materielle_affectation', 'localField': "ressource_materielle_Id", 'foreignField': 'related_collection_recid', 'pipeline': [{'$match':{ '$and' : [ filt_formation, filt_session, filt_employee, {'partner_owner_recid': str(my_partner['recid'])}, {'valide':'1'}] } }, {'$project': {'poste': 1, 'date_du': 1, 'date_au':1, 'related_target_collection':1 }}], 'as': 'ressource_materielle_affectation_collection' } } ] New_RetObject = [] New_val_tmp = 1 """" Si dans la requette on a les champ : 'formation' ou 'session' on utiliser la requete ci-dessous. Cela veut dire qu'on cherche des ressources qui sont des affectation avec une formation ou une session. """ if( "formation" in diction.keys() or "session" in diction.keys() or "employe_email" in diction.keys() ): for New_retVal in MYSY_GV.dbname['ressource_materielle'].aggregate(new_myquery): if ('ressource_materielle_affectation_collection' in New_retVal.keys() and len(New_retVal['ressource_materielle_affectation_collection']) > 0): print(" #### RESULT New_retVal for = ", New_retVal['nom']) user = {} user['id'] = str(New_val_tmp) New_val_tmp = New_val_tmp + 1 user['_id'] = New_retVal['_id'] user['partner_recid'] = New_retVal['partner_recid'] user['ref_interne'] = New_retVal['ref_interne'] user['nom'] = New_retVal['nom'] if ("prix_achat_by" in New_retVal.keys()): user['prix_achat_by'] = New_retVal['prix_achat_by'] else: user['prix_achat_by'] = "" if ("description" in New_retVal.keys()): user['description'] = New_retVal['description'] else: user['description'] = "" if ("detail" in New_retVal.keys()): user['detail'] = New_retVal['detail'] else: user['detail'] = "" if( "famille" in New_retVal.keys()): user['famille'] = New_retVal['famille'] else: user['famille'] = "" if ("marque" in New_retVal.keys()): user['marque'] = New_retVal['marque'] else: user['marque'] = "" if ("type" in New_retVal.keys()): user['type'] = New_retVal['type'] else: user['type'] = "" if ("prix_achat" in New_retVal.keys()): user['prix_achat'] = New_retVal['prix_achat'] else: user['prix_achat'] = "" if ("fournisseur" in New_retVal.keys()): user['fournisseur'] = New_retVal['fournisseur'] else: user['fournisseur'] = "" if ("qty_stock" in New_retVal.keys()): user['qty_stock'] = New_retVal['qty_stock'] else: user['qty_stock'] = "" site_formation_code_site = "" if( "site_formation_id" in New_retVal.keys() and New_retVal['site_formation_id'] ): local_site = MYSY_GV.dbname['site_formation'].find_one({'_id':ObjectId(str(New_retVal['site_formation_id'])), 'valide':'1', 'locked':'0', 'partner_owner_recid':str(my_partner['recid'])}) if( local_site and 'code_site' in local_site.keys() ): site_formation_code_site = local_site['code_site'] user['site_formation_code_site'] = site_formation_code_site user['affectation'] = [] for local_affectation in New_retVal['ressource_materielle_affectation_collection']: affectation = {} if ("poste" in local_affectation.keys()): affectation['poste'] = local_affectation['poste'] else: affectation['poste'] = "" affectation['related_target_collection'] = local_affectation['related_target_collection'] affectation['date_du'] = local_affectation['date_du'] affectation['date_au'] = local_affectation['date_au'] #print(" ### AFFACTATION local_affectation = ", local_affectation) New_RetObject.append(mycommon.JSONEncoder().encode(user)) return True, New_RetObject else: # Il s'agit d'une recherche sans lien avec des fonctions occupés dans une formation ou une session RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle'].find(find_qry): user = retval user['id'] = str(val_tmp) 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 liste des contact " """ Récuperation d'une ressource materiel hors salle (No_Salle) """ def Get_List_Ressource_Materielle_with_filter_No_Salle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', 'nom', 'ref_interne', 'formation', 'session', 'employe_email', 'code_categorie'] 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'existe pas") return False, " Les informations fournies sont incorrectes", """ Verification des champs obligatoires """ 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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_token(token) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur ") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur. " filt_nom = {} if ("nom" in diction.keys()): filt_nom = {'nom': {'$regex': str(diction['nom']), "$options": "i"}} filt_ref_interne = {} if ("ref_interne" in diction.keys()): filt_ref_interne = { 'ref_interne': {'$regex': str(diction['ref_interne']), "$options": "i"}} filt_code_categorie = {} if ("code_categorie" in diction.keys()): filt_code_categorie = { 'code_categorie': {'$regex': str(diction['code_categorie']), "$options": "i"}} # Sous Filter pour une formation sub_filt_formation = {} if ("formation" in diction.keys()): sub_filt_formation = { 'external_code': {'$regex': str(diction['formation']), "$options": "i"}, 'partner_owner_recid':str(my_partner['recid'])} # Sous Filter pour une session sub_filt_session = {} if ("session" in diction.keys()): sub_filt_session = { 'code_session': {'$regex': str(diction['session']), "$options": "i"}, 'partner_owner_recid':str(my_partner['recid'])} # Sous Filter pour un employe sub_filt_employee = {} if ("employe_email" in diction.keys()): sub_filt_employee = {'email': {'$regex': str(diction['employe_email']), "$options": "i"}, 'partner_recid': str(my_partner['recid'])} """ Recuperation des id des codes session pouvant correspondre a la valeur fournie par le user (regexp bien sur) """ filt_session = {} Lists_session_id = [] if ("session" in diction.keys()): for Lists_session in MYSY_GV.dbname['session_formation'].find(sub_filt_session, {'_id':1}): Lists_session_id.append(str(Lists_session['_id'])) if( len(Lists_session_id) > 0): filt_session = {'related_target_collection_id': {'$in': Lists_session_id, }, 'related_collection': 'ressource_materielle', 'related_target_collection': 'session_formation', } """ Recuperation des id des formation pouvant correspondre a la valeur fournie par le user (regexp bien sur) """ filt_formation = {} Lists_formation_id = [] if ("formation" in diction.keys()): for Lists_formation in MYSY_GV.dbname['myclass'].find(sub_filt_formation, {'_id': 1}): Lists_formation_id.append(str(Lists_formation['_id'])) if(len(Lists_formation_id) > 0 ): filt_formation = {'related_target_collection_id': {'$in': Lists_formation_id, }, 'related_collection':'ressource_materielle', 'related_target_collection':'myclass', } """ Recuperation des id des employées dont l'email corresponds en mode regexp """ filt_employee = {} Lists_employee_id = [] if ("employe_email" in diction.keys()): for Lists_employee in MYSY_GV.dbname['ressource_humaine'].find(sub_filt_employee, {'_id': 1}): Lists_employee_id.append(str(Lists_employee['_id'])) if (len(Lists_employee_id) > 0): filt_employee = {'related_target_collection_id': {'$in': Lists_employee_id, }, 'related_collection': 'ressource_materielle', 'related_target_collection': 'ressource_humaine', } #print(" ### sub_filt_employee = ", sub_filt_employee) #print(" ### Lists_employee_id = ", Lists_employee_id) #print(" ### filt_employee = ", filt_employee) """ Clés de mise à jour """ data_cle = {} data_cle['partner_recid'] = str(my_partner['recid']) data_cle['locked'] = "0" data_cle['valide'] = "1" no_salle_qry = {'code_categorie':{"$ne": "salle"}} find_qry = {'$and':[{'partner_recid': str(my_partner['recid']), 'valide':'1', 'locked':'0' }, filt_nom, filt_ref_interne, filt_code_categorie, no_salle_qry] } new_myquery = [{'$match': find_qry}, {"$addFields": {"ressource_materielle_Id": {"$toString": "$_id"}}}, {'$lookup': { 'from': 'ressource_materielle_affectation', 'localField': "ressource_materielle_Id", 'foreignField': 'related_collection_recid', 'pipeline': [{'$match':{ '$and' : [ filt_formation, filt_session, filt_employee, {'partner_owner_recid': str(my_partner['recid'])}, {'valide':'1'}] } }, {'$project': {'poste': 1, 'date_du': 1, 'date_au':1, 'related_target_collection':1 }}], 'as': 'ressource_materielle_affectation_collection' } } ] New_RetObject = [] New_val_tmp = 1 """" Si dans la requette on a les champ : 'formation' ou 'session' on utiliser la requete ci-dessous. Cela veut dire qu'on cherche des ressources qui sont des affectation avec une formation ou une session. """ if( "formation" in diction.keys() or "session" in diction.keys() or "employe_email" in diction.keys() ): for New_retVal in MYSY_GV.dbname['ressource_materielle'].aggregate(new_myquery): if ('ressource_materielle_affectation_collection' in New_retVal.keys() and len(New_retVal['ressource_materielle_affectation_collection']) > 0): print(" #### RESULT New_retVal for = ", New_retVal['nom']) user = {} user['id'] = str(New_val_tmp) New_val_tmp = New_val_tmp + 1 user['_id'] = New_retVal['_id'] user['partner_recid'] = New_retVal['partner_recid'] user['ref_interne'] = New_retVal['ref_interne'] user['nom'] = New_retVal['nom'] if ("prix_achat_by" in New_retVal.keys()): user['prix_achat_by'] = New_retVal['prix_achat_by'] else: user['prix_achat_by'] = "" if ("description" in New_retVal.keys()): user['description'] = New_retVal['description'] else: user['description'] = "" if ("detail" in New_retVal.keys()): user['detail'] = New_retVal['detail'] else: user['detail'] = "" if( "famille" in New_retVal.keys()): user['famille'] = New_retVal['famille'] else: user['famille'] = "" if ("marque" in New_retVal.keys()): user['marque'] = New_retVal['marque'] else: user['marque'] = "" if ("type" in New_retVal.keys()): user['type'] = New_retVal['type'] else: user['type'] = "" if ("prix_achat" in New_retVal.keys()): user['prix_achat'] = New_retVal['prix_achat'] else: user['prix_achat'] = "" if ("fournisseur" in New_retVal.keys()): user['fournisseur'] = New_retVal['fournisseur'] else: user['fournisseur'] = "" if ("qty_stock" in New_retVal.keys()): user['qty_stock'] = New_retVal['qty_stock'] else: user['qty_stock'] = "" site_formation_code_site = "" if( "site_formation_id" in New_retVal.keys() and New_retVal['site_formation_id'] ): local_site = MYSY_GV.dbname['site_formation'].find_one({'_id':ObjectId(str(New_retVal['site_formation_id'])), 'valide':'1', 'locked':'0', 'partner_owner_recid':str(my_partner['recid'])}) if( local_site and 'code_site' in local_site.keys() ): site_formation_code_site = local_site['code_site'] user['site_formation_code_site'] = site_formation_code_site user['affectation'] = [] for local_affectation in New_retVal['ressource_materielle_affectation_collection']: affectation = {} if ("poste" in local_affectation.keys()): affectation['poste'] = local_affectation['poste'] else: affectation['poste'] = "" affectation['related_target_collection'] = local_affectation['related_target_collection'] affectation['date_du'] = local_affectation['date_du'] affectation['date_au'] = local_affectation['date_au'] #print(" ### AFFACTATION local_affectation = ", local_affectation) New_RetObject.append(mycommon.JSONEncoder().encode(user)) return True, New_RetObject else: # Il s'agit d'une recherche sans lien avec des fonctions occupés dans une formation ou une session RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle'].find(find_qry): user = retval user['id'] = str(val_tmp) 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 liste des contact " """ Cette fonction recuperer les ressources associées à une ressource materielle Ex : les composants d'un salle - projecteur - table - ordinateur - etc """ def Get_List_Ressource_Materielle_Rattachement(diction): try: field_list_obligatoire = [ 'token', 'rm_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 la liste des arguments ") return False, " La valeur '" + val + "' n'est pas presente dans la liste des arguments" my_token = "" if ("token" in diction.keys()): if diction['token']: my_token = diction['token'] # Recuperation du recid du partenaire partner_recid = mycommon.get_parnter_recid_from_token(str(my_token)) if partner_recid is False: mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible d'imprimer la fiche detaillée") return False, " Les informations d'identification sont invalides" local_status, my_partner_data = mycommon.Check_Connexion_And_Return_Partner_Data(diction) if (local_status is not True): return local_status, my_partner_data qry_affectation = {'partner_owner_recid':str(my_partner_data['recid']), 'related_target_collection':'ressource_materielle', 'related_target_collection_id':str(diction['rm_id']), 'valide':'1', 'locked':'0'} print(" ### qry_affectation = ",qry_affectation) RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle_affectation'].find(qry_affectation): user = retval user['id'] = str(val_tmp) val_tmp = val_tmp + 1 related_target_collection_id_nom = "" related_target_collection_object = "" # Si le rattachement a un 'related_target_collection_id', alors cela veut dire qu'il faut aller chercher # la cible de cette affection. if( "related_collection_recid" in retval.keys() and "related_collection" in retval.keys()): if( retval["related_collection_recid"] and retval["related_collection"]): # Si l'affectation concerne un salarié if (retval["related_collection"] == "ressource_humaine"): # Si l'affectation concerne un salarié affectation_target_data = MYSY_GV.dbname[retval["related_collection"]].find_one( {"_id": ObjectId(str(retval["related_collection_recid"])), 'partner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): related_target_collection_id_nom = str(affectation_target_data["prenom"]+" "+affectation_target_data["nom"]) related_target_collection_object = "Employe" # 11/01/2024 - Update : affectation d'un materiel a un materiel # Si l'affectation concerne un materiel (oui car un materiel peut rattaché à un materiel) elif (retval["related_collection"] == "ressource_materielle"): # Si l'affectation concerne un materiel affectation_target_data = MYSY_GV.dbname[retval["related_collection"]].find_one( {"_id": ObjectId(str(retval["related_collection_recid"])), 'partner_recid': str(partner_recid), 'valide': '1'}) if (affectation_target_data is not None): related_target_collection_id_nom = str( affectation_target_data["ref_interne"] + " " + affectation_target_data["nom"]) related_target_collection_object = "Materiel" user['related_target_collection_id_nom'] = related_target_collection_id_nom user['related_target_collection_object'] = related_target_collection_object 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 liste des affectations de l'employé " """ Recuperation des types de ressources materielles (consommable, stockable ou autre) """ def Get_Type_Ressource_Materielle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', ] 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'existe pas") return False, " Les informations fournies sont incorrectes", """ Verification des champs obligatoires """ 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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_token(token) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur ") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur. " """ Clés de mise à jour """ data_cle = {} data_cle['partner_owner_recid'] = "default" data_cle['locked'] = "0" data_cle['valide'] = "1" RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle_type'].find(data_cle): user = retval user['id'] = str(val_tmp) 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 les types de ressource materielle " """ Recuperation des catégories materiel (salles, infomatique, autre, etc) """ def Get_Categorie_Ressource_Materielle(diction): try: diction = mycommon.strip_dictionary(diction) """ Verification des input acceptés """ field_list = ['token', ] 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'existe pas") return False, " Les informations fournies sont incorrectes", """ Verification des champs obligatoires """ 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 la liste des arguments ") 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 retval = mycommon.check_partner_token_validity("", token) if retval is False: return "Err_Connexion", " La session de connexion n'est pas valide" # Recuperation des données du partenaire local_status, my_partner = mycommon.get_partner_data_from_token(token) if (local_status is False): mycommon.myprint(str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur ") return False, str(inspect.stack()[0][3]) + " - impossible de récupérer les données de l'utilisateur. " """ Clés de mise à jour """ data_cle = {} data_cle['partner_owner_recid'] = "default" data_cle['locked'] = "0" data_cle['valide'] = "1" RetObject = [] val_tmp = 1 for retval in MYSY_GV.dbname['ressource_materielle_categorie'].find(data_cle): user = retval user['id'] = str(val_tmp) 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 les catégories de ressource materielle "