Commit a65c0390 authored by Emmanuel Raviart's avatar Emmanuel Raviart

Add import of "AMO30_tous_acteurs_tous_mandats_tous_organes_historique.json".

Ensure that each "acteur" and "organe" is defined only once.
parent f7dd006c
......@@ -15,24 +15,30 @@ dir = "../assemblee-data/"
#
[[acteurs_et_organes]]
# Erreur : le fichier AMO20_dep_sen_min_tous_mandats_et_organes_XV.json est en fait celui de la XIème législature.
# C'est pour cette unique raison que le fichier AMO10_deputes_actifs_mandats_actifs_organes_XV.json est utilisé.
filename = "AMO10_deputes_actifs_mandats_actifs_organes_XV.json"
title = "Députés actifs et organes de la XVème législature"
url = "http://data.assemblee-nationale.fr/static/openData/repository/15/amo/deputes_actifs_mandats_actifs_organes/AMO10_deputes_actifs_mandats_actifs_organes_XV.json.zip"
[[acteurs_et_organes]]
# Ce fichier contient notamment les sénateurs, mais pas les députés récents.
# Attention : Ce fichier est exactement le même que celui de la XIVème législature.
filename = "AMO20_dep_sen_min_tous_mandats_et_organes_XV.json"
ignore_for_web = true
title = "Acteurs et organes de la XVème législature"
url = "http://data.assemblee-nationale.fr/static/openData/repository/15/amo/deputes_senateurs_ministres_legislature/AMO20_dep_sen_min_tous_mandats_et_organes_XV.json.zip"
[[acteurs_et_organes]]
# Attention : Ce fichier est exactement le même que celui de la XVème législature.
filename = "AMO20_dep_sen_min_tous_mandats_et_organes_XIV.json"
ignore_for_web = true
title = "Acteurs et organes de la XIVème législature"
url = "http://data.assemblee-nationale.fr/static/openData/repository/14/amo/deputes_senateurs_ministres_legislatures_XIV/AMO20_dep_sen_min_tous_mandats_et_organes_XIV.json.zip"
[[acteurs_et_organes]]
# Ce fichier contient tous les acteurs et organes mais les informations concernant les députés actifs sont moins détaillées.
filename = "AMO30_tous_acteurs_tous_mandats_tous_organes_historique.json"
title = "Historique de tous les acteurs et organes depuis la XIème législature"
url = "http://data.assemblee-nationale.fr/static/openData/repository/15/amo/tous_acteurs_mandats_organes_xi_legislature/AMO30_tous_acteurs_tous_mandats_tous_organes_historique.json.zip"
[[agendas]]
filename = "Agenda_XV.json"
title = "Agenda de la XVème législature"
......
......@@ -255,7 +255,9 @@ pub fn load(
let mut acteur_by_uid: HashMap<String, *const Acteur> = HashMap::new();
for wrapper in &acteurs_et_organes_wrappers {
for acteur in &wrapper.export.acteurs.acteurs {
acteur_by_uid.insert(acteur.uid().to_string(), acteur);
// Keep the existing "acteur", because the first wrapper contains only the current "députés",
// but it has the most details on them.
acteur_by_uid.entry(acteur.uid().to_string()).or_insert(acteur);
}
}
......@@ -329,7 +331,8 @@ pub fn load(
let mut organe_by_uid: HashMap<String, *const Organe> = HashMap::new();
for wrapper in &acteurs_et_organes_wrappers {
for organe in &wrapper.export.organes.organes {
organe_by_uid.insert(organe.uid().to_string(), organe);
// Keep the first existing "organe", because the first wrapper is the most complete.
organe_by_uid.entry(organe.uid().to_string()).or_insert(organe);
}
}
......
......@@ -11,6 +11,7 @@ use data::{Acteur, CodeTypeOrgane, EnabledDatasets, Mandat, PhotoDepute, NO_DATA
use rayon::prelude::*;
use std::collections::HashMap;
use std::fs::{self, File};
use std::mem;
use std::path::Path;
use std::process::Command;
......@@ -67,19 +68,20 @@ fn main() {
let photos_dir = data_dir.join(format!("photos_deputes_{}", legislature));
let mut deputes = Vec::<&Acteur>::new();
for wrapper in &context.acteurs_et_organes_wrappers {
for acteur in &wrapper.export.acteurs.acteurs {
for mandat in
acteur.mandats(Some(&chrono::Local::today().format("%Y-%m-%d").to_string()))
{
if let Mandat::MandatParlementaire(mandat_parlementaire) = mandat {
if let Some(legislature_mandat) = &mandat_parlementaire.legislature {
if legislature_mandat == legislature
&& mandat_parlementaire.type_organe == CodeTypeOrgane::Assemblee
{
deputes.push(acteur);
break; // Don't push the same deputé several times.
}
for acteur in context.acteur_by_uid
.values()
.map(|acteur| unsafe { mem::transmute::<*const Acteur, &Acteur>(*acteur) })
{
for mandat in
acteur.mandats(Some(&chrono::Local::today().format("%Y-%m-%d").to_string()))
{
if let Mandat::MandatParlementaire(mandat_parlementaire) = mandat {
if let Some(legislature_mandat) = &mandat_parlementaire.legislature {
if legislature_mandat == legislature
&& mandat_parlementaire.type_organe == CodeTypeOrgane::Assemblee
{
deputes.push(acteur);
break; // Don't push the same deputé several times.
}
}
}
......
......@@ -28,6 +28,7 @@ use rocket::http::Method;
use rocket::response::{content, NamedFile};
use rocket::State;
use rocket_cors::AllowedOrigins;
use std::mem;
use std::path::{Path, PathBuf};
struct Query;
......@@ -38,12 +39,10 @@ graphql_object!(Query: Context |&self| {
}
field acteurs(&executor) -> FieldResult<Vec<&Acteur>> {
let mut acteurs: Vec<&Acteur> = Vec::new();
for wrapper in &executor.context().acteurs_et_organes_wrappers {
for acteur in &wrapper.export.acteurs.acteurs {
acteurs.push(&acteur);
}
}
let acteurs: Vec<&Acteur> = executor.context().acteur_by_uid
.values()
.map(|acteur| unsafe { mem::transmute::<*const Acteur, &Acteur>(*acteur) })
.collect();
Ok(acteurs)
}
......@@ -324,14 +323,16 @@ graphql_object!(Query: Context |&self| {
Some(ref date) => Some(date.as_ref()),
};
let mut deputes: Vec<&Acteur> = Vec::new();
for wrapper in &executor.context().acteurs_et_organes_wrappers {
for acteur in &wrapper.export.acteurs.acteurs {
for mandat in acteur.mandats(date) {
if let Mandat::MandatParlementaire(mandat_parlementaire) = mandat {
if mandat_parlementaire.type_organe == CodeTypeOrgane::Assemblee {
deputes.push(&acteur);
break; // A deputé can have several mandats, for example "membre" & "secrétaire".
}
for acteur in executor.context().acteur_by_uid
.values()
.map(|acteur| unsafe { mem::transmute::<*const Acteur, &Acteur>(*acteur) })
{
for mandat in acteur.mandats(date) {
if let Mandat::MandatParlementaire(mandat_parlementaire) = mandat {
if mandat_parlementaire.type_organe == CodeTypeOrgane::Assemblee {
deputes.push(&acteur);
break; // A deputé can have several mandats, for example "membre" & "secrétaire".
}
}
}
......@@ -469,12 +470,10 @@ graphql_object!(Query: Context |&self| {
}
field organes(&executor) -> FieldResult<Vec<&Organe>> {
let mut organes: Vec<&Organe> = Vec::new();
for wrapper in &executor.context().acteurs_et_organes_wrappers {
for organe in &wrapper.export.organes.organes {
organes.push(&organe);
}
}
let organes: Vec<&Organe> = executor.context().organe_by_uid
.values()
.map(|organe| unsafe { mem::transmute::<*const Organe, &Organe>(*organe) })
.collect();
Ok(organes)
}
......
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