Subversion Repositories eFlore/Applications.del

Compare Revisions

No changes between revisions

Ignore whitespace Rev 1683 → Rev 1684

/trunk/services/modules/0.1/Observations.php
1,37 → 1,57
<?php
/**
* Description :
* Classe principale de chargement des services d'eFlore.
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* @package eflore-projets
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version 0.1
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org)
*/
* Classe principale de chargement des services Observations.
*
* URLs possibles :
* GET :
* http://localhost/service:del:0.1/observations
* toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires)
*
* http://localhost/service:del:0.1/observations?retour.format=widget
* toutes les infos des observations pour le Widget DEL
*
* http://localhost/service:del:0.1/observations/#idObs
* une observation donnée et ses images, SANS LES propositions & nombre de commentaire*
*
* http://localhost/service:del:0.1/observations/#idObs/#idVote/vote
* toutes les infos sur les votes d'une proposition
*
* PUT :
* http://localhost/service:del:0.1/observations/#idObs/#idCommentaire/vote
* ajoute un vote (+ ou -) pour une obs et une proposition donnée
*
* POST :
* http://localhost/service:del:0.1/observations/#idObs
* utilisé seulement par les admins pour modifier une obs depuis DEL (dépublication des obs)
*
* http://localhost/service:del:0.1/observations/#idObs/#idCommentaire/vote
* modifie un vote (+ ou -) pour une obs et une proposition donnée
*
*
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @category DEL
* @package Observations
* @version 0.1
* @author Jennifer DHÉ <jennifer.dhe@tela-botanica.org>
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org)
*/
class Observations extends RestService {
 
/*
* url possibles :
* http://localhost/del/services/0.1/observations/ => toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires)
* http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
* */
private $parametres = array();
private $ressources = array();
private $methode = null;
private $projetNom = array();
private $serviceNom = array();
private $serviceNom = 'observations';
private $sousServiceNom = null;
private $cheminCourant = null;
 
private $conteneur;
 
/** Indique si oui (true) ou non (false), on veut utiliser les paramètres bruts. */
protected $utilisationParametresBruts = true;
 
41,157 → 61,155
 
public function consulter($ressources, $parametres) {
$this->methode = 'consulter';
$resultat = '';
$reponseHttp = new ReponseHttp();
try {
$this->initialiserRessourcesEtParametres($ressources, $parametres);
$this->conteneur = new Conteneur($this->parametres);
$resultat = $this->traiterRessources();
$reponseHttp->setResultatService($resultat);
} catch (Exception $e) {
$reponseHttp->ajouterErreur($e);
}
$reponseHttp->emettreLesEntetes();
$corps = $reponseHttp->getCorps();
return $corps;
$this->initialiserRessourcesEtParametres($ressources, $parametres);
return $this->executerService();
}
 
public function ajouter($ressources, $requeteDonnees) {
$this->methode = 'ajouter';
$resultat = '';
$reponseHttp = new ReponseHttp();
try {
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
$this->conteneur = new Conteneur($this->parametres);
$resultat = $this->traiterRessources();
} catch (Exception $e) {
$reponseHttp->ajouterErreur($e);
$reponseHttp->emettreLesEntetes();
}
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
return $this->executerService();
}
 
public function modifier($ressources, $requeteDonnees) {
$this->methode = 'modifier';
$resultat = '';
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
return $this->executerService();
}
 
private function executerService() {
$reponseHttp = new ReponseHttp();
try {
$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
$this->conteneur = new Conteneur($this->parametres);
$resultat = $this->traiterRessources();
$reponseHttp->setResultatService($resultat);
} catch (Exception $e) {
$reponseHttp->ajouterErreur($e);
$reponseHttp->emettreLesEntetes();
}
$reponseHttp->emettreLesEntetes();
$corps = $reponseHttp->getCorps();
return $corps;
}
 
private function initialiserRessourcesEtParametres($ressources, $parametres) {
private function initialiserRessourcesEtParametres($ressources, $parametres = array()) {
$this->ressources = $ressources;
$this->parametres = $parametres;
}
 
private function traiterRessources() {
$retour = '';
$this->initialiserProjet();
if ($this->avoirRessourceService()) {
$retour = $this->initialiserService();
}
$this->chargerConfigService();
$this->analyserRessources();
$retour = $this->initialiserService();
return $retour;
}
private function avoirRessourceIdentifiant($num) {
$presenceId = false;
if (is_numeric($this->ressources[$num])) {
$presenceId = true;
} else {
$message = "Le service demandé '$service' nécessite d'avoir un identifiant d'image valide";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
return $presenceId;
 
private function chargerConfigService() {
$chemin = Config::get('chemin_configurations')."config_{$this->serviceNom}.ini";
Config::charger($chemin);
}
 
/*------------------------------------------------------------------------------------------------------------------
CONFIGURATION DU PROJET
CONFIGURATION DU SERVICE
------------------------------------------------------------------------------------------------------------------*/
private function initialiserProjet() {
$this->chargerNomDuProjet();
$this->chargerConfigProjet();
 
private function analyserRessources() {
if ($this->methode == 'consulter') {
$this->analyserRessoucesConsultation();
} else if ($this->methode == 'modifier' || $this->methode == 'ajouter') {
$this->analyserRessoucesModification();
}
}
 
private function chargerNomDuProjet() {
$this->projetNom = 'observations';
}
private function analyserRessoucesConsultation() {
if (count($this->ressources) == 0) {
if ($this->verifierParametreValeur('retour.format', 'widget')) {
// http://localhost/service:del:0.1/observations?retour.format=widget
$this->sousServiceNom = 'liste-observations-widget';
} else {
// http://localhost/service:del:0.1/observations
$this->sousServiceNom = 'liste-observations';
}
} else if (count($this->ressources) == 1) {
if ($this->etreRessourceIdentifiant(0)) {
// http://localhost/service:del:0.1/observations/#idObs
$this->sousServiceNom = 'observation';
}
} else if (count($this->ressources) == 3) {
if ($this->etreRessourceIdentifiant(0) && $this->etreRessourceIdentifiant(1) && $this->verifierRessourceValeur(2, 'vote')) {
// http://localhost/service:del:0.1/observations/#idObs/#idProposition/vote/
$this->sousServiceNom = 'vote-observation';
}
}
 
private function chargerConfigProjet() {
$projet = $this->projetNom;
$chemin = Config::get('chemin_configurations')."config_$projet.ini";
Config::charger($chemin);
if ($this->sousServiceNom == null) {
$this->lancerMessageErreurRessource();
}
}
 
/*------------------------------------------------------------------------------------------------------------------
CONFIGURATION DU SERVICE
------------------------------------------------------------------------------------------------------------------*/
private function avoirRessourceService() {
/*
* url possibles :
* http://localhost/del/services/0.1/observations/ => toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires)
* http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
* */
$presenceRessourceService = false;
if (isset($this->ressources[0])) {
if ($this->avoirRessourceIdentifiant(0)) {
if (sizeof($this->ressources) == 1) {
$presenceRessourceService = true;
$this->serviceNom = 'observation';
} else {
if (isset($this->ressources[1])) {
$presenceRessourceService = $this->avoirRessourceSousService();
}
}
private function analyserRessoucesModification() {
if (count($this->ressources) == 1) {
if ($this->methode == 'modifier' && $this->etreRessourceIdentifiant(0)) {
// http://localhost/service:del:0.1/observations/#idObs
$this->sousServiceNom = 'observation';
}
} else {
if (isset($this->parametres['retour.format']) && $this->parametres['retour.format'] == 'widget') {
$this->methode = 'consulter';
$presenceRessourceService = true;
$this->serviceNom = 'liste-observations-widget';
} else {
$presenceRessourceService = true;
$this->serviceNom = 'liste-observations';
} else if (count($this->ressources) == 3) {
if ($this->etreRessourceIdentifiant(0) && $this->etreRessourceIdentifiant(1) && $this->verifierRessourceValeur(2, 'vote')) {
// http://localhost/service:del:0.1/observations/#idObs/#idProposition/vote/
$this->sousServiceNom = 'vote-observation';
}
}
return $presenceRessourceService;
 
if ($this->sousServiceNom == null) {
$this->lancerMessageErreurRessource();
}
}
private function avoirRessourceSousService() {
$presenceRessourceService = false;
$servicesDispo = Outils::recupererTableauConfig('servicesDispo');
if ($this->avoirRessourceIdentifiant(1)) {
$service = $this->ressources[2];
if (in_array($service, $servicesDispo)) {
$presenceRessourceService = true;
$this->serviceNom = 'vote-observation';
} else {
$message = "Le service demandé '$service' n'est pas disponible pour le projet {$this->projetNom} !\n".
"Les services disponibles sont : ".implode(', ', $servicesDispo);
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
 
private function etreRessourceIdentifiant($num) {
$presenceId = false;
if (isset($this->ressources[$num]) && is_numeric($this->ressources[$num])) {
$presenceId = true;
}
return $presenceRessourceService;
return $presenceId;
}
 
private function verifierRessourceValeur($num, $valeur) {
$ok = false;
if (isset($this->ressources[$num]) && $this->ressources[$num] == $valeur) {
$ok = true;
}
return $ok;
}
 
private function verifierParametreValeur($cle, $valeur) {
$ok = false;
if (isset($this->parametres[$cle]) && $this->ressources[$cle] == $valeur) {
$ok = true;
}
return $ok;
}
 
private function lancerMessageErreurRessource() {
$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources);
$message = "La ressource demandée '$ressource' ".
"n'est pas disponible pour le service ".$this->serviceNom." !\n".
"Les URLs disponibles sont : \n".
" - en GET : observations, observations/#idObs/#idProposition/vote \n".
" - en POST : observations/#id, observations/#idObs/#idProposition/vote \n".
" - en PUT : observations/#idObs/#idProposition/vote \n";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
 
private function initialiserService() {
//$this->chargerNomDuService();
$classe = $this->obtenirNomClasseService($this->serviceNom);
$classe = $this->obtenirNomClasseService($this->sousServiceNom);
$chemins = array();
$chemins[] = $this->cheminCourant.$this->projetNom.DS.$classe.'.php';
$chemins[] = $this->cheminCourant.$this->serviceNom.DS.$classe.'.php';
$chemins[] = $this->cheminCourant.'commun'.DS.$classe.'.php';
$retour = '';
$service = null;
foreach ($chemins as $chemin) {
if (file_exists($chemin)) {
$this->conteneur->chargerConfiguration('config_'.$this->projetNom.'.ini');
$this->conteneur->chargerConfiguration('config_'.$this->serviceNom.'.ini');
require_once $chemin;
$service = new $classe($this->conteneur);
if ($this->methode == 'consulter') {
203,9 → 221,11
}
}
}
 
if (is_null($service)) {
$message = "Le service demandé '{$this->serviceNom}' n'existe pas dans le projet {$this->projetNom} !";
$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources);
$message = "Le classe '$classe' correspondant à la ressource '$ressource' ".
"n'existe pas dans le service '{$this->serviceNom}' !";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
216,7 → 236,4
$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
return $classeNom;
}
 
 
}
?>
}
/trunk/services/modules/0.1/images/ListeImages.php
239,7 → 239,7
$retour = false;
if ($controlAcces->controlerIpAutorisees()) {
if ($controlAcces->etreUtilisateurAvecDroitAdmin()) {
$urlServiceBase = $this->conteneur->getParametre('url_service_suppression_image');
$urlServiceBase = $this->conteneur->getParametre('urlServiceCelImage');
$url = $urlServiceBase.$idImage;
 
$clientHttp = $this->conteneur->getRestClient();
/trunk/services/modules/0.1/observations/ListeObservationsWidget.php
264,7 → 264,7
}
//TODO: déplacer les fonctions ci dessus et dessous dans une classe
// utilitaire
public function supprimerAccents($str, $charset='utf-8') {
private function supprimerAccents($str, $charset='utf-8') {
$str = htmlentities($str, ENT_NOQUOTES, $charset);
 
$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
/trunk/services/modules/0.1/observations/VoteObservation.php
40,7 → 40,6
* Méthode seulement présente pour interdire proprement l'accès à la consultation
* */
public function consulter($ressources, $parametres) {
 
$this->configurer();
 
//TODO: faut il vérifier quelque chose, si on n'a pas renseigné les valeurs correctement
/trunk/services/modules/0.1/observations/Observation.php
1,17 → 1,19
<?php
/**
* Le web service observations récupère toutes les information pour une observation:
* Web service retournant toutes les infos d'une observation donnée :
* images, votes sur image et protocole, commentaires, votes sur commentaires, ...
*
* @category php 5.2
* @category DEL
* @package Observations
* @version 0.1
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Observations
*
* @config-depend: "url_image" (dans configurations/config_observations.ini)
* ex: http://www.tela-botanica.org/appli:cel-img:%09dXL.jpg
* @config-depend: "url_image" (dans configurations/config_observations.ini) ex: http://www.tela-botanica.org/appli:cel-img:%09dXL.jpg
*/
 
// http://localhost/del/services/0.1/observations/#id => une observation donnée et ses images, SANS LES propositions & nombre de commentaire
20,6 → 22,9
 
class Observation {
 
private $conteneur;
private $gestionBdd;
private $bdd;
/* Map les champs MySQL vers les champs utilisés dans le JSON pour les clients pour
chacune des différentes tables utilisées pour le chargement de résultats ci-dessous.
- chargerObservation() (v_del_image)
107,11 → 112,6
"proposition_initiale" => 1),
);
 
 
private $conteneur;
private $gestionBdd;
private $bdd;
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->conteneur->chargerConfiguration('config_votes.ini');
166,11 → 166,10
$observation = array_pop($observations);
 
// 3) charge les données de votes et protocoles associés aux images
if($observation['images']) {
if ($observation['images']) {
$votes = self::chargerVotesImage($this->bdd, $observation['images'], $protocole);
// 3") merge/reformate les données retournées
self::mapVotesToImages($votes,
$observation['images']);
self::mapVotesToImages($votes, $observation['images']);
}
 
// 4) charge les commentaires et les votes associés
177,17 → 176,21
// modifie/créé $observation['commentaires']
self::chargerCommentaires($this->bdd, $observation);
 
 
// désindexe le tableau (tel qu'apparement attendu par les applis), c'est une exception
// corriger l'appli cliente pour utiliser les index puis supprimer cette ligne
$observation['images'] = array_values($observation['images']);
// autre élément de post-processing: le ce_utilisateur de l'observation non-numeric...
if(!is_numeric($observation['auteur.id'])) $observation['auteur.id'] = "0";
if(!isset($observation['auteur.nom'])) $observation['auteur.nom'] = '[inconnu]';
if (!is_numeric($observation['auteur.id'])) {
$observation['auteur.id'] = "0";
}
if (!isset($observation['auteur.nom'])) {
$observation['auteur.nom'] = '[inconnu]';
}
 
if (isset($parametres['justthrow'])) {
return $observation;
}
 
if(isset($parametres['justthrow'])) return $observation;
 
// Mettre en forme le résultat et l'envoyer pour affichage
$resultat = new ResultatService();
$resultat->corps = $observation;
215,7 → 218,7
 
// Charger les images et leurs votes associés
static function chargerVotesImage($db, $images, $protocole = NULL) {
if(!$images) return NULL;
if (!$images) return NULL;
 
$select = array('votes' =>
array('id_vote', 'ce_image', 'ce_protocole', 'ce_utilisateur', 'valeur', 'date', /* del_image_vote */),
247,7 → 250,6
__FILE__ . ':' . __LINE__);
 
//echo "REQUETE: $req"; exit;
 
return $db->recupererTous($req);
}
 
263,7 → 265,7
*
* */
static function mapVotesToImages($votes, &$images) {
if(!$votes) return;
if (!$votes) return;
 
// pour chaque vote
foreach ($votes as $vote) {
309,7 → 311,7
$observation['id_observation'],
__FILE__ . ':' . __LINE__));
 
if(!$commentaires) return;
if (!$commentaires) return;
 
// les commentaires réunifiées et dont les votes sont mergés
$ret = array();
317,7 → 319,7
$commentid = $comment['id_commentaire'];
$voteid = $comment['vote.id'];
 
if(!array_key_exists($commentid, $ret)) {
if (!array_key_exists($commentid, $ret)) {
$comment_extract = array_intersect_key($comment, array_flip(self::$mappings['commentaires']));
// cas particulier: conflit d'aliases avec del_commentaire_vote
$comment_extract['auteur.id'] = $comment_extract['__auteur_com'];
329,7 → 331,7
$ret[$commentid] = $comment_extract;
}
 
if(!$comment['nom_sel'] || ! $voteid) continue;
if (!$comment['nom_sel'] || ! $voteid) continue;
$vote = array_intersect_key($comment, array_flip(self::$mappings['votes']));
$ret[$commentid]['votes'][$voteid] = $vote;
}
337,13 → 339,13
}
 
// cf ListeObservation::reformateObservation() et ListeImages2::reformateImagesDoubleIndex()
// (trop de variétés de formatage, à unifier côté client pour unifier côté backend ...)
// (trop de variétés de formatage, à unifier côté client pour unifier côté backend ...)
static function reformateObservationSimpleIndex($obs, $url_pattern = '') {
// XXX: cf Observation.php::consulter(), nous pourriouns ici
// conserver les valeurs vides (pour les phptests notamment, ou non)
$obs = array_map('array_filter', $obs);
$obs_merged = array();
foreach($obs as $o) {
foreach ($obs as $o) {
$id = $o['id_observation'];
$image = array_intersect_key($o, array_flip(array('id_image', 'date', 'hauteur' , 'largeur', 'nom_original')));
$image['binaire.href'] = sprintf($url_pattern, $image['id_image']);
354,4 → 356,24
return $obs_merged;
}
 
/**
* Modifie une observation directement dans le CEL en faisant un appel à un web service du CEL.
* Utilisé uniquement par les admins.
* Permet de dépublier une observation.
*
* @param array $ressources tableau des informations contenues dans l'url après le nom du service
* @param array $parametres contenu du post
* @return mixed Chaine "OK" en cas de succès, booléen "false" en cas d'échec
*/
public function modifier($ressources, $parametres) {
$retour = false;
if (isset($parametres['transmission'])) {
$idObs = $ressources[0];
$clientRest = $this->conteneur->getRestClient();
$urlTpl = $this->conteneur->getParametre('urlServiceCelObs');
$url = $urlTpl.$idObs;
$retour = $clientRest->modifier($url, $parametres);
}
return $retour;
}
}
/trunk/services/modules/0.1/determinations/ValiderDetermination.php
24,6 → 24,9
private $bdd;
private $parametres = array();
private $ressources = array();
private $idObs = null;
private $idProposition = null;
private $idAuteurObs = null;
 
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
34,92 → 37,107
 
public function modifier($ressources, $parametres) {
$this->verifierParametres($ressources, $parametres);
$id_proposition = $ressources[1];
$this->idProposition = $ressources[1];
$e = $this->modifierObservationParDetermination();
 
$e = $this->modifierObservationParDetermination($id_proposition, $parametres['auteur.id']);
if($e == 'ok' || $e == 'OK' || $e == 'Not Modified') {
if ($e == 'ok' || $e == 'OK' || $e == 'Not Modified') {
RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);
return;
} else {
throw new Exception("Erreur: le web service du CEL a retourné : $e", RestServeur::HTTP_CODE_ERREUR);
}
throw new Exception("error: Cel returned \"$e\"", RestServeur::HTTP_CODE_ERREUR);
}
 
public function verifierParametres($ressources, $parametres) {
private function verifierParametres($ressources, $parametres) {
$erreurs = array();
if (!is_numeric($ressources[1])) {
$erreurs[] = '- le paramètre indiquant l\'identifiant de la proposition doit être numérique ;';
$erreurs[] = '- la ressource indiquant l\'identifiant de la proposition doit être numérique';
}
 
//Le paramètre auteur.id (id de l'auteur de la détermination)
// est là pour éviter que le $_POST ne soit vide
if (!isset($parametres['auteur.id'])) {
$erreurs[] = '- paramètre "auteur.id" manquant ;';
$erreurs[] = "- le paramètre 'auteur.id' est manquant";
}
 
if ($erreurs) {
throw new Exception("Erreur lors de la configuration :\n" . implode("\n", $erreurs),
RestServeur::HTTP_CODE_ERREUR);
$msg = "Erreur dans les paramètres d'appel au web service :\n" . implode("\n", $erreurs);
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
}
 
/*
/**
* 1) récupère l'observation, autrement échec
* 2) récupère et l'auteur officiel et valide l'authentification (match sur $_POST['auteur.id'] et $_SESSION), autrement échec
* 3) prépare les nouvelles valeurs à mettre à jour dans cel_obs depuis del_commentaire
* 2) récupère et l'id auteur de l'obs et vérfie qu'il correspond à l'id de l'utilisateur actuel
* 3) prépare les nouvelles valeurs à transférer au service CEL
* 4) effectue la mise à jour
* 5) si tout s'est passé comme convenu, marque la proposition comme "retenue"
*/
private function modifierObservationParDetermination($id_proposition, $auteurId) {
$champs_a_modifier = array('nom_sel', 'nom_sel_nn', 'nom_ret', 'nom_ret_nn', 'nom_referentiel');
private function modifierObservationParDetermination() {
$propositionInfos = $this->getInfosProposition();
$this->idObs = $propositionInfos['ce_observation'];
$this->idAuteurObs = $this->getIdAuteurObs();
$this->verifierDroitUtilisateur();
 
// obtenirInformationDetermination()
// TODO: else { LIMIT 1 ? }
$proposition = $this->bdd->recuperer(sprintf('SELECT ce_observation, id_commentaire, %s FROM del_commentaire WHERE id_commentaire = %d AND %s',
implode(',', $champs_a_modifier),
intval($id_proposition),
$auteurId ? 'ce_utilisateur = ' . $this->bdd->proteger($auteurId) : 1));
$parametres = array(
'id_observation' => $this->idObs,
'nom_sel_nn' => $propositionInfos['nom_sel_nn'],
'nom_referentiel' => $propositionInfos['nom_referentiel'],
'id_utilisateur' => $this->idAuteurObs);
 
if(! $proposition) {
$urlBase = $this->conteneur->getParametre('urlServiceCelObs');
$url = $urlBase.$this->idObs;
$retour = $this->conteneur->getRestClient()->modifier($url, $parametres);
 
// TODO: check sur HTTP code == 200, plutôt que sur texte
if ($retour == 'ok' || $retour == 'OK') {
$this->mettreAJourPropositionRetenue();
}
return $retour;
}
 
private function getInfosProposition() {
$idPropositionP = $this->bdd->proteger($this->idProposition);
$requete = "SELECT id_commentaire, ce_observation, nom_sel_nn, nom_referentiel ".
'FROM del_commentaire '.
"WHERE id_commentaire = $idPropositionP ".
' -- '.__FILE__.' : '.__LINE__;
$resultat = $this->bdd->recuperer($requete);
if (! $resultat) {
throw new Exception("Cette proposition est invalide.", RestServeur::HTTP_CODE_ERREUR);
}
return $resultat;
}
 
private function getIdAuteurObs() {
$obsIdP = $this->bdd->proteger($this->idObs);
$requete = 'SELECT ce_utilisateur '.
'FROM del_observation '.
"WHERE id_observation = $obsIdP ".
' -- '.__FILE__.' : '.__LINE__;
$auteurInfo = $this->bdd->recuperer($requete);
return $auteurInfo['ce_utilisateur'];
}
 
$obsId = $proposition['ce_observation'];
// obtenirInformationsObservation()
$realAuteurId = $this->bdd->recuperer(sprintf('SELECT ce_utilisateur FROM del_observation WHERE id_observation = %d',
intval($obsId)));
$realAuteurId = $realAuteurId['ce_utilisateur']; // XXX: PHP-5.3
private function verifierDroitUtilisateur() {
$controleAcces = $this->conteneur->getControleAcces();
$utilisateurInfos = $controleAcces->getInfosUtilisateurConnecte();
$utilisateurId = $utilisateurInfos['id_utilisateur'];
 
if(! $this->validationReqOriginMatchObsAuthor($realAuteurId)) {
throw new Exception("Seul l'utilisateur ayant saisi l'observation peut la valider : veuillez vous identifier.\n",
RestServeur::HTTP_CODE_ERREUR);
if ($this->idAuteurObs != $utilisateurId) {
$msg = "Seul l'utilisateur ayant saisi l'observation peut la valider : veuillez vous identifier.\n";
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
 
$parametres_formates = array_intersect_key($proposition,
array_flip($champs_a_modifier));
$parametres_formates = array_merge($parametres_formates,
array('id_observation' => $obsId,
'ce_utilisateur' => $realAuteurId,
// on change la "certitude" de l'observation correspondante
'certitude' => 'Certaine',
'obsKeywordDelete' => 'adeterminer'));
$ret = $this->conteneur->getRestClient()->modifier($this->conteneur->getParametre('url_service_validation_base') . $obsId,
$parametres_formates);
// cf cel/jrest/services/CelValidationObservation.php::updateElement()
// TODO: check sur HTTP code == 200, plutôt que sur texte
if($ret == 'ok' || $ret == 'OK') {
// remet à 0 le status "proposition_retenue" pour toutes les propositions faites sur cette
// observation à l'exception de celle désormais validée
$this->bdd->requeter(sprintf('UPDATE del_commentaire SET proposition_retenue = IF(id_commentaire = %d, 1, 0)' .
' WHERE ce_observation = %d -- %s',
$proposition['id_commentaire'], $obsId, __FILE__ . ':' . __LINE__));
}
return $ret;
}
 
private function validationReqOriginMatchObsAuthor($ce_utilisateur) {
$controle_utilisateur = $this->conteneur->getControleAcces();
$utilisateur_connecte = $controle_utilisateur->getInfosUtilisateurConnecte();
return $ce_utilisateur == $utilisateur_connecte['id_utilisateur'];
/**
* Remet à 0 le status "proposition_retenue" pour toutes les propositions faites sur cette
* observation à l'exception de celle désormais validée
*/
private function mettreAJourPropositionRetenue() {
$requete = 'UPDATE del_commentaire '.
"SET proposition_retenue = IF(id_commentaire = {$this->idProposition}, 1, 0) ".
"WHERE ce_observation = {$this->idObs} ".
' -- '.__FILE__.' : '.__LINE__;
return $this->bdd->requeter($requete);
}
}
/trunk/services/configurations/config.defaut.ini
67,22 → 67,19
url_service_base = "{ref:url_base}service:del:0.1/"
; URL de base des services d'eFlore
url_service_base_eflore = "{ref:url_base}service:eflore:0.1/"
 
; URL de base des services du CEL
url_service_base_cel = "{ref:url_base}service:cel:"
urlServiceBaseCel = "{ref:url_base}service-test:cel:"
; Service du CEL pour manipuler une image à distance
urlServiceCelImage = "{ref:urlServiceBaseCel}CelImage/";
; Service du CEL pour manipuler une observation à distance
urlServiceCelObs = "{ref:urlServiceBaseCel}CelObs/";
 
; URL de base des services appelé lors de la validation
; un POST est effectué à cette adresse, ce qui tolère les réécritures d'URL
; mais non les 30x. En cas de Cel distinct d'Eflore, et indépendemment de l'URI,
; pointer vers l'hôte final, eg: http://moncel/jrest/CelValidationObservation/
url_service_validation_base = "{ref:url_service_base_cel}CelValidationObservation/";
;
url_service_suppression_image = "{ref:url_service_base_cel}CelSuppressionImage/";
 
; URL de base du service appelé pour autocompléter les noms de taxons
url_service_completion_base = "{ref:url_service_base_eflore}%s/noms?masque=%s&recherche=etendue&retour.format=min&navigation.limite=50&ns.structure=au";
 
; +------------------------------------------------------------------------------------------------------+
; Espaces de noms
; Espaces de noms
cheminDelCommun = "../commun"
 
; +------------------------------------------------------------------------------------------------------+
/trunk/services/configurations/config_observations.ini
14,10 → 14,7
 
; +------------------------------------------------------------------------------------------------------+
; Config spécifique au projet
; Noms des services disponibles pour ce projet
servicesDispo = "observation, vote"
 
 
[mapping_observation]
id_observation = "id_observation"
date_observation = "date_observation"
/trunk/services
Property changes:
Added: svn:mergeinfo
Merged /branches/v1.2-lithium/services:r1676
Merged /branches/v1.0-hydrogene/services:r1507