Commit 2c097a31 authored by Nicolas Joyard's avatar Nicolas Joyard

Load groupes depuis ND + ajout couleurs

parent bd0b6c7d
......@@ -24,4 +24,5 @@ def runserver():
@manager.command
def import_nd():
"""Importe les députés depuis NosDéputés.fr"""
app.config.update(SQLALCHEMY_ECHO=False)
NosDeputesImporter(app).run()
......@@ -6,7 +6,7 @@ import dateparser
import requests
from sqlalchemy.inspection import inspect
from ..models import db, Parlementaire
from ..models import db, Groupe, Parlementaire
def parse_date(date):
......@@ -18,12 +18,30 @@ def parse_date(date):
return dateparser.parse(date[0:10])
def dechex(dec):
s = hex(int(dec))[2:]
if len(s) == 1:
s = '0' + s
elif len(s) > 2:
s = 'ff'
return s
def parse_couleur(couleur):
if not couleur:
return '#000000'
else:
return '#' + ''.join(map(dechex, couleur.split(',')))
class NosDeputesImporter(object):
URL_LISTE = 'https://www.nosdeputes.fr/deputes/json'
URL_GROUPES = 'https://www.nosdeputes.fr/organismes/groupe/json'
URL_DEPUTES = 'https://www.nosdeputes.fr/deputes/json'
URL_PHOTO = '//www.nosdeputes.fr/depute/photo/%(slug)s'
columns = None
groupes = {}
def __init__(self, app):
self.app = app
......@@ -65,8 +83,8 @@ class NosDeputesImporter(object):
'num_deptmt': data['num_deptmt'],
'nom_circo': data['nom_circo'],
'num_circo': data['num_circo'],
'groupe': data['parti_ratt_financier'],
'groupe_sigle': data['groupe_sigle'],
'groupe': self.groupes[data['groupe_sigle'] or 'NI'],
'url_photo': self.URL_PHOTO % data,
'url_rc': data['url_nosdeputes'],
......@@ -86,13 +104,11 @@ class NosDeputesImporter(object):
return created, updated
def run(self):
self.info('Début import NosDéputés.fr')
def import_deputes(self):
try:
data = requests.get(self.URL_LISTE).json()
data = requests.get(self.URL_DEPUTES).json()
except Exception as e:
self.error('Téléchargement %s impossible: %s' % (URL_LISTE, e))
self.error('Téléchargement %s impossible: %s' % (URL_DEPUTES, e))
return
self.info('%s députés trouvés' % len(data['deputes']))
......@@ -110,5 +126,68 @@ class NosDeputesImporter(object):
db.session.commit()
db.session.flush()
self.info('Import terminé: %s créés, %s mis à jour' % (created,
updated))
self.info('Import députés terminé: %s créés, %s mis à jour'
% (created, updated))
def import_groupe(self, data):
created = False
updated = False
if data.get('acronyme', None):
id_data = {
'chambre': 'AN',
'sigle': data['acronyme']
}
groupe = Groupe.query.filter_by(**id_data).first()
if not groupe:
groupe = Groupe(**id_data)
db.session.add(groupe)
created = True
self.groupes[id_data['sigle']] = groupe
fields = {
'nom': data['nom'],
'couleur': parse_couleur(data['couleur'])
}
for key, newvalue in fields.items():
curvalue = getattr(groupe, key)
if curvalue != newvalue:
updated = True
setattr(groupe, key, newvalue)
return created, updated
def import_groupes(self):
try:
data = requests.get(self.URL_GROUPES).json()
except Exception as e:
self.error('Téléchargement %s impossible: %s' % (URL_DEPUTES, e))
return
self.info('%s organismes trouvés' % len(data['organismes']))
created = 0
updated = 0
for org in data['organismes']:
c, u = self.import_groupe(org['organisme'])
if c:
created += 1
elif u:
updated += 1
db.session.commit()
db.session.flush()
self.info('Import groupes terminé: %s créés, %s mis à jour'
% (created, updated))
def run(self):
self.info('Début import NosDéputés.fr')
self.import_groupes()
self.import_deputes()
\ No newline at end of file
# -*- coding: utf-8 -*-
from .database import db
from .parlementaire import Parlementaire
from .parlementaire import Groupe, Parlementaire
......@@ -6,6 +6,16 @@ from .constants import CHAMBRES, ETAPES, SEXES
from .database import db
class Groupe(db.Model):
__tablename__ = 'groupes'
id = db.Column(db.Integer, primary_key=True)
sigle = db.Column(db.Unicode)
nom = db.Column(db.Unicode)
chambre = db.Column(db.Enum(*CHAMBRES.keys(), name='chambres'))
couleur = db.Column(db.Unicode)
class Parlementaire(db.Model):
__tablename__ = 'parlementaires'
......@@ -24,8 +34,9 @@ class Parlementaire(db.Model):
num_deptmt = db.Column(db.Unicode)
nom_circo = db.Column(db.Unicode)
num_circo = db.Column(db.Integer)
groupe = db.Column(db.Unicode)
groupe_sigle = db.Column(db.Unicode)
groupe_id = db.Column(db.Integer, db.ForeignKey('groupes.id'))
groupe = db.relationship('Groupe')
url_photo = db.Column(db.Unicode)
url_rc = db.Column(db.Unicode)
......
# -*- coding: utf-8 -*-
from flask import render_template
from sqlalchemy.orm import joinedload
from .models import Parlementaire
......@@ -37,7 +38,8 @@ def setup_routes(app):
@app.route('/parlementaires', endpoint='parlementaires')
def parlementaires():
qs = Parlementaire.query.options(joinedload('groupe')).all()
return render_template(
'list.html.j2',
parlementaires=Parlementaire.query.all()
parlementaires=qs
)
......@@ -12,8 +12,8 @@
{% endblock %}
</head>
<body>
<section class="container-fluid">
<header class="col-md-12 page-header">
<header class="jumbotron">
<div class="container-fluid">
<h1>
Transparence IRFM
</h1>
......@@ -23,8 +23,10 @@
<li role="presentation" {% if request.endpoint == item.endpoint %}class="active"{% endif %}><a href="{{ item.url }}">{{ item.label }}</a></li>
{% endfor %}
</ul>
</header>
</div>
</header>
<section class="container-fluid">
<div class="col-md-12">
{% block content %}
{% endblock %}
......
......@@ -28,10 +28,10 @@
<tr>
<td>
<img class="chamber-icon" src="{{ url_for('static', filename=parl.chambre|lower+'.png') }}">
<span class="search-vector">{{ parl.nom }} {{ parl.prenom }} {{ parl.nom_circo }} {{ parl.num_deptmt }} {{ parl.groupe_sigle }} {{ parl.groupe }}</span>
<span class="search-vector">{{ parl.nom }} {{ parl.prenom }} {{ parl.nom_circo }} {{ parl.num_deptmt }} {{ parl.groupe.sigle }} {{ parl.groupe.nom }}</span>
</td>
<td data-value="{{ parl.nom }} {{ parl.prenom }}">{{ parl.prenom }} {{ parl.nom }}</td>
<td>{{ parl.groupe_sigle }}</td>
<td><span title="{{ parl.groupe.nom }}" class="label" style="background-color: {{ parl.groupe.couleur }};">{{ parl.groupe.sigle }}</span></td>
<td data-value="{{ parl.num_deptmt }} {{ parl.num_circo }}">{{ parl.nom_circo }} n°{{ parl.num_circo }}</td>
<td>{{ parl.etape }}</td>
</tr>
......
"""Suppression groupe
Revision ID: 9784b9baaf7d
Revises: 8d32ba048444
Create Date: 2017-05-06 00:06:25.565160
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '9784b9baaf7d'
down_revision = '8d32ba048444'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('parlementaires', 'groupe')
op.drop_column('parlementaires', 'groupe_sigle')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('parlementaires', sa.Column('groupe_sigle', sa.VARCHAR(), autoincrement=False, nullable=True))
op.add_column('parlementaires', sa.Column('groupe', sa.VARCHAR(), autoincrement=False, nullable=True))
# ### end Alembic commands ###
"""Ajout entité groupe + relation parl
Revision ID: beb25e23d267
Revises: 9784b9baaf7d
Create Date: 2017-05-06 00:07:59.939030
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.postgresql import ENUM
# revision identifiers, used by Alembic.
revision = 'beb25e23d267'
down_revision = '9784b9baaf7d'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('groupes',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('sigle', sa.Unicode(), nullable=True),
sa.Column('nom', sa.Unicode(), nullable=True),
sa.Column('chambre', ENUM('SEN', 'AN', name='chambres', create_type=False), nullable=True),
sa.Column('couleur', sa.Unicode(), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.add_column('parlementaires', sa.Column('groupe_id', sa.Integer(), nullable=True))
op.create_foreign_key(None, 'parlementaires', 'groupes', ['groupe_id'], ['id'])
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'parlementaires', type_='foreignkey')
op.drop_column('parlementaires', 'groupe_id')
op.drop_table('groupes')
# ### end Alembic commands ###
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