Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 1123 → Rev 1124

/trunk/scripts/modules/chorodep/chorodep.ini
1,5 → 1,5
; Ajouter les nouvelles version à la suite dans versions et versionsDonnees.
versions = "2011_04,2012_01,2013_07,2013_08,2013_11,2014_08"
versions = "2011_04,2012_01,2013_07,2013_08,2013_11"
versionsDonnees="2011-04-05,2012-01-01,2013-07-22,2013-08-05,2013-11-13,2014-08-15"
dossierTsv = "{ref:dossierDonneesEflore}chorodep/{ref:versionDonnees}/"
dossierTsvTpl = "{ref:dossierDonneesEflore}chorodep/%s/"
19,6 → 19,9
chorodepOntologies = "chorodep_ontologies"
chorodep = "chorodep_v{ref:version}"
chorodepTpl = "chorodep_v%s"
; Noms vernaculaires et status de protection :
statuts_protection = "chorologie_sp"
noms_vernaculaires = "chorologie_nv"
 
[fichiers]
structureSql = "chorodep.sql"
29,6 → 32,8
chorodepOntologies = "chorodep_ontologies.tsv"
chorodep = "chorodep_v{ref:versionDonnees}.tsv"
chorodepTpl = "chorodep_v%s.tsv"
; Noms vernaculaires et status de protection :
structureNVSP = "nvsp.sql"
 
[chemins]
structureSql = "{ref:dossierSql}{ref:fichiers.structureSql}"
38,4 → 43,12
chorodepSources = "{ref:dossierSql}{ref:fichiers.chorodepSources}"
chorodepOntologies = "{ref:dossierSql}{ref:fichiers.chorodepOntologies}"
chorodep = "{ref:dossierTsv}{ref:fichiers.chorodep}"
chorodepTpl = "{ref:dossierTsvTpl}{ref:fichiers.chorodepTpl}"
chorodepTpl = "{ref:dossierTsvTpl}{ref:fichiers.chorodepTpl}"
; Noms vernaculaires et status de protection :
structureNVSP = "{ref:dossierSql}{ref:fichiers.structureNVSP}"
 
[services]
;base_url_service_eflore = "http://api.tela-botanica.org/service:eflore:0.1/";
base_url_service_eflore = "http://localhost/service:eflore:0.1/";
url_nvjfl = "{ref:base_url_service_eflore}nvjfl/noms-vernaculaires?masque.lg=fra&retour.champs=num_taxon&retour.tri=num_taxon&navigation.depart=%s&navigation.limite=%s"
url_sptb = "{ref:base_url_service_eflore}sptb/statuts?masque.nn=%s"
/trunk/scripts/modules/chorodep/Chorodep.php
55,6 → 55,25
case 'supprimerTous' :
$this->supprimerTous();
break;
// noms vernaculaires et statuts de protection
case 'NVSP' :
$this->nettoyageNVSP();
$this->chargerStructureNVSP();
$this->rabouterNomsVernaculaires();
$this->rabouterStatutsProtection();
break;
case 'nettoyageNVSP' :
$this->nettoyageNVSP();
break;
case 'chargerStructureNVSP' :
$this->chargerStructureNVSP();
break;
case 'nomsVernaculaires' :
$this->rabouterNomsVernaculaires();
break;
case 'statutsProtection' :
$this->rabouterStatutsProtection();
break;
default :
throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
}
142,7 → 161,7
private function initialiserTraitement() {
//------------------------------------------------------------------------------------------------------------//
// Récupération des informations à vérifier
$table = $this->getNomTableDernierVersion();
$table = $this->getNomTableDerniereVersion();
$requete = 'SELECT * '.
"FROM $table ";
$taxons = $this->getBdd()->recupererTous($requete);
486,7 → 505,7
return $tablesChorodep;
}
 
