Commit 1583e113 authored by Emmanuel Raviart's avatar Emmanuel Raviart

Allow to retrieve a "dossier" by URL segment or signet (of Sénat).

parent 59a147d6
......@@ -714,6 +714,8 @@ dependencies = [
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"juniper 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
"juniper_codegen 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
......
......@@ -7,6 +7,8 @@ authors = ["Emmanuel Raviart <emmanuel@raviart.com>"]
chrono = { version = "0.4", features = ["serde"] }
juniper = "0.10"
juniper_codegen = "0.10"
lazy_static = "1"
regex = "1.0"
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
......
......@@ -14,6 +14,8 @@ pub struct Context {
pub acteurs_et_organes_wrappers: Vec<acteurs_et_organes::ExportJsonWrapper>,
pub agendas_wrappers: Vec<agendas::AgendaJsonWrapper>,
pub amendements_wrappers: Vec<amendements::AmendementsJsonWrapper>,
pub dossier_parlementaire_by_segment: HashMap<String, *const DossierParlementaire>,
pub dossier_parlementaire_by_signet_senat: HashMap<String, *const DossierParlementaire>,
pub dossier_parlementaire_by_uid: HashMap<String, *const DossierParlementaire>,
pub dossiers_legislatifs_wrappers: Vec<dossiers_legislatifs::ExportJsonWrapper>,
pub organe_by_uid: HashMap<String, *const Organe>,
......@@ -29,6 +31,28 @@ impl Context {
.map(|acteur| unsafe { mem::transmute::<*const Acteur, &Acteur>(*acteur) })
}
pub fn get_dossier_parlementaire_at_segment(
&self,
segment: &str,
) -> Option<&DossierParlementaire> {
self.dossier_parlementaire_by_segment
.get(&segment.to_string())
.map(|dossier| unsafe {
mem::transmute::<*const DossierParlementaire, &DossierParlementaire>(*dossier)
})
}
pub fn get_dossier_parlementaire_at_signet_senat(
&self,
signet_senat: &str,
) -> Option<&DossierParlementaire> {
self.dossier_parlementaire_by_signet_senat
.get(&signet_senat.to_string())
.map(|dossier| unsafe {
mem::transmute::<*const DossierParlementaire, &DossierParlementaire>(*dossier)
})
}
pub fn get_dossier_parlementaire_at_uid(&self, uid: &str) -> Option<&DossierParlementaire> {
self.dossier_parlementaire_by_uid
.get(&uid.to_string())
......
......@@ -396,37 +396,37 @@ impl DossierParlementaire {
// }
// }
// pub fn titre_dossier(&self) -> &TitreDossier {
// match *self {
// DossierParlementaire::DossierCommissionEnquete(DossierCommissionEnquete {
// ref titre_dossier,
// ..
// })
// | DossierParlementaire::DossierInitiativeExecutif(DossierInitiativeExecutif {
// ref titre_dossier,
// ..
// })
// | DossierParlementaire::DossierLegislatif(DossierLegislatif {
// ref titre_dossier,
// ..
// })
// | DossierParlementaire::DossierMissionControle(DossierMissionControle {
// ref titre_dossier,
// ..
// })
// | DossierParlementaire::DossierMissionInformation(DossierMissionInformation {
// ref titre_dossier,
// ..
// })
// | DossierParlementaire::DossierResolutionAN(DossierResolutionAN {
// ref titre_dossier,
// ..
// })
// | DossierParlementaire::DossierSansType(DossierSansType {
// ref titre_dossier, ..
// }) => &titre_dossier,
// }
// }
pub fn titre_dossier(&self) -> &TitreDossier {
match *self {
DossierParlementaire::DossierCommissionEnquete(DossierCommissionEnquete {
ref titre_dossier,
..
})
| DossierParlementaire::DossierInitiativeExecutif(DossierInitiativeExecutif {
ref titre_dossier,
..
})
| DossierParlementaire::DossierLegislatif(DossierLegislatif {
ref titre_dossier,
..
})
| DossierParlementaire::DossierMissionControle(DossierMissionControle {
ref titre_dossier,
..
})
| DossierParlementaire::DossierMissionInformation(DossierMissionInformation {
ref titre_dossier,
..
})
| DossierParlementaire::DossierResolutionAN(DossierResolutionAN {
ref titre_dossier,
..
})
| DossierParlementaire::DossierSansType(DossierSansType {
ref titre_dossier, ..
}) => &titre_dossier,
}
}
pub fn uid(&self) -> &str {
match *self {
......@@ -453,6 +453,12 @@ impl DossierParlementaire {
}
}
impl PartialEq for DossierParlementaire {
fn eq(&self, other: &Self) -> bool {
self.uid() == other.uid()
}
}
// Using graphql_union because instance_resolvers of graphql_interface does not work with Juniper 0.9.2.
// graphql_interface!(DossierParlementaire: () |&self| {
graphql_union!(DossierParlementaire: () |&self| {
......
......@@ -5,6 +5,9 @@ extern crate chrono;
extern crate juniper;
#[macro_use]
extern crate juniper_codegen;
#[macro_use]
extern crate lazy_static;
extern crate regex;
extern crate serde;
#[macro_use]
extern crate serde_derive;
......@@ -38,6 +41,7 @@ pub use dossiers_legislatifs::DossierParlementaire;
pub use mandats::Mandat;
pub use organes::Organe;
pub use photos::PhotoDepute;
use regex::Regex;
pub use scrutins::Scrutin;
use std::collections::HashMap;
use std::fs::{self, File};
......@@ -249,13 +253,38 @@ pub fn load(
}
}
let mut dossier_parlementaire_by_segment: HashMap<String, *const DossierParlementaire> =
HashMap::new();
let mut dossier_parlementaire_by_signet_senat: HashMap<String, *const DossierParlementaire> =
HashMap::new();
let mut dossier_parlementaire_by_uid: HashMap<String, *const DossierParlementaire> =
HashMap::new();
lazy_static! {
static ref senat_chemin_regex: Regex =
Regex::new(r"^https?://www.senat.fr/dossier-legislatif/(.*).html$").unwrap();
}
for wrapper in &dossiers_legislatifs_wrappers {
for dossier in &wrapper.export.dossiers_legislatifs.dossiers {
let dossier_parlementaire = &dossier.dossier_parlementaire;
let titre_dossier = dossier_parlementaire.titre_dossier();
match titre_dossier.senat_chemin {
None => (),
Some(ref senat_chemin) => {
let captures = senat_chemin_regex.captures(&senat_chemin).unwrap();
dossier_parlementaire_by_signet_senat
.insert(captures[1].to_string(), dossier_parlementaire);
}
}
match titre_dossier.titre_chemin {
None => (),
Some(ref titre_chemin) => {
dossier_parlementaire_by_segment
.insert(titre_chemin.to_string(), dossier_parlementaire);
}
}
dossier_parlementaire_by_uid.insert(
dossier.dossier_parlementaire.uid().to_string(),
&dossier.dossier_parlementaire,
dossier_parlementaire.uid().to_string(),
dossier_parlementaire,
);
}
}
......@@ -304,6 +333,8 @@ pub fn load(
acteurs_et_organes_wrappers,
agendas_wrappers,
amendements_wrappers,
dossier_parlementaire_by_segment,
dossier_parlementaire_by_signet_senat,
dossier_parlementaire_by_uid,
dossiers_legislatifs_wrappers,
organe_by_uid,
......
......@@ -358,6 +358,38 @@ graphql_object!(Query: Context |&self| {
Ok(dossiers_parlementaires)
}
field dossiers_parlementaires_par_cles(&executor, segment: Option<String>, , signet_senat: Option<String>) -> FieldResult<Vec<&DossierParlementaire>> {
let context = executor.context();
let mut dossiers_parlementaires: Vec<&DossierParlementaire> = Vec::new();
match segment {
None => (),
Some(ref segment) => {
match context.get_dossier_parlementaire_at_segment(segment) {
None => (),
Some(ref dossier_parlementaire) => {
if !dossiers_parlementaires.contains(dossier_parlementaire) {
dossiers_parlementaires.push(dossier_parlementaire);
}
},
}
},
}
match signet_senat {
None => (),
Some(ref signet_senat) => {
match context.get_dossier_parlementaire_at_signet_senat(signet_senat) {
None => (),
Some(ref dossier_parlementaire) => {
if !dossiers_parlementaires.contains(dossier_parlementaire) {
dossiers_parlementaires.push(dossier_parlementaire);
}
},
}
},
}
Ok(dossiers_parlementaires)
}
field dossiers_parlementaires_prochains(&executor, date: String) -> FieldResult<Vec<&DossierParlementaire>> {
let date_time = DateTime::parse_from_rfc3339(&date).expect(&format!("Invalid date & time: {}", date));
let date = date_time.date();
......
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