Commit ed60c45ea406c60a21abad0392fbc86cc77d0f60

Authored by Etienne Pallier
1 parent 4022449b

Nouveau script install/update.sh pour mettre à jour le logiciel ET la BD

Nouveau script "install/update.sh" pour mettre à jour automatiquement:
- le logiciel (git pull)
ET
- la BD (seulement si besoin)
README.md
... ... @@ -53,10 +53,10 @@ Logiciel testé et validé sur les configurations suivantes :
53 53  
54 54 VERSION ACTUELLE
55 55  
56   -Date: 11/01/2019
57   -Version: 2.9.1.11
  56 +Date: 15/01/2019
  57 +Version: 2.9.2
58 58 Author: EP
59   - Update fichier database/labinvent_last_version.sql contenant la BD COMPLETE
  59 + Nouveau script "install/update.sh" pour mettre à jour automatiquement le logiciel (git pull) ET la BD (si besoin)
60 60  
61 61 Version majeure en cours : 2.9 (https://projects.irap.omp.eu/versions/207)
62 62  
... ... @@ -73,6 +73,9 @@ CHANGEMENTS IMPORTANTS (MILESTONES)
73 73 Liste complète des évolutions: https://gitlab.irap.omp.eu/epallier/labinvent/commits/master
74 74  
75 75 -----------------------------------------------------------------------------------------------------------
  76 +15/01/2019 Version: 2.9.2 (EP)
  77 + Nouveau script "install/update.sh" pour mettre à jour automatiquement le logiciel (git pull) ET la BD (si besoin)
  78 +
76 79 10/01/2019 Version: 2.9.1.11 (EP)
77 80 Nouveau mode LDAP AUTHENTIFIÉ opérationnel (pour le CRAL) :
78 81 - **ATTENTION, MODIF DE LA BD, il faut exécuter le script de mise à jour suivant**:
... ...
install/update.sh 0 → 100755
... ... @@ -0,0 +1,94 @@
  1 +#!/bin/bash
  2 +
  3 +# ----------------------------------------------------------------------------------------------------------------
  4 +# Ce script permet de mettre à jour automatiquement le code source du logiciel, ainsi que la BD (si besoin).
  5 +# C'est une bonne pratique de l'exécuter assez régulièrement pour garder un logiciel bien à jour.
  6 +
  7 +# Il ne fait essentiellement qu'un "git pull" suivi de la mise à jour de la BD (si besoin).
  8 +
  9 +# La BD est mise à jour SEULEMENT s'il existe au moins 1 NOUVEAU script de mise à jour db-update-YYYY-MM-DD.sh
  10 +# récupéré avec git pull (dans le dossier database/update/).
  11 +# S'il y en a plusieurs, ils sont exécutés dans l'ordre chronologique.
  12 +# ----------------------------------------------------------------------------------------------------------------
  13 +
  14 +# (Bash Arrays : cf https://www.cyberciti.biz/faq/finding-bash-shell-array-length-elements/)
  15 +
  16 +TEST=1
  17 +
  18 +db_update_scripts_folder="../database/update"
  19 +db_update_scripts_folder_tmp=/tmp/database_update
  20 +
  21 +function abort() {
  22 + echo "******************************************************"
  23 + echo "!!! Script aborté à cause d'une erreur d'exécution !!!"
  24 + echo "******************************************************"
  25 + exit 1
  26 +}
  27 +
  28 +# TEST only
  29 +[[ $TEST == 1 ]] && (rm ../database/update/test.txt ; rm ../database/update/db-update-2017-08-24.sh ; rm ../database/update/db-update-2017-08-25.sh)
  30 +
  31 +
  32 +
  33 +# 0) Sauvegarde de l'état actuel du dossier database/update/ (dans /tmp)
  34 +#db_update_scripts_before=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )
  35 +rm -rf $db_update_scripts_folder_tmp/ || abort
  36 +mkdir $db_update_scripts_folder_tmp/ || abort
  37 +cp -fp $db_update_scripts_folder/db-update-????-??-??.sh $db_update_scripts_folder_tmp/ || abort
  38 +cd $db_update_scripts_folder_tmp/ || abort
  39 +db_update_scripts_before=$(ls -1 db-update-????-??-??.sh) || abort
  40 +cd - >/dev/null || abort
  41 +#echo ; echo ${db_update_scripts_before[@]}
  42 +
  43 +
  44 +
  45 +# 1) Mise à jour du code source (git pull)
  46 +#db_update_scripts_after=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" "key0" "key11" )
  47 +echo
  48 +echo "* Mise à jour du code source (git pull) (o/n) ? [o]"
  49 +read do_it ; [[ -z $do_it ]] && do_it="o" ; echo $do_it
  50 +[[ $do_it != "o" ]] && exit 0
  51 +
  52 +cd ../ || abort
  53 +git pull || abort
  54 +cd - >/dev/null || abort
  55 +
  56 +# TEST only
  57 +[[ $TEST == 1 ]] && (touch ../database/update/test.txt ; touch ../database/update/db-update-2017-08-24.sh ; touch ../database/update/db-update-2017-08-25.sh)
  58 +
  59 +cd $db_update_scripts_folder/ || abort
  60 +db_update_scripts_after=$(ls -1 db-update-????-??-??.sh) || abort
  61 +cd - >/dev/null || abort
  62 +#echo ; echo ${db_update_scripts_after[@]}
  63 +echo "=> Fait"
  64 +
  65 +
  66 +
  67 +# 2) (Optionnel) Mise a jour de la BD (seulement s'il y a au moins 1 nouveau script db-update-YYYY-MM-DD.sh dans database/update/)
  68 +db_update_scripts_new=$( echo ${db_update_scripts_before[@]} ${db_update_scripts_after[@]} | tr ' ' '\n' | sort | uniq -u ) || abort
  69 +#temp=() ; for t in ${db_update_scripts_new[@]} ; do temp+=($t) ; done ; temp+=('toto') ; db_update_scripts_new=$temp
  70 +#echo ${#db_update_scripts_new[@]} ; echo ${db_update_scripts_new[@]}
  71 +# Pas de nouveau script de mise à jour BD à exécuter => exit
  72 +[[ $db_update_scripts_new == '' ]] && exit 0
  73 +#nb_scripts=${#db_update_scripts_new[@]}
  74 +#[[ $nb_scripts == 0 ]] && exit 0
  75 +
  76 +echo
  77 +echo "* Mise à jour de la Base de Données :"
  78 +echo "Voici le(s) script(s) à exécuter :"
  79 +echo ${db_update_scripts_new[@]}
  80 +cd $db_update_scripts_folder/ || abort
  81 +for db_update_script_new in ${db_update_scripts_new[@]} ; do
  82 + echo ; echo
  83 + echo "- Execution du script de mise à jour de la BD $db_update_scripts_folder/$db_update_script_new (o/n) ? [o]"
  84 + read do_it ; [[ -z $do_it ]] && do_it="o" ; echo $do_it
  85 + if [[ $do_it == "o" ]] ; then
  86 + #ls -l ./$db_update_script_new_ || abort
  87 + ./$db_update_script_new || abort
  88 + fi
  89 +done
  90 +cd - >/dev/null
  91 +
  92 +echo
  93 +echo "=> Fait"
  94 +
... ...
src/Model/Entity/Materiel.php
... ... @@ -73,4 +73,61 @@ class Materiel extends Entity
73 73 '*' => true,
74 74 'id' => false
75 75 ];
  76 +
  77 + /* 14/1/19 bake autogenerated:
  78 + protected $_accessible = [
  79 + 'designation' => true,
  80 + 'sur_categorie_id' => true,
  81 + 'categorie_id' => true,
  82 + 'sous_categorie_id' => true,
  83 + 'numero_laboratoire' => true,
  84 + 'description' => true,
  85 + 'materiel_administratif' => true,
  86 + 'materiel_technique' => true,
  87 + 'status' => true,
  88 + 'date_acquisition' => true,
  89 + 'prix_ht' => true,
  90 + 'eotp' => true,
  91 + 'numero_commande' => true,
  92 + 'code_comptable' => true,
  93 + 'numero_serie' => true,
  94 + 'groupes_thematique_id' => true,
  95 + 'groupes_metier_id' => true,
  96 + 'numero_inventaire_organisme' => true,
  97 + 'numero_inventaire_old' => true,
  98 + 'date_archivage' => true,
  99 + 'etiquette' => true,
  100 + 'lieu_detail' => true,
  101 + 'nom_responsable' => true,
  102 + 'email_responsable' => true,
  103 + 'gestionnaire_id' => true,
  104 + 'nom_createur' => true,
  105 + 'nom_modificateur' => true,
  106 + 'created' => true,
  107 + 'modified' => true,
  108 + 'date_reception' => true,
  109 + 'organisme_id' => true,
  110 + 'site_id' => true,
  111 + 'date_fin_garantie' => true,
  112 + 'duree_garantie' => true,
  113 + 'unite_duree_garantie' => true,
  114 + 'hors_service' => true,
  115 + 'photo_id' => true,
  116 + 'metrologie' => true,
  117 + 'fournisseur_id' => true,
  118 + 'sur_category' => true,
  119 + 'category' => true,
  120 + 'sous_category' => true,
  121 + 'groupes_thematique' => true,
  122 + 'groupes_metier' => true,
  123 + 'organisme' => true,
  124 + 'site' => true,
  125 + 'documents' => true,
  126 + 'emprunts' => true,
  127 + 'suivis' => true,
  128 + 'fournisseur' => true,
  129 + 'user' => true
  130 + ];
  131 + */
  132 +
