Commit 2de8cefadedc2454dff054e8b0cd21ee25e4e673

Authored by Etienne Pallier
1 parent ded5e071
Exists in master and in 1 other branch dev

Diverses simplifications, refactorisations, optimisations (v3.7.9.24):

	- Nouvelle variable $this->current_user_entity "globale" et héritée par
tous les controleurs (car définie dans AppController.beforeFilter())
		=> cette variable est un objet Entity et donc avec des propriétés
(virtuelles) pratiques permettant de faire par exemple :
			- $user->is_admin
			- $user->is_resp
			- $user->is_super
			mais aussi :
			- $user->is_admin_or_more()
			- $user->is_admin_or_less()

	- bugfix 3 TESTS !!!
README.md
... ... @@ -53,24 +53,20 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -Date: 30/04/2020
57   -Version: 3.7.9.23
  56 +Date: 04/05/2020
  57 +Version: 3.7.9.24
58 58 Author: EP
59 59 Commentaire:
60 60 Diverses améliorations, simplifications, refactorisations, optimisations :
61   - - ajout de l'option globale $this->SUPERADMIN_CAN_DO_EVERYTHING dans AppController (false par défaut) pour donner rapidement TOUS les droits à superadmin (juste passer à true)
62   - - regroupement des conditions d'accès des 3 actions ADD, EDIT, et DELETE car très semblables => remplacé 60 lignes par 10 !!!
63   - - Grosse simplification (et bugfixes !!) des conditions d'accès à la plupart des actions de MaterielsController => c'est bien plus clair à lire
64   - - Nouvelles règles ACL (conditions d'accès) sous forme de tableau $acl => en cours...
65   - => ce changement offre plusieurs avantages, et devrait notamment permettre de :
66   - - clarifier les conditions d'accès,
67   - - les rendre plus facilement modifiables
68   - - les rendre copiables d'une action à l'autre (et donc facilement réutilisables sans avoir à réécrire de code)
69   - - afficher une page web présentant automatiquement (dynamiquement) une synthèse claire de toutes les ACL, action par action, et profil par profil
70   - (ce qui permettra de se rendre compte plus facilement de l'état actuel des conditions d'accès)
71   - - Utilisation de $this->action et $this->action_id (...) de AppController.beforeFilter() un peu partout
72   - - Utilisation de $this->entity de AppController.beforeFilter() un peu partout pour simplifier et surtout éviter (bcp) les accès BD redondants
73   - - Optimisations pour éviter trop de requetes en BD et simplification des tests acl
  61 + - Nouvelle variable $this->current_user_entity "globale" et héritée par tous les controleurs (car définie dans AppController.beforeFilter())
  62 + => cette variable est un objet Entity et donc avec des propriétés (virtuelles) pratiques permettant de faire par exemple :
  63 + - $user->is_admin
  64 + - $user->is_resp
  65 + - $user->is_super
  66 + mais aussi :
  67 + - $user->is_admin_or_more()
  68 + - $user->is_admin_or_less()
  69 + - bugfix 3 TESTS !!!
74 70  
75 71 IMPORTANT :
76 72 - Pour connaitre la version actuelle, taper "./VERSION"
... ... @@ -105,6 +101,19 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https
105 101  
106 102 -----------------------------------------------------------------------------------------------------------
107 103  
  104 +30/04/2020 Version 3.7.9.23 (EP)
  105 + Diverses améliorations, simplifications, refactorisations, optimisations :
  106 + - ajout de l'option globale $this->SUPERADMIN_CAN_DO_EVERYTHING dans AppController (false par défaut) pour donner rapidement TOUS les droits à superadmin (juste passer à true)
  107 + - regroupement des conditions d'accès des 3 actions ADD, EDIT, et DELETE car très semblables => remplacé 60 lignes par 10 !!!
  108 + - Grosse simplification (et bugfixes !!) des conditions d'accès à la plupart des actions de MaterielsController => c'est bien plus clair à lire
  109 + - Nouvelles règles ACL (conditions d'accès) sous forme de tableau $acl => en cours...
  110 + => ce changement offre plusieurs avantages, et devrait notamment permettre de :
  111 + - clarifier les conditions d'accès,
  112 + - les rendre plus facilement modifiables
  113 + - les rendre copiables d'une action à l'autre (et donc facilement réutilisables sans avoir à réécrire de code)
  114 + - afficher une page web présentant automatiquement (dynamiquement) une synthèse claire de toutes les ACL, action par action, et profil par profil
  115 + (ce qui permettra de se rendre compte plus facilement de l'état actuel des conditions d'accès)
  116 +
108 117 29/04/2020 Version 3.7.9.22 (EP)
109 118 Diverses améliorations, simplifications, optimisations :
110 119 - factorisation d'une partie de add_or_edit() dans AppController (appelée par les add_or_edit() de chaque controleur spécifique)
... ...
TESTS.sh
... ... @@ -2,21 +2,31 @@
2 2 #rm -rf tmp/cache/*/*
3 3 sudo chmod o+w tmp/cache/persistent/myapp_cake_core_translations_* > /dev/null 2>&1
4 4  
  5 +# Tous les tests
  6 +TESTALL=1
  7 +# Quelques tests seulement (au moins 1)
  8 +#TESTALL=0
5 9  
6   -vendor/bin/phpunit || vendor/phpunit/phpunit/phpunit
  10 +if [[ $TESTALL == 1 ]] ; then
  11 + vendor/bin/phpunit || vendor/phpunit/phpunit/phpunit
7 12  
8   -# Si ca ne marche pas, essayer plutot:
9   -#vendor/phpunit/phpunit/phpunit
  13 + # Si ca ne marche pas, essayer plutot:
  14 + #vendor/phpunit/phpunit/phpunit
  15 +
  16 + # Plus de details:
  17 + #vendor/bin/phpunit --debug
  18 + #vendor/bin/phpunit --verbose --log-tap tap.log
  19 + #vendor/bin/phpunit --testdox
10 20  
11   -# Plus de details:
12   -#vendor/bin/phpunit --debug
13   -#vendor/bin/phpunit --verbose --log-tap tap.log
14   -#vendor/bin/phpunit --testdox
  21 +else
  22 + # Executer UN SEUL test:
  23 + # Ex: je veux executer ONLY le test testMat31CreateAs() de MaterielsControllerTest:
  24 + #vendor/bin/phpunit --filter testMat31CreateAs
  25 + vendor/bin/phpunit --filter testMat32CreateAdministratifOrTechnicalAs
  26 + vendor/bin/phpunit --filter testACLEditUtilisateur
  27 + vendor/bin/phpunit --filter testMatCopy
15 28  
16   -# Executer UN SEUL test:
17   -# Ex: je veux executer ONLY le test testMat31CreateAs() de MaterielsControllerTest:
18   -#vendor/bin/phpunit --filter testMat31CreateAs
19   -#vendor/bin/phpunit --filter testMat32CreateAdministratifOrTechnicalAs
  29 +fi
20 30  
21 31 sudo rm -f tmp/cache/persistent/myapp_cake_core_translations_*
22 32  
... ...
src/Controller/AppController.php
... ... @@ -66,10 +66,10 @@ class AppController extends Controller
66 66 protected $action;
67 67 protected $entity;
68 68 protected $entity_id;
  69 + // Current (priviledged) USER (if so, otherwise = NULL) from DB (Entity class)
  70 + //private $CURRENT_PRIVILEDGED_USER = null;
  71 + protected $current_user_entity = null;
69 72  
70   - // Current priviledged USER (if so, otherwise = NULL)
71   - private $CURRENT_PRIVILEDGED_USER = null;
72   -
73 73 // Current ROLE (by default = "Utilisateur")
74 74 private $CURRENT_ROLE = null;
75 75  
... ... @@ -471,7 +471,7 @@ class AppController extends Controller
471 471 * $user est l'equivalent de $this->LdapAuth->user()
472 472 *
473 473 */
474   - public function isAuthorized($user)
  474 + public function isAuthorized(Array $user)
475 475 {
476 476 $this->myDebug("step 2C (general): AppController.isAuthorized()");
477 477  
... ... @@ -553,23 +553,26 @@ class AppController extends Controller
553 553 return $users_name;
554 554 }
555 555  
556   -
557   - public function getTablePriviledgedUserFromCurrentSessionUserIfExists($user = null)
558   - {
559   - if (! $this->CURRENT_PRIVILEDGED_USER) {
  556 + // @deprecated
  557 + public function getTablePriviledgedUserFromCurrentSessionUserIfExists($user = null) {
  558 + return $this->getUserEntity($user);
  559 + }
  560 + public function getUserEntity($user = null) {
  561 + //if (! $this->CURRENT_PRIVILEDGED_USER) {
  562 + if (! $this->current_user_entity) {
560 563 $configuration = $this->confLabinvent;
561   - $username = $user ? $user[$configuration->ldap_authenticationType][0] : $this->LdapAuth->user($configuration->ldap_authenticationType)[0];
562   - $priviledgedUser = TableRegistry::getTableLocator()->get('Users')->find()
563   - ->where([
564   - 'username' => $username
565   - ])
566   - ->
  564 + $ldapAuthType = $configuration->ldap_authenticationType;
  565 + $username = $user ? $user[$ldapAuthType] : $this->LdapAuth->user($ldapAuthType);
  566 + $username = $username[0];
  567 + $priviledgedUser = TableRegistry::getTableLocator()->get('Users')
  568 + ->find()
  569 + ->where(['username' => $username])
  570 + ->first();
567 571 // ->where(['username' => $this->LdapAuth->user('cn')[0]])
568   - first();
569 572 // if (! $priviledgedUser) $priviledgedUser = "Unpriviledged User (not in table utilisateurs)";
570   - $this->CURRENT_PRIVILEDGED_USER = $priviledgedUser;
  573 + $this->current_user_entity = $priviledgedUser;
571 574 }
572   - return $this->CURRENT_PRIVILEDGED_USER;
  575 + return $this->current_user_entity;
573 576 }
574 577  
575 578 public function getUserRole($user = null)
... ... @@ -585,8 +588,7 @@ class AppController extends Controller
585 588 private function userHasRole($expectedRole, $ORMORE = false)
586 589 {
587 590 $role = $this->getUserRole();
588   - if (! $ORMORE)
589   - return ($role == $expectedRole);
  591 + if (!$ORMORE) return ($role == $expectedRole);
590 592 return ($this->getRoleLevel($role) >= $this->getRoleLevel($expectedRole));
591 593 /*
592 594 * //$hasRole = false;
... ... @@ -843,11 +845,12 @@ class AppController extends Controller
843 845 if ($this->LdapAuth->user()) {
844 846 // ATTENTION, $priviledgedUser = NULL si l'utilisateur courant n'est pas un utilisateur privilégié
845 847 // (c'est à dire s'il n'est pas dans la table "utilisateurs")
846   - $this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists();
  848 + //$this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists();
  849 + $this->current_user_entity = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists();
847 850 //$role = $this->getUserRole();
848 851 $this->userRole = $this->getUserRole();
849 852 $profile = self::PROFILES["$this->userRole"];
850   - $this->myDebug("- priviledgedUser is {$this->priviledgedUser}");
  853 + $this->myDebug("- priviledgedUser is {$this->current_user_entity}");
851 854 $this->myDebug("- userRole is {$this->getUserRole()}", "- profile is: $profile");
852 855 // L'utilisateur connecté (return null si pas connecté)
853 856 // $this->Auth->user('id');
... ... @@ -867,7 +870,7 @@ class AppController extends Controller
867 870 $this->set('role', $this->userRole);
868 871 $this->set('profile', $profile);
869 872 $this->set('username', $this->userName);
870   - $this->set('priviledgedUser', $this->priviledgedUser);
  873 + $this->set('priviledgedUser', $this->current_user_entity);
871 874  
872 875 $this->set('USER_IS_UTILISATEUR', $this->USER_IS_UTILISATEUR);
873 876 $this->set('USER_IS_ADMIN', $this->USER_IS_ADMIN);
... ...
src/Controller/MaterielsController.php
... ... @@ -259,6 +259,27 @@ class MaterielsController extends AppController {
259 259 //if (parent::isAuthorized($userFromSession)) return TRUE;
260 260 $this->myDebug("step 2A (specific): MaterielsController.isAuthorized(user)");
261 261 $this->myDebug("- user is:", $user);
  262 +
  263 + $this->current_user_entity = $this->getUserEntity();
  264 + assert($this->current_user_entity != null);
  265 + if ($this->current_user_entity == null) throw new \Exception("pas d'utilisateur défini !!!");
  266 + debug($this->current_user_entity);
  267 +
  268 + debug("user is xxx :");
  269 + debug($this->current_user_entity->is_user);
  270 + debug($this->current_user_entity->is_resp);
  271 + debug($this->current_user_entity->is_admin);
  272 + debug($this->current_user_entity->is_adminplus);
  273 + debug($this->current_user_entity->is_super);
  274 +
  275 + debug("user is xxx or more :");
  276 + debug($this->current_user_entity->is_resp_or_more);
  277 + debug($this->current_user_entity->is_admin_or_more);
  278 +
  279 + debug("user is xxx or less :");
  280 + debug($this->current_user_entity->is_resp_or_less);
  281 + debug($this->current_user_entity->is_admin_or_less);
  282 +
262 283 /* ICI C'EST OK
263 284 $toto="tititoto";
264 285 $this->set(compact('toto'));
... ... @@ -368,7 +389,8 @@ class MaterielsController extends AppController {
368 389 //debug("action $action, id $this->entity_id");
369 390 //return $this->isAuthorizedActionFor($action, $this->getIdPassed(), $this->userRole, $this->userFromSession, $this->userCname);
370 391 return $this->isAuthorizedActionFor(
371   - $action?$action:$this->action, $this->entity_id,
  392 + $action ? $action : $this->action,
  393 + $this->entity_id,
372 394 $this->userRole,
373 395 $this->userFromSession, $this->userCname
374 396 );
... ... @@ -390,6 +412,7 @@ class MaterielsController extends AppController {
390 412 $this->myDebug("step 2B (intermediaire): MaterielsController.isAuthorizedAction($role, $action, $id, user, $userCname)");
391 413 //$this->myDebug("- user is ", $user);
392 414  
  415 + //debug($this->entity->tititoto());
393 416 // Raccourci pour SUPERADMIN : par défaut il a (presque) TOUS les droits, donc c'est vite vu !
394 417 // (sauf certaines actions afin de lui donner un comportement proche de ADMIN)
395 418 if ($this->USER_IS_SUPERADMIN) {
... ... @@ -397,8 +420,21 @@ class MaterielsController extends AppController {
397 420 //pr($this->Materiels->toto());
398 421 // Il suffit de passer $this->SUPERADMIN_CAN_DO_EVERYTHING à true pour TOUT autoriser à superadmin :
399 422 if (! $this->SUPERADMIN_CAN_DO_EVERYTHING) {
  423 + $acl = [
  424 + 'add' => "(id==0) || (id>0 && entity_is_created)",
  425 + 'edit' => "entity_is_created",
  426 + 'delete' => "entity_is_created",
  427 + 'statusValidated' => "entity_is_created",
  428 + 'statusToBeArchived' => "entity_is_validated",
  429 + 'statusArchived' => "entity_is_tobearchived",
  430 + 'statusCreated' => "! entity_is_created",
  431 + 'printLabelRuban' => "config_has_printer && entity_is_validated",
  432 + // toutes les autres actions => ok
  433 + '*' => 'Y'
  434 + ];
400 435 // add by copy, edit, ou delete => ssi CREATED
401 436 if ( ($this->action=='add' && $id>0) || in_array($this->action,['edit', 'delete', 'statusValidated']) ) return $this->isCreated($id);
  437 + //if ($this->action==’statusValidated’) return $this->isCreated($id);
402 438 if ($this->action=='statusToBeArchived') return $this->isValidated($id);
403 439 if ($this->action=='statusArchived') return $this->isToBeArchived($id);
404 440 if ($this->action=='statusCreated') return ! $this->isCreated($id);
... ... @@ -450,7 +486,9 @@ class MaterielsController extends AppController {
450 486 // Conditions supplémentaires pour profils User et Responsable :
451 487 if ( in_array($role, ['Utilisateur', 'Responsable']) ) {
452 488 //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]);
453   - $isHis = $this->isHis($id, $user);
  489 + //$isHis = $this->isHis($id, $user);
  490 + //$isHis = $this->isHis($id);
  491 + $isHis = $this->belongsToCurrentUser($id);
454 492 return $role=='Utilisateur' ? $isHis : $isHis||$this->isRespGroup($id, $userCname);
455 493 /*
456 494 if ($role=='Utilisateur') return $isHis;
... ... @@ -768,7 +806,9 @@ class MaterielsController extends AppController {
768 806  
769 807 // Archivage
770 808 case 'statusArchived':
771   - return $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST();
  809 + //return $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST();
  810 + if (! $this->isToBeArchived($id)) return FALSE;
  811 + return $this->USER_IS_ADMIN_AT_LEAST();
772 812 // /$id = (int) $this->request->getAttribute('params')['pass'][0];
773 813 // if ($this->userHasRoleAtLeast('Administration')) {
774 814 // if ($role == 'Super Administrateur') {
... ... @@ -821,10 +861,11 @@ class MaterielsController extends AppController {
821 861 * cf https://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html
822 862 */
823 863 // True if materiel with id $id is owned by $nomCreateur
824   - public function isOwnedBy($id, $nomCreateur)
  864 + public function isOwnedBy($id, $user_name)
825 865 {
826   - $entity = $this->getEntity($id);
827   - return in_array($nomCreateur, [$entity->nom_createur, $entity->nom_responsable]);
  866 + //$entity = $this->getEntity($id);
  867 + //return in_array($user_name, [$entity->nom_createur, $entity->nom_responsable]);
  868 + return $this->getEntity($id)->isOwnedOrDeclaredByUser($user_name);
828 869 /*
829 870 return ($this->Materiels->exists([
830 871 'id' => $id,
... ... @@ -837,10 +878,14 @@ class MaterielsController extends AppController {
837 878 }
838 879  
839 880 // True if materiel with id $id is owned by current user
840   - public function isHis($id, $userFromSession) {
841   - return ($this->isOwnedBy($id, $userFromSession['sn'][0] . ' ' . $userFromSession['givenname'][0]));
  881 + //public function isHis($id, $userFromSession) {
  882 + //public function isHis($matos_id) {
  883 + public function belongsToCurrentUser($id) {
  884 + //return ($this->isOwnedBy($id, $userFromSession['sn'][0] . ' ' . $userFromSession['givenname'][0]));
  885 + return $this->isOwnedBy($id, $this->current_user_entity->nom);
842 886 }
843 887  
  888 +
844 889 public function isRespGroup($id, $loginResponsable)
845 890 {
846 891 // Get user
... ... @@ -1054,6 +1099,13 @@ class MaterielsController extends AppController {
1054 1099 public function view($id = null)
1055 1100 {
1056 1101 $this->myDebug("step 3: MaterielsController.view()");
  1102 +
  1103 + /*
  1104 + debug($this->getEntity($id));
  1105 + debug("matos is status xxx:");
  1106 + debug($this->getEntity($id)->is_created);
  1107 + debug($this->getEntity($id)->is_validated);
  1108 + */
1057 1109  
1058 1110 $materiel = $this->Materiels->get($id, [
1059 1111 'contain' => [
... ... @@ -1105,9 +1157,10 @@ class MaterielsController extends AppController {
1105 1157  
1106 1158 // Current user is same group as current materiel
1107 1159 $USER_IS_SAME_GROUP_AS_MATERIEL = (
1108   - ( isset($this->priviledgedUser->groupes_metier_id) && $this->priviledgedUser->groupes_metier_id != $this->idGmNa && $materiel->groupes_metier_id == $this->priviledgedUser->groupes_metier_id )
  1160 + //( isset($this->priviledgedUser->groupes_metier_id) && $this->priviledgedUser->groupes_metier_id != $this->idGmNa && $materiel->groupes_metier_id == $this->priviledgedUser->groupes_metier_id )
  1161 + ( isset($this->current_user_entity->groupes_metier_id) && $this->current_user_entity->groupes_metier_id != $this->idGmNa && $materiel->groupes_metier_id == $this->current_user_entity->groupes_metier_id )
1109 1162 ||
1110   - ( isset($this->priviledgedUser->groupe_thematique_id) && $this->priviledgedUser->groupe_thematique_id != $this->idGtNa && $materiel->groupes_thematique_id == $this->priviledgedUser->groupe_thematique_id )
  1163 + ( isset($this->current_user_entity->groupe_thematique_id) && $this->current_user_entity->groupe_thematique_id != $this->idGtNa && $materiel->groupes_thematique_id == $this->current_user_entity->groupe_thematique_id )
1111 1164 );
1112 1165 $this->set(compact('USER_IS_SAME_GROUP_AS_MATERIEL'));
1113 1166  
... ...
src/Model/Entity/Materiel.php
... ... @@ -74,6 +74,59 @@ class Materiel extends Entity
74 74 'id' => false
75 75 ];
76 76  
  77 + public function tititoto() {
  78 + return "tototiti";
  79 + }
  80 +
  81 + // (EP 20200504)
  82 + // Propriétés virtuelles (attributs virtuels de l'entité matériel)
  83 + // A utiliser dans le controleur ainsi : $materiel->is_created
  84 + //public function isCreated() { return $this->status == 'CREATED'; }
  85 + //protected function _getIsCreated() { return $this->_fields['status'] == 'CREATED'; }
  86 + protected function _getIsCreated() { return $this->status == 'CREATED'; }
  87 + //return $this->status == 'CREATED';
  88 + protected function _getIsValidated() { return $this->status == 'VALIDATED'; }
  89 + //protected function _getIsValidated() { return $this->_fields['status'] == 'VALIDATED'; }
  90 + //public function is_tobearchived() { return $this->status == 'TOBEARCHIVED'; }
  91 + protected function _getIsTobearchived() { return $this->status == 'TOBEARCHIVED'; }
  92 + protected function _getIsArchived() { return $this->status == 'ARCHIVED'; }
  93 +
  94 + //public function isUsedOrCreatedByUser($user) {
  95 + public function isOwnedOrDeclaredByUser($username) {
  96 + return in_array($username, [$this->nom_createur, $this->nom_responsable]);
  97 + }
  98 + /*
  99 + public function isSameGroupAsUser($user_groupid1, $user_groupid2) {
  100 + // Responsable groupe métier ?
  101 + $group = 'groupes_metier';
  102 + $group_fk = $group.'_id';
  103 + if (
  104 + $user_groupid1 !== null
  105 + &&
  106 + $user_groupid1 != TableRegistry::getTableLocator()->get('GroupesMetiers')
  107 + ->find()
  108 + ->where(['nom =' => 'N/A'])
  109 + ->first()['id']
  110 + ) return $this->$group_fk == $user_groupid1;
  111 +
  112 + // Responsable groupe thématique ?
  113 + $group = 'groupe_thematique';
  114 + $group_fk = $group.'_id';
  115 + if (
  116 + $u[$group_fk] !== null
  117 + &&
  118 + $u[$group_fk] != TableRegistry::getTableLocator()->get('GroupesThematiques')
  119 + ->find()
  120 + ->where(['nom =' => 'N/A'])
  121 + ->first()['id']
  122 + ) return $this->getEntity($id)->$group_fk == $u[$group_fk];
  123 +
  124 + // sinon, pas responsable de groupe
  125 + return false;
  126 + } // isSameGroupAsUser
  127 + */
  128 +
  129 +
77 130 /* 14/1/19 bake autogenerated:
78 131 protected $_accessible = [
79 132 'designation' => true,
... ...
src/Model/Entity/User.php
... ... @@ -56,4 +56,48 @@ class User extends Entity
56 56 return $hasher->hash($password);
57 57 }
58 58 }
  59 +
  60 + // (EP 20200504) - Champs virtuels
  61 +
  62 + // Nom Prénom
  63 + //protected function _getFullname() { return $this->name.' '.$this->firstname; }
  64 +
  65 + // Champs virtuels $user->is_xxx
  66 +/*
  67 + public function isUser() { return $this->role == 'Utilisateur'; }
  68 + public function is_resp() { return $this->role == 'Responsable'; }
  69 + public function is_admin() { return $this->role == 'Administration'; }
  70 + public function is_super() { return $this->role == 'Super Administrateur'; }
  71 + */
  72 + protected function _getIsUser() { return $this->role == 'Utilisateur'; } //return $this->_fields['status'] == 'CREATED';
  73 + protected function _getIsResp() { return $this->role == 'Responsable'; }
  74 + protected function _getIsAdmin() { return $this->role == 'Administration'; }
  75 + protected function _getIsAdminplus() { return $this->role == 'Administration Plus'; }
  76 + protected function _getIsSuper() { return $this->role == 'Super Administrateur'; }
  77 +
  78 +
  79 + // Champs virtuels $user->is_xxx_or_more
  80 + //public function isRespOrMore() {
  81 + protected function _getIsRespOrMore() {
  82 + return in_array($this->role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']);
  83 + }
  84 + public function _getIsAdminOrMore() {
  85 + return in_array($this->role, ['Administration', 'Administration Plus', 'Super Administrateur']);
  86 + }
  87 + public function _getIsAdminplusOrMore() {
  88 + return in_array($this->role, ['Administration Plus', 'Super Administrateur']);
  89 + }
  90 +
  91 + // Champs virtuels $user->is_xxx_or_less
  92 + public function _getIsRespOrLess() {
  93 + return in_array($this->role, ['Utilisateur', 'Responsable']);
  94 + }
  95 + public function _getIsAdminOrLess() {
  96 + return in_array($this->role, ['Utilisateur', 'Responsable', 'Administration']);
  97 + }
  98 + public function _getIsAdminplusOrLess() {
  99 + return in_array($this->role, ['Utilisateur', 'Responsable', 'Administration', 'Administration Plus']);
  100 + }
  101 +
  102 +
59 103 }
... ...
tests/Fixture/MaterielsFixture.php
... ... @@ -630,11 +630,12 @@ class MaterielsFixture extends TestFixture {
630 630 'lieu_detail' => 'Lorem ipsum dolor sit amet',
631 631  
632 632 //'nom_responsable' => 'Lorem ipsum dolor sit amet',
633   - 'nom_responsable' => 'test0 test9',
634   - //'nom_responsable' => 'user5 USER',
  633 + //'nom_responsable' => 'test0 test9',
  634 + 'nom_responsable' => 'user5 USER',
635 635 'email_responsable' => 'Lorem ipsum dolor sit amet',
636 636 //'nom_createur' => 'Lorem ipsum dolor sit amet',
637   - 'nom_createur' => 'test0 test9',
  637 + //'nom_createur' => 'test0 test9',
  638 + 'nom_responsable' => 'user5 USER',
638 639 'nom_modificateur' => 'Lorem ipsum dolor sit amet',
639 640 'created' => '2016-04-19 09:09:29',
640 641 'modified' => '2016-04-19 09:09:29',
... ... @@ -748,11 +749,11 @@ class MaterielsFixture extends TestFixture {
748 749 'date_archivage' => '2016-04-19',
749 750 'etiquette' => 0,
750 751 'lieu_detail' => 'Lorem ipsum dolor sit amet',
751   - 'nom_responsable' => 'test0 test9',
752   - //'nom_responsable' => 'user5 USER',
  752 + //'nom_responsable' => 'test0 test9',
  753 + 'nom_responsable' => 'user5 USER',
753 754 'email_responsable' => 'Lorem ipsum dolor sit amet',
754   - 'nom_createur' => 'test0 test9',
755   - //'nom_createur' => 'user5 USER',
  755 + //'nom_createur' => 'test0 test9',
  756 + 'nom_createur' => 'user5 USER',
756 757 'nom_modificateur' => 'Lorem ipsum dolor sit amet',
757 758 'created' => '2016-04-19 09:09:29',
758 759 'modified' => '2016-04-19 09:09:29',
... ...
tests/TestCase/Controller/General.php
... ... @@ -28,8 +28,13 @@ class General extends IntegrationTestCase {
28 28 'ADMINP',
29 29 'SUPER'
30 30 ];
  31 + /*
  32 + * (EP 20200504)
  33 + * Supprimé le cas USER_from_ldap car tous les users sont desormais dans la table users.
  34 + * On n'a donc plus jamais ce cas...
  35 + */
31 36 protected $ROLES6 = [
32   - ['USER_from_ldap'],
  37 + //['USER_from_ldap'],
33 38 ['USER'],
34 39 ['RESP'],
35 40 ['ADMIN'],
... ...
tests/TestCase/Controller/MaterielsControllerTest.php
... ... @@ -483,13 +483,20 @@ class MaterielsControllerTest extends General {
483 483 $newMateriel["$fields[0]"] = $i;
484 484 $newMateriel["$fields[1]"] = $j;
485 485 $combination = [$i,$j];
  486 + //debug($combination);
486 487 // ni administratif ni technique => must FAIL
487 488 if ($combination == [0,0]) $this->_testMatCreate1FailsAs($role, $newMateriel, implode(',',$combination));
488 489 // technique only
489 490 if ($combination == [0,1]) {
490 491 // cree un nouveau materiel
491 492 //$this->_testMatCreateAs($role, $newMateriel, implode(',',$combination));
492   - $this->testMat31CreateAs($role, $newMateriel, implode(',',$combination));
  493 + //$this->testMat31CreateAs($role, $newMateriel, implode(',',$combination));
  494 + /*
  495 + $this->authAs($role);
  496 + $this->get('/materiels/index');
  497 + $this->assertResponseContains("Liste des matériels (6)", $role.','.implode($combination));
  498 + */
  499 + $this->testMat31CreateAs($role, $newMateriel);
493 500 // supprimer un materiel pour avoir toujours le meme nombre
494 501 //TODO: impossible de supprimer le matos 1, why ???
495 502 //$this->post('/materiels/delete/1');
... ... @@ -497,6 +504,7 @@ class MaterielsControllerTest extends General {
497 504 $this->get('/materiels/index');
498 505 $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6;
499 506 $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role.','.implode($combination));
  507 + //$this->assertResponseContains("Liste des matériels (7)", $role.','.implode($combination));
500 508 }
501 509 // Administratif : (1,0) et (1,1) : ok si prix > 800
502 510 // No need to test the case [1,1] because same as [1,0]
... ... @@ -547,10 +555,10 @@ class MaterielsControllerTest extends General {
547 555 $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role);
548 556 //$this->post('/materiels/add', $this->newMaterielWithAllMandatoryFields);
549 557 $this->post('/materiels/add', $materiel);
  558 + $nbmat++;
550 559  
551 560 // APRES add
552 561 $this->get('/materiels/index');
553   - $nbmat++;
554 562 // VOIR LE HTML DE LA PAGE WEB
555 563 //var_dump($this->_getBodyAsString());
556 564 $this->assertResponseContains("Liste des matériels (".$nbmat.")", "(testMat31CreateAs): Le matériel ne s'ajoute pas correctement (avec le profil $role)");
... ... @@ -699,17 +707,20 @@ class MaterielsControllerTest extends General {
699 707 }
700 708  
701 709 // Called by testMatCopy() just above
  710 + //if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001');
  711 +
702 712 private function _testMatCopy($testnum, $COPIED, $role, $id, array $materiel_new_data=[], $num_inventaire=NULL) {
703 713 //debug("_testMatCopy numéro ".$testnum);
704   - if ($this->DEBUG) {
705   - echo("\n");
706   - echo("_testMatCopy (with role ".$role.") numéro ".$testnum." :");
707   - }
708 714 $designation = isset($materiel_new_data->designation) ? $materiel_new_data->designation : 'matos 1 USER (C)';
709 715  
710 716 // AVANT add
711 717 // USER ne voit pas les materiels ARCHIVED
712 718 $nbmat = $this->USER_IS_ADMIN_AT_LEAST() ? 7 : 6;
  719 + if ($this->DEBUG) {
  720 + echo("\n _testMatCopy (avec role $role et test numéro $testnum) :");
  721 + echo("\n designation: $designation");
  722 + echo("\n nb matos: $nbmat");
  723 + }
713 724 $this->_checkNbMaterielInIndexViewIs(true, $role, $nbmat);
714 725 /*
715 726 $this->get('/materiels/index');
... ... @@ -719,6 +730,7 @@ class MaterielsControllerTest extends General {
719 730 */
720 731 $this->post('/materiels/add/'.$id, $materiel_new_data);
721 732 $nbmat++;
  733 + //debug($nbmat);
722 734  
723 735 // APRES add
724 736 $this->_checkNbMaterielInIndexViewIs($COPIED, $role, $nbmat, $designation, $num_inventaire);
... ...