scripts / analyse-votes-AN /
Newer Older
609 lines | 28.547kb
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
1
#!/bin/bash
2

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
3
for tool in sqlite3 getopt md5sum mktemp; do
4
    which $tool > /dev/null 2>&1 || {
5
        echo missing tool $tool
6
        exit 1
7
    }
plus de souplesse dans les p...
Sébastien MARQUE authored on 2019-02-20
8
done
9

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
10
IFS_=$IFS
11

            
amélioration code
Sébastien Marque authored on 2019-05-30
12
function sqlite_request () {
13
    sqlite3 "$in_ram_database" <<< "$1"
14
}
15

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
16
function create_database () {
fix syntax error
Sébastien Marque authored on 2019-06-10
17
    if test ${#groupes[@]} -eq 0; then
complète re-écriture
Sébastien Marque authored on 2019-04-27
18
        echo "unable to find groupes in $config_file" >&2
19
        exit 1
fixe pb quand groupe cible e...
Sébastien Marque authored on 2019-02-18
20
    fi
complète re-écriture
Sébastien Marque authored on 2019-04-27
21

            
amélioration code
Sébastien Marque authored on 2019-05-30
22
    sqlite_request "create table if not exists votes (id integer primary key, nom text)"
23
    sqlite_request "create table if not exists url (id integer primary key autoincrement, url text)"
24
    sqlite_request "create table if not exists députés (id integer primary key autoincrement, nom text, groupe integer)"
25
    sqlite_request "create table if not exists groupes (id integer primary key autoincrement, nom text, nom_court text)"
26
    sqlite_request "create table if not exists scrutins (num integer primary key, date text not null, intitulé text non null, adoption boolean, url integer)"
27
    sqlite_request "create table if not exists dépouillement (député integer not null, scrutin integer not null, groupe integer not null, vote integer not null)"
fix missing table
Sébastien MARQUE authored on 2021-02-13
28
    sqlite_request "create table if not exists dossiers (id text primary key, titre text, url text)"
complète re-écriture
Sébastien Marque authored on 2019-04-27
29

            
30
    v_id=0
31
    for v in Pour Contre Abstention Non-votant; do
amélioration code
Sébastien Marque authored on 2019-05-30
32
        if test -z $(sqlite_request "select nom from votes where id is $v_id"); then
33
            sqlite_request "insert into votes values ($v_id, '$v')"
complète re-écriture
Sébastien Marque authored on 2019-04-27
34
        else
amélioration code
Sébastien Marque authored on 2019-05-30
35
            test -z $(sqlite_request "select nom from votes where id is $v_id and nom is '$v'") \
36
                && sqlite_request "update votes set nom = '$v' where id is $v_id)"
complète re-écriture
Sébastien Marque authored on 2019-04-27
37
        fi
38
        let v_id++
39
    done
40
    unset v_id v
41

            
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
42
    for g in ${!groupes[@]}; do
amélioration code
Sébastien Marque authored on 2019-05-30
43
        test -z $(sqlite_request "select id from groupes where nom is '${groupes[$g]}' and nom_court is '$g'") \
44
            && sqlite_request "insert into groupes (nom, nom_court) values ('${groupes[$g]}', '$g')"
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
45
    done
complète re-écriture
Sébastien Marque authored on 2019-04-27
46
    unset g groupes
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
47

            
amélioration code
Sébastien Marque authored on 2019-05-30
48
    test -z $(sqlite_request "select id from url where id = 0") \
49
        && sqlite_request "insert into url values (0, '')"
complète re-écriture
Sébastien Marque authored on 2019-04-27
50
}
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
51

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
52
function update_database () {
53
    test "$no_db_update" = $true_flag && return
54
    tempfile="/dev/shm/scrutin.$$"
55
    progress=0
fix bug sur premier scrutin
Sébastien Marque authored on 2019-04-27
56
    first_=$first
amélioration code
Sébastien Marque authored on 2019-05-30
57
    first=$(sqlite_request "select count(num) from scrutins")
complète re-écriture
Sébastien Marque authored on 2019-04-27
58
    if test ${first:-0} -lt $last; then
59
        echo "récupération des scrutins n°$((${first:-0}+1)) à n°$last dans "$database" (à conserver autant que possible)" >&2
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
60

            
fix missing table
Sébastien MARQUE authored on 2021-02-13
61
        local url_database=/dev/shm/url_database
complète re-écriture
Sébastien Marque authored on 2019-04-27
62
        : > "$url_database"
63
        test $((last % 100)) -ne 0 && last_offset=0
fix dossiers manquants
Sébastien MARQUE authored on 2019-12-09
64
        IFS=$' \t\n'
complète re-écriture
Sébastien Marque authored on 2019-04-27
65
        for offset in $(seq $((last - 100)) -100 ${first:-0} ) $last_offset; do
sélection possible de la man...
Sébastien MARQUE authored on 2021-02-13
66
            wget -qO- "http://www2.assemblee-nationale.fr/scrutins/liste/(offset)/$offset/(legislature)/$mandature/(type)/TOUS/(idDossier)/TOUS" \
complète re-écriture
Sébastien Marque authored on 2019-04-27
67
                | awk '
68
                    /<td class="denom">/ {
69
                        scrutin = gensub(/^.+denom.>([[:digit:]]+).*<.td./,"\\1","1",$0)
70
                    }
71
                    /<td class="desc">.+dossier<.a/ {
72
                        a[scrutin] = gensub(/^.+.<a href="(.+)">dossier<.a>.*$/,"\\1","1",$0)
73
                    }
74
                    END {
75
                        for (i in a)
76
                            print gensub("*","","1",i) "|" a[i]
77
                    }' >> "$url_database"
78
        done
79
        sort -u "$url_database" > "${url_database}.sorted"
80
        mv -f "${url_database}.sorted" "$url_database"
81

            
82
        IFS=$'\n'
83
        begin=$(date +%s)
84
        for scrutin in $(seq $((${first:-0}+1)) $last); do
sélection possible de la man...
Sébastien MARQUE authored on 2021-02-13
85
            wget -qO- "http://www2.assemblee-nationale.fr/scrutins/detail/(legislature)/$mandature/(num)/$scrutin" \
complète re-écriture
Sébastien Marque authored on 2019-04-27
86
                |  sed -r '0,/< *div class="titre-bandeau-bleu +to-print" *>/d; /< *script +type="text\/javascript" *>/,$d' > $tempfile
87

            
88
            unset title date adoption url id_url
89

            
90
            title=$(sed -rn '/<h1 class="">Analyse du scrutin n° '$scrutin'/n; s,^.*<h3 class="president-title">(.+).</h3>,\1,p' $tempfile \
91
                    | sed "s/;//g; s/[ \t][ \t]+/ /g; s/^Scrutin public sur *//; s/^l[ae']s* *//")
92
            date=$(sed -rn 's,^.*<h1 class="">Analyse du scrutin n° '$scrutin'<br/>(.+) </h1>,\1,p' $tempfile)
93
            adoption=$(sed -rn 's,^.*<p class="annonce"><span class="annoncevote">(.+).</span></p>.*$,\1,p' $tempfile)
94
            test -n "$title" -a -n "$date" -a -n "$adoption" || {
95
                echo "erreur dans la récupération du scrutin $scrutin"
96
                exit 1
97
            }
98
            grep -q 'e a a' <<< "$adoption" && adoption=1 || adoption=0
petite simplification du cod...
Sébastien MARQUE authored on 2019-03-31
99

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
100
            url=$(awk -F'|' "/^$scrutin\|/{print \$2}" "$url_database")
amélioration code
Sébastien Marque authored on 2019-05-30
101
            id_url=$(sqlite_request "select id from url where url is '$url'")
complète re-écriture
Sébastien Marque authored on 2019-04-27
102
            if test -z "$id_url"; then
amélioration code
Sébastien Marque authored on 2019-05-30
103
                sqlite_request "insert into url (url) values ('$url')"
104
                id_url=$(sqlite_request "select id from url where url is '$url'")
complète re-écriture
Sébastien Marque authored on 2019-04-27
105
            fi
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
106

            
amélioration code
Sébastien Marque authored on 2019-05-30
107
            sqlite_request "insert into scrutins values ($scrutin, '$date', \"${title//\"}\", $adoption, ${id_url:-0})"
complète re-écriture
Sébastien Marque authored on 2019-04-27
108

            
amélioration code
Sébastien Marque authored on 2019-05-30
109
            for v in $(sqlite_request "select * from votes"); do
110
                for g in $(sqlite_request "select id,nom from groupes"); do
complète re-écriture
Sébastien Marque authored on 2019-04-27
111
                    for d in $(sed -rn '/<p class="nomgroupe">'${g#*|}' <span class="block topmargin">/,/<div class="TTgroupe topmargin-lg">/p' $tempfile \
112
                        | sed -rn '/<p class="typevote">'${v#*|}':/,/<.div>/p' \
113
                        | sed 's,</li>,\n,g' \
114
                        | sed -rn '/<p class="typevote">/d; s,^\s*<li>\s*,,; s,&nbsp;, ,g; s/^\s*//; s/M(me|\.) //; s/ \(.*$//; s,<b>,,; s,</b>,,p'); do
amélioration code
Sébastien Marque authored on 2019-05-30
115
                        d_id=$(sqlite_request "select id from députés where nom is \"$d\" and groupe is ${g%|*}")
complète re-écriture
Sébastien Marque authored on 2019-04-27
116
                        if test -z "$d_id"; then
amélioration code
Sébastien Marque authored on 2019-05-30
117
                            sqlite_request "insert into députés (nom, groupe) values (\"$d\", ${g%|*})"
118
                            d_id=$(sqlite_request "select id from députés where nom is \"$d\" and groupe is ${g%|*}")
complète re-écriture
Sébastien Marque authored on 2019-04-27
119
                        fi
amélioration code
Sébastien Marque authored on 2019-05-30
120
                        sqlite_request "insert into dépouillement values ($d_id, $scrutin, ${g%|*}, ${v%|*})"
complète re-écriture
Sébastien Marque authored on 2019-04-27
121
                    done
122
                done
123
            done
124

            
amélioration du calcul ETA p...
Sébastien MARQUE authored on 2019-05-30
125
            if test $(( ($scrutin - $first) * 100 / ( $last - $first ) )) -ne $progress; then
126
                progress=$(( ($scrutin - $first) * 100 / ( $last - $first ) ))
complète re-écriture
Sébastien Marque authored on 2019-04-27
127
                if test $(($progress % ${update_progress:-1})) -eq 0; then
128
                    now=$(date +%s)
129
                    delta=$(( $now - $begin ))
amélioration du calcul ETA p...
Sébastien MARQUE authored on 2019-05-30
130
#                   scrutin = first+1 à la première itération
131
                    echo $progress%, ETA: $(date +%H:%M:%S -d "$(($delta * ($last - $scrutin) / ($scrutin - $first) )) seconds")
complète re-écriture
Sébastien Marque authored on 2019-04-27
132
                fi
133
            fi
134
        done
135
        rm -f "$url_database" "$tempfile"
136
    fi
fix bug sur premier scrutin
Sébastien Marque authored on 2019-04-27
137
    first=$first_
complète re-écriture
Sébastien Marque authored on 2019-04-27
138
}
139

            
140
function write_comparaison () {
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
141

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
142
    result="comparaisons ${groupe[0]} avec ${groupe_ref:-GDR}${dossier:+ - ${dossier}}"
complète re-écriture
Sébastien Marque authored on 2019-04-27
143
    content="/dev/shm/$result/content.xml"
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
144
    id_cols="Scrutin Date Titre Adoption Panurgisme${nom:+ Participation Loyauté}"
amélioration code
Sébastien Marque authored on 2019-05-30
145
    typevotes=$(sqlite_request "select nom from votes")
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
146
    nb_cols=$(( $(wc -w <<< $id_cols) + $(wc -w <<< $typevotes) * ${#groupe[@]} ))
147
    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')
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
148
    function write_cell () {
149
        case $1 in
150
            url)
151
                cell='<table:table-cell office:value-type="string" calcext:value-type="string">'
152
                cell+="<text:p><text:a xlink:href=\"$2\" xlink:type=\"simple\">$3</text:a></text:p>";;
153
            texte)
154
                cell='<table:table-cell office:value-type="string" calcext:value-type="string">'
155
                cell+="<text:p>$2</text:p>"
156
                ;;
157
            nombre)
158
                cell="<table:table-cell office:value-type=\"float\" office:value=\"$2\" calcext:value-type=\"float\">"
159
                cell+="<text:p>$2</text:p>"
160
                ;;
161
            *)
162
                return 1;;
163
        esac
164
        cell+='</table:table-cell>'
165
        echo $cell >> "$content"
166
    }
complète re-écriture
Sébastien Marque authored on 2019-04-27
167

            
168
    echo "génération du fichier $result"
169

            
170
    mkdir -p "/dev/shm/$result/META-INF"
171

            
172
    cat > "/dev/shm/$result/META-INF/manifest.xml" << EOmetainf
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
173
<?xml version="1.0" encoding="UTF-8"?>
174
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">
175
 <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>
176
 <manifest:file-entry manifest:full-path="content.xml" manifest:media-type="text/xml"/>
177
</manifest:manifest>
178
EOmetainf
179

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
180
    printf 'application/vnd.oasis.opendocument.spreadsheet' > "/dev/shm/$result/mimetype"
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
181

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
182
    echo '<?xml version="1.0" encoding="UTF-8"?>' > "$content"
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
183

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
184
    cat >> "$content" << EOcontent
185
    <office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2">
186
    <office:scripts/>
187
    <office:font-face-decls>
188
    <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
189
    <style:font-face style:name="DejaVu Sans" svg:font-family="&apos;DejaVu Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
190
    <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>
191
    </office:font-face-decls>
192
    <office:automatic-styles>
193
EOcontent
194

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
195
    IFS=$'\n'
complète re-écriture
Sébastien Marque authored on 2019-04-27
196
    for i in $(seq $nb_cols); do
197
        cat >> "$content" << EOcontent
198
            <style:style style:name="co$i" style:family="table-column">
199
            <style:table-column-properties fo:break-before="auto" style:column-width="30.00mm"/>
200
            </style:style>
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
201
EOcontent
complète re-écriture
Sébastien Marque authored on 2019-04-27
202
    done
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
203

            
204
    cat >> "$content" << EOcontent
complète re-écriture
Sébastien Marque authored on 2019-04-27
205
    <style:style style:name="ro1" style:family="table-row">
206
    <style:table-row-properties style:row-height="4.52mm" fo:break-before="auto" style:use-optimal-row-height="true"/>
207
    </style:style>
208
    <style:style style:name="ta1" style:family="table" style:master-page-name="Default">
209
    <style:table-properties table:display="true" style:writing-mode="lr-tb"/>
210
    </style:style>
211
    <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default">
212
    <style:table-cell-properties fo:background-color="#cccccc"/>
213
    </style:style>
214
    </office:automatic-styles>
215
    <office:body>
216
    <office:spreadsheet>
217
    <table:calculation-settings table:automatic-find-labels="false"/>
218
    <table:table table:name="$result" table:style-name="ta1">
219
    <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
220
    <table:table-column table:style-name="co1" table:number-columns-repeated="$(wc -w <<< $id_cols)" table:default-cell-style-name="Default"/>
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
221
EOcontent
222

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
223
    for i in $(seq $(wc -w <<< $typevotes)); do
224
        cat >> "$content" << EOcontent
225
        <table:table-column table:style-name="co1" table:default-cell-style-name="ce1"/>
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
226
EOcontent
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
227
        for (( g = 1; g < ${#groupe[@]}; g++ )); do
228
            cat >> "$content" << EOcontent
229
            <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
230
EOcontent
231
        done
complète re-écriture
Sébastien Marque authored on 2019-04-27
232
    done
233
    echo '<table:table-row table:style-name="ro1">' >> "$content"
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
234

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
235
    IFS=$IFS_
complète re-écriture
Sébastien Marque authored on 2019-04-27
236
    for colonne in $id_cols; do
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
237
        write_cell texte $colonne
complète re-écriture
Sébastien Marque authored on 2019-04-27
238
    done
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
239

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
240
    for typevote in $typevotes; do
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
241
        for g in "${groupe[@]}"; do
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
242
            write_cell texte "$typevote - $g"
complète re-écriture
Sébastien Marque authored on 2019-04-27
243
        done
244
    done
245

            
246
    echo '</table:table-row>' >> "$content"
247

            
248
    progress=0
249
    begin=$(date +%s)
250
    line=1
améliore progression
Sébastien Marque authored on 2019-05-03
251
    test -z "$seq" && qty=$(( $last - $first ))
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
252
    IFS=$'\n'
complète re-écriture
Sébastien Marque authored on 2019-04-27
253
    for scrutin in $(eval ${seq:-seq $first $last}); do
254

            
amélioration code
Sébastien Marque authored on 2019-05-30
255
        data=$(sqlite_request "select date,intitulé,adoption,url.url from scrutins inner join url on scrutins.url = url.id where num is $scrutin")
complète re-écriture
Sébastien Marque authored on 2019-04-27
256
        date=$(cut -d'|' -sf 1 <<< $data)
257
        title=$(cut -d'|' -sf 2 <<< $data)
258
        adoption=$(cut -d'|' -sf 3 <<< $data)
259
        url=$(cut -d'|' -sf 4 <<< $data)
260
        test $adoption -eq 1 && adoption='oui' || adoption='non'
groupe de référence: GDR
Sébastien MARQUE authored on 2019-02-17
261

            
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
262
        echo '<table:table-row table:style-name="ro1">' >> "$content"
263

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
264
        if test -n "$url"; then
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
265
            write_cell url "$url" $scrutin
complète re-écriture
Sébastien Marque authored on 2019-04-27
266
        else
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
267
            write_cell nombre $scrutin
complète re-écriture
Sébastien Marque authored on 2019-04-27
268
        fi
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
269
        write_cell texte "$date"
270
        write_cell texte "${title//\'/&apos;}"
271
        write_cell texte "$adoption"
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
272

            
amélioration code
Sébastien MARQUE authored on 2019-11-13
273
        for typevote in $(seq 0 $(( $(wc -w <<< $typevotes) - 1 ))); do
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
274
            vote_cible[$typevote]=$(sqlite_request "select
complète re-écriture
Sébastien Marque authored on 2019-04-27
275
                                        count(député)
276
                                     from
277
                                        dépouillement
278
                                     where
279
                                        scrutin is $scrutin
280
                                     and
281
                                        vote is $typevote
282
                                     and
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
283
                                        groupe is ${groupe_id[0]} ${nom:+ and député is ${nom%|*}}")
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
284
        done
285
        if test \( ${vote_cible[0]} -gt ${vote_cible[1]} -a $adoption = oui \) \
286
            -o  \( ${vote_cible[1]} -gt ${vote_cible[0]} -a $adoption = non \); then
287
            panurge=1
288
        else
289
            panurge=0
290
        fi
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
291
        write_cell nombre $panurge
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
292

            
293
        if test -n "$nom"; then
294
            for typevote in 0 1; do
295
                votes_g0[$typevote]=$(sqlite_request "select
296
                                            count(député)
297
                                         from
298
                                            dépouillement
299
                                         where
300
                                            scrutin is $scrutin
301
                                         and
302
                                            vote is $typevote
303
                                         and
304
                                            groupe is ${groupe_id[0]}")
305
            done
306
            participation=$(( vote_cible[0] + vote_cible[1] + vote_cible[2] + vote_cible[3] ))
307
            if test $(( (${votes_g0[0]} - ${votes_g0[1]}) * (${vote_cible[0]} - ${vote_cible[1]}) )) -gt 0; then
308
                loyaute=1
309
            else
310
                loyaute=0
311
            fi
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
312
            write_cell nombre $participation
313
            write_cell nombre $loyaute
ajoute colonnes loyauté, pan...
Sébastien MARQUE authored on 2019-11-13
314
        fi
315

            
amélioration code
Sébastien MARQUE authored on 2019-11-13
316
        for typevote in $(seq 0 $(( $(wc -w <<< $typevotes) - 1 ))); do
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
317
            write_cell nombre ${vote_cible[$typevote]}
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
318
            for (( g = 1; g < ${#groupe_id[@]}; g++ )); do
amélioration code
Sébastien Marque authored on 2019-05-30
319
                votes=$(sqlite_request "select
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
320
                                            count(député)
321
                                         from
322
                                            dépouillement
323
                                         where
324
                                            scrutin is $scrutin
325
                                         and
326
                                            vote is $typevote
327
                                         and
328
                                            groupe is ${groupe_id[$g]}")
simplification écriture des ...
Sébastien MARQUE authored on 2019-11-13
329
                write_cell nombre $votes
complète re-écriture
Sébastien Marque authored on 2019-04-27
330
            done
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
331
        done
complète re-écriture
Sébastien Marque authored on 2019-04-27
332
        echo '</table:table-row>' >> "$content"
333

            
meilleur calcul progression
Sébastien Marque authored on 2019-04-27
334
        if test $(( ($line * 100) / ${qty:-$last} )) -ne $progress; then
335
            progress=$(( ($line * 100) / ${qty:-$last} ))
336
            if test $(( $progress % ${generation_progress:-5} )) -eq 0; then
complète re-écriture
Sébastien Marque authored on 2019-04-27
337
                now=$(date +%s)
338
                delta=$(( $now - $begin ))
meilleur calcul progression
Sébastien Marque authored on 2019-04-27
339
                echo $progress%, ETA: $(date +%H:%M:%S -d "$(( $delta * (${qty:-$last} - $line) / $line )) seconds")
complète re-écriture
Sébastien Marque authored on 2019-04-27
340
            fi
341
        fi
meilleur calcul progression
Sébastien Marque authored on 2019-04-27
342

            
343
        let line++
344

            
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
345
    done
complète re-écriture
Sébastien Marque authored on 2019-04-27
346
    echo
347

            
348
    cat >> "$content" << EOcontent
349
    </table:table>
350
    <table:named-expressions/>
351
    <table:database-ranges>
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
352
    <table:database-range table:name="__Anonymous_Sheet_DB__0" table:target-range-address="&apos;$result&apos;.D1:&apos;$result&apos;.$last_col$line" table:display-filter-buttons="true"/>
complète re-écriture
Sébastien Marque authored on 2019-04-27
353
    </table:database-ranges>
354
    </office:spreadsheet>
355
    </office:body>
356
    </office:document-content>
357
EOcontent
358

            
359
    ( cd "/dev/shm/$result" && zip -r ../"$result" * > /dev/null 2>&1 && cd .. && rm -fr "$result" )
360

            
361
    mv -f "/dev/shm/$result.zip" "$result.ods"
362

            
363
    echo "$result.ods"
364
}
365

            
366
function save_database () {
améliore abandon
Sébastien MARQUE authored on 2020-02-23
367
    test -n "$result" -a -d "/dev/shm/$result" && rm -fr "/dev/shm/$result"
améliore le trap
Sébastien Marque authored on 2019-04-27
368
    test -n "$database" -a -n "$in_ram_database" || return
améliore la sortie
Sébastien Marque authored on 2019-06-10
369
    test -r "$in_ram_database" || return
complète re-écriture
Sébastien Marque authored on 2019-04-27
370
    if test -r "$database" && md5sum $in_ram_database | sed "s,$in_ram_database,$database," | md5sum --status -c -; then
371
        rm -f $in_ram_database
372
    elif test -w "$database"; then
373
        mv -f $in_ram_database "$database"
374
    elif ! test -e "$database"; then
375
        mv $in_ram_database "$database"
376
    else
377
        rm -f $in_ram_database
378
    fi
379
}
380

            
factorisation
Sébastien MARQUE authored on 2020-02-08
381
function dernier_scrutin_public () {
sélection possible de la man...
Sébastien MARQUE authored on 2021-02-13
382
    wget -qO- "http://www2.assemblee-nationale.fr/scrutins/liste/(legislature)/$mandature/(type)/TOUS/(idDossier)/TOUS" \
factorisation
Sébastien MARQUE authored on 2020-02-08
383
            | sed -rn 's,^.*<td class="denom">(.+)</td>.*$,\1,p' \
384
            | head -1
385
}
386

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
387
trap save_database EXIT
388

            
389
true_flag=$(mktemp --dry-run XXXXX)
390

            
391
OPTS=$( getopt -l no-db-update,\
392
                  db-update-only,\
393
                  cible:,\
394
                  ref:,\
395
                  député:,\
396
                  premier-scrutin:,\
397
                  dernier-scrutin:,\
398
                  période:,\
399
                  liste-dossiers,\
400
                  liste-députés,\
401
                  dossiers,\
402
                  dossier:,\
403
                  conf:,\
404
                  database:,\
405
                  progrès-génération:\
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
406
                  progrès-update:,\
407
                  help \
complète re-écriture
Sébastien Marque authored on 2019-04-27
408
                  -- "$@" )
409

            
410
eval set --$OPTS
411

            
412
while [[ $# -gt 0 ]]; do
413
    case "$1" in
414
        "--no-db-update")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
415
#|ne met pas à jour la base de données
complète re-écriture
Sébastien Marque authored on 2019-04-27
416
            no_db_update=$true_flag;;
417
        "--db-update-only")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
418
#|ne génère pas de fichier de résultat
complète re-écriture
Sébastien Marque authored on 2019-04-27
419
            db_update_only=$true_flag;;
420
        "--cible")
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
421
#<nom court du groupe>|génère un comparatif pour ce groupe. Par défaut LREM
422
            groupe[0]="${2^^}"
complète re-écriture
Sébastien Marque authored on 2019-04-27
423
            shift;;
424
        "--ref")
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
425
#<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
fix typo
Sébastien Marque authored on 2019-04-27
426
            groupe_ref="${2^^}"
complète re-écriture
Sébastien Marque authored on 2019-04-27
427
            shift;;
428
        "--député")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
429
#<nom>|filtre la cible sur un-e député-e sur le groupe cible (par défaut LREM). <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.
complète re-écriture
Sébastien Marque authored on 2019-04-27
430
            depute=$true_flag
431
            nom="$2"
432
            shift;;
sélection possible de la man...
Sébastien MARQUE authored on 2021-02-13
433
        "--mandature")
434
           mandature="$2"
435
           ;;
complète re-écriture
Sébastien Marque authored on 2019-04-27
436
        "--premier-scrutin")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
437
#<numéro>|commence la génération du résultat à partir du scrutin <numéro>
complète re-écriture
Sébastien Marque authored on 2019-04-27
438
            no_db_update=$true_flag
439
            first="$2"
440
            shift;;
441
        "--dernier-scrutin")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
442
#<numéro>|termine la génération du résultat au scrutin <numéro>
complète re-écriture
Sébastien Marque authored on 2019-04-27
443
            no_db_update=$true_flag
444
            last="$2"
445
            shift;;
446
        "--période")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
447
#<jj/mm/aaaa:JJ/MM/AAAA>|génère un résultat pour les scrutins allant de jj/mm/aaaa à JJ/MM/AAAA
complète re-écriture
Sébastien Marque authored on 2019-04-27
448
            periode=$true_flag
449
            no_db_update=$true_flag
450
            periode_value="$2"
451
            shift;;
452
        "--liste-députés-du-groupe")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
453
#<nom court du groupe>|liste les député-e-s du groupe <nom court du groupe> sur la mandature
complète re-écriture
Sébastien Marque authored on 2019-04-27
454
            liste_deputes=$true_flag
455
            liste_deputes_value="${2^^}"
456
            shift;;
457
        "--liste-députés")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
458
#|liste tou-te-s les député-e-s de la mandature
complète re-écriture
Sébastien Marque authored on 2019-04-27
459
            liste_deputes=$true_flag;;
460
        "--liste-dossiers")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
461
#|affiche une liste numérotée des dossiers et sort
complète re-écriture
Sébastien Marque authored on 2019-04-27
462
            liste_dossiers=$true_flag;;
463
        "--dossier")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
