Commit ed60c45ea406c60a21abad0392fbc86cc77d0f60
1 parent
4022449b
Exists in
master
and in
3 other branches
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)
Showing
6 changed files
with
310 additions
and
11 deletions
Show diff stats
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**: | ... | ... |
... | ... | @@ -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 | ... | ... |