Commit e8f0e488 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Possibilité d'avoir un même Individu rattaché à plusieurs Utilisateur

parent 32a487ec
Loading
Loading
Loading
Loading
+1 −9
Changes for module/Application/config/others/utilisateur.config.php: 1 added line, 9 removed lines.
Original line number Diff line number Diff line
<?php

use Application\Controller\Factory\UtilisateurControllerFactory;
use Application\Controller\UtilisateurController;
use Application\Form\CreationUtilisateurForm;
use Application\Form\CreationUtilisateurFromIndividuForm;
use Application\Form\Factory\CreationUtilisateurFormFactory;
@@ -101,15 +102,6 @@ return [
                            ],
                        ],
                    ],
                    'ajouter-pour-individu' => [
                        'type'          => Segment::class,
                        'options'       => [
                            'route'       => '/ajouter-pour-individu/:individu',
                            'defaults'    => [
                                'action' => 'ajouterFromIndividu',
                            ],
                        ],
                    ],
                    'creer-compte-local-individu' => [
                        'type'          => Segment::class,
                        'options'       => [
+2 −2
Changes for module/Application/src/Application/Controller/TheseController.php: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -255,8 +255,8 @@ class TheseController extends AbstractController

        $utilisateurs = [];
        foreach ($these->getActeurs() as $acteur) {
            $utilisateur = $this->utilisateurService->getRepository()->findByIndividu($acteur->getIndividu());
            $utilisateurs[$acteur->getId()] = $utilisateur;
            $utilisateursTrouves = $this->utilisateurService->getRepository()->findByIndividu($acteur->getIndividu()); // ok
            $utilisateurs[$acteur->getId()] = $utilisateursTrouves;
        }

        //TODO JP remplacer dans modifierPersopassUrl();
+13 −50
Changes for module/Application/src/Application/Controller/UtilisateurController.php: 13 added lines, 50 removed lines.
Original line number Diff line number Diff line
@@ -156,49 +156,6 @@ class UtilisateurController extends \UnicaenAuth\Controller\UtilisateurControlle
        ]);
    }

    /**
     * @return ViewModel
     */
    public function ajouterFromIndividuAction()
    {
        /** @var Individu $individu */
        $individuId = $this->params('individu');
        $individu = $this->individuService->getRepository()->findOneBy(["id"=>$individuId]);
        if ($individu === null) {
            throw new RuntimeException("Individu introuvable avec cet id");
        }

        $utilisateur = $this->utilisateurService->getRepository()->findByIndividu($individu);
        if ($utilisateur !== null) {
            throw new RuntimeException("Il existe déjà un utilisateur lié à l'individu $individu.");
        }

        /** @var CreationUtilisateurFromIndividuForm $form */
        $form = $this->getServiceLocator()->get('FormElementManager')->get(CreationUtilisateurFromIndividuForm::class);
        $form->setIndividu($individu);

        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            $form->setData($data);
            if ($form->isValid()) {
                if (!empty($data['email'])) {
                    $individu->setEmail($data['email']);
                }
                $utilisateur = $this->utilisateurService->createFromIndividuAndFormData($individu, $data->toArray());
                $this->flashMessenger()->addSuccessMessage(
                    "Utilisateur <strong>{$utilisateur->getUsername()}</strong> créé avec succès à partir de l'individu $individu.");
                $this->redirect()->toRoute('utilisateur');
            }
        }

        return new ViewModel([
            'form' => $form,
            'individu' => $individu,
        ]);
    }

    /**
     * Usurpe l'identité d'un autre utilisateur.
     *
@@ -414,9 +371,12 @@ class UtilisateurController extends \UnicaenAuth\Controller\UtilisateurControlle
    {
        $individu = $this->getIndividuService()->getRequestedIndividu($this);
        $acteurs = $this->acteurService->getRepository()->findActeursByIndividu($individu);
        $utilisateur = $this->utilisateurService->getRepository()->findByIndividu($individu);
        if ($utilisateur === null AND $individu->getEmail() !== null) $utilisateur = $this->utilisateurService->getRepository()->findByUsername($individu->getEmail());

        $utilisateurs = $this->utilisateurService->getRepository()->findByIndividu($individu, $isLocal = true); // done
        // NB: findByIndividu() avec $isLocal = true renverra 1 utilisateur au maximum
        $utilisateur = $utilisateurs ? current($utilisateurs) : null;
        if ($utilisateur === null AND $individu->getEmail() !== null) {
            $utilisateur = $this->utilisateurService->getRepository()->findByUsername($individu->getEmail());
        }

        return new ViewModel([
            'individu' => $individu,
@@ -428,9 +388,9 @@ class UtilisateurController extends \UnicaenAuth\Controller\UtilisateurControlle
    public function creerCompteLocalIndividuAction()
    {
        $individu = $this->getIndividuService()->getRequestedIndividu($this);
        $utilisateur = $this->utilisateurService->getRepository()->findByIndividu($individu);
        $utilisateurs = $this->utilisateurService->getRepository()->findByIndividu($individu); // done

        if ($utilisateur === null) {
        if (empty($utilisateurs)) {
            $user = $this->utilisateurService->createFromIndividu($individu, $individu->getEmail(), 'none');
            $this->userService->updateUserPasswordResetToken($user);
            $url = $this->url()->fromRoute('utilisateur/init-compte', ['token' => $user->getPasswordResetToken()], ['force_canonical' => true], true);
@@ -442,9 +402,12 @@ class UtilisateurController extends \UnicaenAuth\Controller\UtilisateurControlle
        return $this->redirect()->toRoute('utilisateur/gerer-utilisateur', ['individu' => $individu->getId()], [], true);
    }

    public function resetPasswordAction() {
    public function resetPasswordAction()
    {
        $individu = $this->getIndividuService()->getRequestedIndividu($this);
        $utilisateur = $this->utilisateurService->getRepository()->findByIndividu($individu);
        $utilisateurs = $this->utilisateurService->getRepository()->findByIndividu($individu, $isLocal = true); // done
        // NB: findByIndividu() avec $isLocal = true renverra 1 utilisateur au maximum
        $utilisateur = $utilisateurs ? current($utilisateurs) : null;

        if ($utilisateur !== null) {
            $this->userService->updateUserPasswordResetToken($utilisateur);
+1 −1
Changes for module/Application/src/Application/Controller/ValidationController.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ class ValidationController extends AbstractController
        /** @var Acteur $acteur */
        foreach ($these->getActeurs() as $acteur) {
            $individu = $acteur->getIndividu();
            $utilisateurs[$individu->getId()] = $this->utilisateurService->getRepository()->findByIndividu($individu);
            $utilisateurs[$individu->getId()] = $this->utilisateurService->getRepository()->findByIndividu($individu); // ok
        }

        $view = new ViewModel([
+18 −7
Changes for module/Application/src/Application/Entity/Db/Repository/UtilisateurRepository.php: 18 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -13,23 +13,34 @@ class UtilisateurRepository extends DefaultEntityRepository
     * Recherche les utilisateurs lié à un individu.
     *
     * @param Individu  $individu
     * @return Utilisateur
     * @param bool|null $isLocal
     * @return Utilisateur[]
     */
    public function findByIndividu(Individu $individu)
    public function findByIndividu(Individu $individu, $isLocal = null)
    {
        $qb = $this->createQueryBuilder('u')
            ->join('u.individu', 'i')
            ->where('i = :individu')
            ->setParameter('individu', $individu);

        try {
            $utilisateur = $qb->getQuery()->getOneOrNullResult();
        } catch (NonUniqueResultException $e) {
        if ($isLocal !== null) {
            if ($isLocal) {
                $qb->andWhere($qb->expr()->notIn('u.password', ['shib', 'ldap']));
            } else {
                $qb->andWhere($qb->expr()->in('u.password', ['shib', 'ldap']));
            }
        }

        $utilisateurs = $qb->getQuery()->getResult();
            throw new RuntimeException("Plusieurs (".count($utilisateurs).") Utilisateur partagent le même individu [".$individu->getId()."]", 0, $e);

        if ($isLocal && count($utilisateurs) > 1) {
            throw new RuntimeException(
                "Plusieurs Utilisateur partagent le même individu " . $individu->getId() . " : " .
                implode(', ', array_map(function (Utilisateur $u) { return $u->getId(); }, $utilisateurs))
            );
        }

        return $utilisateur;
        return $utilisateurs;
    }

    /**
Loading