scripts / analyse-votes-AN /
Newer Older
606 lines | 28.46kb
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
66
            wget -qO- "http://www2.assemblee-nationale.fr/scrutins/liste/(offset)/$offset/(legislature)/15/(type)/TOUS/(idDossier)/TOUS" \
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
85
            wget -qO- "http://www2.assemblee-nationale.fr/scrutins/detail/(legislature)/15/(num)/$scrutin" \
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 () {
382
    wget -qO- 'http://www2.assemblee-nationale.fr/scrutins/liste/(legislature)/15/(type)/TOUS/(idDossier)/TOUS' \
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;;
433
        "--premier-scrutin")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
434
#<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
435
            no_db_update=$true_flag
436
            first="$2"
437
            shift;;
438
        "--dernier-scrutin")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
439
#<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
440
            no_db_update=$true_flag
441
            last="$2"
442
            shift;;
443
        "--période")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
444
#<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
445
            periode=$true_flag
446
            no_db_update=$true_flag
447
            periode_value="$2"
448
            shift;;
449
        "--liste-députés-du-groupe")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
450
#<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
451
            liste_deputes=$true_flag
452
            liste_deputes_value="${2^^}"
453
            shift;;
454
        "--liste-députés")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
455
#|liste tou-te-s les député-e-s de la mandature
complète re-écriture
Sébastien Marque authored on 2019-04-27
456
            liste_deputes=$true_flag;;
457
        "--liste-dossiers")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
458
#|affiche une liste numérotée des dossiers et sort
complète re-écriture
Sébastien Marque authored on 2019-04-27
459
            liste_dossiers=$true_flag;;
460
        "--dossier")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
461
#<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
462
            dossier=$true_flag
463
            dossier_value="$2"
464
            shift;;
465
        "--dossiers")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
466
#|sélection interactive du dossier
complète re-écriture
Sébastien Marque authored on 2019-04-27
467
            dossier=$true_flag;;
468
        "--conf")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
469
#<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
470
            test -r "$2" || {
471
                echo "config introuvable $2" >&2
472
                options_error=$true_flag
473
            }
474
            config_file="$2"
475
            shift;;
476
        "--database")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
477
#<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
478
            test -r "$2" && file -b "$2" | grep -q '^SQLite 3.x database' || {
479
                echo "erreur sur option database: fichier '$2' introuvable ou pas une base SQLite 3" >&2
480
                options_error=$true_flag
481
            }
482
            database="$2"
483
            shift;;
484
        "--progrès-génération")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
485
#<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
486
            generation_progress="$2"
487
            shift;;
488
        "--progrès-update")
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
489
#<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
490
            update_progress="$2"
491
            shift;;
ajout d'un message d'aide
Sébastien Marque authored on 2019-04-27
492
        "--help")
493
#|affiche cette aide et quitte
494
            echo "$0 [options]"
495
            echo "génère un classeur ODS pour comparer les scrutins publics de la 15ème mandature à l'Assemblée Nationale"
496
            echo
497
            sed -rn '/^ *"--.+"\)/N; s/^ *"(--.+)"\)\n#(.+)$/\1|\2/p' "$0" \
498
                | awk -F'|' -v marge='  ' -v prog="$0" '{
499
                    printf("%s %s\n" marge "%s\n\n", $1, $2, gensub("\\. ", "\\\n" marge, "g", gensub("\\{_\\}", prog, "g", $3)))
500
                }'
501
            exit;;
complète re-écriture
Sébastien Marque authored on 2019-04-27
502
    esac
503
    shift
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
504
done
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
505

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

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

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

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

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

            
ajout possibilité de compare...
Sébastien Marque authored on 2019-05-03
529
for (( g = 0; g < ${#groupe[@]}; g++ )); do
amélioration code
Sébastien Marque authored on 2019-05-30
530
    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
531
    if test -z "${groupe_id[$g]}"; then
532
        echo "groupe ${groupe[$g]} inconnu" >&2
complète re-écriture
Sébastien Marque authored on 2019-04-27
533
        exit 1
534
    fi
535
done
ajout script d'analyse des v...
Sébastien MARQUE authored on 2019-02-17
536

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

            
complète re-écriture
Sébastien Marque authored on 2019-04-27
547
if test "$liste_dossiers" = $true_flag; then
amélioration code
Sébastien Marque authored on 2019-05-30
548
    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
549
    exit
550
fi
551

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

            
559
if test "$liste_deputes" = $true_flag; then
560
    if test -n "$liste_deputes_value"; then
amélioration code
Sébastien Marque authored on 2019-05-30
561
        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
562
    else
amélioration code
Sébastien Marque authored on 2019-05-30
563
        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
564
    fi
565
    exit
566
fi
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
567

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

            
586
if test "$dossier" = $true_flag; then
factorisation
Sébastien MARQUE authored on 2020-02-08
587
    last=$(dernier_scrutin_public)
complète re-écriture
Sébastien Marque authored on 2019-04-27
588
    if test -z "$dossier_value"; then
589
        IFS=$'\n'
amélioration code
Sébastien Marque authored on 2019-05-30
590
        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
591
            if test -n "$dossier"; then
amélioration code
Sébastien Marque authored on 2019-05-30
592
                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\""
593
                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
594
                break
595
            fi
596
        done
597
        IFS=$IFS_
598
    else
amélioration code
Sébastien Marque authored on 2019-05-30
599
        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\""
600
        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")
601
        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
602
    fi
603
fi
écriture directe en feuille ...
Sébastien MARQUE authored on 2019-03-31
604

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