Commit 2de8cefadedc2454dff054e8b0cd21ee25e4e673
1 parent
ded5e071
Exists in
master
and in
1 other branch
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 !!!
Showing
9 changed files
with
262 additions
and
72 deletions
Show diff stats
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); | ... | ... |