Commit f58bb053 authored by David Surville's avatar David Surville
Browse files

Refonte des pages de gestion des utilisateurs

parent 20f64a70
Loading
Loading
Loading
Loading
Loading
+24 −26
Changes for config/merged/utilisateur.config.php: 24 added lines, 26 removed lines.
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ use UnicaenUtilisateur\Form\User\UserForm;
use UnicaenUtilisateur\Form\User\UserFormFactory;
use UnicaenUtilisateur\Form\User\UserHydrator;
use UnicaenUtilisateur\Form\User\UserHydratorFactory;
use UnicaenUtilisateur\Form\User\UserRechercheForm;
use UnicaenUtilisateur\Provider\Privilege\UtilisateurPrivileges;
use UnicaenUtilisateur\Service\Role\RoleService;
use UnicaenUtilisateur\Service\Role\RoleServiceFactory;
@@ -16,6 +17,17 @@ use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;

return [

    'unicaen-utilisateur' => [
        /**
         * Liste des services utilisée pour rechercher un utilisateur existant ou à ajouter dans l'application.
         * Le service 'app' est défini par défaut et va rechercher dans la table des utilisateurs défini dans le paramètre 'user_entity_class'.
         */
        'recherche-individu' => [
            'app'       => UserService::class,
        ],
    ],

    'bjyauthorize' => [
        'guards' => [
            PrivilegeController::class => [
@@ -24,8 +36,7 @@ return [
                    'action' => [
                        'index',
                        'rechercher',
                        'rechercher-utilisateur',
                        'listing',
                        'lister',
                        'export'
                    ],
                    'privileges' => [
@@ -35,7 +46,7 @@ return [
                [
                    'controller' => UtilisateurController::class,
                    'action' => [
                        'effacer',
                        'supprimer',
                        'ajouter',
                    ],
                    'privileges' => [
@@ -78,13 +89,13 @@ return [
                ],
                'may_terminate' => true,
                'child_routes' => [
                    'listing' => [
                    'lister' => [
                        'type'          => Literal::class,
                        'options'       => [
                            'route'       => '/listing',
                            'route'       => '/lister',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'listing',
                                'action' => 'lister',
                            ],
                        ],
                    ],
@@ -111,23 +122,13 @@ return [
                    'rechercher' => [
                        'type'          => Segment::class,
                        'options'       => [
                            'route'       => '/rechercher[/:service-name]',
                            'route'       => '/rechercher',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'rechercher',
                            ],
                        ],
                    ],
                    'rechercher-utilisateur' => [
                        'type'          => Literal::class,
                        'options'       => [
                            'route'       => '/rechercher-utilisateur',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'rechercher-utilisateur',
                            ],
                        ],
                    ],
                    'add-role' => [
                        'type'          => Segment::class,
                        'options'       => [
@@ -158,13 +159,13 @@ return [
                            ],
                        ],
                    ],
                    'effacer' => [
                    'supprimer' => [
                        'type'          => Segment::class,
                        'options'       => [
                            'route'       => '/effacer/:utilisateur',
                            'route'       => '/supprimer/:utilisateur',
                            'defaults'    => [
                                'controller' => UtilisateurController::class,
                                'action' => 'effacer',
                                'action' => 'supprimer',
                            ],
                        ],
                    ],
@@ -181,14 +182,11 @@ return [
    ],

    'form_elements' => [
        'factories' => [
            UserForm::class => UserFormFactory::class,
        ],
        'invokables' => [
            UserRechercheForm::class => UserRechercheForm::class,
        ],

    'hydrators' => [
        'factories' => [
            UserHydrator::class => UserHydratorFactory::class,
            UserForm::class => UserFormFactory::class,
        ],
    ],

+136 −134
Changes for src/UnicaenUtilisateur/Controller/UtilisateurController.php: 136 added lines, 134 removed lines.
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ use UnicaenApp\Service\EntityManagerAwareTrait;
use UnicaenApp\View\Model\CsvModel;
use UnicaenUtilisateur\Entity\Db\UserInterface;
use UnicaenUtilisateur\Form\User\UserFormAwareTrait;
use UnicaenUtilisateur\Form\User\UserRechercheFormAwareTrait;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuResultatInterface;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuServiceInterface;
use UnicaenUtilisateur\Service\Role\RoleServiceAwareTrait;
use UnicaenUtilisateur\Service\User\UserServiceAwareTrait;
@@ -24,123 +26,129 @@ class UtilisateurController extends AbstractActionController
    use RoleServiceAwareTrait;
    use UserServiceAwareTrait;
    use EntityManagerAwareTrait;

    use UserFormAwareTrait;
    use UserRechercheFormAwareTrait;


    public $recherche;
    /**
     * @var RechercheIndividuServiceInterface[]
     */
    public $searchServices;

    /** @var ProviderInterface */
    /**
     * @var ProviderInterface
     */
    private $identityProvider;

    /**
     * @param $searchServices
     * @return self
     */
    public function setSearchServices($searchServices)
    {
        $this->searchServices = $searchServices;

        return $this;
    }

    /**
     * @param $provider
     * @return self
     */
    public function setIdentityProvider($provider)
    {
        $this->identityProvider = $provider;

        return $this;
    }

    public function indexAction()
    {
        $roles = $this->roleService->findAll();
        $utilisateur = null;
        $rolesAffectes = [];
        $rolesDisponibles = [];

        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost()->toArray()['utilisateur'];
            $source = explode('||',$data['id'])[0];
            $id = explode('||',$data['id'])[1];

            $utilisateur = null;
        $form = $this->userRechercheForm;

        if ($data = $this->params()->fromPost()) {
            $form->setData($data);
            if ($form->isValid()) {
                list($source, $id) = explode('||', $data['utilisateurId']);

                switch ($source) {
                    case 'app' :
                    $utilisateur = $this->userService->find($id);
                    $params = [];
                    if ($utilisateur !== null) $params = ["query" => ["id" => $id]];
                    return $this->redirect()->toRoute(null, [], $params, true);
                        return $this->redirect()->toRoute('unicaen-utilisateur', [], ["query" => ["id" => $id]], true);

                // on peut complete en cas nouvelle source
                    default :
                    if (isset($this->recherche[$source])) {
                        $people = $this->recherche[$source]->findById($id);
                        $utilisateur = $this->userService->importFromRechercheIndividuResultatInterface($people, $source);

                        $params = [];
                        if (!$this->userService->findByUsername($utilisateur->getUsername())) {
                            $this->userService->create($utilisateur);
                            $params = array_merge($params, ["query" => ["id" => $utilisateur->getId()]]);
                        if (isset($this->searchServices[$source])) {
                            $sourceUser = $this->searchServices[$source]->findById($id);
                            $newUser = $this->userService->importFromRechercheIndividuResultatInterface($sourceUser, $source);
                            $user = $this->userService->findByUsername($newUser->getUsername());

                            if (!$user) {
                                $user = $this->userService->create($newUser);
                            } else {
                            $old = $this->userService->findByUsername($utilisateur->getUsername());
                            $params = array_merge($params, ["query" => ["id" => $old->getId()]]);
                            $this->flashMessenger()->addErrorMessage('Utilisateur <strong>' . $utilisateur->getUsername() . '</strong> déjà enregistré en base.');
                                $this->flashMessenger()->addErrorMessage(
                                    sprintf("L'utilisateur <strong>%s (%s)</strong> existe déjà dans l'application.", $user->getDisplayName(), $user->getUsername())
                                );
                            }
                        return $this->redirect()->toUrl($this->url()->fromRoute(null, [], $params, true));

                            $this->flashMessenger()->addSuccessMessage(sprintf("Utilisateur <strong>%s</strong> créé avec succès.", $user->getDisplayName()));
                            return $this->redirect()->toRoute('utilisateur', [], ["query" => ["id" => $user->getId()]], true);
                        }
                        else {
                        $this->flashMessenger()->addErrorMessage("Source inconnue [" . $source . "].");
                            $this->flashMessenger()->addErrorMessage("La source \"$source\" n'est pas déclarée dans la configuration.");

                            return $this->redirect()->toRoute('utilisateur', [], [], true);
                        }
                }
            }
        }

        $utilisateurId = $this->params()->fromQuery("id");
        if ($utilisateurId !== null) {
            /** @var UserInterface $utilisateur */
            $utilisateur = $this->userService->find($utilisateurId);
            if ($utilisateur !== null) {
                $rolesAffectes = $utilisateur->getRoles()->toArray();
                $rolesDisponibles = array_diff($roles, $rolesAffectes);
            if($utilisateur instanceof UserInterface) {
                $rolesAttribues = $utilisateur->getRoles()->toArray();
                $rolesDisponibles = array_diff($roles, $rolesAttribues);
            }
        }

        // TODO recup le provider qui va bien ...

        // TODO recupérer le provider qui va bien ...
        return new ViewModel([
            'form' => $form,
            'utilisateur' => $utilisateur,
            'roles' => $roles,
            'rolesAutomatiques' => ($this->identityProvider !== null) ? $this->identityProvider->computeRolesAutomatiques($utilisateur) : [],
            'rolesAffectes' => $rolesAffectes,
            'rolesAttribues' => $rolesAttribues,
            'rolesDisponibles' => $rolesDisponibles,
            'identityProvider' => ($this->identityProvider !== null),
            'rolesAutomatiques' => ($this->identityProvider !== null) ? $this->identityProvider->computeRolesAutomatiques($utilisateur) : [],
        ]);
    }

    /** Ajout d'un utilisateur local **/
    public function ajouterAction()
    {
        $user = $this->userService->getEntityInstance();
        $utilisateur = $this->userService->getEntityInstance();
        $form = $this->getUserForm();
        $form->setAttribute('action', $this->url()->fromRoute('unicaen-utilisateur/ajouter', [], [], true));
        $form->bind($user);
        $form->bind($utilisateur);

        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
        if ($data = $this->params()->fromPost()) {
            $form->setData($data);
            if ($form->isValid()) {
                $this->userService->createLocal($user);
                return $this->redirect()->toRoute('unicaen-utilisateur',[], ["query" => ["id" => $user->getId()]], true);
            }
                try {
                    $this->userService->createLocal($utilisateur);
                    $this->flashMessenger()->addSuccessMessage(sprintf("Utilisateur <strong>%s</strong> créé avec succès.", $utilisateur->getDisplayName()));
                } catch (Exception $e) {
                    $this->flashMessenger()->addErrorMessage(sprintf("Une erreur est survenu lors de la création de l'utilisateur <strong>%s</strong>.", $utilisateur->getDisplayName()));
                }

        $vm = new ViewModel();
        //$vm->setTemplate('unicaen-utilisateur/default/default-form');
        $vm->setVariables([
            'title' => "Ajout d'un utilisateur local",
            'form' => $form,
        ]);
        return $vm;
                return $this->redirect()->toRoute('unicaen-utilisateur', [], ["query" => ["id" => $utilisateur->getId()]], true);
            }
        }

    public function addRoleAction() {

        $role = null;
        $utilisateur = null;
        $title = "Création d'un utilisateur local";
        return compact('title', 'form');
    }

        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
    public function addRoleAction()
    {
        $utilisateurId = $this->params()->fromRoute("utilisateur");
        $utilisateur = $this->userService->find($utilisateurId);
        $roleId = $this->params()->fromRoute("role");
@@ -148,24 +156,19 @@ class UtilisateurController extends AbstractActionController

        if ($utilisateur !== null && $role !== null) {
            $this->userService->addRole($utilisateur, $role);
            }
            $result = true;
        }

        return new ViewModel([
            "role" => $role,
            "utilisateur" => $utilisateur,
        return new JsonModel([
            "result" => $result ?: false,
            "message" => $result
                ? sprintf("Ajout du rôle \"%s\" à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
                : sprintf("Erreur lors de l'ajout du rôle \"%s\" à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
        ]);
    }

    public function removeRoleAction()
    {

        $role = null;
        $utilisateur = null;

        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
        $utilisateurId = $this->params()->fromRoute("utilisateur");
        $utilisateur = $this->userService->find($utilisateurId);
        $roleId = $this->params()->fromRoute("role");
@@ -173,95 +176,94 @@ class UtilisateurController extends AbstractActionController

        if ($utilisateur !== null && $role !== null) {
            $this->userService->removeRole($utilisateur, $role);
            }
            $result = true;
        }

        return new ViewModel([
            "role" => $role,
            "utilisateur" => $utilisateur,
        return new JsonModel([
            "result" => $result ?: false,
            "message" => $result
                ? sprintf("Suppression du rôle \"%s\" à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
                : sprintf("Erreur lors de la suppression du rôle \"%s\" à l'utilisateur <strong>%s</strong>.", $role->getLibelle(), $utilisateur->getDisplayName())
        ]);
    }

    public function changerStatutAction()
    {
        $utilisateurId = $this->params()->fromRoute("utilisateur");
        $utilisateur = $this->userService->find($utilisateurId);
        try {
            $utilisateur = $this->userService->find($this->params()->fromRoute("utilisateur"));
            $utilisateur = $this->userService->changeStatus($utilisateur);

        $params = [];
        if ($utilisateur !== null) $params = ["query" => ["id" => $utilisateur->getId()]];
        return $this->redirect()->toRoute('utilisateur', [], $params, true);
            $this->flashMessenger()->addSuccessMessage(sprintf("Utilisateur <strong>%s</strong> %s avec succès.",
                $utilisateur->getDisplayName(),
                $utilisateur->getState() ? 'activé' : 'suspendu'));
        } catch (Exception $e) {
            $this->flashMessenger()->addErrorMessage(sprintf("Une erreur est survenu lors de %s de l'utilisateur <strong>%s</strong>.",
                $utilisateur->getDisplayName(),
                $utilisateur->getState() ? "l'activation" : 'la suspension'));
        }

    public function effacerAction()
    {
        $utilisateurId = $this->params()->fromRoute("utilisateur");
        $utilisateur = $this->userService->find($utilisateurId);
        return compact('utilisateur');
    }

        /** @var Request $request */
        $request = $this->getRequest();
        if ($request->isPost()) {
            $data = $request->getPost();
            if ($data["reponse"] === "oui") $this->userService->supprimer($utilisateur);
            //return $this->redirect()->toRoute('utilisateur', [], [], true);
            exit();
        }

        $vm = new ViewModel();
        if ($utilisateur !== null) {
            $vm->setTemplate('unicaen-utilisateur/default/confirmation');
            $vm->setVariables([
                'title' => "Suppression de l'utilisation " . $utilisateur->getDisplayName(),
                'text' => "La suppression est définitive êtes-vous sûr&middot;e de vouloir continuer ?",
                'action' => $this->url()->fromRoute('unicaen-utilisateur/effacer', ["utilisateur" => $utilisateur->getId()], [], true),
            ]);
    public function supprimerAction()
    {
        try {
            /** @var IndividuCompte $compte */
            $utilisateur = $this->userService->find($this->params()->fromRoute("utilisateur"));
            $this->userService->supprimer($utilisateur);
            $this->flashMessenger()->addSuccessMessage(sprintf("Utilisateur <strong>%s</strong> supprimé avec succès.", $utilisateur->getDisplayName()));
        } catch (Exception $e) {
            $this->flashMessenger()->addErrorMessage(sprintf("Une erreur est survenu lors de la suppression de l'utilisateur <strong>%s</strong>.", $utilisateur->getDisplayName()));
        }
        return $vm;

        return compact('utilisateur');
    }

    public function rechercherAction() : JsonModel 
    {
        $term = $this->params()->fromQuery('term');
        $serviceName = $this->params()->fromRoute('service-name');

        $res = [];
        // on récupère d'abord les utilisateurs enregistrés dans l'application
        $appService = $this->searchServices['app'];
        $currentUsers = $appService->findByTerm($term);
        $finalUsers['app'] = $currentUsers;
        unset($this->searchServices['app']);

        /** @var RechercheIndividuServiceInterface $service */
        foreach ($this->recherche as $key => $service) {
            $res[$key] = $service->findByTerm($term);
        foreach ($this->searchServices as $key => $service) {
            $currentUsernames = array_map(function($u) {
                /** @var RechercheIndividuResultatInterface $u */
                return $u->getUsername();
            }, $currentUsers);
            $users = $service->findByTerm($term);
            $usersFiltered = array_filter($users, function($e) use ($currentUsernames) {
                /** @var RechercheIndividuResultatInterface $e  */
                return !in_array($e->getUsername(), $currentUsernames);
            });
            $currentUsers = array_merge($currentUsers, $usersFiltered);
            $finalUsers[$key] = $usersFiltered;
        }

        $result = [];
        foreach ($res as $key => $individus) {

            if ($serviceName === null OR $key === $serviceName ) {
        foreach ($finalUsers as $key => $individus) {
            foreach ($individus as $individu) {
                    $result[] = array(
                $result[] = [
                    'id' => $key . '||' . $individu->getId(),
                    'label' => $individu->getDisplayName(),
                        'extra' => "<span class='badge' id='" . $key . "' >" . (($individu->getEmail())?:"Aucun mail") . "</span>",
                    );
                }
                    'extra' => sprintf(' <span class="text-highlight">/</span> %s <span class="text-highlight">/</span> %s %s',
                        $individu->getUsername(),
                        $individu->getEmail() ?: "aucun email",
                        ($key === 'app') ? '<i title="Utilisateur existant" class="fas fa-check-circle text-success"></i>' : '')
                ];
            }
        }
        return new JsonModel($result);
    }

    public function rechercherUtilisateurAction() : JsonModel
    {
        $term = $this->params()->fromQuery('term');
        $res = $this->userService->findByTerm($term);
        usort($result, function ($a, $b) { return $a['label'] > $b['label']; });

        foreach ($res as $user) {
            $result[] = array(
                'id'    => $user->getId(),
                'label' => $user->getDisplayName(),
                'extra' => "<span class='badge' id='app' >" . (($user->getEmail())?:"Aucun mail") . "</span>",
            );
        }
        return new JsonModel($result);
    }

    public function listingAction()
    public function listerAction()
    {
        $users = $this->userService->findAll();

@@ -273,7 +275,7 @@ class UtilisateurController extends AbstractActionController
    public function exportAction() 
    {
        $users = $this->userService->findAll();
        $headers = [ 'Nom d\'utilisateur', 'Nom affiché', 'Actif', 'Rôle'];
        $headers = [ 'Identifiant de connexion', 'Nom', 'Activé', 'Rôle'];

        $records = [];
        foreach ($users as $user) {
+25 −19
Changes for src/UnicaenUtilisateur/Controller/UtilisateurControllerFactory.php: 25 added lines, 19 removed lines.
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ use Application\Provider\IdentityProvider;
use Doctrine\ORM\EntityManager;
use Interop\Container\ContainerInterface;
use UnicaenUtilisateur\Form\User\UserForm;
use UnicaenUtilisateur\Form\User\UserRechercheForm;
use UnicaenUtilisateur\Service\RechercheIndividu\RechercheIndividuServiceInterface;
use UnicaenUtilisateur\Service\Role\RoleService;
use UnicaenUtilisateur\Service\User\UserService;

@@ -13,41 +15,45 @@ class UtilisateurControllerFactory {

    public function __invoke(ContainerInterface $container)
    {
        $userSearchFunctions = $container->get('Config')['unicaen-utilisateur']['recherche-individu'];
        $rechercheServices = [];
        foreach ($userSearchFunctions as $key => $service) {
            $rechercheServices[$key] = $container->get($service);
        }

        /**
         * @var RoleService $roleService
         * @var UserService $userService
         * @var MailingService $mailService
         * @var EntityManager $entityManager
         */
        $identityProvider = null;
        if ($container->get('Config')['unicaen-utilisateur']['identity-provider'] !== "") {
            if (isset($container->get('Config')['unicaen-utilisateur']['identity-provider'])) {
                $identityProviderPath = $container->get('Config')['unicaen-utilisateur']['identity-provider'];
                $identityProvider = $container->get($identityProviderPath);
            }
        }
        $config = $container->get('Config');
        $moduleConfig = $config['unicaen-utilisateur'];
        $roleService = $container->get(RoleService::class);
        $userService = $container->get(UserService::class);

        /**
         * @var UserForm $userForm
         * @var UserRechercheForm $userRechercheForm
         */
        $userForm = $container->get('FormElementManager')->get(UserForm::class);
        $userRechercheForm = $container->get('FormElementManager')->get(UserRechercheForm::class);

        // services de recherche d'un individu : application, ldap, octopus,...
        $rechercheServices = [];
        if(isset($moduleConfig['recherche-individu']) && !empty($moduleConfig['recherche-individu'])) {
            foreach ($moduleConfig['recherche-individu'] as $key => $service) {
                $service = $container->get($service);
                if($service instanceof RechercheIndividuServiceInterface) {
                    $rechercheServices[$key] = $service;
                }
            }
        }

        $identityProvider = null;
        if (isset($moduleConfig['identity-provider']) && !empty($moduleConfig['identity-provider'])) {
            $identityProvider = $container->get($moduleConfig['identity-provider']);
        }

        /** @var UtilisateurController $controller */
        $controller = new UtilisateurController();
        $controller->setRoleService($roleService);
        $controller->setUserService($userService);
        $controller->setUserForm($userForm);
        $controller->setSearchServices($rechercheServices);
        $controller->setIdentityProvider($identityProvider);

        $controller->recherche = $rechercheServices;
        $controller->setUserForm($userForm);
        $controller->setUserRechercheForm($userRechercheForm);

        return $controller;
    }
+1 −1
Changes for src/UnicaenUtilisateur/Entity/Db/AbstractRole.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ abstract class AbstractRole implements RoleInterface
     */
    public function __toString()
    {
        return $this->getRoleId();
        return $this->getLibelle();
    }

    /**
+22 −7

File changed.

Preview size limit exceeded, changes collapsed.

Loading