464
#<numéro>|génère un résultat pour le dossier numéroté <numéro>
complète re-écriture
Sébastien Marque authored on 2019-04-27
465
            dossier=$true_flag
466
            dossier_value="$2"
467
            shift;;
468
        "--dossiers")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
469
#|sélection interactive du dossier
complète re-écriture
Sébastien Marque authored on 2019-04-27
470
            dossier=$true_flag;;
471
        "--conf")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
472
#<fichier>|indique le chemin vers le fichier de configuration. Par défaut "{_}.conf"
complète re-écriture
Sébastien Marque authored on 2019-04-27
473
            test -r "$2" || {
474
                echo "config introuvable $2" >&2
475
                options_error=$true_flag
476
            }
477
            config_file="$2"
478
            shift;;
479
        "--database")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
480
#<fichier>|indique le chemin vers la base de données SQLite3 contenant les informations. Par défaut "{_}.db"
complète re-écriture
Sébastien Marque authored on 2019-04-27
481
            test -r "$2" && file -b "$2" | grep -q '^SQLite 3.x database' || {
482
                echo "erreur sur option database: fichier '$2' introuvable ou pas une base SQLite 3" >&2
483
                options_error=$true_flag
484
            }
485
            database="$2"
486
            shift;;
487
        "--progrès-génération")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