private function getNomTableDernierVersion() {
private function getNomTableDerniereVersion() {
$version = $this->getDerniereVersion();
$table = sprintf(Config::get('tables.chorodepTpl'), $version);
return $table;
496,6 → 515,123
$version = array_pop(explode(',', Config::get('versions')));
return $version;
}
 
// ----------
// intégration des noms vernaculaires et statuts de protection (NVSP) dans
// une table dédiée, pour permettre le service intégratif de l'applciation "chorologie"
// (basé sur les scripts de "gentiana-services")
// ----------
 
/**
* Dézingue tout le bousin
* @TODO chaque méthode devrait s'autonettoyer au début afin d'être répétable
* sans avoir à tout reprendre depuis le début (principe du dump)
*/
protected function nettoyageNVSP() {
echo "---- suppression des tables\n";
$tableStatutsProtection = Config::get('tables.statuts_protection');
$tableNomsVernaculaires = Config::get('tables.noms_vernaculaires');
$req = "DROP TABLE IF EXISTS `" . $tableStatutsProtection . "`";
$this->getBdd()->requeter($req);
$req = "DROP TABLE IF EXISTS `" . $tableNomsVernaculaires . "`;";
$this->getBdd()->requeter($req);
}
 
/**
* Crée les tables vides
*/
protected function chargerStructureNVSP() {
echo "---- création des tables\n";
$contenuSql = $this->recupererContenu(Config::get('chemins.structureNVSP'));
$this->executerScripSql($contenuSql);
}
 
/**
* Va chercher les noms vernaculaires pour chaque espèce, et les rajoute
* dans la table dédiée
*/
protected function rabouterNomsVernaculaires() {
$tableNomsVernaculaires = Config::get('tables.noms_vernaculaires');
restore_error_handler();
restore_exception_handler();
ini_set("display_errors", true);
error_reporting(E_ALL);
$squeletteUrlNvjfl = Config::get("url_nvjfl");
echo "---- récupération des noms vernaculaires depuis eFlore\n";
$depart = 0;
$nbInsertions = 0;
$yenaencore = true;
$tailleTranche = 1000;
while ($yenaencore) {
$url = sprintf($squeletteUrlNvjfl, $depart, $tailleTranche);
$noms = $this->chargerDonnees($url);
// Si quelqu'un parvient à dédoublonner les $valeurs, on enlève le IGNORE
$req = "INSERT IGNORE INTO " . $tableNomsVernaculaires . " VALUES ";
$valeurs = array();
// insertion des données
foreach ($noms['resultat'] as $res) {
$numTaxons = explode(',', $res['num_taxon']);
$nvP = $this->getBdd()->proteger($res['nom']);
foreach ($numTaxons as $numTaxon) {
$valeurs[] = "(" . $numTaxon . ", " . $nvP . ")";
}
}
$req .= implode(",", $valeurs);
$this->getBdd()->executer($req);
// prochain tour
$nbInsertions += count($valeurs); // Faux car INSERT IGNORE - dédoublonner ou compter les insertions réelles
$depart += $tailleTranche;
$total = $noms['entete']['total'];
$yenaencore = $depart <= $total;
echo "insérés: " . min($depart, $total) . " noms, " . $nbInsertions . " attributions\n";
}
}
 
/**
* Va chercher les statuts de protection pour chaque espèce et les rajoute
* à la table; importe un fichier dump SQL des lois
*/
protected function rabouterStatutsProtection() {
$tableChorologie = $this->getNomTableDerniereVersion();
$tableStatutsProtection = Config::get('tables.statuts_protection');
echo "---- récupération des statuts de protection depuis eFlore\n";
$req = "SELECT distinct num_nom FROM " . $tableChorologie;
$resultat = $this->getBdd()->recupererTous($req);
// pour chaque taxon mentionné (inefficace mais évite d'implémenter un
// mode liste sur le service eflore/sptb
$squeletteUrlSptb = Config::get("url_sptb");
foreach ($resultat as $res) {
$nn = $res['num_nom'];
//echo "NN: $nn\n";
if ($nn != 0) {
$url = sprintf($squeletteUrlSptb, $nn);
//echo "URL: $url\n";
$statuts = $this->chargerDonnees($url);
//echo "STATUTS: " . print_r($statuts, true) . "\n";
if (count($statuts) > 0) {
$json = array();
foreach ($statuts as $statut) {
$nouveauStatut = array();
$nouveauStatut['zone'] = $statut['code_zone_application'];
$nouveauStatut['lien'] = $statut['hyperlien_legifrance'];
$json[] = $nouveauStatut;
}
// Si au moins un statut
if (count($json) > 0) {
$json = json_encode($json);
//echo "JSON: " . print_r($json, true) . "\n";
// Insertion d'un bout de JSON
$jsonP = $this->getBdd()->proteger($json);
$nnP = $this->getBdd()->proteger($nn);
$reqIns = "INSERT INTO " . $tableStatutsProtection
. " values($nnP, $jsonP)";
//echo "ReqIns: $reqIns\n";
$this->getBdd()->executer($reqIns);
}
}
}
}
}
}
 
class ZgFrDepartements {
626,4 → 762,4
return (int)self::$departements[$n][3];
}
}
?>
?>
/trunk/scripts/bibliotheque/EfloreScript.php
18,7 → 18,13
 
private $Bdd = null;
private $projetNom = null;
protected $conteneur; // mélange cracra, n'était pas utilisé jusqu'à présent (2014-09-29)
 
public function __construct($script_nom, $parametres_cli) {
parent::__construct($script_nom, $parametres_cli);
$this->conteneur = new Conteneur();
}
 
public function getProjetNom() {
return $this->projetNom;
}
85,5 → 91,28
}
return $stop;
}
 
/**
* Consulte une URL et retourne le résultat (ou déclenche une erreur), en
* admettant qu'il soit au format JSON
*
* @param string $url l'URL du service
*/
protected function chargerDonnees($url, $decoderJSON = true) {
$resultat = $this->conteneur->getRestClient()->consulter($url);
$entete = $this->conteneur->getRestClient()->getReponseEntetes();
 
// Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_data
if (isset($entete['wrapper_data'])) {
if ($decoderJSON) {
$resultat = json_decode($resultat, true);
$this->entete = (isset($resultat['entete'])) ? $resultat['entete'] : null;
}
} else {
$m = "L'url <a href=\"$url\">$url</a> lancée via RestClient renvoie une erreur";
trigger_error($m, E_USER_WARNING);
}
return $resultat;
}
}
?>