Loading CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ Journal des modifications - Module Formation : Amélioration de l'UI concernant l'affichage des inscrits à une session de formation - Passage unicaen/renderer 7.0.2 (et donc à TinyMCE 6.3.0). - Filtre 'Catégorie de privilège' sur les pages 'Droits d'accès' : la liste est désormais issue d'une requête en bdd. - [FIX] Rapport d'activité : correction du filtrage selon le profil de l'utilisateur. 9.2.1 ----- Loading module/Application/src/Application/Entity/Db/Role.php +5 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,11 @@ class Role extends AbstractRole implements SourceAwareInterface, HistoriqueAware return $this->getCode() === self::CODE_DIRECTEUR_THESE; } public function isCodirecteurThese(): bool { return $this->getCode() === self::CODE_CODIRECTEUR_THESE; } /** * @return bool */ Loading module/Application/src/Application/Search/Filter/WhereSearchFilter.php 0 → 100644 +11 −0 Original line number Diff line number Diff line <?php namespace Application\Search\Filter; class WhereSearchFilter extends SearchFilter { public function canApplyToQueryBuilder(): bool { return true; } } module/RapportActivite/src/RapportActivite/Controller/Recherche/RapportActiviteRechercheController.php +97 −11 Original line number Diff line number Diff line Loading @@ -4,10 +4,13 @@ namespace RapportActivite\Controller\Recherche; use Application\Controller\AbstractController; use Application\Entity\Db\Interfaces\TypeValidationAwareTrait; use Application\Entity\Db\Role; use Application\Exporter\ExporterDataException; use Application\Filter\IdifyFilter; use Application\Search\Controller\SearchControllerInterface; use Application\Search\Controller\SearchControllerTrait; use Application\Search\Filter\SearchFilter; use Application\Search\Filter\WhereSearchFilter; use Application\Search\SearchServiceAwareTrait; use Fichier\Entity\FichierArchivable; use Fichier\Service\Fichier\Exception\FichierServiceException; Loading @@ -19,7 +22,9 @@ use RapportActivite\Entity\Db\RapportActivite; use RapportActivite\Provider\Privilege\RapportActivitePrivileges; use RapportActivite\Rule\Operation\RapportActiviteOperationRuleAwareTrait; use RapportActivite\Service\Fichier\RapportActiviteFichierServiceAwareTrait; use RapportActivite\Service\RapportActiviteService; use RapportActivite\Service\RapportActiviteServiceAwareTrait; use RapportActivite\Service\Search\RapportActiviteSearchService; use RuntimeException; use Structure\Service\Structure\StructureServiceAwareTrait; use UnexpectedValueException; Loading Loading @@ -57,8 +62,7 @@ class RapportActiviteRechercheController extends AbstractController implements S */ public function indexAction() { $this->restrictFilterEcolesDoctorales(); $this->restrictFilterUnitesRecherches(); $this->restrictFilters(); $text = $this->params()->fromQuery('text'); Loading Loading @@ -106,8 +110,7 @@ class RapportActiviteRechercheController extends AbstractController implements S */ public function filtersAction(): ViewModel { $this->restrictFilterEcolesDoctorales(); $this->restrictFilterUnitesRecherches(); $this->restrictFilters(); $filters = $this->filters(); Loading @@ -120,9 +123,47 @@ class RapportActiviteRechercheController extends AbstractController implements S return $model; } private function restrictFilterEcolesDoctorales() private function restrictFilters(): void { $this->restrictFilterDoctorant(); $this->restrictFilterEtablissementTheseSearchFilter(); $this->restrictFilterEcolesDoctorales(); $this->restrictFilterUnitesRecherches(); $this->restrictFilterNomDirecteur(); } private function restrictFilterDoctorant(): void { if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction sur les ED sélectionnables } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) { // restrictions en fonction du rôle $role = $this->userContextService->getSelectedIdentityRole(); if ($role->isDirecteurThese() || $role->isCodirecteurThese()) { $this->searchService->addFilter((new WhereSearchFilter("invisible", 'acteur_individu')) ->setWhereField('act.individu') ->setDefaultValue($this->userContextService->getDbUser()->getIndividu()->getId()) ->setVisible(false) ); $this->searchService->addFilter((new WhereSearchFilter("invisible", 'acteur_role')) ->setWhereField('actr.code') ->setDefaultValue($role->isDirecteurThese() ? Role::CODE_DIRECTEUR_THESE : Role::CODE_CODIRECTEUR_THESE) ->setVisible(false) ); } } else { throw new UnexpectedValueException( "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " . implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN]) ); } } private function restrictFilterEcolesDoctorales(): void { $edFilter = $this->searchService->getEcoleDoctoraleSearchFilter(); $filter = $this->searchService->getEcoleDoctoraleSearchFilter(); if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction sur les ED sélectionnables Loading @@ -130,9 +171,11 @@ class RapportActiviteRechercheController extends AbstractController implements S // restrictions en fonction du rôle if ($roleEcoleDoctorale = $this->userContextService->getSelectedRoleEcoleDoctorale()) { $ed = $roleEcoleDoctorale->getStructure()->getEcoleDoctorale(); $edFilter->setData([$ed]); $edFilter->setDefaultValueAsObject($ed); $edFilter->setAllowsEmptyOption(false); $filter->setData([$ed]); $filter->setDefaultValueAsObject($ed); $filter->setAllowsEmptyOption(false); } elseif ($this->userContextService->getSelectedRoleDirecteurThese()) { $filter->setVisible(false); } } else { throw new UnexpectedValueException( Loading @@ -142,7 +185,29 @@ class RapportActiviteRechercheController extends AbstractController implements S } } private function restrictFilterUnitesRecherches() private function restrictFilterEtablissementTheseSearchFilter(): void { $filter = $this->searchService->getEtablissementTheseSearchFilter(); if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction sur les ED sélectionnables } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) { // restrictions en fonction du rôle $role = $this->userContextService->getSelectedIdentityRole(); if ($etab = $role->getStructure()?->getEtablissement()) { $filter->setData([$etab]); $filter->setDefaultValueAsObject($etab); $filter->setAllowsEmptyOption(false); } } else { throw new UnexpectedValueException( "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " . implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN]) ); } } private function restrictFilterUnitesRecherches(): void { $filter = $this->searchService->getUniteRechercheSearchFilter(); Loading @@ -155,6 +220,27 @@ class RapportActiviteRechercheController extends AbstractController implements S $filter->setData([$ur]); $filter->setDefaultValueAsObject($ur); $filter->setAllowsEmptyOption(false); } elseif ($this->userContextService->getSelectedRoleDirecteurThese()) { $filter->setVisible(false); } } else { throw new UnexpectedValueException( "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " . implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN]) ); } } private function restrictFilterNomDirecteur(): void { $filter = $this->searchService->getNomDirecteurSearchFilter(); if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) { // restrictions en fonction du rôle if ($this->userContextService->getSelectedRoleDirecteurThese()) { $filter->setVisible(false); } } else { throw new UnexpectedValueException( Loading Loading @@ -187,7 +273,7 @@ class RapportActiviteRechercheController extends AbstractController implements S */ public function telechargerZipAction(): Response { $this->restrictFilterEcolesDoctorales(); $this->restrictFilters(); $result = $this->search(); if ($result instanceof Response) { Loading module/RapportActivite/src/RapportActivite/Service/Search/RapportActiviteSearchService.php +22 −2 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ class RapportActiviteSearchService extends SearchService private ?SelectSearchFilter $operationRealiseeSearchFilter = null; private ?SelectSearchFilter $operationAttendueSearchFilter = null; private ?SelectSearchFilter $dematerialiseSearchFilter = null; private ?TextSearchFilter $nomDirecteurSearchFilter = null; private ?TextSearchFilter $nomDoctorantSearchFilter = null; /** * @inheritDoc Loading Loading @@ -110,8 +112,8 @@ class RapportActiviteSearchService extends SearchService $uniteRechercheFilter, $finalSearchFilter, $anneeRapportActiviteInscrFilter, $this->createFilterNomDoctorant(), $this->createFilterNomDirecteur(), $this->getNomDoctorantSearchFilter(), $this->getNomDirecteurSearchFilter(), $avisAttenduSearchFilter, $dematerialiseSearchFilter, ])); Loading Loading @@ -148,6 +150,8 @@ class RapportActiviteSearchService extends SearchService ->leftJoin('ra.rapportAvis', 'raa') ->leftJoin('raa.avis', 'a') ->leftJoin('a.avisType', 'at') ->leftJoin('these.acteurs', 'act')->andWhereNotHistorise('act') ->leftJoin('act.role', 'actr')->andWhereNotHistorise('actr') ->andWhereNotHistorise(); $qb Loading Loading @@ -650,6 +654,22 @@ class RapportActiviteSearchService extends SearchService return $this->anneeRapportActiviteSearchFilter; } public function getNomDirecteurSearchFilter(): TextSearchFilter { if ($this->nomDirecteurSearchFilter === null) { $this->nomDirecteurSearchFilter = $this->createFilterNomDirecteur(); } return $this->nomDirecteurSearchFilter; } public function getNomDoctorantSearchFilter(): TextSearchFilter { if ($this->nomDoctorantSearchFilter === null) { $this->nomDoctorantSearchFilter = $this->createFilterNomDoctorant(); } return $this->nomDoctorantSearchFilter; } /** * @param EtablissementSearchFilter $etablissementTheseSearchFilter * @return RapportActiviteSearchService Loading Loading
CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ Journal des modifications - Module Formation : Amélioration de l'UI concernant l'affichage des inscrits à une session de formation - Passage unicaen/renderer 7.0.2 (et donc à TinyMCE 6.3.0). - Filtre 'Catégorie de privilège' sur les pages 'Droits d'accès' : la liste est désormais issue d'une requête en bdd. - [FIX] Rapport d'activité : correction du filtrage selon le profil de l'utilisateur. 9.2.1 ----- Loading
module/Application/src/Application/Entity/Db/Role.php +5 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,11 @@ class Role extends AbstractRole implements SourceAwareInterface, HistoriqueAware return $this->getCode() === self::CODE_DIRECTEUR_THESE; } public function isCodirecteurThese(): bool { return $this->getCode() === self::CODE_CODIRECTEUR_THESE; } /** * @return bool */ Loading
module/Application/src/Application/Search/Filter/WhereSearchFilter.php 0 → 100644 +11 −0 Original line number Diff line number Diff line <?php namespace Application\Search\Filter; class WhereSearchFilter extends SearchFilter { public function canApplyToQueryBuilder(): bool { return true; } }
module/RapportActivite/src/RapportActivite/Controller/Recherche/RapportActiviteRechercheController.php +97 −11 Original line number Diff line number Diff line Loading @@ -4,10 +4,13 @@ namespace RapportActivite\Controller\Recherche; use Application\Controller\AbstractController; use Application\Entity\Db\Interfaces\TypeValidationAwareTrait; use Application\Entity\Db\Role; use Application\Exporter\ExporterDataException; use Application\Filter\IdifyFilter; use Application\Search\Controller\SearchControllerInterface; use Application\Search\Controller\SearchControllerTrait; use Application\Search\Filter\SearchFilter; use Application\Search\Filter\WhereSearchFilter; use Application\Search\SearchServiceAwareTrait; use Fichier\Entity\FichierArchivable; use Fichier\Service\Fichier\Exception\FichierServiceException; Loading @@ -19,7 +22,9 @@ use RapportActivite\Entity\Db\RapportActivite; use RapportActivite\Provider\Privilege\RapportActivitePrivileges; use RapportActivite\Rule\Operation\RapportActiviteOperationRuleAwareTrait; use RapportActivite\Service\Fichier\RapportActiviteFichierServiceAwareTrait; use RapportActivite\Service\RapportActiviteService; use RapportActivite\Service\RapportActiviteServiceAwareTrait; use RapportActivite\Service\Search\RapportActiviteSearchService; use RuntimeException; use Structure\Service\Structure\StructureServiceAwareTrait; use UnexpectedValueException; Loading Loading @@ -57,8 +62,7 @@ class RapportActiviteRechercheController extends AbstractController implements S */ public function indexAction() { $this->restrictFilterEcolesDoctorales(); $this->restrictFilterUnitesRecherches(); $this->restrictFilters(); $text = $this->params()->fromQuery('text'); Loading Loading @@ -106,8 +110,7 @@ class RapportActiviteRechercheController extends AbstractController implements S */ public function filtersAction(): ViewModel { $this->restrictFilterEcolesDoctorales(); $this->restrictFilterUnitesRecherches(); $this->restrictFilters(); $filters = $this->filters(); Loading @@ -120,9 +123,47 @@ class RapportActiviteRechercheController extends AbstractController implements S return $model; } private function restrictFilterEcolesDoctorales() private function restrictFilters(): void { $this->restrictFilterDoctorant(); $this->restrictFilterEtablissementTheseSearchFilter(); $this->restrictFilterEcolesDoctorales(); $this->restrictFilterUnitesRecherches(); $this->restrictFilterNomDirecteur(); } private function restrictFilterDoctorant(): void { if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction sur les ED sélectionnables } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) { // restrictions en fonction du rôle $role = $this->userContextService->getSelectedIdentityRole(); if ($role->isDirecteurThese() || $role->isCodirecteurThese()) { $this->searchService->addFilter((new WhereSearchFilter("invisible", 'acteur_individu')) ->setWhereField('act.individu') ->setDefaultValue($this->userContextService->getDbUser()->getIndividu()->getId()) ->setVisible(false) ); $this->searchService->addFilter((new WhereSearchFilter("invisible", 'acteur_role')) ->setWhereField('actr.code') ->setDefaultValue($role->isDirecteurThese() ? Role::CODE_DIRECTEUR_THESE : Role::CODE_CODIRECTEUR_THESE) ->setVisible(false) ); } } else { throw new UnexpectedValueException( "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " . implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN]) ); } } private function restrictFilterEcolesDoctorales(): void { $edFilter = $this->searchService->getEcoleDoctoraleSearchFilter(); $filter = $this->searchService->getEcoleDoctoraleSearchFilter(); if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction sur les ED sélectionnables Loading @@ -130,9 +171,11 @@ class RapportActiviteRechercheController extends AbstractController implements S // restrictions en fonction du rôle if ($roleEcoleDoctorale = $this->userContextService->getSelectedRoleEcoleDoctorale()) { $ed = $roleEcoleDoctorale->getStructure()->getEcoleDoctorale(); $edFilter->setData([$ed]); $edFilter->setDefaultValueAsObject($ed); $edFilter->setAllowsEmptyOption(false); $filter->setData([$ed]); $filter->setDefaultValueAsObject($ed); $filter->setAllowsEmptyOption(false); } elseif ($this->userContextService->getSelectedRoleDirecteurThese()) { $filter->setVisible(false); } } else { throw new UnexpectedValueException( Loading @@ -142,7 +185,29 @@ class RapportActiviteRechercheController extends AbstractController implements S } } private function restrictFilterUnitesRecherches() private function restrictFilterEtablissementTheseSearchFilter(): void { $filter = $this->searchService->getEtablissementTheseSearchFilter(); if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction sur les ED sélectionnables } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) { // restrictions en fonction du rôle $role = $this->userContextService->getSelectedIdentityRole(); if ($etab = $role->getStructure()?->getEtablissement()) { $filter->setData([$etab]); $filter->setDefaultValueAsObject($etab); $filter->setAllowsEmptyOption(false); } } else { throw new UnexpectedValueException( "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " . implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN]) ); } } private function restrictFilterUnitesRecherches(): void { $filter = $this->searchService->getUniteRechercheSearchFilter(); Loading @@ -155,6 +220,27 @@ class RapportActiviteRechercheController extends AbstractController implements S $filter->setData([$ur]); $filter->setDefaultValueAsObject($ur); $filter->setAllowsEmptyOption(false); } elseif ($this->userContextService->getSelectedRoleDirecteurThese()) { $filter->setVisible(false); } } else { throw new UnexpectedValueException( "Anomalie : l'action aurait dû être bloquée en amont (controller guard) car l'utilisateur n'a aucun des privilèges suivants : " . implode(', ', [RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT, RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN]) ); } } private function restrictFilterNomDirecteur(): void { $filter = $this->searchService->getNomDirecteurSearchFilter(); if ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_TOUT))) { // aucune restriction } elseif ($this->isAllowed(Privileges::getResourceId(RapportActivitePrivileges::RAPPORT_ACTIVITE_LISTER_SIEN))) { // restrictions en fonction du rôle if ($this->userContextService->getSelectedRoleDirecteurThese()) { $filter->setVisible(false); } } else { throw new UnexpectedValueException( Loading Loading @@ -187,7 +273,7 @@ class RapportActiviteRechercheController extends AbstractController implements S */ public function telechargerZipAction(): Response { $this->restrictFilterEcolesDoctorales(); $this->restrictFilters(); $result = $this->search(); if ($result instanceof Response) { Loading
module/RapportActivite/src/RapportActivite/Service/Search/RapportActiviteSearchService.php +22 −2 Original line number Diff line number Diff line Loading @@ -67,6 +67,8 @@ class RapportActiviteSearchService extends SearchService private ?SelectSearchFilter $operationRealiseeSearchFilter = null; private ?SelectSearchFilter $operationAttendueSearchFilter = null; private ?SelectSearchFilter $dematerialiseSearchFilter = null; private ?TextSearchFilter $nomDirecteurSearchFilter = null; private ?TextSearchFilter $nomDoctorantSearchFilter = null; /** * @inheritDoc Loading Loading @@ -110,8 +112,8 @@ class RapportActiviteSearchService extends SearchService $uniteRechercheFilter, $finalSearchFilter, $anneeRapportActiviteInscrFilter, $this->createFilterNomDoctorant(), $this->createFilterNomDirecteur(), $this->getNomDoctorantSearchFilter(), $this->getNomDirecteurSearchFilter(), $avisAttenduSearchFilter, $dematerialiseSearchFilter, ])); Loading Loading @@ -148,6 +150,8 @@ class RapportActiviteSearchService extends SearchService ->leftJoin('ra.rapportAvis', 'raa') ->leftJoin('raa.avis', 'a') ->leftJoin('a.avisType', 'at') ->leftJoin('these.acteurs', 'act')->andWhereNotHistorise('act') ->leftJoin('act.role', 'actr')->andWhereNotHistorise('actr') ->andWhereNotHistorise(); $qb Loading Loading @@ -650,6 +654,22 @@ class RapportActiviteSearchService extends SearchService return $this->anneeRapportActiviteSearchFilter; } public function getNomDirecteurSearchFilter(): TextSearchFilter { if ($this->nomDirecteurSearchFilter === null) { $this->nomDirecteurSearchFilter = $this->createFilterNomDirecteur(); } return $this->nomDirecteurSearchFilter; } public function getNomDoctorantSearchFilter(): TextSearchFilter { if ($this->nomDoctorantSearchFilter === null) { $this->nomDoctorantSearchFilter = $this->createFilterNomDoctorant(); } return $this->nomDoctorantSearchFilter; } /** * @param EtablissementSearchFilter $etablissementTheseSearchFilter * @return RapportActiviteSearchService Loading