Commit 7f5cc0bd authored by Nicolas Joyard's avatar Nicolas Joyard

Ajustement home à l'étape cada + mise en évidence 14e leg

parent c6091a8a
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
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_A_CONFIRMER, ETAPE_A_ENVOYER, ETAPE_ENVOYE,
ETAPE_NA, ETAPES) 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
...@@ -105,3 +105,14 @@ def random_parl(): ...@@ -105,3 +105,14 @@ def random_parl():
.first() .first()
return parl return parl
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
...@@ -11,7 +11,7 @@ from ..models.constants import (CHAMBRES, ETAPES, ETAPES_BY_ORDRE, ...@@ -11,7 +11,7 @@ from ..models.constants import (CHAMBRES, ETAPES, ETAPES_BY_ORDRE,
ETAPE_COM_PUBLIE, ETAPE_COURRIEL, ETAPE_COM_PUBLIE, ETAPE_COURRIEL,
ETAPE_DOC_MASQUE, ETAPE_DOC_PUBLIE, ETAPE_DOC_MASQUE, ETAPE_DOC_PUBLIE,
ETAPE_ENVOYE, ETAPE_NA, ETAPE_REPONSE_NEGATIVE, ETAPE_ENVOYE, ETAPE_NA, ETAPE_REPONSE_NEGATIVE,
ETAPE_REPONSE_POSITIVE) ETAPE_REPONSE_POSITIVE, ETAPE_DEMANDE_CADA)
def setup(app): def setup(app):
...@@ -155,7 +155,8 @@ def setup(app): ...@@ -155,7 +155,8 @@ def setup(app):
'ETAPE_ENVOYE': ETAPE_ENVOYE, 'ETAPE_ENVOYE': ETAPE_ENVOYE,
'ETAPE_AR_RECU': ETAPE_AR_RECU, 'ETAPE_AR_RECU': ETAPE_AR_RECU,
'ETAPE_REPONSE_POSITIVE': ETAPE_REPONSE_POSITIVE, 'ETAPE_REPONSE_POSITIVE': ETAPE_REPONSE_POSITIVE,
'ETAPE_REPONSE_NEGATIVE': ETAPE_REPONSE_NEGATIVE 'ETAPE_REPONSE_NEGATIVE': ETAPE_REPONSE_NEGATIVE,
'ETAPE_DEMANDE_CADA': ETAPE_DEMANDE_CADA
}, },
'chambres': CHAMBRES 'chambres': CHAMBRES
} }
...@@ -2,49 +2,53 @@ ...@@ -2,49 +2,53 @@
from flask import render_template from flask import render_template
from ..models.constants import ETAPES_BY_ORDRE from ..models.constants import ETAPES_BY_ORDRE, ETAPE_DEMANDE_CADA
from ..models.queries import (etat_courriers, par_etape, par_departement, from ..models.queries import (etat_courriers, par_etape, par_departement,
random_parl) random_parl, current_step)
def setup_routes(app): def setup_routes(app):
@app.route('/', endpoint='home') @app.route('/', endpoint='home')
def home(): def home():
# Données camembert step = current_step()
etapes_qs = par_etape() kwargs = dict(
def each_etape(getter):
return [getter(e) for e in etapes_qs]
def key_each_etape(key):
return each_etape(lambda e: ETAPES_BY_ORDRE[e.etape][key])
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()
histo_data = {
'labels': [etat for etat, nb in etats],
'datasets': [{
'data': [nb for etat, nb in etats]
}]
}
return render_template(
'index.html.j2',
parlementaire=random_parl(), parlementaire=random_parl(),
etapes_data=etapes_data, current_step=step
histo_data=histo_data,
departements=par_departement()
) )
if step < ETAPE_DEMANDE_CADA:
# Données camembert
etapes_qs = par_etape()
def each_etape(getter):
return [getter(e) for e in etapes_qs]
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
}]
}
# 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['departements'] = par_departement()
return render_template('index.html.j2', **kwargs)
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
{%- endset %} {%- endset %}
{% set page_subtitle -%} {% set page_subtitle -%}
{% block subtitle %}Aidez-nous à obtenir la transparence sur l'Indemnité Représentative de Frais de Mandat !{% endblock %} {% block subtitle %}Aidez-nous à obtenir la transparence sur l'Indemnité Représentative de Frais de Mandat de la précédente législature !{% endblock %}
{%- endset %} {%- endset %}
{% set page_image -%} {% set page_image -%}
......
{% extends "_base.html.j2" %} {% extends "_base.html.j2" %}
{% block content %} {% block content %}
<div class="col-md-8">
<div class="well lead">
<p>L'Indemnité Représentative de Frais de Mandat (IRFM) est une indemnité d'environ 5 000 € versée chaque mois à tous les parlementaires pour couvrir les dépenses liées à leur mandat.</p>
<p>Faute de transparence, nous demandons à chaque parlementaire de nous fournir les éléments permettant aux citoyens de contrôler l'utilisation de leur indemnité :</p>
<ul>
<li>les relevés bancaires du compte dédié (sur les 6 derniers mois)</li>
<li>la dernière déclaration annuelle auprès du Bureau attestant sur l'honneur de l'utilisation conforme de l'IRFM</li>
</ul>
</div>
<section class="panel panel-primary"> <div class="col-md-8">
<header class="panel-heading">
<b>Comment nous aider ?</b>
</header>
<article class="panel-body">
{% filter markdown -%}
{% include "text/howto_help.md" %}
{% endfilter %}
</article>
</section>
<section class="panel panel-default"> <section class="panel panel-default">
<header class="panel-heading"> <header class="panel-heading">
...@@ -33,12 +15,14 @@ ...@@ -33,12 +15,14 @@
</article> </article>
</section> </section>
<section class="panel panel-default"> <section class="panel panel-primary">
<header class="panel-heading"> <header class="panel-heading">
<b>Quelles sont les étapes suivantes pour obtenir la transparence de l'IRFM ?</b> <b>Comment nous aider ?</b>
</header> </header>
<article class="panel-body" id="procedure-container"> <article class="panel-body">
{% include "viz/procedure.svg" %} {% filter markdown -%}
{% include "text/howto_help.md" %}
{% endfilter %}
</article> </article>
</section> </section>
</div> </div>
...@@ -52,7 +36,7 @@ ...@@ -52,7 +36,7 @@
<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">7<br/>Frais de mandats obtenus</a>
<br/><br/> <br/><br/>
<p><a href="/parlementaires" class="btn btn-danger">567 députés n'ayant pas répondu positivement</a></p> <p><a href="/parlementaires?q=Demande%20CADA" class="btn btn-danger">567 députés n'ayant pas répondu positivement</a></p>
</center> </center>
</article> </article>
</section> </section>
...@@ -69,11 +53,19 @@ ...@@ -69,11 +53,19 @@
{{ parlementaire.nom_circo }} &ndash; {{ parlementaire.nom_circo }} &ndash;
Circonscription n°{{ parlementaire.num_circo }}<br><br> Circonscription n°{{ parlementaire.num_circo }}<br><br>
<a class="btn btn-primary btn-sm" href="{{ url_for('parlementaire', id=parlementaire.id) }}" role="button">Envoyer la demande</a>
<a class="btn btn-primary btn-sm" href="{{ url_for('parlementaire', id=parlementaire.id) }}" role="button">
{% if current_step < ordres.ETAPE_DEMANDE_CADA %}
Envoyer la demande
{% else %}
Voir la page du parlementaire
{% endif %}
</a>
</div> </div>
</article> </article>
</section> </section>
{% if current_step < ordres.ETAPE_DEMANDE_CADA %}
<section class="panel panel-default"> <section class="panel panel-default">
<header class="panel-heading"> <header class="panel-heading">
<b>Avancement par département</b> <b>Avancement par département</b>
...@@ -92,7 +84,20 @@ ...@@ -92,7 +84,20 @@
{% include "viz/carte.html.j2" %} {% include "viz/carte.html.j2" %}
</article> </article>
</section> </section>
{% endif %}
</div> </div>
<div class="col-md-12">
<section class="panel panel-default">
<header class="panel-heading">
<b>Quelles sont les étapes suivantes pour obtenir la transparence de l'IRFM ?</b>
</header>
<article class="panel-body" id="procedure-container">
{% include "viz/procedure.svg" %}
</article>
</section>
</div>
{% endblock %} {% endblock %}
{% block scripts %} {% block scripts %}
...@@ -112,105 +117,109 @@ ...@@ -112,105 +117,109 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
/* Camembert */ {% if current_step < ordres.ETAPE_DEMANDE_CADA %}
var circleRatio = 0.52;
/* Camembert */
new Chart($('#pie-canvas'), { var circleRatio = 0.52;
type: 'pie',
data: {{ etapes_data|tojson }}, new Chart($('#pie-canvas'), {
options: { type: 'pie',
legend: { data: {{ etapes_data|tojson }},
display: false options: {
}, legend: {
responsive: false, display: false
maintainAspectRatio: true, },
rotation: Math.PI * (1 - (circleRatio - 0.5)), responsive: false,
circumference: 2 * Math.PI * circleRatio, maintainAspectRatio: true,
cutoutPercentage: 25, rotation: Math.PI * (1 - (circleRatio - 0.5)),
animation: { circumference: 2 * Math.PI * circleRatio,
animateRotate: false cutoutPercentage: 25,
animation: {
animateRotate: false
}
} }
} });
});
/* Histo de suivi des courriers */ /* Histo de suivi des courriers */
new Chart($('#bar-canvas'), { new Chart($('#bar-canvas'), {
type: 'horizontalBar', type: 'horizontalBar',
data: {{ histo_data|tojson }}, data: {{ histo_data|tojson }},
options: { options: {
animation: { animation: {
duration: 0 duration: 0
}, },
legend: { legend: {
display: false display: false
}, },
title: { title: {
display: true, display: true,
text: 'Suivi des courriers envoyés' text: 'Suivi des courriers envoyés'
}, },
scales: { scales: {
xAxes: [{ xAxes: [{
ticks: { ticks: {
min: 0 min: 0
} }
}], }],
yAxes: [{ yAxes: [{
ticks: { ticks: {
fontSize: 10 fontSize: 10
} }
}] }]
}
} }
} });
});
/* Carte */ /* Carte */
var modesCarte = ['prisencharge', 'envoye']; var modesCarte = ['prisencharge', 'envoye'];
modesCarte.forEach(function(mode) { modesCarte.forEach(function(mode) {
$('#btn-mode-' + mode).click(function(e) { $('#btn-mode-' + mode).click(function(e) {
$('#carte-container .btn').removeClass('btn-primary').addClass('btn-default'); $('#carte-container .btn').removeClass('btn-primary').addClass('btn-default');
$(this).removeClass('btn-default').addClass('btn-primary'); $(this).removeClass('btn-default').addClass('btn-primary');
var ctn = $('#carte-container'); var ctn = $('#carte-container');
modesCarte.forEach(function(m) { ctn.removeClass('carte-mode-' + m); }); modesCarte.forEach(function(m) { ctn.removeClass('carte-mode-' + m); });
ctn.addClass('carte-mode-' + mode); ctn.addClass('carte-mode-' + mode);
e.preventDefault(); e.preventDefault();
});
}); });
});
{% for dep in departements %} {% for dep in departements %}
$('.departement{{ dep.num_deptmt }}') $('.departement{{ dep.num_deptmt }}')
.attr('data-content', .attr('data-content',
{% for ordre in [ordres.ETAPE_A_ENVOYER, ordres.ETAPE_A_CONFIRMER] %} {% for ordre in [ordres.ETAPE_A_ENVOYER, ordres.ETAPE_A_CONFIRMER] %}
{{ etapes_by_ordre[ordre]|label_etape_text|tojson }} + {{ etapes_by_ordre[ordre]|label_etape_text|tojson }} +
"&nbsp;: {{ dep['nb_etape_%s' % ordre] }} <br>" + "&nbsp;: {{ dep['nb_etape_%s' % ordre] }} <br>" +
{% endfor %} {% endfor %}
{{ etapes_by_ordre[ordres.ETAPE_ENVOYE]|label_etape_text|tojson }} + {{ etapes_by_ordre[ordres.ETAPE_ENVOYE]|label_etape_text|tojson }} +
"&nbsp;: {{ dep.nb_envoyes }} <br>" "&nbsp;: {{ dep.nb_envoyes }} <br>"
) )
.click(function() { .click(function() {
location.href = '{{ url_for('parlementaires') }}?q={{ dep.num_deptmt }}'; location.href = '{{ url_for('parlementaires') }}?q={{ dep.num_deptmt }}';
}); });
{% endfor %} {% endfor %}
$('.land').mouseover(function(e) {
$('#carte-popover .popover-title').html($(this).attr('title'));
$('#carte-popover .popover-content').html($(this).attr('data-content'));
$('.land').mouseover(function(e) { });
$('#carte-popover .popover-title').html($(this).attr('title'));
$('#carte-popover .popover-content').html($(this).attr('data-content'));
}); $('.land').mousemove(function(e) {
$('#carte-popover').css('left', e.clientX - 200)
.css('top', e.clientY + 20)
.show();
});
$('.land').mousemove(function(e) { $('.land').mouseleave(function(e) {
$('#carte-popover').css('left', e.clientX - 200) $('#carte-popover').hide();
.css('top', e.clientY + 20) });
.show();
});
$('.land').mouseleave(function(e) { {% endif %}
$('#carte-popover').hide();
});
/* Procedure */ /* Procedure */
......
...@@ -446,7 +446,7 @@ ...@@ -446,7 +446,7 @@
<tr> <tr>
<td class="label-next"> <td class="label-next">
<span class="label" title="Nous avons déposé un recours auprès de la CADA " <span class="label" title="Nous avons déposé un recours auprès de la CADA "
data-toggle="tooltip" style="background-color: #bb6666;"> data-toggle="tooltip" style="background-color: #eebb44;">
<i class="fa fa-balance-scale"></i> <i class="fa fa-balance-scale"></i>
Demande CADA Demande CADA
</span> </span>
......
# <a href="{{ url_for('home') }}">Transparence IRFM</a> # <a href="{{ url_for('home') }}">Transparence IRFM</a>
Aidez-nous à obtenir la transparence sur l'Indemnité Représentative de Frais de Mandat ! Aidez-nous à obtenir la transparence sur l'Indemnité Représentative de Frais de Mandat de la précédente législature !
{% if current_step < ordres.ETAPE_DEMANDE_CADA %}
La première étape de notre action pour obtenir la transparence des frais de mandat des députés consiste à envoyer une demande de document à chaque parlementaire concerné par lettre recommandée avec accusé de réception. Malheureusement, notre petite équipe entièrement bénévole ne peut pas le faire pour tous les députés. **Mais vous pouvez nous aider à le faire !** La première étape de notre action pour obtenir la transparence des frais de mandat des députés consiste à envoyer une demande de document à chaque parlementaire concerné par lettre recommandée avec accusé de réception. Malheureusement, notre petite équipe entièrement bénévole ne peut pas le faire pour tous les députés. **Mais vous pouvez nous aider à le faire !**
C'est simple : choisissez un parlementaire pour lequel la demande de document n'a pas encore été envoyée depuis la [liste des parlementaires](/parlementaires), cliquez sur le bouton « *Envoyer la demande* » et laissez-vous guider. Si vous ne savez pas lequel choisir, un parlementaire au hasard est affiché ci-contre. C'est simple : choisissez un parlementaire pour lequel la demande de document n'a pas encore été envoyée depuis la [liste des parlementaires](/parlementaires), cliquez sur le bouton « *Envoyer la demande* » et laissez-vous guider. Si vous ne savez pas lequel choisir, un parlementaire au hasard est affiché ci-contre.
<center><a class="btn btn-primary" href="/parlementaires">Trouver un.e député.e à solliciter</a> &nbsp; &nbsp; <a class="btn btn-primary" href="/hasard">Solliciter un.e député.e au hasard</a></center> <center><a class="btn btn-primary" href="/parlementaires">Trouver un-e député-e à solliciter</a> &nbsp; &nbsp; <a class="btn btn-primary" href="/hasard">Solliciter un-e député-e au hasard</a></center>
{% else %}
Nous avons transmis un recours auprès de la [Commission d'Accès aux Documents Administratifs (CADA)](http://cada.fr) pour chaque parlementaire n'ayant pas répondu positivement à notre demande. Celle-ci statuera vraisemblablement à la rentrée.
En attendant, vous pouvez contacter directement l'un des parlementaires ou l'un de leurs collaborateurs pour recueillir leur avis sur cette opération, et tenter de les convaincre de nous répondre favorablement.
<center><a class="btn btn-primary" href="/parlementaires?q=Demande%20CADA">Trouver un-e député-e à solliciter</a> &nbsp; &nbsp; <a class="btn btn-primary" href="/hasard">Solliciter un-e député-e au hasard</a></center>
{% endif %}
Notez bien que tous les parlementaires sont des élus de la Nation, vous êtes donc tout à fait en droit d'envoyer une demande à un élu d'une autre circonscription que celle de votre domicile. Notez bien que tous les parlementaires sont des élus de la Nation, vous êtes donc tout à fait en droit de solliciter un élu d'une autre circonscription que celle de votre domicile.
\ No newline at end of file
...@@ -13,3 +13,7 @@ Sans aucune transparence sur l'utilisation de cet argent public, les parlementai ...@@ -13,3 +13,7 @@ Sans aucune transparence sur l'utilisation de cet argent public, les parlementai
#### Plus de transparence ? #### Plus de transparence ?
Nous souhaitons demander à chaque parlementaire de nous fournir les éléments permettant aux citoyens de contrôler l'utilisation de leur indemnité : les relevés bancaires (sur les 6 derniers mois) ainsi que la dernière déclaration attestant sur l'honneur d'utilisation conforme de l'IRFM qu'il doit transmettre chaque année au Bureau de l'Assemblée nationale. Nous souhaitons demander à chaque parlementaire de nous fournir les éléments permettant aux citoyens de contrôler l'utilisation de leur indemnité : les relevés bancaires (sur les 6 derniers mois) ainsi que la dernière déclaration attestant sur l'honneur d'utilisation conforme de l'IRFM qu'il doit transmettre chaque année au Bureau de l'Assemblée nationale.
#### Qui est concerné ?
Pour l'instant, seuls les députés de la précédente législature sont concernés. Les nouveaux députés n'ont encore rien à communiquer puisque leur mandat vient tout juste de débuter. Par ailleurs, il n'est pas exclu que les lois de moralisation de la vie politique qui sont actuellement discutées au parlement établissent de nouvelles règles de transparence sur l'IRFM, et que nous n'ayons donc pas besoin d'étendre l'opération à la 15ème législature.
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