76 133 }
... ...
src/Model/Table/MaterielsTable.php
1 1 <?php
2 2 namespace App\Model\Table;
3 3  
  4 +//use Cake\ORM\Query;
4 5 use Cake\ORM\RulesChecker;
5 6 use Cake\ORM\Table;
6 7 use Cake\Validation\Validator;
... ... @@ -24,6 +25,17 @@ use Cake\ORM\Association\BelongsTo;
24 25 * @property \Cake\ORM\Association\HasMany $Suivis
25 26 * @property \Cake\ORM\Association\BelongsTo $Fournisseurs
26 27 * @property \Cake\ORM\Association\BelongsTo $Users
  28 + *
  29 + * @method \App\Model\Entity\Materiel get($primaryKey, $options = [])
  30 + * @method \App\Model\Entity\Materiel newEntity($data = null, array $options = [])
  31 + * @method \App\Model\Entity\Materiel[] newEntities(array $data, array $options = [])
  32 + * @method \App\Model\Entity\Materiel|bool save(\Cake\Datasource\EntityInterface $entity, $options = [])
  33 + * @method \App\Model\Entity\Materiel patchEntity(\Cake\Datasource\EntityInterface $entity, array $data, array $options = [])
  34 + * @method \App\Model\Entity\Materiel[] patchEntities($entities, array $data, array $options = [])
  35 + * @method \App\Model\Entity\Materiel findOrCreate($search, callable $callback = null, $options = [])
  36 + *
  37 + * @mixin \Cake\ORM\Behavior\TimestampBehavior
  38 + *