488
#<chiffre>|affiche de la progression de la génération du fichier tous les <chiffre>%. Par défaut 5
complète re-écriture
Sébastien Marque authored on 2019-04-27
489
            generation_progress="$2"
490
            shift;;
491
        "--progrès-update")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
492
#<chiffre>|affiche de la progression de la mise à jour de la base de données tous les <chiffre>%. Par défaut 1
complète re-écriture
Sébastien Marque authored on 2019-04-27
493
            update_progress="$2"
494
            shift;;
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
495
        "--help")
496
#|affiche cette aide et quitte
497
            echo "$0 [options]"
498
            echo "génère un classeur ODS pour comparer les scrutins publics de la 15ème mandature à l'Assemblée Nationale"
499
            echo
500
            sed -rn '/^ *"--.+"\)/N; s/^ *"(--.+)"\)\n#(.+)$/\1|\2/p' "$0" \
501
                | awk -F'|' -v marge='  ' -v prog="$0" '{
502
                    printf("%s %s\n" marge "%s\n\n", $1, $2, gensub("\\. ", "\\\n" marge, "g", gensub("\\{_\\}", prog, "g", $3)))
503
                }'
504
            exit;;
complète re-écriture
Sébastien Marque authored on 2019-04-27
505
    esac
506
    shift
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
507
done
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
508

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
509
test "$options_error" = $true_flag && exit 1
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
510

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
511
test -z "$database" && database="${0}.db"
utilsation d'une archive com...
Sébastien MARQUE authored on 2019-02-20
512

            
fix syntax error
Sébastien Marque authored on 2019-06-10
513
declare -A groupes
complète re-écriture
Sébastien Marque authored on 2019-04-27
514
if test -n "$config_file"; then
515
    source "$config_file"
