Commit a095e57e authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Optimisation et UI de recherche unifiée pour les activités (en cours)

parent 3ba317fe
Loading
Loading
Loading
Loading
Loading
+39 −7
Original line number Diff line number Diff line
@@ -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()
                );
@@ -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
+4 −4
Original line number Diff line number Diff line
@@ -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()
+31 −0
Original line number Diff line number Diff line
@@ -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 {
+12 −6
Original line number Diff line number Diff line
@@ -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
{
@@ -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();
@@ -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;
    }

+19 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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(
@@ -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