Loading doc/configuration/config-signature.md +4 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,10 @@ ## Technique ### Fichiers de configuration ``` cp config/autoload/unicaen-signature.local.php.dist config/autoload/unicaen-signature.local.php ``` ### Activer les éléments d'UI (Interface d'administration) ```bash Loading doc/versions/version-2.13.2-ripley-php8.md +9 −25 Original line number Diff line number Diff line # Mise à Jour 2.13.2 "RIPLEY" > Attention, version disponible sur la branche **"ripley"** > Attention, version disponible sur la branche **"ripley" / "master"** ## Mise à jour et patch Loading Loading @@ -127,10 +127,10 @@ Depuis https://git.unicaen.fr/open-source/oscar 826e821d..a4996af6 spartan -> origin/spartan ``` Basculer sur la branche **ripley** : Update mars 2025 : la version "Ripley" stable est sur la branche MASTER ```bash git checkout ripley-laminas-php8 git checkout master ``` ### Installation des librairies tiers Loading Loading @@ -188,7 +188,7 @@ php bin/oscar.php check:config Puis MAJ de la BDD si tout est OK ```bash php vendor/bin/doctrine-module orm:schema-tool:update --force php vendor/bin/doctrine-module orm:schema-tool:update --force --complete ``` ```bash Loading Loading @@ -278,26 +278,10 @@ Mise à jour de la quête SIFAC pour le chargement des dépenses engagées. la m ```php <?php function migrate_implode(string $separator, ?array $array) { if (is_null($array)) { return ''; } return implode($separator, $array); } $param_postgresql_host = /*oscar_php8_postgresql*/ "localhost"; $param_gearman_host = /*"oscar_php8_gearman"*/"localhost"; $param_elastic_host = /*"'oscar_php8_elasticsearch:9200'"*/"localhost"; // config/autoload/local.php //... return array( 'view_manager' => array( 'display_not_found_reason' => getenv('APPLICATION_ENV') == 'development', 'display_exceptions' => getenv('APPLICATION_ENV') == 'development', ), //... // Oscar 'oscar' => [ // Contenu... Loading Loading @@ -346,11 +330,11 @@ Créer et donner les droits d'accès en écriture au dossier des signatures : ### Configuration des parapheurs > Même si vous n'utilisez pas la signature numérique, copié quand même les fichiers de configurations ``` cp config/autoload/unicaen-signature.local.php.dist config/autoload/unicaen-signature.local.php ``` Se rendre dans l'administration des privilèges pour accorder les droits d'accès en fonction des rôles. > En cours module/Oscar/src/Oscar/Connector/ConnectorPersonDB.php +1 −1 Original line number Diff line number Diff line Loading @@ -317,7 +317,7 @@ class ConnectorPersonDB extends AbstractConnector { if ($this->personHydrator === null) { $this->personHydrator = new ConnectorPersonHydrator( $this->getServiceLocator()->get('Doctrine\ORM\EntityManager') $this->getServiceLocator() ); $this->personHydrator->setPurge($this->getOptionPurge()); } Loading module/Oscar/src/Oscar/Connector/ConnectorPersonHydrator.php +58 −23 Original line number Diff line number Diff line Loading @@ -8,8 +8,10 @@ namespace Oscar\Connector; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Laminas\ServiceManager\ServiceManager; use Oscar\Entity\Organization; use Oscar\Entity\OrganizationPerson; use Oscar\Entity\OrganizationRepository; Loading @@ -19,6 +21,7 @@ use Oscar\Entity\RoleRepository; use Oscar\Exception\ConnectorException; use Oscar\Exception\OscarException; use Oscar\Factory\JsonToPersonFactory; use Oscar\Service\PersonService; /** * Cette classe centralise l'analyse des données d'un personne pour mettre à jour un objet Person avec. Loading @@ -28,12 +31,15 @@ use Oscar\Factory\JsonToPersonFactory; */ class ConnectorPersonHydrator { private $serviceManager; /** * @return OrganizationRepository */ public function getOrganizationRepository() { return $this->entityManager->getRepository(Organization::class); return $this->getEntityManager()->getRepository(Organization::class); } /** Loading @@ -41,15 +47,47 @@ class ConnectorPersonHydrator */ public function getRoleRepository() { return $this->entityManager->getRepository(Role::class); return $this->getEntityManager()->getRepository(Role::class); } /** * @return ServiceManager */ public function getServiceManager() { return $this->serviceManager; } /** * @return EntityRepository * @throws \Doctrine\ORM\Exception\NotSupported * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ public function getOrganizationPersonRepository() :EntityRepository { return $this->getEntityManager()->getRepository(OrganizationPerson::class); } /** * @return EntityManager * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ public function getEntityManager() :EntityManager { return $this->getServiceManager()->get('Doctrine\ORM\EntityManager'); } /** * @return \Doctrine\ORM\EntityRepository * @return PersonService * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ public function getOrganizationPersonRepository() public function getPersonService() :PersonService { return $this->entityManager->getRepository(OrganizationPerson::class); return $this->getServiceManager()->get(PersonService::class); } private $repport; Loading Loading @@ -85,9 +123,9 @@ class ConnectorPersonHydrator * ConnectorPersonHydrator constructor. * @param EntityManager $entityManager */ public function __construct(EntityManager $entityManager) public function __construct(ServiceManager $serviceManager) { $this->entityManager = $entityManager; $this->serviceManager = $serviceManager; } /** Loading Loading @@ -160,15 +198,15 @@ class ConnectorPersonHydrator /////////////////////////////////// /// Récupération des rôles synchronisés par organisation $syncRoles = []; /** @var OrganizationPerson $organizationperson */ foreach ($personOscar->getOrganizations() as $organizationperson) { if ($organizationperson->getOrigin() == $connectorName) { $organizationCode = $organizationperson->getOrganization()->getCode(); /** @var OrganizationPerson $organizationPerson */ foreach ($personOscar->getOrganizations() as $organizationPerson) { if ($organizationPerson->getOrigin() == $connectorName) { $organizationCode = $organizationPerson->getOrganization()->getCode(); if (!array_key_exists($organizationCode, $syncRoles)) { $syncRoles[$organizationCode] = []; } if (!in_array($organizationperson->getRoleObj()->getRoleId(), $syncRoles[$organizationCode])) { $syncRoles[$organizationCode][] = $organizationperson->getRoleObj()->getRoleId(); if (!in_array($organizationPerson->getRoleObj()->getRoleId(), $syncRoles[$organizationCode])) { $syncRoles[$organizationCode][] = $organizationPerson->getRoleObj()->getRoleId(); } } } Loading @@ -184,6 +222,7 @@ class ConnectorPersonHydrator foreach ($roles as $roleId) { if (array_key_exists($organizationCode, $syncRoles)) { if (in_array($roleId, $syncRoles[$organizationCode])) { // Rôle déjà synchronisé array_splice( $syncRoles[$organizationCode], array_search($roleId, $syncRoles[$organizationCode]), Loading @@ -193,13 +232,9 @@ class ConnectorPersonHydrator } if (array_key_exists($roleId, $rolesOscar)) { if (!$organization->hasPerson($personOscar, $roleId)) { $roleOscar = new OrganizationPerson(); $this->entityManager->persist($roleOscar); $roleOscar->setPerson($personOscar) ->setOrganization($organization) ->setOrigin($connectorName) ->setRoleObj($rolesOscar[$roleId]); $personOscar->getOrganizations()->add($roleOscar); $this->getPersonService()->personOrganizationAdd($organization, $personOscar, $rolesOscar[$roleId],null,null, $connectorName); $this->repport->addupdated( sprintf( "Ajout du rôle '%s' dans '%s' pour '%s' ", Loading Loading @@ -249,18 +284,18 @@ class ConnectorPersonHydrator // Purge des rôles supprimés foreach ($syncRoles as $code => $roles) { if (count($syncRoles[$code]) < 0) { if (count($roles) <= 0) { continue; } /** @var OrganizationPerson $organizationPerson */ foreach ($personOscar->getOrganizations() as $organizationPerson) { $roleId = $organizationPerson->getRole(); $codeOrg = $organizationPerson->getOrganization()->getCode(); if ($codeOrg == $code) { if (in_array($roleId, $syncRoles[$code])) { if ($this->getPurge()) { $this->entityManager->remove($organizationPerson); $this->getPersonService()->personOrganizationRemove($organizationPerson); $this->repport->addremoved( sprintf( "Suppression du rôle %s pour %s dans %s.", Loading module/Oscar/src/Oscar/Connector/ConnectorPersonJsonHttpAuthBasic.php +1 −1 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ class ConnectorPersonJsonHttpAuthBasic extends AbstractConnectorOscar { if( $this->personHydrator === null ){ $this->personHydrator = new ConnectorPersonHydrator( $this->getEntityManager() $this->getServiceManager() ); $this->personHydrator->setPurge($this->getOptionPurge()); } Loading Loading
doc/configuration/config-signature.md +4 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,10 @@ ## Technique ### Fichiers de configuration ``` cp config/autoload/unicaen-signature.local.php.dist config/autoload/unicaen-signature.local.php ``` ### Activer les éléments d'UI (Interface d'administration) ```bash Loading
doc/versions/version-2.13.2-ripley-php8.md +9 −25 Original line number Diff line number Diff line # Mise à Jour 2.13.2 "RIPLEY" > Attention, version disponible sur la branche **"ripley"** > Attention, version disponible sur la branche **"ripley" / "master"** ## Mise à jour et patch Loading Loading @@ -127,10 +127,10 @@ Depuis https://git.unicaen.fr/open-source/oscar 826e821d..a4996af6 spartan -> origin/spartan ``` Basculer sur la branche **ripley** : Update mars 2025 : la version "Ripley" stable est sur la branche MASTER ```bash git checkout ripley-laminas-php8 git checkout master ``` ### Installation des librairies tiers Loading Loading @@ -188,7 +188,7 @@ php bin/oscar.php check:config Puis MAJ de la BDD si tout est OK ```bash php vendor/bin/doctrine-module orm:schema-tool:update --force php vendor/bin/doctrine-module orm:schema-tool:update --force --complete ``` ```bash Loading Loading @@ -278,26 +278,10 @@ Mise à jour de la quête SIFAC pour le chargement des dépenses engagées. la m ```php <?php function migrate_implode(string $separator, ?array $array) { if (is_null($array)) { return ''; } return implode($separator, $array); } $param_postgresql_host = /*oscar_php8_postgresql*/ "localhost"; $param_gearman_host = /*"oscar_php8_gearman"*/"localhost"; $param_elastic_host = /*"'oscar_php8_elasticsearch:9200'"*/"localhost"; // config/autoload/local.php //... return array( 'view_manager' => array( 'display_not_found_reason' => getenv('APPLICATION_ENV') == 'development', 'display_exceptions' => getenv('APPLICATION_ENV') == 'development', ), //... // Oscar 'oscar' => [ // Contenu... Loading Loading @@ -346,11 +330,11 @@ Créer et donner les droits d'accès en écriture au dossier des signatures : ### Configuration des parapheurs > Même si vous n'utilisez pas la signature numérique, copié quand même les fichiers de configurations ``` cp config/autoload/unicaen-signature.local.php.dist config/autoload/unicaen-signature.local.php ``` Se rendre dans l'administration des privilèges pour accorder les droits d'accès en fonction des rôles. > En cours
module/Oscar/src/Oscar/Connector/ConnectorPersonDB.php +1 −1 Original line number Diff line number Diff line Loading @@ -317,7 +317,7 @@ class ConnectorPersonDB extends AbstractConnector { if ($this->personHydrator === null) { $this->personHydrator = new ConnectorPersonHydrator( $this->getServiceLocator()->get('Doctrine\ORM\EntityManager') $this->getServiceLocator() ); $this->personHydrator->setPurge($this->getOptionPurge()); } Loading
module/Oscar/src/Oscar/Connector/ConnectorPersonHydrator.php +58 −23 Original line number Diff line number Diff line Loading @@ -8,8 +8,10 @@ namespace Oscar\Connector; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Laminas\ServiceManager\ServiceManager; use Oscar\Entity\Organization; use Oscar\Entity\OrganizationPerson; use Oscar\Entity\OrganizationRepository; Loading @@ -19,6 +21,7 @@ use Oscar\Entity\RoleRepository; use Oscar\Exception\ConnectorException; use Oscar\Exception\OscarException; use Oscar\Factory\JsonToPersonFactory; use Oscar\Service\PersonService; /** * Cette classe centralise l'analyse des données d'un personne pour mettre à jour un objet Person avec. Loading @@ -28,12 +31,15 @@ use Oscar\Factory\JsonToPersonFactory; */ class ConnectorPersonHydrator { private $serviceManager; /** * @return OrganizationRepository */ public function getOrganizationRepository() { return $this->entityManager->getRepository(Organization::class); return $this->getEntityManager()->getRepository(Organization::class); } /** Loading @@ -41,15 +47,47 @@ class ConnectorPersonHydrator */ public function getRoleRepository() { return $this->entityManager->getRepository(Role::class); return $this->getEntityManager()->getRepository(Role::class); } /** * @return ServiceManager */ public function getServiceManager() { return $this->serviceManager; } /** * @return EntityRepository * @throws \Doctrine\ORM\Exception\NotSupported * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ public function getOrganizationPersonRepository() :EntityRepository { return $this->getEntityManager()->getRepository(OrganizationPerson::class); } /** * @return EntityManager * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ public function getEntityManager() :EntityManager { return $this->getServiceManager()->get('Doctrine\ORM\EntityManager'); } /** * @return \Doctrine\ORM\EntityRepository * @return PersonService * @throws \Psr\Container\ContainerExceptionInterface * @throws \Psr\Container\NotFoundExceptionInterface */ public function getOrganizationPersonRepository() public function getPersonService() :PersonService { return $this->entityManager->getRepository(OrganizationPerson::class); return $this->getServiceManager()->get(PersonService::class); } private $repport; Loading Loading @@ -85,9 +123,9 @@ class ConnectorPersonHydrator * ConnectorPersonHydrator constructor. * @param EntityManager $entityManager */ public function __construct(EntityManager $entityManager) public function __construct(ServiceManager $serviceManager) { $this->entityManager = $entityManager; $this->serviceManager = $serviceManager; } /** Loading Loading @@ -160,15 +198,15 @@ class ConnectorPersonHydrator /////////////////////////////////// /// Récupération des rôles synchronisés par organisation $syncRoles = []; /** @var OrganizationPerson $organizationperson */ foreach ($personOscar->getOrganizations() as $organizationperson) { if ($organizationperson->getOrigin() == $connectorName) { $organizationCode = $organizationperson->getOrganization()->getCode(); /** @var OrganizationPerson $organizationPerson */ foreach ($personOscar->getOrganizations() as $organizationPerson) { if ($organizationPerson->getOrigin() == $connectorName) { $organizationCode = $organizationPerson->getOrganization()->getCode(); if (!array_key_exists($organizationCode, $syncRoles)) { $syncRoles[$organizationCode] = []; } if (!in_array($organizationperson->getRoleObj()->getRoleId(), $syncRoles[$organizationCode])) { $syncRoles[$organizationCode][] = $organizationperson->getRoleObj()->getRoleId(); if (!in_array($organizationPerson->getRoleObj()->getRoleId(), $syncRoles[$organizationCode])) { $syncRoles[$organizationCode][] = $organizationPerson->getRoleObj()->getRoleId(); } } } Loading @@ -184,6 +222,7 @@ class ConnectorPersonHydrator foreach ($roles as $roleId) { if (array_key_exists($organizationCode, $syncRoles)) { if (in_array($roleId, $syncRoles[$organizationCode])) { // Rôle déjà synchronisé array_splice( $syncRoles[$organizationCode], array_search($roleId, $syncRoles[$organizationCode]), Loading @@ -193,13 +232,9 @@ class ConnectorPersonHydrator } if (array_key_exists($roleId, $rolesOscar)) { if (!$organization->hasPerson($personOscar, $roleId)) { $roleOscar = new OrganizationPerson(); $this->entityManager->persist($roleOscar); $roleOscar->setPerson($personOscar) ->setOrganization($organization) ->setOrigin($connectorName) ->setRoleObj($rolesOscar[$roleId]); $personOscar->getOrganizations()->add($roleOscar); $this->getPersonService()->personOrganizationAdd($organization, $personOscar, $rolesOscar[$roleId],null,null, $connectorName); $this->repport->addupdated( sprintf( "Ajout du rôle '%s' dans '%s' pour '%s' ", Loading Loading @@ -249,18 +284,18 @@ class ConnectorPersonHydrator // Purge des rôles supprimés foreach ($syncRoles as $code => $roles) { if (count($syncRoles[$code]) < 0) { if (count($roles) <= 0) { continue; } /** @var OrganizationPerson $organizationPerson */ foreach ($personOscar->getOrganizations() as $organizationPerson) { $roleId = $organizationPerson->getRole(); $codeOrg = $organizationPerson->getOrganization()->getCode(); if ($codeOrg == $code) { if (in_array($roleId, $syncRoles[$code])) { if ($this->getPurge()) { $this->entityManager->remove($organizationPerson); $this->getPersonService()->personOrganizationRemove($organizationPerson); $this->repport->addremoved( sprintf( "Suppression du rôle %s pour %s dans %s.", Loading
module/Oscar/src/Oscar/Connector/ConnectorPersonJsonHttpAuthBasic.php +1 −1 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ class ConnectorPersonJsonHttpAuthBasic extends AbstractConnectorOscar { if( $this->personHydrator === null ){ $this->personHydrator = new ConnectorPersonHydrator( $this->getEntityManager() $this->getServiceManager() ); $this->personHydrator->setPurge($this->getOptionPurge()); } Loading