516
else
517
    config_file="${0}.conf"
518
    if test -r "$config_file"; then
519
        source "$config_file"
520
    fi
utilsation d'une archive com...
Sébastien MARQUE authored on 2019-02-20
521
fi
522

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
523
IFS=',' groupe=(${groupe[0]:-LREM} ${groupe_ref:-GDR})
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
524

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
525
in_ram_database=$(mktemp --dry-run /dev/shm/XXXXXXXXXXXX)
526
if test -r "$database"; then
527
    cp "$database" "$in_ram_database"
528
else
529
    create_database
530
fi
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
531

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
532
for (( g = 0; g < ${#groupe[@]}; g++ )); do
amélioration code
Sébastien Marque authored on 2019-05-30
533
    groupe_id[$g]=$(sqlite_request "select id from groupes where nom_court is '${groupe[$g]}'")
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
534
    if test -z "${groupe_id[$g]}"; then
535
        echo "groupe ${groupe[$g]} inconnu" >&2
complète re-écriture
Sébastien Marque authored on 2019-04-27
536
        exit 1
537
    fi
538
done
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
539

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
540
if test "$periode" = $true_flag; then
amélioration code
Sébastien Marque authored on 2019-05-30
541
    first=$(sqlite_request "select num from scrutins where date like '% du ${periode_value%:*}' order by num asc" | head -1)
542
    last=$(sqlite_request "select num from scrutins where date like '% du ${periode_value#*:}' order by num asc" | tail -1)
complète re-écriture
Sébastien Marque authored on 2019-04-27
543
    test -z "$first" && echo "date de début inconnue: ${periode_value#*:}" >&2 && rm -f $in_ram_database && exit 1
544
    test -z "$last" && echo "date de fin inconnue: ${periode_value%:*}" >&2 && rm -f $in_ram_database && exit 1
fix bug sur premier scrutin
Sébastien Marque authored on 2019-04-27
545
elif test "$dossier" != $true_flag; then
factorisation
Sébastien MARQUE authored on 2020-02-08
546
    test -z "$last" && last=$(dernier_scrutin_public)
fix bug sur premier scrutin
Sébastien Marque authored on 2019-04-27
547
    test -z "$first" && first=1
complète re-écriture
Sébastien Marque authored on 2019-04-27
548
fi
affiche nom du fichier des r...
Sébastien MARQUE authored on 2019-03-30
549

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
550
if test "$liste_dossiers" = $true_flag; then
amélioration code
Sébastien Marque authored on 2019-05-30
551
    sqlite_request "select printf('%s - %s', id, url) from url" | sed 's,https*://.*/dossiers/,,; s/_/ /g; s/.asp$//'
complète re-écriture
Sébastien Marque authored on 2019-04-27
552
    exit
553
fi
554

            
555
if test "$db_update_only" = $true_flag; then
556
    unset first last
factorisation
Sébastien MARQUE authored on 2020-02-08
557
    last=$(dernier_scrutin_public)
complète re-écriture
Sébastien Marque authored on 2019-04-27
558
    update_database
559
    exit
560
fi
561

            
562
if test "$liste_deputes" = $true_flag; then
563
    if test -n "$liste_deputes_value"; then
amélioration code
Sébastien Marque authored on 2019-05-30
564
        sqlite_request "select printf('%s - %s', députés.nom, groupes.nom_court) from députés inner join groupes on groupes.id = députés.groupe where groupes.nom_court is '$liste_deputes_value'"
complète re-écriture
Sébastien Marque authored on 2019-04-27
565
    else
amélioration code
Sébastien Marque authored on 2019-05-30
566
        sqlite_request "select printf('%s - %s', députés.nom, groupes.nom_court) from députés inner join groupes on groupes.id = députés.groupe order by groupes.nom_court asc"
complète re-écriture
Sébastien Marque authored on 2019-04-27
567
    fi
568
    exit
569
fi
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
570

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
571
if test "$depute" = $true_flag; then
572
    if test -n "$nom"; then
amélioration code
Sébastien Marque authored on 2019-05-30
573
        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")
complète re-écriture
Sébastien Marque authored on 2019-04-27
574
        if test $match -ne 1; then
575
            if test $match -eq 0; then
576
                echo "pas de député correspondant dans le groupe $groupe"
577
            else 
578
                echo "plusieurs députés correspondent:"
amélioration code
Sébastien Marque authored on 2019-05-30
579
                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"
complète re-écriture
Sébastien Marque authored on 2019-04-27
580
            fi
581
            exit 1
582
        else
amélioration code
Sébastien Marque authored on 2019-05-30
583
            nom=$(sqlite_request "select députés.id,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")
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
584
            groupe[0]="${nom#*|} (${groupe[0]})"
complète re-écriture
Sébastien Marque authored on 2019-04-27
585
        fi
586
    fi
587
fi
588

            
589
if test "$dossier" = $true_flag; then
factorisation
Sébastien MARQUE authored on 2020-02-08
590
    last=$(dernier_scrutin_public)
complète re-écriture
Sébastien Marque authored on 2019-04-27
591
    if test -z "$dossier_value"; then
592
        IFS=$'\n'
amélioration code
Sébastien Marque authored on 2019-05-30
593
        select dossier in $(sqlite_request "select url from url" | sed 's,^.*/dossiers/,,; s/_/ /g; s/.asp$//'); do
complète re-écriture
Sébastien Marque authored on 2019-04-27
594
            if test -n "$dossier"; then
amélioration code
Sébastien Marque authored on 2019-05-30
595
                seq="sqlite_request \"select num from scrutins inner join url on url.id = scrutins.url where url.url like '%/dossiers/${dossier// /_}%' order by num asc\""
596
                qty=$(sqlite_request "select count(num) from scrutins inner join url on url.id = scrutins.url where url.url like '%/dossiers/${dossier// /_}%' order by num asc")
complète re-écriture
Sébastien Marque authored on 2019-04-27
597
                break
598
            fi
599
        done
600
        IFS=$IFS_
601
    else
amélioration code
Sébastien Marque authored on 2019-05-30
602
        seq="sqlite_request \"select num from scrutins inner join url on url.id = scrutins.url where url.id is $dossier_value order by num asc\""
603
        qty=$(sqlite_request "select count(num) from scrutins inner join url on url.id = scrutins.url where url.id is $dossier_value order by num asc")
604
        dossier=$(sqlite_request "select url from url where id is $dossier_value" | sed 's,^.*/dossiers/,,; s/_/ /g; s/.asp$//')
complète re-écriture
Sébastien Marque authored on 2019-04-27
605
    fi
606
fi
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
607

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
608
update_database
609
write_comparaison