Commit e31bad66 by Nicolas Joyard

Gestion dynamique OK/KO

parent 48a88c89
......@@ -2,8 +2,14 @@
from sqlalchemy.sql.expression import case, func
from .constants import (ETAPE_A_CONFIRMER, ETAPE_A_ENVOYER, ETAPE_ENVOYE,
ETAPE_NA, ETAPE_REPONSE_POSITIVE, ETAPES)
from .constants import (
ETAPE_A_CONFIRMER,
ETAPE_A_ENVOYER,
ETAPE_ENVOYE,
ETAPE_NA,
ETAPE_REPONSE_POSITIVE,
ETAPES,
)
from .database import db
from .parlementaire import Parlementaire
from .procedure import Action
......@@ -15,31 +21,33 @@ def etat_courriers():
"""
_categories = [
{'etats': [''], 'label': 'Inconnu'},
{'etats': ['Pris en charge', 'En cours de traitement'],
'label': 'Pris en charge'},
{'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é'}
{"etats": [""], "label": "Inconnu"},
{
"etats": ["Pris en charge", "En cours de traitement"],
"label": "Pris en charge",
},
{
"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)"
expr = func.split_part(
func.split_part(
Action.suivi, ':', 2),
' (', 1
)
data = {item.etat: item.nb
for item in db.session.query(expr.label('etat'),
func.count(1).label('nb'))
.filter(Action.etape == ETAPE_ENVOYE)
.group_by(expr)
.all()}
return [(c['label'], sum([data.get(e, 0) for e in c['etats']]))
for c in _categories]
expr = func.split_part(func.split_part(Action.suivi, ":", 2), " (", 1)
data = {
item.etat: item.nb
for item in db.session.query(expr.label("etat"), func.count(1).label("nb"))
.filter(Action.etape == ETAPE_ENVOYE)
.group_by(expr)
.all()
}
return [
(c["label"], sum([data.get(e, 0) for e in c["etats"]])) for c in _categories
]
def par_departement():
......@@ -49,28 +57,35 @@ def par_departement():
"""
# Comptage des parlementaires par département...
dept_qs = db.session \
.query(Parlementaire.num_deptmt,
func.count(Parlementaire.id).label('total'))
dept_qs = db.session.query(
Parlementaire.num_deptmt, func.count(Parlementaire.id).label("total")
)
# ...et par étape
dept_qs = dept_qs.add_columns(*[
func.sum(case([(Parlementaire.etape == e['ordre'], 1)], else_=0))
.label('nb_etape_%s' % e['ordre'])
for e in ETAPES
])
dept_qs = dept_qs.add_columns(
*[
func.sum(case([(Parlementaire.etape == e["ordre"], 1)], else_=0)).label(
"nb_etape_%s" % e["ordre"]
)
for e in ETAPES
]
)
# ...et qui sont dans une étape >= pris en charge
dept_qs = dept_qs.add_columns(
func.sum(case([(Parlementaire.etape >= ETAPE_A_CONFIRMER, 1)],
else_=0)).label('nb_prisencharge'),
func.sum(case([(Parlementaire.etape >= ETAPE_ENVOYE, 1)],
else_=0)).label('nb_envoyes')
func.sum(case([(Parlementaire.etape >= ETAPE_A_CONFIRMER, 1)], else_=0)).label(
"nb_prisencharge"
),
func.sum(case([(Parlementaire.etape >= ETAPE_ENVOYE, 1)], else_=0)).label(
"nb_envoyes"
),
)
return dept_qs.group_by(Parlementaire.num_deptmt) \
.order_by(Parlementaire.num_deptmt) \
.all()
return (
dept_qs.group_by(Parlementaire.num_deptmt)
.order_by(Parlementaire.num_deptmt)
.all()
)
def par_etape():
......@@ -79,12 +94,14 @@ def par_etape():
"""
count = func.count(Parlementaire.id)
return db.session.query(Parlementaire.etape, count.label('nb')) \
.filter(Parlementaire.etape > ETAPE_NA) \
.group_by(Parlementaire.etape) \
.order_by(Parlementaire.etape) \
.having(count > 0) \
.all()
return (
db.session.query(Parlementaire.etape, count.label("nb"))
.filter(Parlementaire.etape > ETAPE_NA)
.group_by(Parlementaire.etape)
.order_by(Parlementaire.etape)
.having(count > 0)
.all()
)
def random_parl():
......@@ -93,16 +110,18 @@ def random_parl():
aucun n'est disponible parmi ceux concernés par l'opération
"""
parl = Parlementaire.query \
.filter(Parlementaire.etape == ETAPE_A_ENVOYER) \
.order_by(func.random()) \
.first()
parl = (
Parlementaire.query.filter(Parlementaire.etape == ETAPE_A_ENVOYER)
.order_by(func.random())
.first()
)
if not parl:
parl = Parlementaire.query \
.filter(Parlementaire.etape > ETAPE_NA) \
.order_by(func.random()) \
.first()
parl = (
Parlementaire.query.filter(Parlementaire.etape > ETAPE_NA)
.order_by(func.random())
.first()
)
return parl
......@@ -112,7 +131,32 @@ def current_step():
Renvoie l'étape minimale de tous les parlementaires concernés
"""
return db.session.query(func.min(Parlementaire.etape).label('etape')) \
.filter(Parlementaire.etape > ETAPE_NA) \
.filter(Parlementaire.etape != ETAPE_REPONSE_POSITIVE) \
.first().etape
return (
db.session.query(func.min(Parlementaire.etape).label("etape"))
.filter(Parlementaire.etape > ETAPE_NA)
.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 @@
from flask import render_template
from ..models.constants import ETAPES_BY_ORDRE, ETAPE_DEMANDE_CADA
from ..models.queries import (etat_courriers, par_etape, par_departement,
random_parl, current_step)
from ..models.queries import (
etat_courriers,
par_etape,
par_departement,
random_parl,
current_step,
nb_ok,
nb_ko,
)
def setup_routes(app):
@app.route('/', endpoint='home')
@app.route("/", endpoint="home")
def home():
step = current_step()
kwargs = dict(
parlementaire=random_parl(),
current_step=step
parlementaire=random_parl(), current_step=step, nb_ok=nb_ok(), nb_ko=nb_ko()
)
if step < ETAPE_DEMANDE_CADA:
......@@ -29,26 +34,26 @@ def setup_routes(app):
def key_each_etape(key):
return each_etape(lambda e: ETAPES_BY_ORDRE[e.etape][key])
kwargs['etapes_data'] = {
'labels': key_each_etape('label'),
'datasets': [{
'data': each_etape(lambda e: e.nb),
'backgroundColor': key_each_etape('couleur'),
'hoverBackgroundColor': key_each_etape('couleur'),
'borderWidth': 0
}]
kwargs["etapes_data"] = {
"labels": key_each_etape("label"),
"datasets": [
{
"data": each_etape(lambda e: e.nb),
"backgroundColor": key_each_etape("couleur"),
"hoverBackgroundColor": key_each_etape("couleur"),
"borderWidth": 0,
}
],
}
# Données histogramme
etats = etat_courriers()
kwargs['histo_data'] = {
'labels': [etat for etat, nb in etats],
'datasets': [{
'data': [nb for etat, nb in etats]
}]
kwargs["histo_data"] = {
"labels": [etat for etat, nb in etats],
"datasets": [{"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 @@
</table>
</section>
{% endblock %}
......@@ -34,9 +34,9 @@
</header>
<article class="panel-body">
<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/>
<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>
</article>
</section>
......@@ -237,7 +237,7 @@
/* 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 = {
'#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 @@
'#nb_negatifs': 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'];
......
......@@ -1012,7 +1012,7 @@
y="-76.039421"
x="-145.41687"
id="tspan1055"
sodipodi:role="line">7</tspan></text>
sodipodi:role="line">{{ nb_ok }}</tspan></text>
</g>
<g
id="nb_negatifs"
......@@ -1032,6 +1032,6 @@
y="-223.58508"
x="-2.7185695"
id="tspan1055-3"
sodipodi:role="line">567</tspan></text>
sodipodi:role="line">{{ nb_ko }}</tspan></text>
</g>
</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 sign in to comment