...
|
...
|
@@ -171,12 +171,34 @@ function update_database () {
|
171
|
171
|
}
|
172
|
172
|
|
173
|
173
|
function write_comparaison () {
|
174
|
|
- result="comparaisons ${groupe[0]} avec ${groupe_ref:-GDR}${dossier:+ - ${dossier}}"
|
|
174
|
+ result="scrutins ($(sum <<< "${groupe[@]}" | cut -b1-5))${dossier:+ - ${dossier}}"
|
175
|
175
|
content="/dev/shm/$result/content.xml"
|
176
|
|
- id_cols=(Scrutin Date Scéance Titre Adoption Panurgisme${nom:+ Participation Loyauté} Dossier)
|
|
176
|
+ id_cols=(Scrutin Date Séance Titre Adoption Dossier)
|
177
|
177
|
eval $(sqlite_request 'select printf("typevotes[%i]=%s;", id, nom) from votes')
|
178
|
178
|
nb_cols=$(( ${#id_cols[@]} + ${#typevotes[@]} * ${#groupe[@]} ))
|
179
|
179
|
last_col=$(awk -v n=$nb_cols 'BEGIN{printf("%c%c", n < 27 ? "" : int(n/26) + 64, (n % 26) + (n % 26 == 0 ? 26 : 0) + 64)}' | tr -d '\0')
|
|
180
|
+ colors=($(awk -v n=${#groupe[@]} -v from=${from_color:-2A0636} -v to=${to_color:-D09B8A} '
|
|
181
|
+ function rgbL (p) {
|
|
182
|
+ r = rgb_from[1] + p * (rgb_to[1] - rgb_from[1])
|
|
183
|
+ g = rgb_from[2] + p * (rgb_to[2] - rgb_from[2])
|
|
184
|
+ b = rgb_from[3] + p * (rgb_to[3] - rgb_from[3])
|
|
185
|
+ L = r * 0.299 + g * 0.587 + b * 0.114
|
|
186
|
+ printf("%02x%02x%02x:%s\n", int(r), int(g), int(b), L > 185 ? "000000" : "ffffff")
|
|
187
|
+ }
|
|
188
|
+ BEGIN {
|
|
189
|
+ for (i = split(gensub("(..)(..)(..)", "\\1,\\2,\\3", "1", from), rgb_from, ","); i > 0; i--)
|
|
190
|
+ rgb_from[i] = strtonum(sprintf("%d", strtonum("0x" rgb_from[i])))
|
|
191
|
+ for (i = split(gensub("(..)(..)(..)", "\\1,\\2,\\3", "1", to), rgb_to, ","); i > 0; i--)
|
|
192
|
+ rgb_to[i] = strtonum(sprintf("%d", strtonum("0x" rgb_to[i])))
|
|
193
|
+
|
|
194
|
+ print "pour_bash_array_qui_commence_a_index_0"
|
|
195
|
+ rgbL(0)
|
|
196
|
+ for (i = 1; i < n-1; i++) {
|
|
197
|
+ rgbL(i/n)
|
|
198
|
+ }
|
|
199
|
+ if (n > 1) rgbL(1)
|
|
200
|
+ }
|
|
201
|
+ '))
|
180
|
202
|
function write_cell () {
|
181
|
203
|
case $1 in
|
182
|
204
|
url)
|
...
|
...
|
@@ -241,9 +263,18 @@ EOcontent
|
241
|
263
|
<style:style style:name="ta1" style:family="table" style:master-page-name="Default">
|
242
|
264
|
<style:table-properties table:display="true" style:writing-mode="lr-tb"/>
|
243
|
265
|
</style:style>
|
244
|
|
- <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default">
|
245
|
|
- <style:table-cell-properties fo:background-color="#cccccc"/>
|
246
|
|
- </style:style>
|
|
266
|
+EOcontent
|
|
267
|
+
|
|
268
|
+ for i in $(seq ${#groupe[@]}); do
|
|
269
|
+ cat >> "$content" << EOcontent
|
|
270
|
+ <style:style style:name="ce$i" style:family="table-cell" style:parent-style-name="Default">
|
|
271
|
+ <style:table-cell-properties fo:wrap-option="wrap" style:vertical-align="middle" fo:background-color="#${colors[$i]%:*}"/>
|
|
272
|
+ <style:text-properties fo:hyphenate="false" fo:color="#${colors[$i]}"/>
|
|
273
|
+ </style:style>
|
|
274
|
+EOcontent
|
|
275
|
+ done
|
|
276
|
+
|
|
277
|
+ cat >> "$content" << EOcontent
|
247
|
278
|
</office:automatic-styles>
|
248
|
279
|
<office:body>
|
249
|
280
|
<office:spreadsheet>
|
...
|
...
|
@@ -254,12 +285,9 @@ EOcontent
|
254
|
285
|
EOcontent
|
255
|
286
|
|
256
|
287
|
for i in $(seq ${#typevotes[@]}); do
|
257
|
|
- cat >> "$content" << EOcontent
|
258
|
|
- <table:table-column table:style-name="co1" table:default-cell-style-name="ce1"/>
|
259
|
|
-EOcontent
|
260
|
|
- for (( g = 1; g < ${#groupe[@]}; g++ )); do
|
|
288
|
+ for g in $(seq ${#groupe[@]}); do
|
261
|
289
|
cat >> "$content" << EOcontent
|
262
|
|
- <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
|
|
290
|
+ <table:table-column table:style-name="co1" table:default-cell-style-name="ce$g"/>
|
263
|
291
|
EOcontent
|
264
|
292
|
done
|
265
|
293
|
done
|
...
|
...
|
@@ -302,34 +330,12 @@ EOcontent
|
302
|
330
|
write_cell texte "$seance"
|
303
|
331
|
write_cell texte "$title"
|
304
|
332
|
write_cell texte "$adoption"
|
|
333
|
+ write_cell url "${dossier_url/#null/\"\"}" "${dossier_texte/#null}"
|
305
|
334
|
|
|
335
|
+ unset votes
|
306
|
336
|
for typevote in $(seq ${#typevotes[@]}); do
|
307
|
|
- vote_cible[$typevote]=$(sqlite_request "select
|
308
|
|
- count(député)
|
309
|
|
- from
|
310
|
|
- dépouillements
|
311
|
|
- inner join
|
312
|
|
- députés, groupes
|
313
|
|
- on
|
314
|
|
- députés.groupe = groupes.id and dépouillements.député = députés.id
|
315
|
|
- where
|
316
|
|
- scrutin is $scrutin
|
317
|
|
- and
|
318
|
|
- vote is $typevote
|
319
|
|
- and
|
320
|
|
- groupes.id = ${groupe_id[0]} ${nom:+ and députés.nom is \"${nom}\"}")
|
321
|
|
- done
|
322
|
|
- if test \( ${vote_cible[1]} -gt ${vote_cible[2]} -a $adoption = oui \) \
|
323
|
|
- -o \( ${vote_cible[2]} -gt ${vote_cible[1]} -a $adoption = non \); then
|
324
|
|
- panurge=oui
|
325
|
|
- else
|
326
|
|
- panurge=non
|
327
|
|
- fi
|
328
|
|
- write_cell texte $panurge
|
329
|
|
-
|
330
|
|
- if test -n "$nom"; then
|
331
|
|
- for typevote in 1 2; do
|
332
|
|
- votes_g0[$typevote]=$(sqlite_request "select
|
|
337
|
+ for (( g = 0; g < ${#groupe[@]}; g++ )); do
|
|
338
|
+ votes[${#votes[@]}]=$(sqlite_request "select
|
333
|
339
|
count(député)
|
334
|
340
|
from
|
335
|
341
|
dépouillements
|
...
|
...
|
@@ -342,39 +348,22 @@ EOcontent
|
342
|
348
|
and
|
343
|
349
|
vote is $typevote
|
344
|
350
|
and
|
345
|
|
- groupes.id is ${groupe_id[0]}")
|
|
351
|
+ ${id_groupe[$g]%:*}.nom = '${groupe[$g]}'")
|
346
|
352
|
done
|
347
|
|
- participation=$(( vote_cible[1] + vote_cible[2] + vote_cible[3] + vote_cible[4] ))
|
348
|
|
- if test $(( (${votes_g0[1]} - ${votes_g0[2]}) * (${vote_cible[1]} - ${vote_cible[2]}) )) -gt 0; then
|
349
|
|
- loyaute=oui
|
350
|
|
- else
|
351
|
|
- loyaute=non
|
352
|
|
- fi
|
353
|
|
- write_cell nombre $participation
|
354
|
|
- write_cell texte $loyaute
|
355
|
|
- fi
|
356
|
|
-
|
357
|
|
- write_cell url "${dossier_url/#null/\"\"}" "${dossier_texte/#null}"
|
358
|
|
-
|
359
|
|
- for typevote in $(seq ${#typevotes[@]}); do
|
360
|
|
- write_cell nombre ${vote_cible[$typevote]}
|
361
|
|
- for (( g = 1; g < ${#groupe_id[@]}; g++ )); do
|
362
|
|
- votes=$(sqlite_request "select
|
363
|
|
- count(député)
|
364
|
|
- from
|
365
|
|
- dépouillements
|
366
|
|
- inner join
|
367
|
|
- députés, groupes
|
368
|
|
- on
|
369
|
|
- députés.groupe = groupes.id and dépouillements.député = députés.id
|
370
|
|
- where
|
371
|
|
- scrutin is $scrutin
|
372
|
|
- and
|
373
|
|
- vote is $typevote
|
374
|
|
- and
|
375
|
|
- groupes.id is ${groupe_id[$g]}")
|
376
|
|
- write_cell nombre $votes
|
|
353
|
+ done
|
|
354
|
+ for ((j = 0; j < ${#groupe[@]}; j++)); do
|
|
355
|
+ presence=1 # `let presence+=0` sort en erreur si variable est unset ou égale à 0
|
|
356
|
+ for ((i = $j; i < ${#votes[@]}; i += ${#groupe[@]})); do
|
|
357
|
+ let presence+=${votes[$i]}
|
377
|
358
|
done
|
|
359
|
+ if test $presence -eq 1; then
|
|
360
|
+ for ((i = $j; i < ${#votes[@]}; i += ${#groupe[@]})); do
|
|
361
|
+ votes[$i]=-1
|
|
362
|
+ done
|
|
363
|
+ fi
|
|
364
|
+ done
|
|
365
|
+ for ((i = 0; i < ${#votes[@]}; i ++)); do
|
|
366
|
+ write_cell nombre ${votes[$i]}
|
378
|
367
|
done
|
379
|
368
|
echo '</table:table-row>' >> "$content"
|
380
|
369
|
|
...
|
...
|
@@ -453,44 +442,70 @@ while [[ $# -gt 0 ]]; do
|
453
|
442
|
case "$1" in
|
454
|
443
|
"--no-db-update")
|
455
|
444
|
#|ne met pas à jour la base de données
|
|
445
|
+ if test ${db_update_only:-OK} = $true_flag; then
|
|
446
|
+ echo "option incompatible avec --db-update-only"
|
|
447
|
+ exit 1
|
|
448
|
+ fi
|
456
|
449
|
no_db_update=$true_flag;;
|
457
|
450
|
"--db-update-only")
|
458
|
451
|
#|ne génère pas de fichier de résultat
|
|
452
|
+ if test ${no_db_update:-OK} = $true_flag; then
|
|
453
|
+ echo "option incompatible avec --no-db-update"
|
|
454
|
+ exit 1
|
|
455
|
+ fi
|
459
|
456
|
db_update_only=$true_flag;;
|
460
|
|
- "--cible")
|
461
|
|
-#<nom court du groupe>|génère un comparatif pour ce groupe. Par défaut Renaissance
|
462
|
|
- groupe[0]="${2}"
|
|
457
|
+ "--cible"|"-c")
|
|
458
|
+#<nom court du groupe>|ajoute les scrutins de ce groupe, de ce ou cette députée, les colonnes seront dans l'ordre
|
|
459
|
+ _groupe[${#_groupe[@]}]="${2}"
|
463
|
460
|
shift;;
|
464
|
|
- "--ref")
|
465
|
|
-#<nom court du groupe ou des groupes>|compare avec ce ou ces groupes. Si plusieurs groupes, ils sont séparés par une virgule, sans espace. Par défaut GDR
|
466
|
|
- groupe_ref="${2}"
|
467
|
|
- shift;;
|
468
|
|
- "--député")
|
469
|
|
-#<nom>|filtre la cible sur un-e député-e sur le groupe cible (par défaut Renaissance). <nom> est insensible à la casse. Tout ou partie du nom ou du prénom peut être donné, espace compris. Caractère % utilisé comme caractère joker. Si aucune correspondance n'est trouvée avec un-e député-é, sortie en erreur. Si plusieurs député-e-s correspondent la liste est affichée et sortie en erreur.
|
470
|
|
- depute=$true_flag
|
471
|
|
- nom="$2"
|
|
461
|
+ "--couleurs")
|
|
462
|
+#<nombre hexadécimal>:<nombre hexadécimal>|colore les colonnes en dégradé entre les deux couleurs comprises
|
|
463
|
+ if grep -iq '[^0-9A-F:]' <<< ${2:-ERROR}; then
|
|
464
|
+ echo "$1 ${2:-ERROR}: format attendu <nombre>:<nombre>"
|
|
465
|
+ exit 1
|
|
466
|
+ elif egrep -iq '[0-9A-F]{6}:[0-9A-F]{6}' <<< ${2:-ERROR}; then
|
|
467
|
+ from_color=${2%:*}
|
|
468
|
+ to_color=${2#*:}
|
|
469
|
+ else
|
|
470
|
+ echo erreur $2: couleur RGB au format hexadécimal demandé
|
|
471
|
+ fi
|
472
|
472
|
shift;;
|
473
|
473
|
"--mandature")
|
474
|
474
|
mandature="$2"
|
475
|
475
|
;;
|
|
476
|
+ "--scrutin")
|
|
477
|
+#<nombre>[:<nombre>]|commence la génération du résultat pour le scrutin <nombre>, ou entre les deux nombres donnés
|
|
478
|
+ if grep -q '[^0-9:]' <<< ${2:-ERROR}; then
|
|
479
|
+ echo "$1 ${2:-ERROR}: format attendu <nombre>[:<nombre>]"
|
|
480
|
+ exit 1
|
|
481
|
+ elif egrep -q '[1-9][0-9]*(:[1-9][0-9]*)?' <<< ${2:-ERROR}; then
|
|
482
|
+ first=${2%:*}
|
|
483
|
+ last=${2#*:}
|
|
484
|
+ if test $first -gt $last; then
|
|
485
|
+ last+=:$first
|
|
486
|
+ first=${last%:*}
|
|
487
|
+ last=${last#*:}
|
|
488
|
+ fi
|
|
489
|
+ else
|
|
490
|
+ echo "$1 ${2:-ERROR}: <nombre> ne doit pas commencer par 0"
|
|
491
|
+ exit 1
|
|
492
|
+ fi
|
|
493
|
+ shift;;
|
476
|
494
|
"--premier-scrutin")
|
477
|
495
|
#<numéro>|commence la génération du résultat à partir du scrutin <numéro>
|
478
|
|
- no_db_update=$true_flag
|
479
|
496
|
first="$2"
|
480
|
497
|
shift;;
|
481
|
498
|
"--dernier-scrutin")
|
482
|
499
|
#<numéro>|termine la génération du résultat au scrutin <numéro>
|
483
|
|
- no_db_update=$true_flag
|
484
|
500
|
last="$2"
|
485
|
501
|
shift;;
|
486
|
502
|
"--période")
|
487
|
503
|
#<jj/mm/aaaa:JJ/MM/AAAA>|génère un résultat pour les scrutins allant de jj/mm/aaaa à JJ/MM/AAAA
|
488
|
504
|
periode=$true_flag
|
489
|
|
- no_db_update=$true_flag
|
490
|
505
|
periode_value="$2"
|
491
|
506
|
shift;;
|
492
|
507
|
"--liste-députés-du-groupe")
|
493
|
|
-#<nom court du groupe>|liste les député-e-s du groupe <nom court du groupe> sur la mandature
|
|
508
|
+#<groupe>|liste les député·e·s du groupe <groupe>
|
494
|
509
|
liste_deputes=$true_flag
|
495
|
510
|
liste_deputes_value="${2}"
|
496
|
511
|
shift;;
|
...
|
...
|
@@ -557,8 +572,6 @@ done
|
557
|
572
|
|
558
|
573
|
test "$options_error" = $true_flag && exit 1
|
559
|
574
|
|
560
|
|
-IFS=',' groupe=(${groupe[0]:-Renaissance} ${groupe_ref:-GDR})
|
561
|
|
-
|
562
|
575
|
in_ram_database=$(mktemp --dry-run /dev/shm/XXXXXXXXXXXX)
|
563
|
576
|
if test -r "$database"; then
|
564
|
577
|
cp "$database" "$in_ram_database"
|
...
|
...
|
@@ -566,18 +579,6 @@ else
|
566
|
579
|
create_database
|
567
|
580
|
fi
|
568
|
581
|
|
569
|
|
-function check_groupes () {
|
570
|
|
- nb_groupe=$(sqlite_request "select count(id) from groupes where nom like \"%$1%\" or nom_court is \"$1\"")
|
571
|
|
- if test $nb_groupe -eq 0; then
|
572
|
|
- echo "aucun groupe ne correspond au critère $1" >&2
|
573
|
|
- exit 1
|
574
|
|
- elif test $nb_groupe -gt 1; then
|
575
|
|
- echo "plusieurs groupes correspondent au critère $1" >&2
|
576
|
|
- sqlite_request "select printf('• %s%s', nom, iif(nom_court is not null, ' [' || nom_court || ']', '')) from groupes where nom like \"%$1%\" or nom_court = \"$1\"" | grep --color -i "$1" >&2
|
577
|
|
- exit 1
|
578
|
|
- fi
|
579
|
|
-}
|
580
|
|
-
|
581
|
582
|
if test "$periode" = $true_flag; then
|
582
|
583
|
function get_date () {
|
583
|
584
|
sqlite_request "select distinct(date) from scrutins order by num asc" | awk -v d="$1" -v comp=$2 '
|
...
|
...
|
@@ -625,11 +626,6 @@ if test "$db_update_only" = $true_flag; then
|
625
|
626
|
exit
|
626
|
627
|
fi
|
627
|
628
|
|
628
|
|
-for (( g = 0; g < ${#groupe[@]}; g++ )); do
|
629
|
|
- check_groupes "${groupe[$g]}"
|
630
|
|
- groupe_id[$g]=$(sqlite_request "select id from groupes where nom like \"%${groupe[$g]}%\" or nom_court is '${groupe[$g]}'")
|
631
|
|
-done
|
632
|
|
-
|
633
|
629
|
if test "$liste_deputes" = $true_flag; then
|
634
|
630
|
if test -n "$liste_deputes_value"; then
|
635
|
631
|
sqlite_request "select printf('%s - %s%s',
|
...
|
...
|
@@ -654,22 +650,36 @@ if test "$liste_deputes" = $true_flag; then
|
654
|
650
|
exit
|
655
|
651
|
fi
|
656
|
652
|
|
657
|
|
-if test "$depute" = $true_flag; then
|
658
|
|
- if test -n "$nom"; then
|
659
|
|
- match=$(sqlite_request "select count(députés.id) from députés inner join groupes on groupes.id = députés.groupe where députés.nom like '%$nom%' and groupes.nom_court is '$groupe' collate nocase")
|
660
|
|
- if test $match -eq 0; then
|
661
|
|
- echo "pas de député correspondant à $nom dans le groupe $groupe"
|
662
|
|
- exit 1
|
663
|
|
- elif test $match -gt 1; then
|
664
|
|
- echo "plusieurs députés correspondent à $nom:"
|
665
|
|
- sqlite_request "select députés.nom from députés inner join groupes on groupes.id = députés.groupe where députés.nom like '%$nom%' and groupes.nom_court is '$groupe' collate nocase"
|
666
|
|
- exit 1
|
667
|
|
- else
|
668
|
|
- groupe[0]=$(sqlite_request "select printf('%s (%s)', députés.nom, groupes.nom) from députés inner join groupes on groupes.id = députés.groupe where députés.nom like '%$nom%' and groupes.nom_court is '$groupe' collate nocase")
|
669
|
|
- nom=${groupe[0]%% (*}
|
670
|
|
- fi
|
|
653
|
+for (( g = 0; g < ${#_groupe[@]}; g++ )); do
|
|
654
|
+ # on vérifie si c'est un ou une député
|
|
655
|
+ depute_count=$(sqlite_request "select count(distinct nom) from députés where nom like '%${_groupe[$g]}%'")
|
|
656
|
+ groupe_count=$(sqlite_request "select count(distinct nom) from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'")
|
|
657
|
+ if test $depute_count -eq 1 -a $groupe_count -ne 1; then
|
|
658
|
+ groupe[$g]=$(sqlite_request "select distinct nom from députés where nom like '%${_groupe[$g]}%'")
|
|
659
|
+ id_groupe[$g]=députés:$(sqlite_request "select group_concat(id) from députés where nom is '${groupe[$g]}'")
|
|
660
|
+ continue
|
|
661
|
+ elif test $groupe_count -eq 1 -a $depute_count -ne 1; then
|
|
662
|
+ groupe[$g]=$(sqlite_request "select distinct nom from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'")
|
|
663
|
+ id_groupe[$g]=groupes:$(sqlite_request "select id from groupes where nom is '${groupe[$g]}'")
|
|
664
|
+ continue
|
|
665
|
+ elif test $groupe_count -eq 1 -a $depute_count -eq 1; then
|
|
666
|
+ echo "dénomination ambigüe pour ${_groupe[$g]}"
|
|
667
|
+ sqlite_request "select printf('député·e: %s', distinct nom) from députés where nom like '%${_groupe[$g]}%'" | grep --color -i "${_groupe[$g]}"
|
|
668
|
+ sqlite_request "select printf('groupe : %s', distinct nom) from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'" | grep --color -i "${_groupe[$g]}"
|
|
669
|
+ exit 1
|
|
670
|
+ elif test $depute_count -gt 1; then
|
|
671
|
+ echo plusieurs député·e·s correspondant à "${_groupe[$g]}" trouvé·e·s
|
|
672
|
+ sqlite_request "select distinct nom from députés where nom like '%${_groupe[$g]}%'" | grep --color -i "${_groupe[$g]}"
|
|
673
|
+ exit 1
|
|
674
|
+ elif test $groupe_count -gt 1; then
|
|
675
|
+ echo plusieurs groupes correspondant à "${_groupe[$g]}" trouvés
|
|
676
|
+ sqlite_request "select distinct nom from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'" | grep --color -i "${_groupe[$g]}"
|
|
677
|
+ exit 1
|
|
678
|
+ else
|
|
679
|
+ echo aucun·e député·e ou groupe ne correspond au critère "${_groupe[$g]}"
|
|
680
|
+ exit 1
|
671
|
681
|
fi
|
672
|
|
-fi
|
|
682
|
+done
|
673
|
683
|
|
674
|
684
|
update_database
|
675
|
685
|
write_comparaison
|