userHasRoleAtLeast('Utilisateur')) { * return false; * } * } * return true; * } */ /* * Toute première méthode appelée, * * AVANT authentification * */ public function initialize() { $this->myDebug("step 0A (specific): PagesController.initialize()"); parent::initialize(); // On autorise l'action add SANS authentification (unauthenticated) //$this->Auth->allow(['add']); //$this->LdapAuth->allow(['display']); } // (20200424 EP) public function beforeFilter(\Cake\Event\Event $event) { $this->myDebug("step 1A (specific): PagesController.beforeFilter()"); // On donne d'abord les autorisations par défaut de AppController parent::beforeFilter($event); // Puis on ajoute les autorisations spécifiques /* $path = func_get_args(); pr($path); $page = null; if (! empty($path[0])) $page = $path[0]; */ $pages_authorized_without_connexion = ['about', 'acls', 'changes', 'stats']; $this->action = $this->getActionPassed(); if ($this->action == "display") { $this->page = $this->request->getParam('pass.0'); // On autorise l'action display SANS connexion // mais seulement pour la page 'about' //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no"; //if ( $this->page == 'about' ) $this->LdapAuth->allow(['display']); if ( in_array($this->page, $pages_authorized_without_connexion) ) $this->LdapAuth->allow(['display']); } } /* * @Override * * Initialisation des autorisations pour les actions spécifiques à ce controleur * */ protected function setAuthorizations() { // On supprime les autres actions par défaut (add, view, index, find) //foreach (array_keys($this->is_authorized_action[]) as $a) if ($a != 'display') unset($this->is_authorized_action[$a]); $this->is_authorized_action = []; // Action display 'about' (affichage de la page 'A propos') $this->setAuthorizationsForAction('display/about', 0); // Pages autorisées à tout le monde SANS connexion // - Autorisations $this->setAuthorizationsForAction('display/acls', 0); // - Nouveautés $this->setAuthorizationsForAction('display/changes', 0); // - Stats $this->setAuthorizationsForAction('display/stats', 0); // Action display 'home' (affichage de la page 'Accueil') $this->setAuthorizationsForAction('display/home', 0); // Action display 'tools' (affichage de la page 'menu Outils') // admin (+) only $this->setAuthorizationsForAction('display/tools', -1, ['admin'=>0, 'super'=>0]); $this->setAuthorizationsForAction('display/tools-sm', -1, ['admin'=>0, 'super'=>0]); //$this->setAuthorizationsForAction('display/tools', 0); //$this->setAuthorizationsForAction('display/tools-sm', 0); $this->setAuthorizationsForAction('display/printers', 0); // Superadmin only : // - Action display 'infos' (affichage de la page 'Informations techniques sur le serveur') $this->setAuthorizationsForAction('display/infos', -1, ['super'=>0]); // - Action display 'logs' (affichage des messages de log') $this->setAuthorizationsForAction('display/logs', -1, ['super'=>0]); } /* public function isAuthorized($user, $action=null, $id=null, $role=null, $userCname=null) { $this->myDebug("step 2A (specific): PagesController.isAuthorized(user)"); $this->myDebug("- user is:", $user); if ($this->action == 'display') { //$page = $this->request->getParam('pass.0'); // Action display SANS nom de page => on redirige sur '/' // (c'est à dire sur /pages/home, c'est à dire /pages/display/home) // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/ if (! $this->page) { $this->redirect('/'); return false; } switch ($this->page) { // Page d'accueil autorisée à tous les profils (roles) case 'home': return true; // Page 'tools' seulement à partir de ADMIN // if (! $this->userHasRoleAtLeast('Administration')) { case 'tools': return $this->USER_IS_ADMIN_AT_LEAST(); //case 'tools': return $this->USER_IS_USER(); // Page 'infos' seulement pour SUPERADMIN //if (! $this->USER_IS_SUPERADMIN()) return $this->redirect('/'); case 'infos': return $this->USER_IS_SUPERADMIN(); } } // display // sinon, règle par défaut donnée par AppController return parent::isAuthorized($user); } */ /** * Displays a view * * @return void|\Cake\Network\Response * @throws \Cake\Network\Exception\NotFoundException When the view file could not * be found or \Cake\View\Exception\MissingTemplateException in debug mode. */ public function display() { // (EP 21/5/19) // On ne voit ce message que sur la page "about" // En effet, les autres pages nécessitant un login, // on est redirigé sur la page login et donc la methode login() du controleur UsersController // Du coup, il faut décommenter la ligne "exit" juste après pour voir ce message (évite la redirection). $this->myDebug("step 2: PagesController.display()"); $configuration = $this->confLabinvent; // Action display SANS nom de page => on redirige sur '/' // (c'est à dire sur /pages/home, c'est à dire /pages/display/home) // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/ ///$page = $this->request->getParam('pass.0'); /* if (! $page) $this->redirect('/'); */ $subpage = $this->request->getParam('pass.1'); //if (!$subpage) $subpage = null; /* $path = func_get_args(); if (! count($path)) return $this->redirect('/'); if ($path[0] === null) $path[0] = ''; $this->myDebug("- path is:"); $this->myDebug($path); $page = $subpage = null; if (! empty($path[0])) $page = $path[0]; if (! empty($path[1])) $subpage = $path[1]; */ $this->myDebug("- page is:"); $this->myDebug($this->page); $this->myDebug("- subpage is:"); $this->myDebug($subpage); /* // @todo : faire plus proprement, dans isAuthorized() // Si l'utilisateur n'est pas connecté, on le redirige vers la page login.ctp // sauf si l'action demandée est 'about' ou si le mode install est activé //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no"; if ( $page != 'about' ) { // ! in_array($page, ['about', 'tools']) if ( // pas logged (pas authentifié) ! $this->LdapAuth->user($configuration->ldap_authenticationType)[0] //&& $path[0]!='about' //&& ! in_array($path[0], ['about', 'tools']) // et pas mode install && ! $configuration->mode_install ) { return $this->redirect([ 'controller' => 'users', 'action' => 'login' ]); } } */ /* // @todo : faire plus proprement, avec isAuthorized() // Page 'tools' seulement à partir de ADMIN if ($page == 'tools') { // if (! $this->userHasRoleAtLeast('Administration')) { if (! $this->USER_IS_ADMIN_AT_LEAST()) return false; //return $this->redirect('/'); } // Page 'infos' seulement pour SUPERADMIN if ($page == 'infos') { //if (! $this->USER_IS_SUPERADMIN()) return $this->redirect('/'); if (! $this->USER_IS_SUPERADMIN()) return false; } */ // Finalement, on affiche la $page demandée (avec render()) $this->set('page', $this->page); $this->set(compact('subpage')); // - Page des LOGS // /pages/logs?level=info if ($this->page=='logs') { $info_levels = ['info','debug','notice']; $error_levels = ['warning', 'error', 'critical', 'alert', 'emergency']; // Paar défaut, level = INFO $level = 'Info'; $level_arg = $this->request->getQuery('level'); if ($level_arg!==null && in_array($level_arg, array_merge($info_levels,$error_levels))) $level=$level_arg; //debug($level); $this->set(compact('level', 'info_levels', 'error_levels')); } // - Page des AUTORISATIONS if ($this->page=='acls') { $lab_name = $this->confLabinvent->labNameShort; if (!$lab_name) $lab_name = 'NOM_DU_LABO'; $this->set(compact('lab_name')); } // - Page des STATISTIQUES if ($this->page=='stats') { // - Année en cours $now = new \DateTime('now'); //debug($now); // 2020 en 2020 $current_year = (int) $now->format('Y'); $materiels = TableRegistry::getTableLocator()->get('Materiels'); //debug($all_matos->count()); //3967 /* $statuses = [ 'CREATED' => 'created', 'VALIDATED' => 'date_validated', 'ARCHIVED' => 'date_archived' ]; */ $statuses = [ 'CREATED', 'VALIDATED', 'TOBEARCHIVED', 'ARCHIVED' ]; // - Donées Totales $tot = []; /* $tot['CREATED'] = 100; $tot['VALIDATED'] = 70; $tot['TOBEARCHIVED'] = 10; $tot['ARCHIVED'] = 10; */ foreach ($statuses as $status) { //TODO: optimiser, à ne faire qu'une seule fois, et non pas à chaque tour de boucle: // Tous les matos qui ont une date d'achat non nulle $all_matos = $materiels->find()->where(['year(date_acquisition) >' => 0]); if ($status != 'CREATED') $all_matos->where(['status' => $status]); $tot[$status] = $all_matos->count(); } // - Donées Moyennes $avg = []; /* $avg['CREATED'] = 10; $avg['VALIDATED'] = 7; $avg['TOBEARCHIVED'] = 1; $avg['ARCHIVED'] = 1; */ foreach ($statuses as $status) { //TODO: optimiser, à ne faire qu'une seule fois, et non pas à chaque tour de boucle: // Tous les matos qui ont une date d'achat non nulle //$all_matos = $materiels->find(); $all_matos = $materiels->find()->where(['year(date_acquisition) >' => 0]); //->groupBy('year(date_acquisition)'); if ($status != 'CREATED') $all_matos->where(['status' => $status]); $avg[$status] = $all_matos //->groupBy('year(date_acquisition)'); ->countBy(function($matos) { return $matos->date_acquisition->format('Y'); }) //->toList(); //->toArray(); //->count(); ->avg(); $avg[$status] = round($avg[$status]); } //debug($avg); // - Données par Année $years = []; //$year_min = $materiels->find()->min(['year(date_acquisition)']); $matos_year_min = $materiels->find() ->where(['year(date_acquisition) >' => 0]) ->min(function($matos) { return $matos->date_acquisition->format('Y'); }); //$year_min = 2009; $year_min = (int) $matos_year_min->date_acquisition->format('Y'); // TODO: Ajouter progression d'année en année (2020 = 2019 +/- 10%) for ($y=$current_year ; $y>=$year_min ; $y--) { //debug($y); try { foreach ($statuses as $status) { //TODO: optimiser, à ne faire qu'une seule fois, et non pas à chaque tour de boucle: $all_matos_for_year = $materiels ->find() ->where(['year(date_acquisition)' => $y]); if ($status != 'CREATED') $all_matos_for_year->where(['status' => $status]); $years[$y][$status] = $all_matos_for_year->count(); } } catch (\PDOException $e) { debug("Mauvais format de requete SQL (PagesController), Exception PDO générée !"); exit; } } //debug($years); // Set all variables pour la vue $this->set(compact('current_year', 'year_min', 'years', 'tot', 'avg')); } // - Page des OUTILS if ($this->page=='tools') { // Mode 'SA a tous les droits' $no_limit_mode = $this->confLabinvent->mode_nolimit; $this->set(compact('no_limit_mode')); } //debug(implode('/', $path)); //debug(implode('/', array($page,$subpage))); try { //$this->render(implode('/', $path)); //$this->render("$page/$subpage"); $this->render($subpage ? $this->page.'/'.$subpage : $this->page); //$this->render(implode('/', array($page,$subpage))); } catch (MissingTemplateException $e) { if (Configure::read('debug')) throw $e; throw new NotFoundException(); } } // display() }