Commit dd3e6eec authored by James Pic's avatar James Pic

Merge pull request #20 from political-memory/fix-francedata-abbr

Fix francedata group abbreviations
parents a2466349 9c1c97d1
......@@ -14,6 +14,8 @@ from django.utils import timezone
from representatives.models import (Country, Mandate, Email, Address, WebSite,
Representative, Constituency, Phone, Group,
Chamber)
from variants import FranceDataVariants
logger = logging.getLogger(__name__)
......@@ -21,161 +23,6 @@ representative_pre_import = django.dispatch.Signal(
providing_args=['representative_data'])
def _get_rep_district_name(json):
num = json.get('num_circo')
nom = json.get('nom_circo')
if num == 'nd':
return nom
else:
ordinal = u'ère' if num == 1 else u'ème'
return '%s (%d%s circonscription)' % (nom, num, ordinal)
def _get_rep_parl_groups(json):
return [{
'name': g['responsabilite']['organisme'],
'role': g['responsabilite']['fonction'],
'start': json['mandat_debut']
} for g in json['groupes_parlementaires']]
def _get_rep_comittees(json):
return [{
'name': g['responsabilite']['organisme'],
'role': g['responsabilite']['fonction'],
'start': json['mandat_debut']
} for g in json['responsabilites']
if g['responsabilite']['organisme'].startswith('Commission')]
#
# Variant configuration
# - mail_domain is used to distinguish official vs personal emails
# - off_* fields are used for the official address of meps
# - mandates defines how mandates are created from the rep json
#
# Mandates are defined as follows
# - 'kind' indicates the group kind, a constant string
# - 'chamber' tells whether the group belongs to the chamber
# - 'from', if present, must be a function that takes the rep json and returns
# an array of dicts; one group will be created from each item in the dict.
# When 'from' is not present, only one group wil be created using the rep
# json (IOW, 'from' defaults to lambda repjson: [repjson])
# - 'name', 'abbr', 'role', 'start', 'end' are strings that are interpolated
# against the rep json or items returned by 'from'.
# - 'name_path', 'abbr_path', etc. can replace 'name', 'abbr'... by specifying
# a slash-separated dictionnary path where the value is to be found in the
# rep json or item returned by 'from'
# - 'name_fn', 'abbr_fn', etc. can also replace 'name', 'abbr'... by a
# function that takes the input item (rep json or item returned by 'from')
# and returns the value
#
FranceDataVariants = {
"AN": {
"chamber": u"Assemblée nationale",
"remote_id_field": "url_an",
"mail_domain": "@assemblee-nationale.fr",
"off_city": "Paris",
"off_street": u"Rue de l'Université",
"off_number": "126",
"off_code": "75355",
"off_name": u"Assemblée nationale",
"mandates": [
{
"kind": "group",
"chamber": True,
"abbr": "%(groupe_sigle)s",
"name_path": "groupe/organisme",
"role_path": "groupe/fonction",
"start": "%(mandat_debut)s"
},
{
"kind": "department",
"abbr": "%(num_deptmt)s",
"name": "%(nom_circo)s",
"start": "%(mandat_debut)s"
},
{
"kind": "district",
"abbr": "%(num_deptmt)s-%(num_circo)s",
"name_fn": _get_rep_district_name,
"start": "%(mandat_debut)s"
},
{
"kind": "parl-group",
"chamber": True,
"from": _get_rep_parl_groups,
"abbr": "%(name)s",
"name": "%(name)s",
"role": "%(role)s",
"start": "%(start)s"
},
{
"kind": "comittee",
"chamber": True,
"from": _get_rep_comittees,
"abbr": "%(name)s",
"name": "%(name)s",
"role": "%(role)s",
"start": "%(start)s"
}
]
},
"SEN": {
"chamber": u"Sénat",
"remote_id_field": "url_institution",
"mail_domain": "@senat.fr",
"off_city": "Paris",
"off_street": u"Rue de Vaugirard",
"off_number": "15",
"off_code": "75291",
"off_name": u"Palais du Luxembourg",
"mandates": [
{
"kind": "group",
"chamber": True,
"abbr": "%(groupe_sigle)s",
"name_path": "groupe/organisme",
"role_path": "groupe/fonction",
"start": "%(mandat_debut)s"
},
{
"kind": "department",
"abbr": "%(num_deptmt)s",
"name": "%(nom_circo)s",
"start": "%(mandat_debut)s"
},
{
"kind": "district",
"abbr": "%(num_deptmt)s-%(num_circo)s",
"name_fn": _get_rep_district_name,
"start": "%(mandat_debut)s"
},
{
"kind": "parl-group",
"chamber": True,
"from": _get_rep_parl_groups,
"abbr": "%(name)s",
"name": "%(name)s",
"role": "%(role)s",
"start": "%(start)s"
},
{
"kind": "comittee",
"chamber": True,
"from": _get_rep_comittees,
"abbr": "%(name)s",
"name": "%(name)s",
"role": "%(role)s",
"start": "%(start)s"
}
]
}
}
def _get_mdef_item(mdef, item, json, default=None):
if item in mdef:
return mdef[item] % json
......
......@@ -134,6 +134,7 @@
"number": "126",
"street": "Rue de l'Universit\u00e9",
"representative": 1,
"location": "",
"kind": "official",
"postcode": "75355"
},
......@@ -148,6 +149,7 @@
"number": "20",
"street": "Rue d'Arras",
"representative": 1,
"location": "",
"kind": "",
"postcode": "59000"
},
......@@ -162,6 +164,7 @@
"number": "",
"street": "",
"representative": 1,
"location": "",
"kind": "",
"postcode": "59000"
},
......@@ -176,6 +179,7 @@
"number": "15",
"street": "Rue de Vaugirard",
"representative": 2,
"location": "",
"kind": "official",
"postcode": "75291"
},
......@@ -268,35 +272,15 @@
"model": "representatives.group",
"pk": 6
},
{
"fields": {
"name": "Groupe d'amiti\u00e9 france-mexique",
"kind": "parl-group",
"abbreviation": "Groupe d'amiti\u00e9 france-mexique",
"chamber": 1
},
"model": "representatives.group",
"pk": 7
},
{
"fields": {
"name": "Groupe d'amiti\u00e9 france-argentine",
"kind": "parl-group",
"abbreviation": "Groupe d'amiti\u00e9 france-argentine",
"chamber": 1
},
"model": "representatives.group",
"pk": 8
},
{
"fields": {
"name": "Commission des lois constitutionnelles, de la l\u00e9gislation et de l'administration g\u00e9n\u00e9rale de la r\u00e9publique",
"kind": "comittee",
"abbreviation": "Commission des lois constitutionnelles, de la l\u00e9gislation et de l'administration g\u00e9n\u00e9rale de la r\u00e9publique",
"abbreviation": "AnComLois",
"chamber": 1
},
"model": "representatives.group",
"pk": 9
"pk": 7
},
{
"fields": {
......@@ -306,7 +290,7 @@
"chamber": 2
},
"model": "representatives.group",
"pk": 10
"pk": 8
},
{
"fields": {
......@@ -316,7 +300,7 @@
"chamber": null
},
"model": "representatives.group",
"pk": 11
"pk": 9
},
{
"fields": {
......@@ -326,27 +310,17 @@
"chamber": null
},
"model": "representatives.group",
"pk": 12
},
{
"fields": {
"name": "Groupe France-Japon",
"kind": "parl-group",
"abbreviation": "Groupe France-Japon",
"chamber": 2
},
"model": "representatives.group",
"pk": 13
"pk": 10
},
{
"fields": {
"name": "Commission de la culture, de l'\u00e9ducation et de la communication",
"kind": "comittee",
"abbreviation": "Commission de la culture, de l'\u00e9ducation et de la communication",
"abbreviation": "SenComCult",
"chamber": 2
},
"model": "representatives.group",
"pk": 14
"pk": 11
},
{
"fields": {
......@@ -378,6 +352,7 @@
"end_date": null,
"role": "membre",
"representative": 1,
"link": "",
"begin_date": null,
"constituency": 3
},
......@@ -390,6 +365,7 @@
"end_date": null,
"role": "membre",
"representative": 1,
"link": "",
"begin_date": "2012-06-20",
"constituency": 1
},
......@@ -402,6 +378,7 @@
"end_date": null,
"role": "membre",
"representative": 1,
"link": "",
"begin_date": "2012-06-20",
"constituency": 1
},
......@@ -414,6 +391,7 @@
"end_date": null,
"role": "membre",
"representative": 1,
"link": "",
"begin_date": "2012-06-20",
"constituency": 1
},
......@@ -424,37 +402,14 @@
"fields": {
"group": 7,
"end_date": null,
"role": "vice-pr\u00e9sident",
"representative": 1,
"begin_date": "2012-06-20",
"constituency": 1
},
"model": "representatives.mandate",
"pk": 5
},
{
"fields": {
"group": 8,
"end_date": null,
"role": "vice-pr\u00e9sident",
"representative": 1,
"begin_date": "2012-06-20",
"constituency": 1
},
"model": "representatives.mandate",
"pk": 6
},
{
"fields": {
"group": 9,
"end_date": null,
"role": "membre",
"representative": 1,
"link": "",
"begin_date": "2012-06-20",
"constituency": 1
},
"model": "representatives.mandate",
"pk": 7
"pk": 5
},
{
"fields": {
......@@ -462,70 +417,63 @@
"end_date": null,
"role": "membre",
"representative": 2,
"link": "",
"begin_date": null,
"constituency": 3
},
"model": "representatives.mandate",
"pk": 8
"pk": 6
},
{
"fields": {
"group": 10,
"group": 8,
"end_date": null,
"role": "membre",
"representative": 2,
"link": "",
"begin_date": "2004-09-26",
"constituency": 2
},
"model": "representatives.mandate",
"pk": 9
"pk": 7
},
{
"fields": {
"group": 11,
"group": 9,
"end_date": null,
"role": "membre",
"representative": 2,
"link": "",
"begin_date": "2004-09-26",
"constituency": 2
},
"model": "representatives.mandate",
"pk": 10
"pk": 8
},
{
"fields": {
"group": 12,
"group": 10,
"end_date": null,
"role": "membre",
"representative": 2,
"link": "",
"begin_date": "2004-09-26",
"constituency": 2
},
"model": "representatives.mandate",
"pk": 11
},
{
"fields": {
"group": 13,
"end_date": null,
"role": "pr\u00e9sident",
"representative": 2,
"begin_date": "2004-09-26",
"constituency": 2
},
"model": "representatives.mandate",
"pk": 12
"pk": 9
},
{
"fields": {
"group": 14,
"group": 11,
"end_date": null,
"role": "vice-pr\u00e9sident",
"representative": 2,
"link": "",
"begin_date": "2004-09-26",
"constituency": 2
},
"model": "representatives.mandate",
"pk": 13
"pk": 10
}
]
# coding: utf-8
# Equivalences of nat. Assembly committees
_equiv_Com_AN = {
}
# Abbreviations for nat. Assembly committees
_abbr_Com_AN = {
(u"Commission chargée de l'application de l'article 26 de la "
u"constitution"): "AnComImmu",
u"Commission de la défense nationale et des forces armées": "AnComDef",
u"Commission des affaires culturelles et de l'éducation": "AnComCult",
u"Commission des affaires économiques": "AnComEco",
u"Commission des affaires étrangères": "AnComEtrg",
u"Commission des affaires européennes": "AnComEU",
u"Commission des affaires sociales": "AnComSoc",
(u"Commission des finances, de l'économie générale et du contrôle "
u"budgétaire"): "AnComFin",
(u"Commission des lois constitutionnelles, de la législation et de "
u"l'administration générale de la république"): "AnComLois",
u"Commission du développement durable et de l'aménagement du territoire":
"AnComDevD"
}
# Equivalences of Senate committees
_equiv_Com_SEN = {
u"COMMISSION DES AFFAIRES EUROPÉENNES Commission des affaires européennes":
u"Commission des affaires européennes",
u"Commission de l'aménagement du territoire et du développement durable":
(u"Commission du développement durable, des infrastructures, de "
u"l'équipement et de l'aménagement du territoire")
}
# Abbreviations for Senate committees
_abbr_Com_SEN = {
u"Commission de la culture, de l'éducation et de la communication":
"SenComCult",
u"Commission des affaires économiques": "SenComEco",
u"Commission des affaires étrangères, de la défense et des forces armées":
"SenComDef",
u"Commission des affaires européennes": "SenComEU",
u"Commission des affaires sociales": "SenComSoc",
(u"Commission des finances, du contrôle budgétaire et des comptes "
u"économiques de la nation"): "SenComFin",
(u"Commission des lois constitutionnelles, de législation, du suffrage "
u"universel, du Règlement et d'administration générale"): "SenComLois",
(u"Commission du développement durable, des infrastructures, de "
u"l'équipement et de l'aménagement du territoire"): "SenComDevD",
u"Commission sénatoriale pour le contrôle de l'application des lois":
"SenComAppL"
}
def _get_rep_district_name(json):
num = json.get('num_circo')
nom = json.get('nom_circo')
if num == 'nd':
return nom
else:
ordinal = u'ère' if num == 1 else u'ème'
return '%s (%d%s circonscription)' % (nom, num, ordinal)
def _get_sen_comittees(json):
comittees = []
start = json['mandat_debut']
for g in json['responsabilites']:
orga = g['responsabilite']['organisme']
role = g['responsabilite']['fonction']
if not orga.startswith('Commission'):
continue
if orga in _equiv_Com_SEN:
orga = _equiv_Com_SEN[orga]
comittees.append({
'abbr': _abbr_Com_SEN[orga] if orga in _abbr_Com_SEN else '',
'name': orga,
'role': role,
'start': start
})
return comittees
def _get_an_comittees(json):
comittees = []
start = json['mandat_debut']
for g in json['responsabilites']:
orga = g['responsabilite']['organisme']
role = g['responsabilite']['fonction']
if not orga.startswith('Commission'):
continue
if orga in _equiv_Com_AN:
orga = _equiv_Com_AN[orga]
comittees.append({
'abbr': _abbr_Com_AN[orga] if orga in _abbr_Com_AN else '',
'name': orga,
'role': role,
'start': start
})
return comittees
#
# Variant configuration
# - mail_domain is used to distinguish official vs personal emails
# - off_* fields are used for the official address of meps
# - mandates defines how mandates are created from the rep json
#
# Mandates are defined as follows
# - 'kind' indicates the group kind, a constant string
# - 'chamber' tells whether the group belongs to the chamber
# - 'from', if present, must be a function that takes the rep json and returns
# an array of dicts; one group will be created from each item in the dict.
# When 'from' is not present, only one group wil be created using the rep
# json (IOW, 'from' defaults to lambda repjson: [repjson])
# - 'name', 'abbr', 'role', 'start', 'end' are strings that are interpolated
# against the rep json or items returned by 'from'.
# - 'name_path', 'abbr_path', etc. can replace 'name', 'abbr'... by specifying
# a slash-separated dictionnary path where the value is to be found in the
# rep json or item returned by 'from'
# - 'name_fn', 'abbr_fn', etc. can also replace 'name', 'abbr'... by a
# function that takes the input item (rep json or item returned by 'from')
# and returns the value
#
FranceDataVariants = {
"AN": {
"chamber": u"Assemblée nationale",
"remote_id_field": "url_an",
"mail_domain": "@assemblee-nationale.fr",
"off_city": "Paris",
"off_street": u"Rue de l'Université",
"off_number": "126",
"off_code": "75355",
"off_name": u"Assemblée nationale",
"mandates": [
{
"kind": "group",
"chamber": True,
"abbr": "%(groupe_sigle)s",
"name_path": "groupe/organisme",
"role_path": "groupe/fonction",
"start": "%(mandat_debut)s"
},
{
"kind": "department",
"abbr": "%(num_deptmt)s",
"name": "%(nom_circo)s",
"start": "%(mandat_debut)s"
},
{