27 39 */
28 40 class MaterielsTable extends AppTable
29 41 {
... ... @@ -45,10 +57,16 @@ class MaterielsTable extends AppTable
45 57 public function initialize(array $config)
46 58 {
47 59 parent::initialize($config);
48   - $this->table('materiels');
49   - $this->displayField('id');
50   - $this->primaryKey('id');
  60 +
  61 + $this->setTable('materiels');
  62 + $this->setDisplayField('id');
  63 + $this->setPrimaryKey('id');
  64 + //$this->table('materiels');
  65 + //$this->displayField('id');
  66 + //$this->primaryKey('id');
  67 +
51 68 $this->addBehavior('Timestamp');
  69 +
52 70 $this->belongsTo('SurCategories', [
53 71 'foreignKey' => 'sur_categorie_id'
54 72 ]);
... ... @@ -83,10 +101,22 @@ class MaterielsTable extends AppTable
83 101 'foreignKey' => 'fournisseur_id'
84 102 ]);
85 103  
86   - // EP 9/6/17 added :
  104 + // 9/6/17 EP added :
87 105 $this->belongsTo('Users', [
88 106 'foreignKey' => 'gestionnaire_id'
89 107 ]);
  108 + // 14/1/19 cake bake auto added:
  109 + /*
  110 + $this->belongsTo('Gestionnaires', [
  111 + 'foreignKey' => 'gestionnaire_id'
  112 + ]);
  113 + */
  114 + $this->belongsTo('Photos', [
  115 + 'foreignKey' => 'photo_id'
  116 + ]);
  117 +
  118 +
  119 +
