Commit e31bad66 authored by Nicolas Joyard's avatar Nicolas Joyard

Gestion dynamique OK/KO

parent 48a88c89
...@@ -2,8 +2,14 @@ ...@@ -2,8 +2,14 @@
from sqlalchemy.sql.expression import case, func from sqlalchemy.sql.expression import case, func
from .constants import (ETAPE_A_CONFIRMER, ETAPE_A_ENVOYER, ETAPE_ENVOYE, from .constants import (
ETAPE_NA, ETAPE_REPONSE_POSITIVE, ETAPES) ETAPE_A_CONFIRMER,
ETAPE_A_ENVOYER,
ETAPE_ENVOYE,
ETAPE_NA,
ETAPE_REPONSE_POSITIVE,
ETAPES,
)
from .database import db from .database import db
from .parlementaire import Parlementaire from .parlementaire import Parlementaire
from .procedure import Action from .procedure import Action
...@@ -15,31 +21,33 @@ def etat_courriers(): ...@@ -15,31 +21,33 @@ def etat_courriers():
""" """
_categories = [ _categories = [
{'etats': [''], 'label': 'Inconnu'}, {"etats": [""], "label": "Inconnu"},
{'etats': ['Pris en charge', 'En cours de traitement'], {
'label': 'Pris en charge'}, "etats": ["Pris en charge", "En cours de traitement"],
{'etats': ['Pli présenté', 'En attente de seconde présentation'], "label": "Pris en charge",
'label': 'Présenté'}, },
{'etats': ['Attend d\'être retiré au guichet'], 'label': 'Au guichet'}, {
{'etats': ['Distribué'], 'label': 'Distribué'} "etats": ["Pli présenté", "En attente de seconde présentation"],
"label": "Présenté",
},
{"etats": ["Attend d'être retiré au guichet"], "label": "Au guichet"},
{"etats": ["Distribué"], "label": "Distribué"},
] ]
# Extrait "Distribué" de "1X23456: Distribué (01/02/2017)" # Extrait "Distribué" de "1X23456: Distribué (01/02/2017)"
expr = func.split_part( expr = func.split_part(func.split_part(Action.suivi, ":", 2), " (", 1)
func.split_part(
Action.suivi, ':', 2), data = {
' (', 1 item.etat: item.nb
) for item in db.session.query(expr.label("etat"), func.count(1).label("nb"))
.filter(Action.etape == ETAPE_ENVOYE)
data = {item.etat: item.nb .group_by(expr)
for item in db.session.query(expr.label('etat'), .all()
func.count(1).label('nb')) }
.filter(Action.etape == ETAPE_ENVOYE)
.group_by(expr) return [
.all()} (c["label"], sum([data.get(e, 0) for e in c["etats"]])) for c in _categories
]
return [(c['label'], sum([data.get(e, 0) for e in c['etats']]))
for c in _categories]
def par_departement(): def par_departement():
...@@ -49,28 +57,35 @@ def par_departement(): ...@@ -49,28 +57,35 @@ def par_departement():
""" """
# Comptage des parlementaires par département... # Comptage des parlementaires par département...
dept_qs = db.session \ dept_qs = db.session.query(
.query(Parlementaire.num_deptmt, Parlementaire.num_deptmt, func.count(Parlementaire.id).label("total")
func.count(Parlementaire.id).label('total')) )
# ...et par étape # ...et par étape
dept_qs = dept_qs.add_columns(*[ dept_qs = dept_qs.add_columns(
func.sum(case([(Parlementaire.etape == e['ordre'], 1)], else_=0)) *[
.label('nb_etape_%s' % e['ordre']) func.sum(case([(Parlementaire.etape == e["ordre"], 1)], else_=0)).label(
for e in ETAPES "nb_etape_%s" % e["ordre"]
]) )
for e in ETAPES
]
)
# ...et qui sont dans une étape >= pris en charge # ...et qui sont dans une étape >= pris en charge
dept_qs = dept_qs.add_columns( dept_qs = dept_qs.add_columns(
func.sum(case([(Parlementaire.etape >= ETAPE_A_CONFIRMER, 1)], func.sum(case([(Parlementaire.etape >= ETAPE_A_CONFIRMER, 1)], else_=0)).label(
else_=0)).label('nb_prisencharge'), "nb_prisencharge"
func.sum(case([(Parlementaire.etape >= ETAPE_ENVOYE, 1)], ),
else_=0)).label('nb_envoyes') func.sum(case([(Parlementaire.etape >= ETAPE_ENVOYE, 1)], else_=0)).label(
"nb_envoyes"
),
) )
return dept_qs.group_by(Parlementaire.num_deptmt) \ return (
.order_by(Parlementaire.num_deptmt) \ dept_qs.group_by(Parlementaire.num_deptmt)
.all() .order_by(Parlementaire.num_deptmt)
.all()
)
def par_etape(): def par_etape():
...@@ -79,12 +94,14 @@ def par_etape(): ...@@ -79,12 +94,14 @@ def par_etape():
""" """
count = func.count(Parlementaire.id) count = func.count(Parlementaire.id)
return db.session.query(Parlementaire.etape, count.label('nb')) \ return (
.filter(Parlementaire.etape > ETAPE_NA) \ db.session.query(Parlementaire.etape, count.label("nb"))
.group_by(Parlementaire.etape) \ .filter(Parlementaire.etape > ETAPE_NA)
.order_by(Parlementaire.etape) \ .group_by(Parlementaire.etape)
.having(count > 0) \ .order_by(Parlementaire.etape)
.all() .having(count > 0)
.all()
)
def random_parl(): def random_parl():
...@@ -93,16 +110,18 @@ def random_parl(): ...@@ -93,16 +110,18 @@ def random_parl():
aucun n'est disponible parmi ceux concernés par l'opération aucun n'est disponible parmi ceux concernés par l'opération
""" """
parl = Parlementaire.query \ parl = (
.filter(Parlementaire.etape == ETAPE_A_ENVOYER) \ Parlementaire.query.filter(Parlementaire.etape == ETAPE_A_ENVOYER)
.order_by(func.random()) \ .order_by(func.random())
.first() .first()
)
if not parl: if not parl:
parl = Parlementaire.query \ parl = (
.filter(Parlementaire.etape > ETAPE_NA) \ Parlementaire.query.filter(Parlementaire.etape > ETAPE_NA)
.order_by(func.random()) \ .order_by(func.random())
.first() .first()
)
return parl return parl
...@@ -112,7 +131,32 @@ def current_step(): ...@@ -112,7 +131,32 @@ def current_step():
Renvoie l'étape minimale de tous les parlementaires concernés Renvoie l'étape minimale de tous les parlementaires concernés
""" """
return db.session.query(func.min(Parlementaire.etape).label('etape')) \ return (
.filter(Parlementaire.etape > ETAPE_NA) \ db.session.query(func.min(Parlementaire.etape).label("etape"))
.filter(Parlementaire.etape != ETAPE_REPONSE_POSITIVE) \ .filter(Parlementaire.etape > ETAPE_NA)
.first().etape .filter(Parlementaire.etape != ETAPE_REPONSE_POSITIVE)
.first()
.etape
)
def nb_ok():
"""
Renvoie le nombre de parlementaires ayant répondu positivement
"""
return Parlementaire.query.filter(
Parlementaire.etape == ETAPE_REPONSE_POSITIVE
).count()
def nb_ko():
"""
Renvoie le nombre de parlementaires n'ayant pas répondu positivement
"""
return (
Parlementaire.query.filter(Parlementaire.etape > ETAPE_NA)
.filter(Parlementaire.etape != ETAPE_REPONSE_POSITIVE)
.count()
)
...@@ -3,19 +3,24 @@ ...@@ -3,19 +3,24 @@
from flask import render_template from flask import render_template
from ..models.constants import ETAPES_BY_ORDRE, ETAPE_DEMANDE_CADA from ..models.constants import ETAPES_BY_ORDRE, ETAPE_DEMANDE_CADA
from ..models.queries import (etat_courriers, par_etape, par_departement, from ..models.queries import (
random_parl, current_step) etat_courriers,
par_etape,
par_departement,
random_parl,
current_step,
nb_ok,
nb_ko,
)
def setup_routes(app): def setup_routes(app):
@app.route("/", endpoint="home")
@app.route('/', endpoint='home')
def home(): def home():
step = current_step() step = current_step()
kwargs = dict( kwargs = dict(
parlementaire=random_parl(), parlementaire=random_parl(), current_step=step, nb_ok=nb_ok(), nb_ko=nb_ko()
current_step=step
) )
if step < ETAPE_DEMANDE_CADA: if step < ETAPE_DEMANDE_CADA:
...@@ -29,26 +34,26 @@ def setup_routes(app): ...@@ -29,26 +34,26 @@ def setup_routes(app):
def key_each_etape(key): def key_each_etape(key):
return each_etape(lambda e: ETAPES_BY_ORDRE[e.etape][key]) return each_etape(lambda e: ETAPES_BY_ORDRE[e.etape][key])
kwargs['etapes_data'] = { kwargs["etapes_data"] = {
'labels': key_each_etape('label'), "labels": key_each_etape("label"),
'datasets': [{ "datasets": [
'data': each_etape(lambda e: e.nb), {
'backgroundColor': key_each_etape('couleur'), "data": each_etape(lambda e: e.nb),
'hoverBackgroundColor': key_each_etape('couleur'), "backgroundColor": key_each_etape("couleur"),
'borderWidth': 0 "hoverBackgroundColor": key_each_etape("couleur"),
}] "borderWidth": 0,
}
],
} }
# Données histogramme # Données histogramme
etats = etat_courriers() etats = etat_courriers()
kwargs['histo_data'] = { kwargs["histo_data"] = {
'labels': [etat for etat, nb in etats], "labels": [etat for etat, nb in etats],
'datasets': [{ "datasets": [{"data": [nb for etat, nb in etats]}],
'data': [nb for etat, nb in etats]
}]
} }
kwargs['departements'] = par_departement() kwargs["departements"] = par_departement()
return render_template('index.html.j2', **kwargs) return render_template("index.html.j2", **kwargs)
...@@ -81,4 +81,3 @@ ...@@ -81,4 +81,3 @@
</table> </table>
</section> </section>
{% endblock %} {% endblock %}
...@@ -34,9 +34,9 @@ ...@@ -34,9 +34,9 @@
</header> </header>
<article class="panel-body"> <article class="panel-body">
<center> <center>
<a style="font-size: 35px" href="/parlementaires?q=R%C3%A9ponse%20positive" class="btn btn-success">7<br/>Frais de mandats obtenus</a> <a style="font-size: 35px" href="/parlementaires?q=R%C3%A9ponse%20positive" class="btn btn-success">{{ nb_ok }}<br/>Frais de mandats obtenus</a>
<br/><br/> <br/><br/>
<p><a href="/parlementaires?q={{ etapes_by_ordre[current_step].label | urlencode }}" class="btn btn-danger">567 députés n'ayant pas répondu positivement</a></p> <p><a href="/parlementaires?q={{ etapes_by_ordre[current_step].label | urlencode }}" class="btn btn-danger">{{ nb_ko }} députés n'ayant pas répondu positivement</a></p>
</center> </center>
</article> </article>
</section> </section>
...@@ -237,7 +237,7 @@ ...@@ -237,7 +237,7 @@
/* Procedure */ /* Procedure */
var en_cours = "En cours: requête déposée au Tribunal Administratif pour 567 députés n'ayant pas répondu favorablement à notre demande"; var en_cours = "En cours: requête déposée au Tribunal Administratif pour {{ nb_ko }} députés n'ayant pas répondu favorablement à notre demande";
var tooltips = { var tooltips = {
'#demande': "Envoi d'une demande de communication des relevés bancaires et de l'attestation d'utilisation de l'IRFM aux parlementaires", '#demande': "Envoi d'une demande de communication des relevés bancaires et de l'attestation d'utilisation de l'IRFM aux parlementaires",
...@@ -280,7 +280,7 @@ ...@@ -280,7 +280,7 @@
'#nb_negatifs': en_cours, '#nb_negatifs': en_cours,
'#saisie_ta': en_cours, '#saisie_ta': en_cours,
'#nb_positifs': "7 parlementaires ont accepté de nous communiquer les informations demandées" '#nb_positifs': "{{ nb_ok }} parlementaires ont accepté de nous communiquer les informations demandées"
}; };
var tooltips_right = ['#accord_eur', '#rejet_eur', '#lobbying']; var tooltips_right = ['#accord_eur', '#rejet_eur', '#lobbying'];
......
...@@ -1012,7 +1012,7 @@ ...@@ -1012,7 +1012,7 @@
y="-76.039421" y="-76.039421"
x="-145.41687" x="-145.41687"
id="tspan1055" id="tspan1055"
sodipodi:role="line">7</tspan></text> sodipodi:role="line">{{ nb_ok }}</tspan></text>
</g> </g>
<g <g
id="nb_negatifs" id="nb_negatifs"
...@@ -1032,6 +1032,6 @@ ...@@ -1032,6 +1032,6 @@
y="-223.58508" y="-223.58508"
x="-2.7185695" x="-2.7185695"
id="tspan1055-3" id="tspan1055-3"
sodipodi:role="line">567</tspan></text> sodipodi:role="line">{{ nb_ko }}</tspan></text>
</g> </g>
</svg> </svg>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment