From bc2274a0e4566f36fe4818cd196f2fd6e7fd04c6 Mon Sep 17 00:00:00 2001 From: Alexandre Cases Date: Tue, 21 Jun 2016 12:48:47 +0200 Subject: [PATCH] Version: 2.4.6.3 --- README-LABINVENT.md | 9 +++++---- src/Controller/AppController.php | 20 ++++++++++++++------ src/Controller/MaterielsController.php | 35 +++++++++++++++++++++++++++++++---- src/Controller/SuivisController.php | 9 ++++++++- src/Template/Element/menu_view.ctp | 22 +++++++++++++++++----- src/Template/Layout/default.ctp | 2 +- src/Template/Materiels/edit.ctp | 4 +--- src/Template/Materiels/find.ctp | 8 ++++---- src/Template/Materiels/index.ctp | 6 +++--- src/Template/Materiels/view.ctp | 8 +++++--- src/Template/Suivis/find.ctp | 18 +++++++++++------- src/Template/Suivis/index.ctp | 2 +- src/Template/Suivis/view.ctp | 2 +- 13 files changed, 102 insertions(+), 43 deletions(-) diff --git a/README-LABINVENT.md b/README-LABINVENT.md index 9eafb78..405ca8f 100755 --- a/README-LABINVENT.md +++ b/README-LABINVENT.md @@ -51,12 +51,13 @@ Logiciel testé et validé sur les configurations suivantes : VERSION ACTUELLE Date: 21/06/2016 -Version: 2.4.6.2 +Version: 2.4.6.3 -Ajout "from_mail" (configurations) +Materiels (date_archivage) + materiel (fonctionnent responsable si gmétier OU gthématique) -Demande (terminé) : https://projects.irap.omp.eu/issues/3858 - +Demande (terminé) : https://projects.irap.omp.eu/issues/3803 + https://projects.irap.omp.eu/issues/3808 + Version majeure en cours (2.4): https://projects.irap.omp.eu/versions/107 ROADMAP: https://projects.irap.omp.eu/projects/labinvent/roadmap diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index 9668a9a..c35b6bd 100755 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -140,6 +140,15 @@ class AppController extends Controller $this->LdapAuth->config('authError', "Désolé, vous n'êtes pas autorisés à accéder à cette zone."); } + public function afterFilter(Event $event) + { + if(in_array($this->request->params['action'], ['edit', 'add'])) { + $this->request->session()->write("retourForm1", true); + } + else if($this->request->params['action'] != 'creer') { + $this->request->session()->write("retourForm1", false); + } + } /** * Before render callback. @@ -163,21 +172,20 @@ class AppController extends Controller $this->set('configuration', $configuration); $this->request->session()->write("authType", $configuration->authentificationType_ldap); - $role = TableRegistry::get('Users')->find()->where(['username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0]])->first()['role']; + $user = TableRegistry::get('Users')->find()->where(['username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0]])->first(); + + $role = $user['role']; if($role == null) $role = 'Utilisateur'; $this->set('role', $role); + $this->set('userConnected', $user); + $displayElement = function ($nom, $valeur) { if ($valeur != "") echo ''.$nom.' '.$valeur.''; }; $this->set('displayElement', $displayElement); - if(in_array($this->request->params['action'], ['edit', 'add'])) { - $this->request->session()->write("retourForm", true); - } - - } // "le materiel", "le suivi"... diff --git a/src/Controller/MaterielsController.php b/src/Controller/MaterielsController.php index 4660b4e..e76f8b3 100755 --- a/src/Controller/MaterielsController.php +++ b/src/Controller/MaterielsController.php @@ -39,7 +39,10 @@ class MaterielsController extends AppController if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['givenname'][0].' '.$user['sn'][0])) { return true; } - else if ($this->userHasRole('Responsable')) { + else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { + return true; + } + else if ($this->userHasRole('Administration')) { return true; } } @@ -55,7 +58,10 @@ class MaterielsController extends AppController if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['givenname'][0].' '.$user['sn'][0])) { return true; } - else if ($this->userHasRole('Responsable')) { + else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { + return true; + } + else if ($this->userHasRole('Administration')) { return true; } } @@ -63,7 +69,12 @@ class MaterielsController extends AppController if ($action == 'statusValidated') { $id = (int)$this->request->params['pass'][0]; - if ($this->userHasRole('Responsable')) { + if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { + if($this->isCreated($id)) { + return true; + } + } + else if ($this->userHasRole('Administration')) { if($this->isCreated($id)) { return true; } @@ -72,7 +83,12 @@ class MaterielsController extends AppController if ($action == 'statusToBeArchived') { $id = (int)$this->request->params['pass'][0]; - if ($this->userHasRole('Responsable')) { + if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) { + if($this->isValidated($id)) { + return true; + } + } + else if ($this->userHasRole('Administration')) { if($this->isValidated($id)) { return true; } @@ -115,6 +131,13 @@ class MaterielsController extends AppController return ($this->Materiels->exists(['id' => $id, 'nom_createur' => $nomCreateur]) || $this->Materiels->exists(['id' => $id, 'nom_responsable' => $nomCreateur])); } + public function isRespGroup($id, $loginResponsable) + { + $u = TableRegistry::get('Users')->find()->where(['username' => $loginResponsable])->first(); + + return ($this->Materiels->exists(['id' => $id, 'groupes_metier_id' => $u['groupes_metier_id']]) || $this->Materiels->exists(['id' => $id, 'groupes_thematique_id' => $u['groupe_thematique_id']])); + } + public function isCreated($id) { return $this->Materiels->exists(['id' => $id, 'status' => 'CREATED']); @@ -336,6 +359,10 @@ class MaterielsController extends AppController private function statusSetTo($newStatus, $message, $id = null, $from = 'index') { $materiel = $this->Materiels->get($id)->set('status', $newStatus); + if($newStatus == 'ARCHIVED') { + $materiel->set('date_archivage', date('Y-m-d')); + } + if ($this->Materiels->save($materiel, ['checkRules' => false, 'checkExisting' => false])) { $this->Flash->success(__($message)); $this->sendEmailToManagement($id); diff --git a/src/Controller/SuivisController.php b/src/Controller/SuivisController.php index 129584b..d9447ab 100755 --- a/src/Controller/SuivisController.php +++ b/src/Controller/SuivisController.php @@ -26,12 +26,13 @@ class SuivisController extends AppController $action = $this->request->params['action']; - if($this->userHasRole('Responsable')) return true; + if($this->userHasRole('Administration')) return true; //Pour un "utilisateur" if (in_array($action, ['edit', 'delete'])) { $id = (int)$this->request->params['pass'][0]; if($this->isOwnedBy($id, $user['givenname'][0].' '.$user['sn'][0])) return true; + if($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) return true; } return parent::isAuthorized($user); @@ -43,6 +44,12 @@ class SuivisController extends AppController return $this->Suivis->exists(['id' => $id, 'nom_createur' => $nomCreateur]); } + public function isRespGroup($id, $loginResponsable) + { + $u = TableRegistry::get('Users')->find()->where(['username' => $loginResponsable])->first(); + + return ($this->Suivis->exists(['id' => $id, 'groupes_metier_id' => $u['groupes_metier_id']]) || $this->Suivis->exists(['id' => $id, 'groupes_thematique_id' => $u['groupe_thematique_id']])); + } /** * Index method diff --git a/src/Template/Element/menu_view.ctp b/src/Template/Element/menu_view.ctp index 2f831df..9321785 100755 --- a/src/Template/Element/menu_view.ctp +++ b/src/Template/Element/menu_view.ctp @@ -17,7 +17,7 @@
  • request->session()->read("retourForm")) { + if($this->request->session()->read("retourForm1")) { echo $this->Html->link (' Retour', 'javascript:window.history.go(-2)', ['escape' => false]); } else { echo $this->Html->link (' Retour', 'javascript:window.history.go(-1)', ['escape' => false]); @@ -32,7 +32,7 @@ if($singularHumanName == 'Matériel') { if (in_array($materiel->status, ['CREATED', 'VALIDATED'])) { - if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { + if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id)) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur']))) { $isAuthorized = true; } }else { @@ -42,17 +42,23 @@ } } else if (in_array($singularHumanName, ['Suivi', 'Emprunt'])) { - if (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur'])) { + if (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) { $isAuthorized = true; }else { if($singularHumanName == 'Suivi') { if(in_array($username, [$suivi->nom_createur])) { $isAuthorized = true; } + else if ($role == 'Responsable' && ($suivi->groupes_metier_id == $userConnected->groupes_metier_id || $suivi->groupes_thematique_id == $userConnected->groupe_thematique_id)) { + $isAuthorized = true; + } } else { if(in_array($username, [$emprunt->nom_createur, $emprunt->nom_emprunteur])) { $isAuthorized = true; } + else if ($role == 'Responsable') { + $isAuthorized = true; + } } } } @@ -97,23 +103,29 @@ if($singularHumanName == 'Matériel') { if ($materiel->status == 'CREATED') { - if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { + if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id)) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur']))) { $isAuthorized = true; } } } else if (in_array($singularHumanName, ['Suivi', 'Emprunt'])) { - if (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur'])) { + if (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) { $isAuthorized = true; }else { if($singularHumanName == 'Suivi') { if(in_array($username, [$suivi->nom_createur])) { $isAuthorized = true; + } + else if ($role == 'Responsable' && ($suivi->groupes_metier_id == $userConnected->groupes_metier_id || $suivi->groupes_thematique_id == $userConnected->groupe_thematique_id)) { + $isAuthorized = true; } } else { if(in_array($username, [$emprunt->nom_createur, $emprunt->nom_emprunteur])) { $isAuthorized = true; } + else if ($role == 'Responsable') { + $isAuthorized = true; + } } } } diff --git a/src/Template/Layout/default.ctp b/src/Template/Layout/default.ctp index 5c3c654..afd3894 100755 --- a/src/Template/Layout/default.ctp +++ b/src/Template/Layout/default.ctp @@ -94,7 +94,7 @@ $cakeDescription = 'Labinvent 2.0'; - VERSION 2.4.6.2 (21/06/2016) + VERSION 2.4.6.3 (21/06/2016) diff --git a/src/Template/Materiels/edit.ctp b/src/Template/Materiels/edit.ctp index 2a2e6f0..0e44d31 100755 --- a/src/Template/Materiels/edit.ctp +++ b/src/Template/Materiels/edit.ctp @@ -22,8 +22,6 @@ if ($IS_VALIDATED) 'site_id', 'date_acquisition', 'date_reception', - 'nom_responsable', - 'fournisseur', 'organisme_id', 'prix_ht' ), @@ -191,7 +189,7 @@ if ($IS_VALIDATED) echo $this->Form->input('fournisseur', [ 'label' => 'Fournisseur', - 'disabled' => $isReadonlyField('email_responsable', $myReadonlyFields) + 'disabled' => $isReadonlyField('fournisseur', $myReadonlyFields) ]); echo $this->Form->input('organisme_id', [ 'options' => $organismes, diff --git a/src/Template/Materiels/find.ctp b/src/Template/Materiels/find.ctp index d02a66c..8b495ba 100644 --- a/src/Template/Materiels/find.ctp +++ b/src/Template/Materiels/find.ctp @@ -259,7 +259,7 @@ if ($r) { * ACTION 'edit' */ if (in_array($material->status, ['CREATED', 'VALIDATED'])) { - if(($role == 'Utilisateur' && (in_array($username, [$material->nom_createur, $material->nom_responsable]))) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { + if(($role == 'Utilisateur' && (in_array($username, [$material->nom_createur, $material->nom_responsable]))) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) || ($role == 'Responsable' && ($material->groupes_metier_id == $userConnected->groupes_metier_id || $material->groupes_thematique_id == $userConnected->groupe_thematique_id))) { echo ''; echo $this->Html->link('', ['action' => 'edit', $material->id], @@ -280,14 +280,14 @@ if ($r) { echo ''; - if(in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur'])) { + if(in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur']) || ($role == 'Responsable' && ($material->groupes_metier_id == $userConnected->groupes_metier_id || $material->groupes_thematique_id == $userConnected->groupe_thematique_id))) { if(h($material->status) == 'CREATED') { echo $this->Html->link('', ['action' => 'statusValidated', $material->id], ['title' => 'Valider', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => 'Êtes-vous sur de vouloir validé '.$material->designation.' ?']); } - else if (h($material->status) == 'VALIDATED' && h($material->nom_responsable) == $username) { + else if (h($material->status) == 'VALIDATED') { echo $this->Html->link('', ['action' => 'statusToBeArchived', $material->id], ['title' => 'Demander la sortie de l\'inventaire', 'style' => 'margin: 0 2px', 'escape' => false, @@ -309,7 +309,7 @@ if ($r) { */ // Seul un materiel CREATED peut être supprimer if ($material->status == 'CREATED') { - if($role != 'Utilisateur' || in_array($username, [$material->nom_createur, $material->nom_responsable])) { + if(($role != 'Utilisateur' && $role != 'Responsable') || in_array($username, [$material->nom_createur, $material->nom_responsable]) || ($role == 'Responsable' && ($material->groupes_metier_id == $userConnected->groupes_metier_id || $material->groupes_thematique_id == $userConnected->groupe_thematique_id))) { echo $this->Html->link(__(''), ['action' => 'delete', $material->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $material->designation)] diff --git a/src/Template/Materiels/index.ctp b/src/Template/Materiels/index.ctp index 4a68bc4..9bd3bb7 100755 --- a/src/Template/Materiels/index.ctp +++ b/src/Template/Materiels/index.ctp @@ -166,7 +166,7 @@ if (isset ( $STATUS )) { status, ['CREATED', 'VALIDATED'])): - if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { + if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id))) { ?> Html->link(__(''), ['action' => 'edit', $materiel->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]) ?> @@ -174,7 +174,7 @@ if (isset ( $STATUS )) { groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id))) { if(h($materiel->status) == 'CREATED') { echo $this->Html->link('', @@ -203,7 +203,7 @@ if (isset ( $STATUS )) { status) == 'CREATED') { - if($role != 'Utilisateur' || in_array($username, [$materiel->nom_createur, $materiel->nom_responsable])) { + if(($role != 'Utilisateur' && $role != 'Responsable') || in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id))) { echo $this->Html->link(__(''), ['action' => 'delete', $materiel->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $materiel->designation)]); diff --git a/src/Template/Materiels/view.ctp b/src/Template/Materiels/view.ctp index e16da9e..ca5415b 100755 --- a/src/Template/Materiels/view.ctp +++ b/src/Template/Materiels/view.ctp @@ -23,7 +23,7 @@
    status, ['CREATED', 'VALIDATED'])) { - if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { + if(($role == 'Utilisateur' && (in_array($username, [$materiel->nom_createur, $materiel->nom_responsable]))) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id))) { echo $this->Html->link(__(' Editer ce matériel'), ['action' => 'edit', $materiel->id], ['escape' => false, @@ -91,7 +91,7 @@ } } - if(in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur'])) { + if(in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur']) || ($role == 'Responsable' && ($materiel->groupes_metier_id == $userConnected->groupes_metier_id || $materiel->groupes_thematique_id == $userConnected->groupe_thematique_id))) { // 2) Bouton de changement de statut : Valider, Demander archivage, ou Archiver switch ($materiel->status) { case "CREATED": @@ -201,7 +201,9 @@ $displayElement(__($configuration->nom_groupe_metier), $materiel->has('groupes_metier') ? $this->Html->link($materiel->groupes_metier->nom, ['controller' => 'GroupesMetiers', 'action' => 'view', $materiel->groupes_metier->id]) : ''); $displayElement(__('Date d\'achat'), h($materiel->date_acquisition)); $displayElement(__('Statut'), h($materiel->status)); - + if($materiel->status == 'ARCHIVED') { + $displayElement(__('Date d\'archivage'), h($materiel->date_archivage)); + } $displayElement(__('Prix (HT)'), h($materiel->prix_ht).' €'); $displayElement(__('Fournisseur'), h($materiel->fournisseur)); diff --git a/src/Template/Suivis/find.ctp b/src/Template/Suivis/find.ctp index 0309f14..d7896c7 100755 --- a/src/Template/Suivis/find.ctp +++ b/src/Template/Suivis/find.ctp @@ -126,14 +126,18 @@ $r = isset ($_results); '; - $this->Html->link(__(''), ['action' => 'view', $suivi->id], ['title' => 'Visualiser', 'style' => 'margin: 0 2px', 'escape' => false ]); - if(($role == 'Utilisateur' && in_array($username, [$suivi->nom_createur])) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { - $this->Html->link(__(''), ['action' => 'edit', $suivi->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]); - $this->Form->postLink(__(''), ['action' => 'delete', $suivi->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $suivi->id)]); - } - echo ''; + echo $this->Html->link(__(''), ['action' => 'view', $suivi->id], ['title' => 'Visualiser', 'style' => 'margin: 0 2px', 'escape' => false ]); + - echo ''; + if(($role == 'Utilisateur' && in_array($username, [$suivi->nom_createur])) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) || $role == 'Responsable' && ($suivi->groupes_metier_id == $userConnected->groupes_metier_id || $suivi->groupes_thematique_id == $userConnected->groupe_thematique_id)) { + + echo $this->Html->link(__(''), ['action' => 'edit', $suivi->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]); + echo $this->Form->postLink(__(''), ['action' => 'delete', $suivi->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $suivi->id)]); + echo ''; + } + + + echo ''; endforeach; echo ''; echo ''; diff --git a/src/Template/Suivis/index.ctp b/src/Template/Suivis/index.ctp index e765031..ab4fec5 100755 --- a/src/Template/Suivis/index.ctp +++ b/src/Template/Suivis/index.ctp @@ -25,7 +25,7 @@ Html->link(__(''), ['action' => 'view', $suivi->id], ['title' => 'Visualiser', 'style' => 'margin: 0 2px', 'escape' => false ]) ?> - nom_createur])) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { ?> + nom_createur])) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) || $role == 'Responsable' && ($suivi->groupes_metier_id == $userConnected->groupes_metier_id || $suivi->groupes_thematique_id == $userConnected->groupe_thematique_id)) { ?> Html->link(__(''), ['action' => 'edit', $suivi->id], ['title' => 'Editer', 'style' => 'margin: 0 2px', 'escape' => false ]) ?> Form->postLink(__(''), ['action' => 'delete', $suivi->id], ['title' => 'Supprimer', 'style' => 'margin: 0 2px', 'escape' => false, 'confirm' => __('Êtes-vous sur de vouloir supprimer # {0}?', $suivi->id)]) ?> diff --git a/src/Template/Suivis/view.ctp b/src/Template/Suivis/view.ctp index 849621e..29c31c4 100755 --- a/src/Template/Suivis/view.ctp +++ b/src/Template/Suivis/view.ctp @@ -6,7 +6,7 @@ nom_createur])) || (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']))) { + if(($role == 'Utilisateur' && in_array($username, [$suivi->nom_createur])) || (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur'])) || $role == 'Responsable' && ($suivi->groupes_metier_id == $userConnected->groupes_metier_id || $suivi->groupes_thematique_id == $userConnected->groupe_thematique_id)) { echo $this->Html->link(__(' Editer ce suivi'), ['action' => 'edit', $suivi->id], ['escape' => false,'onclick' => 'return true;'] -- libgit2 0.21.2