90 120 }
91 121  
92 122 /**
... ... @@ -98,6 +128,7 @@ class MaterielsTable extends AppTable
98 128 */
99 129 public function validationDefault(Validator $validator)
100 130 {
  131 +
101 132 $dateValide = function ($entity) {
102 133 $time = Time::now(); // On récupère la date et l'heure actuelles
103 134 $today = (new date("$time->year-$time->month-$time->day"))->format('Ymd'); // On extrait la date on la formatte en un format comparable de type 20171231
... ... @@ -114,10 +145,15 @@ class MaterielsTable extends AppTable
114 145 ]);
115 146 $validator->notEmpty('sur_categorie_id', 'Vous devez sélectionner une valeur');
116 147 $validator->notEmpty('categorie_id', 'Vous devez sélectionner une valeur');
117   - $validator->allowEmpty('numero_laboratoire')->add('numero_laboratoire', 'unique', [
  148 + $validator
  149 + //->scalar('numero_laboratoire')
  150 + ->maxLength('numero_laboratoire', 20)
  151 + ->allowEmpty('numero_laboratoire')
  152 + ->add('numero_laboratoire', 'unique', [
118 153 'rule' => 'validateUnique',
119 154 'provider' => 'table'
120 155 ]);
  156 +
121 157 $validator->allowEmpty('description')->add('description', 'valid', [
122 158 'rule' => 'check_string_with_some_special_cars',
123 159 'message' => 'Ce champ contient des caractères interdits',
... ... @@ -210,7 +246,16 @@ class MaterielsTable extends AppTable
210 246 $validator->allowEmpty('gestionnaire_id');
211 247 // ->notEmpty('gestionnaire_id', 'Ce champ doit être rempli');
212 248 $validator->allowEmpty('nom_createur');
213   - $validator->allowEmpty('nom_modificateur');
  249 + $validator
  250 + ->maxLength('nom_modificateur', 45)
  251 + ->allowEmpty('nom_modificateur');
  252 + /* 14/1/19 cake bake autogenerated:
  253 + $validator
  254 + ->scalar('nom_modificateur')
  255 + ->maxLength('nom_modificateur', 45)
  256 + ->allowEmpty('nom_modificateur');
  257 + */
  258 +
214 259 $validator->allowEmpty('date_reception');
215 260 $validator->allowEmpty('date_fin_garantie');
216 261 $validator->allowEmpty('duree_garantie');
... ... @@ -305,6 +350,11 @@ class MaterielsTable extends AppTable
305 350 $rules->add($rules->existsIn([
306 351 'site_id'
307 352 ], 'Sites'));
  353 + // 14/1/19 bake autoadded:
  354 + //$rules->add($rules->existsIn(['gestionnaire_id'], 'Gestionnaires'));
  355 + //$rules->add($rules->existsIn(['photo_id'], 'Photos'));
  356 + $rules->add($rules->existsIn(['fournisseur_id'], 'Fournisseurs'));
  357 +
308 358 return $rules;
309 359 }
310 360  
... ...
tests/Fixture/MaterielsFixture.php
... ... @@ -556,6 +556,52 @@ class MaterielsFixture extends TestFixture {
556 556 * @var array
557 557 */
558 558 public $records = [
  559 +
  560 + /* 14/1/19 bake autogenerated
  561 + [
  562 + 'id' => 1,
  563 + 'designation' => 'Lorem ipsum dolor sit amet',
  564 + 'sur_categorie_id' => 1,
  565 + 'categorie_id' => 1,
  566 + 'sous_categorie_id' => 1,
  567 + 'numero_laboratoire' => 'Lorem ipsum dolor ',
  568 + 'description' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.',
  569 + 'materiel_administratif' => 1,
  570 + 'materiel_technique' => 1,
  571 + 'status' => 'Lorem ipsum d',
  572 + 'date_acquisition' => '2019-01-14',
  573 + 'prix_ht' => 1,
  574 + 'eotp' => 'Lorem ipsum dolor sit amet',
  575 + 'numero_commande' => 'Lorem ipsum dolor sit amet',
  576 + 'code_comptable' => 'Lorem ipsum dolor sit amet',
  577 + 'numero_serie' => 'Lorem ipsum dolor sit amet',
  578 + 'groupes_thematique_id' => 1,
  579 + 'groupes_metier_id' => 1,
  580 + 'numero_inventaire_organisme' => 'Lorem ipsum dolor sit amet',
  581 + 'numero_inventaire_old' => 'Lorem ipsum dolor sit amet',
  582 + 'date_archivage' => '2019-01-14',
  583 + 'etiquette' => 1,
  584 + 'lieu_detail' => 'Lorem ipsum dolor sit amet',
  585 + 'nom_responsable' => 'Lorem ipsum dolor sit amet',
  586 + 'email_responsable' => 'Lorem ipsum dolor sit amet',
  587 + 'gestionnaire_id' => 1,
  588 + 'nom_createur' => 'Lorem ipsum dolor sit amet',
  589 + 'nom_modificateur' => 'Lorem ipsum dolor sit amet',
  590 + 'created' => '2019-01-14 14:14:39',
  591 + 'modified' => '2019-01-14 14:14:39',
  592 + 'date_reception' => '2019-01-14',
  593 + 'organisme_id' => 1,
  594 + 'site_id' => 1,
  595 + 'date_fin_garantie' => '2019-01-14',
  596 + 'duree_garantie' => 1,
  597 + 'unite_duree_garantie' => 'Lorem ipsum dolor sit amet',
  598 + 'hors_service' => 1,
  599 + 'photo_id' => 1,
  600 + 'metrologie' => 1,
  601 + 'fournisseur_id' => 1
  602 + ],
  603 + */
  604 +
559 605 [
560 606 'id' => 1,
561 607 'designation' => 'matos 1 USER (C)',
... ...
tests/TestCase/Model/Table/MaterielsTableTest.php
... ... @@ -37,8 +37,14 @@ class MaterielsTableTest extends TestCase
37 37 'app.suivis',
38 38 'app.emprunts',
39 39 'app.fournisseurs',
40   - 'app.unites'
  40 + 'app.unites',
  41 + // 14/1/19 bake autogenerated:
  42 + 'app.type_suivis',
  43 + 'app.type_documents',
  44 + 'app.fichemetrologiques',
  45 + //'app.mesures',
41 46 ];
  47 +
42 48  
43 49 /**
44 50 * setUp method
... ... @@ -48,7 +54,9 @@ class MaterielsTableTest extends TestCase
48 54 public function setUp()
49 55 {
50 56 parent::setUp();
51   - $config = TableRegistry::exists('Materiels') ? [] : ['className' => 'App\Model\Table\MaterielsTable'];
  57 + // 14/1/19 bake autogenerated:
  58 + $config = TableRegistry::exists('Materiels') ? [] : ['className' => MaterielsTable::class];
  59 + //$config = TableRegistry::exists('Materiels') ? [] : ['className' => 'App\Model\Table\MaterielsTable'];
52 60 $this->Materiels = TableRegistry::get('Materiels', $config);
53 61 }
54 62  
... ... @@ -65,6 +73,47 @@ class MaterielsTableTest extends TestCase
65 73 }
66 74  
67 75 /**
  76 + * Test initialize method
  77 + *
  78 + * @return void
  79 + public function testInitialize()
  80 + {
  81 + $this->markTestIncomplete('Not implemented yet.');
  82 + }
  83 + */
  84 +
  85 + /**
  86 + * Test validationDefault method
  87 + *
  88 + * @return void
  89 + public function testValidationDefault()
  90 + {
  91 + $this->markTestIncomplete('Not implemented yet.');
  92 + }
  93 + */
  94 +
  95 + /**
  96 + * Test buildRules method
  97 + *
  98 + * @return void
  99 + public function testBuildRules()
  100 + {
  101 + $this->markTestIncomplete('Not implemented yet.');
  102 + }
  103 + */
  104 +
  105 + /**
  106 + * Test beforeSave method
  107 + *
  108 + * @return void
  109 + public function testBeforeSave()
  110 + {
  111 + $this->markTestIncomplete('Not implemented yet.');
  112 + }
  113 + */
  114 +
  115 +
  116 + /**
68 117 * Test check_string method
69 118 *
70 119 * @return void
... ...