Loading module/Oscar/src/Oscar/Controller/PersonController.php +39 −7 Original line number Diff line number Diff line Loading @@ -287,18 +287,31 @@ class PersonController extends AbstractOscarController { $allow = false; $justXHR = true; $format = $this->params()->fromQuery('f', 'json'); $restricted = []; // On test les accès $s1 = time(); $s = time(); if ($this->getOscarUserContextService()->hasPrivileges(Privileges::PERSON_SHOW)) { $allow = true; $justXHR = false; $restricted = false; } else { $this->getLoggerService()->info("Pas le droit PERSON_SHOW : " . (time() - $s) . ' ms'); $s = time(); $allow = $this->getOscarUserContextService()->hasOneOfPrivilegesInAnyRoles( [Privileges::ACTIVITY_INDEX, Privileges::ACTIVITY_PERSON_MANAGE, Privileges::PROJECT_PERSON_MANAGE, Privileges::ORGANIZATION_EDIT] ); $this->getLoggerService()->info("Calucle dans les structures : " . (time() - $s) . ' ms'); $s = time(); } if (!$allow) { $restricted = $this->getPersonService()->getCurrentPersonRestrictedPersonsIds(); if( count($restricted) == 0 ){ $this->getLoggerService()->info( "Accès non authorisé à la recherche des personnes pour " . $this->getCurrentPerson() ); Loading @@ -307,6 +320,25 @@ class PersonController extends AbstractOscarController } else { throw new UnAuthorizedException(); } } else { $json = [ 'datas' => [], 'error' => "" ]; $datas = $this->getPersonService()->getPersonsByIds($restricted); foreach ($datas as $data) { $personData = $data->toArray(); $json['datas'][] = $personData; } $view = new JsonModel(); $view->setVariables($json); $this->getLoggerService()->info("Total : " . (time() - $s1) . ' ms'); return $view; } } else { $restricted = false; } // Donnèes GET Loading module/Oscar/src/Oscar/Controller/ProjectController.php +4 −4 Original line number Diff line number Diff line Loading @@ -439,10 +439,10 @@ class ProjectController extends AbstractOscarController */ public function currentUserProjectsAction() { return [ 'person' => $this->getCurrentPerson(), 'q' => $this->params()->fromQuery('q', '') ]; $datas = $this->getProjectGrantService()->getAdvancedSearchOptions($this->params()); $datas['person'] = $this->getCurrentPerson(); //$datas['q'] = $this->params()->fromQuery('q', ''); return $datas; } public function organizationsAction() Loading module/Oscar/src/Oscar/Entity/PersonRepository.php +31 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,37 @@ class PersonRepository extends EntityRepository implements IConnectedRepository } /** * @param array $idsActivities * @return array */ public function getIdsInActivities( array $idsActivities ): array { $rsm = new ResultSetMapping(); $rsm->addScalarResult('person_id', 'person_id'); $sql = 'select ap.person_id from activityperson ap where ap.activity_id IN(:activities_ids) union select pm.person_id from projectmember pm inner join project p on p.id = pm.project_id inner join activity a on a.project_id = p.id where a.id IN(:activities_ids) '; $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); $results = $query->setParameter('activities_ids', $idsActivities)->getResult(); return array_map('current', $results); } public function getIdsInOrganizations( array $idsOrganisations ): array { $rsm = new ResultSetMapping(); $rsm->addScalarResult('person_id', 'person_id'); $sql = 'select op.person_id from organizationperson op where op.organization_id IN(:organizations_ids)'; $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); $results = $query->setParameter('organizations_ids', $idsOrganisations)->getResult(); return array_map('current', $results); } public function getReferentsIdsPerson(int $person): array { try { Loading module/Oscar/src/Oscar/Entity/RoleRepository.php +12 −6 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; use Oscar\Exception\OscarException; use Oscar\Formatter\OscarFormatterConst; use Oscar\Service\LoggerService; class RoleRepository extends EntityRepository { Loading Loading @@ -229,13 +230,13 @@ class RoleRepository extends EntityRepository * * @param Person $person */ public function getDistinctRolesPersonInActivities( Person $person ) public function getDistinctRolesPersonInActivities( Person $person , LoggerService $logger ) { $s = time(); $sql = "SELECT DISTINCT ur.id FROM user_role ur " ."LEFT JOIN activityperson ap ON ur.id = ap.roleobj_id " ."LEFT JOIN projectmember pm ON ur.id = pm.roleobj_id " ."WHERE ap.person_id = :idPerson OR pm.person_id = :idPerson"; $sql = "select distinct roleobj_id from activityperson a where person_id = :idPerson union select distinct roleobj_id from projectmember p where person_id = :idPerson"; $query = $this->getEntityManager()->getConnection()->prepare($sql); $idPerson = $person->getId(); Loading @@ -243,14 +244,19 @@ class RoleRepository extends EntityRepository if( !$query->execute(['idPerson'=>$idPerson]) ){ throw new OscarException("Impossible de charger les rôles de $person dans les activités"); } $logger->info("Récupération des rôles de la personnes dans les activités : " . (time() - $s) . ' ms'); $s = time(); $idsRoles = $query->fetchAll(); $results = $this->createQueryBuilder('r') ->where('r.id IN(:ids)') ->setParameter('ids', $idsRoles) ->setParameter('ids', array_unique($idsRoles)) ->getQuery() ->getResult(); $logger->info("Récupération des rôles finaux : " . (time() - $s) . ' ms'); $s = time(); return $results; } Loading module/Oscar/src/Oscar/Service/OrganizationService.php +19 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ use Oscar\Entity\Country3166; use Oscar\Entity\Country3166Repository; use Oscar\Entity\Organization; use Oscar\Entity\OrganizationPerson; use Oscar\Entity\OrganizationRepository; use Oscar\Entity\OrganizationRole; use Oscar\Entity\OrganizationRoleRepository; use Oscar\Entity\OrganizationType; Loading Loading @@ -79,6 +80,16 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana $this->personService = $personService; } /** * Retourne la liste des IDs des organisations où la personne a un rôle. * * @param int $personId */ public function getIdsOrganizationsPerson( int $personId ) :array { return $this->getOrganizationRepository()->getOrganizationsIdsForPerson($personId); } public function getTypesIdsByLabel(?array $labels) :array { $types = []; $result = $this->getEntityManager()->getRepository(OrganizationType::class)->findBy( Loading Loading @@ -113,6 +124,14 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana return $this->getEntityManager()->getRepository(OrganizationRole::class); } /** * @return OrganizationRepository */ public function getOrganizationRepository() :OrganizationRepository { return $this->getEntityManager()->getRepository(Organization::class); } /** * Retourne la liste des Roles disponible pour une organisation dans une activité. */ Loading Loading
module/Oscar/src/Oscar/Controller/PersonController.php +39 −7 Original line number Diff line number Diff line Loading @@ -287,18 +287,31 @@ class PersonController extends AbstractOscarController { $allow = false; $justXHR = true; $format = $this->params()->fromQuery('f', 'json'); $restricted = []; // On test les accès $s1 = time(); $s = time(); if ($this->getOscarUserContextService()->hasPrivileges(Privileges::PERSON_SHOW)) { $allow = true; $justXHR = false; $restricted = false; } else { $this->getLoggerService()->info("Pas le droit PERSON_SHOW : " . (time() - $s) . ' ms'); $s = time(); $allow = $this->getOscarUserContextService()->hasOneOfPrivilegesInAnyRoles( [Privileges::ACTIVITY_INDEX, Privileges::ACTIVITY_PERSON_MANAGE, Privileges::PROJECT_PERSON_MANAGE, Privileges::ORGANIZATION_EDIT] ); $this->getLoggerService()->info("Calucle dans les structures : " . (time() - $s) . ' ms'); $s = time(); } if (!$allow) { $restricted = $this->getPersonService()->getCurrentPersonRestrictedPersonsIds(); if( count($restricted) == 0 ){ $this->getLoggerService()->info( "Accès non authorisé à la recherche des personnes pour " . $this->getCurrentPerson() ); Loading @@ -307,6 +320,25 @@ class PersonController extends AbstractOscarController } else { throw new UnAuthorizedException(); } } else { $json = [ 'datas' => [], 'error' => "" ]; $datas = $this->getPersonService()->getPersonsByIds($restricted); foreach ($datas as $data) { $personData = $data->toArray(); $json['datas'][] = $personData; } $view = new JsonModel(); $view->setVariables($json); $this->getLoggerService()->info("Total : " . (time() - $s1) . ' ms'); return $view; } } else { $restricted = false; } // Donnèes GET Loading
module/Oscar/src/Oscar/Controller/ProjectController.php +4 −4 Original line number Diff line number Diff line Loading @@ -439,10 +439,10 @@ class ProjectController extends AbstractOscarController */ public function currentUserProjectsAction() { return [ 'person' => $this->getCurrentPerson(), 'q' => $this->params()->fromQuery('q', '') ]; $datas = $this->getProjectGrantService()->getAdvancedSearchOptions($this->params()); $datas['person'] = $this->getCurrentPerson(); //$datas['q'] = $this->params()->fromQuery('q', ''); return $datas; } public function organizationsAction() Loading
module/Oscar/src/Oscar/Entity/PersonRepository.php +31 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,37 @@ class PersonRepository extends EntityRepository implements IConnectedRepository } /** * @param array $idsActivities * @return array */ public function getIdsInActivities( array $idsActivities ): array { $rsm = new ResultSetMapping(); $rsm->addScalarResult('person_id', 'person_id'); $sql = 'select ap.person_id from activityperson ap where ap.activity_id IN(:activities_ids) union select pm.person_id from projectmember pm inner join project p on p.id = pm.project_id inner join activity a on a.project_id = p.id where a.id IN(:activities_ids) '; $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); $results = $query->setParameter('activities_ids', $idsActivities)->getResult(); return array_map('current', $results); } public function getIdsInOrganizations( array $idsOrganisations ): array { $rsm = new ResultSetMapping(); $rsm->addScalarResult('person_id', 'person_id'); $sql = 'select op.person_id from organizationperson op where op.organization_id IN(:organizations_ids)'; $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); $results = $query->setParameter('organizations_ids', $idsOrganisations)->getResult(); return array_map('current', $results); } public function getReferentsIdsPerson(int $person): array { try { Loading
module/Oscar/src/Oscar/Entity/RoleRepository.php +12 −6 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; use Oscar\Exception\OscarException; use Oscar\Formatter\OscarFormatterConst; use Oscar\Service\LoggerService; class RoleRepository extends EntityRepository { Loading Loading @@ -229,13 +230,13 @@ class RoleRepository extends EntityRepository * * @param Person $person */ public function getDistinctRolesPersonInActivities( Person $person ) public function getDistinctRolesPersonInActivities( Person $person , LoggerService $logger ) { $s = time(); $sql = "SELECT DISTINCT ur.id FROM user_role ur " ."LEFT JOIN activityperson ap ON ur.id = ap.roleobj_id " ."LEFT JOIN projectmember pm ON ur.id = pm.roleobj_id " ."WHERE ap.person_id = :idPerson OR pm.person_id = :idPerson"; $sql = "select distinct roleobj_id from activityperson a where person_id = :idPerson union select distinct roleobj_id from projectmember p where person_id = :idPerson"; $query = $this->getEntityManager()->getConnection()->prepare($sql); $idPerson = $person->getId(); Loading @@ -243,14 +244,19 @@ class RoleRepository extends EntityRepository if( !$query->execute(['idPerson'=>$idPerson]) ){ throw new OscarException("Impossible de charger les rôles de $person dans les activités"); } $logger->info("Récupération des rôles de la personnes dans les activités : " . (time() - $s) . ' ms'); $s = time(); $idsRoles = $query->fetchAll(); $results = $this->createQueryBuilder('r') ->where('r.id IN(:ids)') ->setParameter('ids', $idsRoles) ->setParameter('ids', array_unique($idsRoles)) ->getQuery() ->getResult(); $logger->info("Récupération des rôles finaux : " . (time() - $s) . ' ms'); $s = time(); return $results; } Loading
module/Oscar/src/Oscar/Service/OrganizationService.php +19 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ use Oscar\Entity\Country3166; use Oscar\Entity\Country3166Repository; use Oscar\Entity\Organization; use Oscar\Entity\OrganizationPerson; use Oscar\Entity\OrganizationRepository; use Oscar\Entity\OrganizationRole; use Oscar\Entity\OrganizationRoleRepository; use Oscar\Entity\OrganizationType; Loading Loading @@ -79,6 +80,16 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana $this->personService = $personService; } /** * Retourne la liste des IDs des organisations où la personne a un rôle. * * @param int $personId */ public function getIdsOrganizationsPerson( int $personId ) :array { return $this->getOrganizationRepository()->getOrganizationsIdsForPerson($personId); } public function getTypesIdsByLabel(?array $labels) :array { $types = []; $result = $this->getEntityManager()->getRepository(OrganizationType::class)->findBy( Loading Loading @@ -113,6 +124,14 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana return $this->getEntityManager()->getRepository(OrganizationRole::class); } /** * @return OrganizationRepository */ public function getOrganizationRepository() :OrganizationRepository { return $this->getEntityManager()->getRepository(Organization::class); } /** * Retourne la liste des Roles disponible pour une organisation dans une activité. */ Loading