Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 1914 → Rev 1913

/branches/v1.7-croissant/build.properties
File deleted
/branches/v1.7-croissant/TODO
File deleted
/branches/v1.7-croissant/vendors/PHPExcel/issue-79.patch
File deleted
/branches/v1.7-croissant/vendors/PHPExcel/f44b41242023265192efa5d4dd1dbf1dcb0d7cd1.diff
File deleted
/branches/v1.7-croissant/vendors/gwt-ext-ux/UploadDialog/Ext.ux.UploadDialog.js
File deleted
\ No newline at end of file
/branches/v1.7-croissant/vendors/gwt-ext-ux/UploadDialog/README.txt
File deleted
\ No newline at end of file
/branches/v1.7-croissant/vendors/gwt-ext-ux/UploadDialog/Ext.ux.UploadDialog.packed.js
File deleted
\ No newline at end of file
/branches/v1.7-croissant/build.xml
1,87 → 1,25
<project name="cel_GWT2" xmlns:artifact="urn:maven-artifact-ant" basedir=".">
 
<property file="build.properties"/>
<property name="extjsdestdir" value="src/org/tela_botanica/public/js/ext"/>
<target name="init">
<property file="local.properties" />
<property name="server-url" value="${server-url}" />
<property name="server-login" value="${server-login}" />
<property name="server-password" value="${server-password}" />
<property name="server-dir" value="${server-dir}" />
<property name="gwt-path" value="${gwt-path}" />
</target>
<target name="generate-vocabulary" depends="init">
 
<target name="init">
<property file="local.properties" />
<property name="server-url" value="${server-url}" />
<property name="server-login" value="${server-login}" />
<property name="server-password" value="${server-password}" />
<property name="server-dir" value="${server-dir}" />
<property name="gwt-path" value="${gwt-path}" />
</target>
 
<target name="generate-vocabulary" depends="init">
<java classname="com.google.gwt.i18n.tools.I18NSync" fork="true">
<arg value="org.tela_botanica.client.i18n.VocabulaireMetadonnees" />
<classpath>
<path>
<pathelement location="${gwt-path}/gwt-user.jar" />
<pathelement location="${gwt-path}/gwt-dev.jar" />
<pathelement location="src" />
</path>
</classpath>
</java>
</target>
 
 
<path id="gwt">
<fileset includes="*.jar" dir="${gwt-path}/gwt/build/lib"/>
<fileset includes="*.jar" dir="${gwt-path}/gwt-google-apis/maps/build/lib"/>
<fileset includes="gwtext.jar" dir="${gwt-path}/gwt-ext/build/lib"/>
<!-- alternativement, en cas de passage (très hypothétique) a gwt 3:
<fileset includes="gxt-legacy-3.0.1.jar" dir="${gwt-path}/gxt"/>
<fileset includes="gxt-3.0.1.jar" dir="${gwt-path}/gxt"/> -->
<fileset includes="*.jar" dir="${gwt-path}/gwt-ext-ux/build/lib"/>
<pathelement location="src" />
</path>
 
<!-- todo: must be inside cel2.gwt.xml in some way -->
<target name="link-resources">
<mkdir dir="${extjsdestdir}"/>
<mkdir dir="${extjsdestdir}/adapter/ext"/> <!-- normalement optionnel en extjs 4.2.1 -->
<symlink overwrite="true" link="${extjsdestdir}/adapter/ext/" resource="${extjsdir}/adapter/ext/ext-base.js"/>
<symlink overwrite="true" link="${extjsdestdir}" resource="${extjsdir}/ext-all.js"/>
<symlink overwrite="true" link="${extjsdestdir}" resource="${extjsdir}/resources"/>
</target>
 
 
<target name="test"><echoproperties/></target> <!-- sometimes useful -->
 
<target name="compile" depends="link-resources">
<!-- <java classname="com.google.gwt.dev.GWTCompiler" fork="true"> -->
<java classname="com.google.gwt.dev.Compiler" fork="true">
<arg line="-localWorkers 2 -style DETAILED ${projectName}"/>
<!-- <arg line="-out build/gwtOutput"/> -->
<classpath refid="gwt"/>
</java>
</target>
 
<target name="quick" depends="link-resources">
<java classname="com.google.gwt.dev.Compiler" fork="true">
<arg line="-style DETAILED -draftCompile ${projectTestName}" />
<classpath refid="gwt"/>
</java>
</target>
 
 
<target name="debug" depends="link-resources">
<java classname="com.google.gwt.dev.Compiler" fork="true">
<arg line="-style DETAILED -logLevel DEBUG"/> <!-- TRACE -->
<arg value="${projectName}" />
<classpath refid="gwt"/>
</java>
</target>
 
 
<target name="live">
<java classname="com.google.gwt.dev.DevMode" spawn="true" fork="true">
<arg line="-startupUrl http://${celhost}/war/cel2.html -noserver -codeServerPort auto ${projectName}" />
<classpath refid="gwt"/>
</java>
</target>
 
 
</project>
<java classname="com.google.gwt.i18n.tools.I18NSync" fork="true">
<arg value="org.tela_botanica.client.i18n.VocabulaireMetadonnees" />
<classpath>
<path>
<pathelement location="${gwt-path}/gwt-user.jar" />
<pathelement location="${gwt-path}/gwt-dev.jar" />
<pathelement location="src" />
</path>
</classpath>
</java>
</target>
</project>
/branches/v1.7-croissant/widget/modules/cartopoint/squelettes/carte_defaut.tpl.html
248,7 → 248,7
<td>
<span class="nom-sci">&nbsp;
{{if nn != null && nn != 0 && nn != ''}}
<a href="${urlEflore}"
<a href="{urlEflore}"
onclick="ouvrirNouvelleFenetre(this, event)">
${nomSci}
</a>
/branches/v1.7-croissant/widget/modules/photo/Photo.php
176,8 → 176,8
$item['eflore_url'] = $item['lien'] ;
}
// Récupération du GUID - aaaaah c'est cracra si on change la config yatoukipett !! Satan is in this code !!!
if (preg_match($this->config['photo']['motif_guid'], $entree->guid, $match)) {
// Récupération du GUID
if (preg_match('/appli:cel-img:([0-9]+)[^.]+\.jpg$/', $entree->guid, $match)) {
$item['guid'] = (int) $match[1];
} else {
$item['guid'] = $entree->guid;
/branches/v1.7-croissant/widget/modules/photo/config.defaut.ini
1,10 → 1,8
[photo]
; Chemin pour l'autoload à ajouter
autoload = "bibliotheque/;bibliotheque/xml_feed_parser/1.0.4/;bibliotheque/xml_feed_parser/1.0.4/parsers/"
; URL ou chemin du flux RSS contenant les liens vers les photos - ne pas oublier de changer motif_guid en même temps!
; URL ou chemin du flux RSS contenant les liens vers les photos
fluxRssUrl = "http://www.tela-botanica.org/service:cel:CelSyndicationImage/multicriteres/atom/M"
; Expression régulière pour récupérer le numéro de l'image à partir de l'URL renvoyée par le flux Atom
motif_guid = "/appli:cel-img:([0-9]+)[^.]+\.jpg$/"
; Squelette d'url pour accéder à la fiche eFlore
efloreUrlTpl = "http://www.tela-botanica.org/bdtfx-nn-%s"
; Nombre de vignette à afficher : nombre de vignettes par ligne et nombre de lignes séparés par une vigule (ex. : 4,3).
/branches/v1.7-croissant/widget/modules/saisie/Saisie.php
23,7 → 23,6
const DS = DIRECTORY_SEPARATOR;
const PROJET_DEFAUT = 'defaut';
const WS_SAISIE = 'CelWidgetSaisie';
const WS_UPLOAD = 'CelWidgetUploadImageTemp';
const WS_OBS = 'CelObs';
const WS_NOM = 'noms';
private $NS_PROJET_VERSION = '1.01';
108,7 → 107,6
$widget['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], '');
$widget['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
$widget['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
$widget['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
$widget['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
 
 
/branches/v1.7-croissant/widget/modules/saisie/squelettes/defaut/defaut.tpl.html
412,7 → 412,7
</div>
</div>
</form>
<form id="form-upload" class="form-horizontal" action="<?= $url_ws_upload ?>?projet=sauvages"
<form id="form-upload" class="form-horizontal" action="<?=$url_base?>saisie?projet=sauvages&amp;service=upload-image"
method="post" enctype="multipart/form-data">
<h2>Image(s) de cette plante</h2>
<strong>Ajouter une image</strong>
/branches/v1.7-croissant/widget/modules/saisie/squelettes/defaut/js/defaut.js
784,9 → 784,9
$("#dialogue-obs-transaction-ko .alert-txt").append('<pre class="msg-erreur">'+erreurMsg+'</pre>');
$("#dialogue-obs-transaction-ko .alert-txt").append('<pre class="msg-debug">Débogage : '+debugMsg+'</pre>');
}
var hrefCourriel = "mailto:cel_remarques@tela-botanica.org?"+
"subject=Dysfonctionnement du widget de saisie "+TAG_PROJET+
"&body="+erreurMsg+"%0D%0ADébogage :%0D%0A"+debugMsg;
var hrefCourriel = "mailto:cel@tela-botanica.org?"+
"subject=Disfonctionnement du widget de saisie "+TAG_PROJET+
"&body="+erreurMsg+"\nDébogage :\n"+debugMsg;
$('#dialogue-obs-transaction-ko .alert-txt').append($("#tpl-transmission-ko").clone()
.find('.courriel-erreur')
/branches/v1.7-croissant/widget/modules/saisie/squelettes/florileges/florileges.tpl.html
904,7 → 904,7
</div>
</form>
<form id="form-upload" class="form-horizontal" action="<?= $url_ws_upload ?>?projet=sauvages"
<form id="form-upload" class="form-horizontal" action="<?=$url_base?>saisie?projet=sauvages&amp;service=upload-image"
method="post" enctype="multipart/form-data">
<div class="row-fluid">
<div class="span12 well">
/branches/v1.7-croissant/widget/modules/saisie/squelettes/sauvages/js/sauvages.js
555,7 → 555,6
'num_nom_ret' : taxons[numNomSel]['num_nom_ret'],
'num_taxon' : taxons[numNomSel]['num_taxon'],
'famille' : taxons[numNomSel]['famille'],
'nom_referentiel' : 'bdtfx',
'nom_fr' : taxons[numNomSel]['nom_fr'],
'milieu' : milieux.join(','),
'latitude' : $("#latitude").val(),
/branches/v1.7-croissant/widget/modules/saisie/squelettes/sauvages/sauvages.tpl.html
232,7 → 232,7
</form>
<div id="zone-fiche-terrain-photo">
<form id="form-upload" action="<?= $url_ws_upload ?>?projet=sauvages"
<form id="form-upload" action="<?=$url_base?>saisie?projet=sauvages&amp;service=upload-image"
method="post" enctype="multipart/form-data">
<fieldset id="partie-photo">
<legend>Ajouter une photo</legend>
/branches/v1.7-croissant/widget/modules/saisie/squelettes/biodiversite34/js/biodiversite34.js
114,7 → 114,6
'num_nom_ret' : taxons[numNomSel]['num_nom_ret'],
'num_taxon' : taxons[numNomSel]['num_taxon'],
'famille' : taxons[numNomSel]['famille'],
'nom_referentiel' : 'bdtfx',
'nom_fr' : taxons[numNomSel]['nom_fr'],
'milieu' : $("#milieu option:selected").val(),
'latitude' : $("#latitude").val(),
/branches/v1.7-croissant/widget/modules/saisie
Property changes:
Modified: svn:mergeinfo
Reverse-merged /trunk/widget/modules/saisie:r1840-1913
/branches/v1.7-croissant/widget/widget.ini.defaut.php
34,7 → 34,7
baseURLServicesEfloreTpl = "http://www.tela-botanica.org/service:eflore:%s/%s/%s"
; Dossier de stockage temporaire des images (ATTENTION : mettre le slash à la fin)
imagesTempDossier = "/home/telabotap/www/eflore/cel/cache/images/"
; Squelette d'URL pour les images temporaires sotckées sur le serveur - OBSOLETE
; Squelette d'URL pour les images temporaires sotckées sur le serveur
imagesTempUrlTpl = "http://www.tela-botanica.org/eflore/cel/cache/images/%s"
; Url du service fournissant des infos sur les noms à partir d'un num tax
infosTaxonUrl = "http://www.tela-botanica.org/service:eflore:0.1/bdtfx/noms/%s"
/branches/v1.7-croissant/doc/bdd/schema_bdd_cel_v2.mwb
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.7-croissant/doc/bdd/cel_v2.sql
8,13 → 8,13
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_obs_images` ;
 
CREATE TABLE IF NOT EXISTS `cel_obs_images` (
`id_image` BIGINT NOT NULL,
`id_observation` BIGINT NOT NULL,
`date_liaison` DATETIME NOT NULL,
PRIMARY KEY (`id_image`, `id_observation`),
INDEX `observation` (`id_observation` ASC),
INDEX `image` (`id_image` ASC))
CREATE TABLE IF NOT EXISTS `cel_obs_images` (
`id_image` BIGINT NOT NULL ,
`id_observation` BIGINT NOT NULL ,
`date_liaison` DATETIME NOT NULL ,
PRIMARY KEY (`id_image`, `id_observation`) ,
INDEX `observation` (`id_observation` ASC) ,
INDEX `image` (`id_image` ASC) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
25,17 → 25,17
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_utilisateurs` ;
 
CREATE TABLE IF NOT EXISTS `cel_utilisateurs` (
`id_utilisateur` INT NOT NULL,
`prenom` VARCHAR(255) NULL DEFAULT NULL,
`nom` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`courriel` VARCHAR(255) NOT NULL,
`mot_de_passe` VARCHAR(45) NOT NULL,
`admin` TINYINT(1) NULL DEFAULT '0',
`licence_acceptee` TINYINT(1) NULL DEFAULT '0' COMMENT 'Acceptation de la licence utilisateur pour le cel\n',
`preferences` LONGTEXT NULL DEFAULT NULL COMMENT 'Préférences utilisateur sérialisées sous une forme à définir\n',
`date__premiere_utilisation` DATETIME NOT NULL,
PRIMARY KEY (`id_utilisateur`))
CREATE TABLE IF NOT EXISTS `cel_utilisateurs` (
`id_utilisateur` INT NOT NULL ,
`prenom` VARCHAR(255) NULL DEFAULT NULL ,
`nom` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`courriel` VARCHAR(255) NOT NULL ,
`mot_de_passe` VARCHAR(45) NOT NULL ,
`admin` TINYINT(1) NULL DEFAULT '0' ,
`licence_acceptee` TINYINT(1) NULL DEFAULT '0' COMMENT 'Acceptation de la licence utilisateur pour le cel\n' ,
`preferences` LONGTEXT NULL DEFAULT NULL COMMENT 'Préférences utilisateur sérialisées sous une forme à définir\n' ,
`date__premiere_utilisation` DATETIME NOT NULL ,
PRIMARY KEY (`id_utilisateur`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
46,24 → 46,24
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_mots_cles_images` ;
 
CREATE TABLE IF NOT EXISTS `cel_mots_cles_images` (
`id_mot_cle_image` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL COMMENT 'Identifiant du mot-clé pour une position donnée dans l\'arbre d\'utilisateur.\nLe même mot-clé peut être placé à plusieurs endroits de l\'arbre et aura donc deux id distincts.',
`id_utilisateur` VARCHAR(255) NOT NULL,
`mot_cle` VARCHAR(50) NOT NULL COMMENT 'Mot clé de l\'utilisateur pour une position dans l\'arbre.',
`md5` VARCHAR(32) NOT NULL COMMENT 'MD5 du mot clé en minuscule.',
`bg` BIGINT NOT NULL COMMENT 'Bordure gauche.',
`bd` BIGINT NOT NULL COMMENT 'bordure droite.',
`niveau` INT NOT NULL COMMENT 'Niveau du mot clé dans l\'arbre.',
`ce_mot_cle_image_parent` VARCHAR(128) NOT NULL,
PRIMARY KEY (`id_mot_cle_image`, `id_utilisateur`),
CREATE TABLE IF NOT EXISTS `cel_mots_cles_images` (
`id_mot_cle_image` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL COMMENT 'Identifiant du mot-clé pour une position donnée dans l\'arbre d\'utilisateur.\nLe même mot-clé peut être placé à plusieurs endroits de l\'arbre et aura donc deux id distincts.' ,
`id_utilisateur` VARCHAR(255) NOT NULL ,
`mot_cle` VARCHAR(50) NOT NULL COMMENT 'Mot clé de l\'utilisateur pour une position dans l\'arbre.' ,
`md5` VARCHAR(32) NOT NULL COMMENT 'MD5 du mot clé en minuscule.' ,
`bg` BIGINT NOT NULL COMMENT 'Bordure gauche.' ,
`bd` BIGINT NOT NULL COMMENT 'bordure droite.' ,
`niveau` INT NOT NULL COMMENT 'Niveau du mot clé dans l\'arbre.' ,
`ce_mot_cle_image_parent` VARCHAR(128) NOT NULL ,
PRIMARY KEY (`id_mot_cle_image`, `id_utilisateur`) ,
CONSTRAINT `fk_cel_mots_cles_images_cel_utilisateur1`
FOREIGN KEY (`id_utilisateur`)
REFERENCES `cel_utilisateurs` (`id_utilisateur`)
FOREIGN KEY (`id_utilisateur` )
REFERENCES `cel_utilisateurs` (`id_utilisateur` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_cel_mots_cles_images_cel_mots_cles_images1`
FOREIGN KEY (`ce_mot_cle_image_parent`)
REFERENCES `cel_mots_cles_images` (`id_mot_cle_image`)
FOREIGN KEY (`ce_mot_cle_image_parent` )
REFERENCES `cel_mots_cles_images` (`id_mot_cle_image` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
78,12 → 78,12
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_images_mots_cles` ;
 
CREATE TABLE IF NOT EXISTS `cel_images_mots_cles` (
`id_image` BIGINT NOT NULL,
`id_mot_cle_image` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`id_utilisateur` VARCHAR(128) NOT NULL,
PRIMARY KEY (`id_image`, `id_mot_cle_image`, `id_utilisateur`),
INDEX `image` (`id_image` ASC))
CREATE TABLE IF NOT EXISTS `cel_images_mots_cles` (
`id_image` BIGINT NOT NULL ,
`id_mot_cle_image` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`id_utilisateur` VARCHAR(128) NOT NULL ,
PRIMARY KEY (`id_image`, `id_mot_cle_image`, `id_utilisateur`) ,
INDEX `image` (`id_image` ASC) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
94,33 → 94,33
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_images` ;
 
CREATE TABLE IF NOT EXISTS `cel_images` (
`id_image` BIGINT NOT NULL AUTO_INCREMENT,
`ordre` BIGINT NOT NULL,
`ce_utilisateur` VARCHAR(255) NOT NULL COMMENT 'L\'id utilisateur est un int mais on utilise un varchar pour stocker des observations avec des identifiants temporaires\n',
`prenom_utilisateur` VARCHAR(255) NULL DEFAULT NULL,
`nom_utilisateur` VARCHAR(255) NULL DEFAULT NULL,
`courriel_utilisateur` VARCHAR(255) NULL DEFAULT NULL,
`hauteur` INT NOT NULL,
`largeur` INT NOT NULL,
`appareil_fabriquant` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`appareil_modele` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`date_prise_de_vue` DATETIME NULL DEFAULT NULL,
`note_qualite` DECIMAL(1,0) NULL DEFAULT NULL,
`mots_cles_texte` LONGTEXT NULL DEFAULT NULL COMMENT 'Champ calculé contenant la liste des mots clés utilisateurs séparé par des virgules.\n',
`commentaire` LONGTEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`nom_original` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`md5` VARCHAR(32) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`meta_exif` LONGTEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`meta_iptc` LONGTEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL,
`meta_xmp` LONGTEXT NULL DEFAULT NULL,
`meta_makernote` LONGTEXT NULL DEFAULT NULL,
`meta_autres` LONGTEXT NULL DEFAULT NULL,
`date_modification` DATETIME NOT NULL,
`date_creation` DATETIME NOT NULL COMMENT 'Date d\'ajout de l\'image au CEL.',
`publiable_eflore` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id_image`),
INDEX `id_image` (`id_image` ASC, `ordre` ASC, `ce_utilisateur` ASC))
CREATE TABLE IF NOT EXISTS `cel_images` (
`id_image` BIGINT NOT NULL AUTO_INCREMENT ,
`ordre` BIGINT NOT NULL ,
`ce_utilisateur` VARCHAR(255) NOT NULL COMMENT 'L\'id utilisateur est un int mais on utilise un varchar pour stocker des observations avec des identifiants temporaires\n' ,
`prenom_utilisateur` VARCHAR(255) NULL DEFAULT NULL ,
`nom_utilisateur` VARCHAR(255) NULL DEFAULT NULL ,
`courriel_utilisateur` VARCHAR(255) NULL DEFAULT NULL ,
`hauteur` INT NOT NULL ,
`largeur` INT NOT NULL ,
`appareil_fabriquant` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`appareil_modele` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`date_prise_de_vue` DATETIME NULL DEFAULT NULL ,
`note_qualite` DECIMAL(1,0) NULL DEFAULT NULL ,
`mots_cles_texte` LONGTEXT NULL DEFAULT NULL COMMENT 'Champ calculé contenant la liste des mots clés utilisateurs séparé par des virgules.\n' ,
`commentaire` LONGTEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`nom_original` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`md5` VARCHAR(32) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`meta_exif` LONGTEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`meta_iptc` LONGTEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NULL DEFAULT NULL ,
`meta_xmp` LONGTEXT NULL DEFAULT NULL ,
`meta_makernote` LONGTEXT NULL DEFAULT NULL ,
`meta_autres` LONGTEXT NULL DEFAULT NULL ,
`date_modification` DATETIME NOT NULL ,
`date_creation` DATETIME NOT NULL COMMENT 'Date d\'ajout de l\'image au CEL.' ,
`publiable_eflore` TINYINT(1) NOT NULL DEFAULT 1 ,
PRIMARY KEY (`id_image`) ,
INDEX `id_image` (`id_image` ASC, `ordre` ASC, `ce_utilisateur` ASC) )
ENGINE = MyISAM
AUTO_INCREMENT = 265
DEFAULT CHARACTER SET = utf8
132,24 → 132,24
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_mots_cles_obs` ;
 
CREATE TABLE IF NOT EXISTS `cel_mots_cles_obs` (
`id_mot_cle_obs` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`id_utilisateur` VARCHAR(255) NOT NULL,
`mot_cle` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`md5` VARCHAR(32) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`bg` BIGINT NOT NULL,
`bd` BIGINT NOT NULL,
`niveau` INT NOT NULL,
`ce_mot_cle_obs_parent` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
PRIMARY KEY (`id_mot_cle_obs`, `id_utilisateur`),
CREATE TABLE IF NOT EXISTS `cel_mots_cles_obs` (
`id_mot_cle_obs` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`id_utilisateur` VARCHAR(255) NOT NULL ,
`mot_cle` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`md5` VARCHAR(32) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`bg` BIGINT NOT NULL ,
`bd` BIGINT NOT NULL ,
`niveau` INT NOT NULL ,
`ce_mot_cle_obs_parent` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
PRIMARY KEY (`id_mot_cle_obs`, `id_utilisateur`) ,
CONSTRAINT `fk_cel_mots_cles_obs_cel_utilisateur1`
FOREIGN KEY (`id_utilisateur`)
REFERENCES `cel_utilisateurs` (`id_utilisateur`)
FOREIGN KEY (`id_utilisateur` )
REFERENCES `cel_utilisateurs` (`id_utilisateur` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_cel_mots_cles_obs_cel_mots_cles_obs1`
FOREIGN KEY (`ce_mot_cle_obs_parent`)
REFERENCES `cel_mots_cles_obs` (`id_mot_cle_obs`)
FOREIGN KEY (`ce_mot_cle_obs_parent` )
REFERENCES `cel_mots_cles_obs` (`id_mot_cle_obs` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
164,12 → 164,12
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_obs_mots_cles` ;
 
CREATE TABLE IF NOT EXISTS `cel_obs_mots_cles` (
`id_observation` BIGINT NOT NULL,
`id_mot_cle_obs` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`id_utilisateur` VARCHAR(128) NOT NULL,
PRIMARY KEY (`id_observation`, `id_mot_cle_obs`, `id_utilisateur`),
INDEX `observation` (`id_observation` ASC))
CREATE TABLE IF NOT EXISTS `cel_obs_mots_cles` (
`id_observation` BIGINT NOT NULL ,
`id_mot_cle_obs` VARCHAR(128) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
`id_utilisateur` VARCHAR(128) NOT NULL ,
PRIMARY KEY (`id_observation`, `id_mot_cle_obs`, `id_utilisateur`) ,
INDEX `observation` (`id_observation` ASC) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
180,22 → 180,22
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_zones_geo` ;
 
CREATE TABLE IF NOT EXISTS `cel_zones_geo` (
`id_zone_geo` VARCHAR(50) NOT NULL,
`code` VARCHAR(10) NOT NULL,
`nom` VARCHAR(255) NOT NULL,
`utm_secteur` CHAR(3) NOT NULL,
`utm_x` INT NOT NULL DEFAULT '0',
`utm_y` INT NOT NULL DEFAULT '0',
`wgs84_latitude` FLOAT NOT NULL,
`wgs84_longitude` FLOAT NOT NULL,
`date_modification` DATETIME NOT NULL,
`ce_zone_geo_parente` VARCHAR(50) NULL DEFAULT NULL,
`bg` BIGINT NULL,
`bd` BIGINT NULL,
`niveau` INT NULL,
PRIMARY KEY (`id_zone_geo`),
INDEX `nom` (`nom` ASC))
CREATE TABLE IF NOT EXISTS `cel_zones_geo` (
`id_zone_geo` VARCHAR(50) NOT NULL ,
`code` VARCHAR(10) NOT NULL ,
`nom` VARCHAR(255) NOT NULL ,
`utm_secteur` CHAR(3) NOT NULL ,
`utm_x` INT NOT NULL DEFAULT '0' ,
`utm_y` INT NOT NULL DEFAULT '0' ,
`wgs84_latitude` FLOAT NOT NULL ,
`wgs84_longitude` FLOAT NOT NULL ,
`date_modification` DATETIME NOT NULL ,
`ce_zone_geo_parente` VARCHAR(50) NULL DEFAULT NULL ,
`bg` BIGINT NULL ,
`bd` BIGINT NULL ,
`niveau` INT NULL ,
PRIMARY KEY (`id_zone_geo`) ,
INDEX `nom` (`nom` ASC) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
206,12 → 206,12
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_obs_etendues` ;
 
CREATE TABLE IF NOT EXISTS `cel_obs_etendues` (
`id_observation` BIGINT NOT NULL,
`cle` VARCHAR(255) NOT NULL COMMENT 'Clé du champ au format chat mot (sans accents).\nEx. : maCle, uneAutreCle',
`label` VARCHAR(255) NOT NULL COMMENT 'Intitulé du champ à afficher dans les formulaires.',
`valeur` TEXT NOT NULL COMMENT 'Valeur du champ.',
PRIMARY KEY (`id_observation`, `cle`))
CREATE TABLE IF NOT EXISTS `cel_obs_etendues` (
`id_observation` BIGINT NOT NULL ,
`cle` VARCHAR(255) NOT NULL COMMENT 'Clé du champ au format chat mot (sans accents).\nEx. : maCle, uneAutreCle' ,
`label` VARCHAR(255) NOT NULL COMMENT 'Intitulé du champ à afficher dans les formulaires.' ,
`valeur` TEXT NOT NULL COMMENT 'Valeur du champ.' ,
PRIMARY KEY (`id_observation`, `cle`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
223,49 → 223,49
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_obs` ;
 
CREATE TABLE IF NOT EXISTS `cel_obs` (
`id_observation` BIGINT NOT NULL AUTO_INCREMENT,
`ordre` BIGINT NOT NULL,
`ce_utilisateur` VARCHAR(255) NOT NULL,
`prenom_utilisateur` VARCHAR(255) NULL DEFAULT NULL,
`nom_utilisateur` VARCHAR(255) NULL DEFAULT NULL,
`courriel_utilisateur` VARCHAR(255) NULL DEFAULT NULL,
`nom_sel` VARCHAR(601) NULL DEFAULT NULL COMMENT 'doit pouvoir contenir CONCAT(bdtfx.nom_sci, \" \", bdtfx.auteur) soit 601 caractères',
`nom_sel_nn` DECIMAL(9,0) NULL DEFAULT NULL COMMENT 'Numéro du nom sélectionné.',
`nom_ret` VARCHAR(601) NULL DEFAULT NULL COMMENT 'doit pouvoir contenir CONCAT(bdtfx.nom_sci, \" \", bdtfx.auteur) soit 601 caractères',
`nom_ret_nn` DECIMAL(9,0) NULL DEFAULT NULL COMMENT 'Numéro du nom retenu = num_nom_retenu dans bdtfx',
`nt` DECIMAL(9,0) NULL DEFAULT NULL COMMENT 'Numéro taxonomique.',
`famille` VARCHAR(255) NULL DEFAULT NULL,
`nom_referentiel` VARCHAR(255) NULL DEFAULT NULL,
`ce_zone_geo` VARCHAR(50) NULL DEFAULT NULL,
`zone_geo` VARCHAR(255) NULL DEFAULT NULL,
`lieudit` VARCHAR(255) NULL DEFAULT NULL,
`station` VARCHAR(255) NULL DEFAULT NULL,
`milieu` VARCHAR(255) NULL DEFAULT NULL,
`latitude` DECIMAL(8,5) NULL DEFAULT NULL,
`longitude` DECIMAL(8,5) NULL DEFAULT NULL,
`altitude` INT(5) NULL DEFAULT NULL,
`geodatum` VARCHAR(25) NULL DEFAULT NULL COMMENT 'Référentiel géographique utilisé.\nPar exmple : WGS84',
`date_observation` DATETIME NULL DEFAULT NULL,
`mots_cles_texte` LONGTEXT NULL DEFAULT NULL COMMENT 'Champ calculé contenant la liste des mots clés utilisateurs séparé par des virgules.',
`commentaire` TEXT NULL DEFAULT NULL,
`transmission` TINYINT(1) NULL DEFAULT NULL,
`date_creation` DATETIME NULL DEFAULT NULL,
`date_modification` DATETIME NULL DEFAULT NULL,
`date_transmission` DATETIME NULL DEFAULT NULL,
`abondance` VARCHAR(50) NULL DEFAULT NULL,
`certitude` VARCHAR(255) NULL DEFAULT NULL,
`phenologie` VARCHAR(255) NULL DEFAULT NULL,
`code_insee_calcule` VARCHAR(5) NULL DEFAULT NULL COMMENT 'Code INSEE calculé par un scrip CRON.',
PRIMARY KEY (`id_observation`),
UNIQUE INDEX `id_obs` (`ce_utilisateur` ASC, `ordre` ASC),
INDEX `date_creation` (`ce_utilisateur`(10) ASC, `date_creation` ASC),
INDEX `coordonnees` (`latitude` ASC, `longitude` ASC),
INDEX `nom_retenu` (`nom_ret` ASC),
INDEX `date_observation` (`date_observation` ASC),
INDEX `nom_referentiel` (`nom_referentiel`(5) ASC) COMMENT ' /* comment truncated */ /*Index sur (bdtfx,bdtfx,isfan)*/',
INDEX `date_transmission` (`date_transmission` DESC) COMMENT ' /* comment truncated */ /*Date_transmission : nécessaire à l'ORDER BY utilisé dans la liste d'observation de DEL*/',
INDEX `transmission` (`transmission` ASC) COMMENT ' /* comment truncated */ /*Nécessaire à CEL/DEL qui officie avec transmission = 1*/')
CREATE TABLE IF NOT EXISTS `cel_obs` (
`id_observation` BIGINT NOT NULL AUTO_INCREMENT ,
`ordre` BIGINT NOT NULL ,
`ce_utilisateur` VARCHAR(255) NOT NULL ,
`prenom_utilisateur` VARCHAR(255) NULL DEFAULT NULL ,
`nom_utilisateur` VARCHAR(255) NULL DEFAULT NULL ,
`courriel_utilisateur` VARCHAR(255) NULL DEFAULT NULL ,
`nom_sel` VARCHAR(601) NULL DEFAULT NULL COMMENT 'doit pouvoir contenir CONCAT(bdtfx.nom_sci, \" \", bdtfx.auteur) soit 601 caractères' ,
`nom_sel_nn` DECIMAL(9,0) NULL DEFAULT NULL COMMENT 'Numéro du nom sélectionné.' ,
`nom_ret` VARCHAR(601) NULL DEFAULT NULL COMMENT 'doit pouvoir contenir CONCAT(bdtfx.nom_sci, \" \", bdtfx.auteur) soit 601 caractères' ,
`nom_ret_nn` DECIMAL(9,0) NULL DEFAULT NULL COMMENT 'Numéro du nom retenu = num_nom_retenu dans bdtfx' ,
`nt` DECIMAL(9,0) NULL DEFAULT NULL COMMENT 'Numéro taxonomique.' ,
`famille` VARCHAR(255) NULL DEFAULT NULL ,
`nom_referentiel` VARCHAR(255) NULL DEFAULT NULL ,
`ce_zone_geo` VARCHAR(50) NULL DEFAULT NULL ,
`zone_geo` VARCHAR(255) NULL DEFAULT NULL ,
`lieudit` VARCHAR(255) NULL DEFAULT NULL ,
`station` VARCHAR(255) NULL DEFAULT NULL ,
`milieu` VARCHAR(255) NULL DEFAULT NULL ,
`latitude` DECIMAL(8,5) NULL DEFAULT NULL ,
`longitude` DECIMAL(8,5) NULL DEFAULT NULL ,
`altitude` INT(5) NULL DEFAULT NULL ,
`geodatum` VARCHAR(25) NULL DEFAULT NULL COMMENT 'Référentiel géographique utilisé.\nPar exmple : WGS84' ,
`date_observation` DATETIME NULL DEFAULT NULL ,
`mots_cles_texte` LONGTEXT NULL DEFAULT NULL COMMENT 'Champ calculé contenant la liste des mots clés utilisateurs séparé par des virgules.' ,
`commentaire` TEXT NULL DEFAULT NULL ,
`transmission` TINYINT(1) NULL DEFAULT NULL ,
`date_creation` DATETIME NULL DEFAULT NULL ,
`date_modification` DATETIME NULL DEFAULT NULL ,
`date_transmission` DATETIME NULL DEFAULT NULL ,
`abondance` VARCHAR(50) NULL DEFAULT NULL ,
`certitude` VARCHAR(255) NULL DEFAULT NULL ,
`phenologie` VARCHAR(255) NULL DEFAULT NULL ,
`code_insee_calcule` VARCHAR(5) NULL DEFAULT NULL COMMENT 'Code INSEE calculé par un scrip CRON.' ,
PRIMARY KEY (`id_observation`) ,
INDEX `id_obs` (`ordre` ASC, `ce_utilisateur` ASC) ,
INDEX `date_creation` (`ce_utilisateur` ASC, `date_creation` ASC) ,
INDEX `coordonnees` (`latitude` ASC, `longitude` ASC) ,
INDEX `nom_retenu` (`nom_ret` ASC) ,
INDEX `date_observation` (`date_observation` ASC) COMMENT 'Date_transmission : nécessaire à l'ORDER BY utilisé dans la liste d'observation de DEL' ,
INDEX `nom_referentiel` (`nom_referentiel`(5) ASC) COMMENT 'Index sur (bdtfx,bdtfx,isfan)' ,
INDEX `date_transmission` (`date_transmission` DESC) COMMENT 'Nécessaire à CEL/DEL qui officie avec transmission = 1' ,
INDEX `transmission` (`transmission` ASC) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
276,13 → 276,13
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_utilisateurs_infos` ;
 
CREATE TABLE IF NOT EXISTS `cel_utilisateurs_infos` (
`id_utilisateur` INT NOT NULL,
`admin` TINYINT(1) NOT NULL DEFAULT 0,
`licence_acceptee` TINYINT(1) NOT NULL DEFAULT 0,
`preferences` LONGTEXT NULL DEFAULT NULL,
`date_premiere_utilisation` DATETIME NOT NULL,
PRIMARY KEY (`id_utilisateur`))
CREATE TABLE IF NOT EXISTS `cel_utilisateurs_infos` (
`id_utilisateur` INT NOT NULL ,
`admin` TINYINT(1) NOT NULL DEFAULT 0 ,
`licence_acceptee` TINYINT(1) NOT NULL DEFAULT 0 ,
`preferences` LONGTEXT NULL DEFAULT NULL ,
`date_premiere_utilisation` DATETIME NOT NULL ,
PRIMARY KEY (`id_utilisateur`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
294,12 → 294,12
-- -----------------------------------------------------
DROP TABLE IF EXISTS `cel_images_etendues` ;
 
CREATE TABLE IF NOT EXISTS `cel_images_etendues` (
`id_observation` BIGINT NOT NULL,
`cle` VARCHAR(255) NOT NULL COMMENT 'Clé du champ au format chat mot (sans accents).\nEx. : maCle, uneAutreCle',
`label` VARCHAR(45) NOT NULL COMMENT 'Intitulé du champ à afficher dans les formulaires.',
`valeur` TEXT NOT NULL COMMENT 'Valeur du champ.',
PRIMARY KEY (`id_observation`, `cle`))
CREATE TABLE IF NOT EXISTS `cel_images_etendues` (
`id_observation` BIGINT NOT NULL ,
`cle` VARCHAR(255) NOT NULL COMMENT 'Clé du champ au format chat mot (sans accents).\nEx. : maCle, uneAutreCle' ,
`label` VARCHAR(45) NOT NULL COMMENT 'Intitulé du champ à afficher dans les formulaires.' ,
`valeur` TEXT NOT NULL COMMENT 'Valeur du champ.' ,
PRIMARY KEY (`id_observation`, `cle`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
321,10 → 321,10
-- -----------------------------------------------------
DROP VIEW IF EXISTS `cel_utilisateurs` ;
DROP TABLE IF EXISTS `cel_utilisateurs`;
CREATE OR REPLACE VIEW `cel_utilisateurs` AS
SELECT at.U_ID AS id_utilisateur, at.U_SURNAME AS prenom, at.U_NAME AS nom, at.U_MAIL AS courriel, at.U_PASSWD AS mot_de_passe,
ui.licence_acceptee, ui.admin, ui.preferences, ui.date_premiere_utilisation
FROM tela_prod_v4.annuaire_tela AS at
CREATE OR REPLACE VIEW `cel_utilisateurs` AS
SELECT at.U_ID AS id_utilisateur, at.U_SURNAME AS prenom, at.U_NAME AS nom, at.U_MAIL AS courriel, at.U_PASSWD AS mot_de_passe,
ui.licence_acceptee, ui.admin, ui.preferences, ui.date_premiere_utilisation
FROM tela_prod_v4.annuaire_tela AS at
LEFT JOIN cel_utilisateurs_infos AS ui ON (ui.id_utilisateur = at.U_ID);
 
-- -----------------------------------------------------
332,49 → 332,50
-- -----------------------------------------------------
DROP VIEW IF EXISTS `cel_tapir` ;
DROP TABLE IF EXISTS `cel_tapir`;
CREATE OR REPLACE VIEW `cel_tapir` AS
select concat(_utf8'urn:lsid:tela-botanica.org:cel:',`o`.`id_observation`) AS `guid`,
`o`.`id_observation` AS `observation_id`,
date_format(`o`.`date_observation`,'%Y-%m-%d') AS `observation_date`,
`o`.`nom_sel` AS `nom_scientifique_complet`,
`o`.`nom_sel_nn` AS `nom_num_nomenclatural`,
`o`.`nt` AS `nom_num_taxonomique`,
`o`.`famille` AS `nom_famille`,
concat(_utf8'',`zg`.`nom`,' [INSEE:',`zg`.`code`,']') AS `lieu_commune_nom_complet`,
`zg`.`nom` AS `lieu_commune_nom`,
`zg`.`code` AS `lieu_commune_code_insee`,
if((`zg`.`code` <> ''), 'Lion1906 version 26-05-2008 - http://www.lion1906.com/', NULL) AS `lieu_commune_source`,
format(if((`o`.`latitude` <> ''), `o`.`latitude`, `zg`.`wgs84_latitude`), 5) AS `lieu_latitude`,
format(if((`o`.`longitude` <> ''), `o`.`longitude`, `zg`.`wgs84_longitude`), 5) AS `lieu_longitude`,
`o`.`geodatum` AS `lieu_geodatum`,
if((`o`.`geodatum` <> ''), 'Coordonnées issues de l''utilisation de Google Map', NULL) AS `lieu_georeference_source`,
`o`.`lieudit` AS `lieu_localite`,
`o`.`prenom_utilisateur` AS `observateur_prenom`,
`o`.`nom_utilisateur` AS `observateur_nom`,
`o`.`courriel_utilisateur` AS `observateur_courriel`,
concat(`o`.`prenom_utilisateur`,_utf8' ',`o`.`nom_utilisateur`) AS `observateur_nom_complet`,
concat_ws(' ',`o`.`prenom_utilisateur`,`o`.`nom_utilisateur`,concat('<',`o`.`courriel_utilisateur`,'>')) AS `observateur_intitule`,
`o`.`commentaire` AS `observation_commentaire`,
concat(_utf8'nom_num_nomenclatural=',`o`.`nom_sel_nn`,'; ',
'nom_ret=',encodeToDcsv(`o`.`nom_ret`),'; ',
'nom_num_ret=',`o`.`nom_ret_nn`,'; ',
'nom_num_taxonomique=',`o`.`nt`,'; ',
'nom_referentiel=',encodeToDcsv(`o`.`nom_referentiel`),'; ',
'saisie_date_transmission=',`o`.`date_transmission`,'; ',
'saisie_date_creation=',`o`.`date_creation`,'; ',
'ordre=',`o`.`ordre`,'; ',
'station=',encodeToDcsv(`o`.`station`),'; ',
'milieu=',encodeToDcsv(`o`.`milieu`),'; ',
'mots_cles=',encodeToDcsv(`o`.`mots_cles_texte`),'; ',
'zg_utm_secteur=',encodeToDcsv(`zg`.`utm_secteur`),'; ',
'zg_date_modification=',`zg`.`date_modification`) AS `observation_information_complement`,
`o`.`date_modification` AS `saisie_date_modification`,
`o`.`date_creation` AS `saisie_date_creation`
from (`cel_obs` `o`
left join `cel_zones_geo` `zg` on((`o`.`ce_zone_geo` = `zg`.`id_zone_geo`)))
where `o`.`transmission` = 1
CREATE OR REPLACE VIEW `cel_tapir` AS
select concat(_utf8'urn:lsid:tela-botanica.org:cel:',`o`.`id_observation`) AS `guid`,
`o`.`id_observation` AS `observation_id`,
date_format(`o`.`date_observation`,'%Y-%m-%d') AS `observation_date`,
`o`.`nom_sel` AS `nom_scientifique_complet`,
`o`.`nom_sel_nn` AS `nom_num_nomenclatural`,
`o`.`nt` AS `nom_num_taxonomique`,
`o`.`famille` AS `nom_famille`,
concat(_utf8'',`zg`.`nom`,' [INSEE:',`zg`.`code`,']') AS `lieu_commune_nom_complet`,
`zg`.`nom` AS `lieu_commune_nom`,
`zg`.`code` AS `lieu_commune_code_insee`,
if((`zg`.`code` <> ''), 'Lion1906 version 26-05-2008 - http://www.lion1906.com/', NULL) AS `lieu_commune_source`,
format(if((`o`.`latitude` <> ''), `o`.`latitude`, `zg`.`wgs84_latitude`), 5) AS `lieu_latitude`,
format(if((`o`.`longitude` <> ''), `o`.`longitude`, `zg`.`wgs84_longitude`), 5) AS `lieu_longitude`,
`o`.`geodatum` AS `lieu_geodatum`,
if((`o`.`geodatum` <> ''), 'Coordonnées issues de l''utilisation de Google Map', NULL) AS `lieu_georeference_source`,
`o`.`lieudit` AS `lieu_localite`,
`o`.`prenom_utilisateur` AS `observateur_prenom`,
`o`.`nom_utilisateur` AS `observateur_nom`,
`o`.`courriel_utilisateur` AS `observateur_courriel`,
concat(`o`.`prenom_utilisateur`,_utf8' ',`o`.`nom_utilisateur`) AS `observateur_nom_complet`,
concat_ws(' ',`o`.`prenom_utilisateur`,`o`.`nom_utilisateur`,concat('<',`o`.`courriel_utilisateur`,'>')) AS `observateur_intitule`,
`o`.`commentaire` AS `observation_commentaire`,
concat(_utf8'nom_num_nomenclatural=',`o`.`nom_sel_nn`,'; ',
'nom_ret=',encodeToDcsv(`o`.`nom_ret`),'; ',
'nom_num_ret=',`o`.`nom_ret_nn`,'; ',
'nom_num_taxonomique=',`o`.`nt`,'; ',
'nom_referentiel=',encodeToDcsv(`o`.`nom_referentiel`),'; ',
'saisie_date_transmission=',`o`.`date_transmission`,'; ',
'saisie_date_creation=',`o`.`date_creation`,'; ',
'ordre=',`o`.`ordre`,'; ',
'station=',encodeToDcsv(`o`.`station`),'; ',
'milieu=',encodeToDcsv(`o`.`milieu`),'; ',
'mots_cles=',encodeToDcsv(`o`.`mots_cles_texte`),'; ',
'zg_utm_secteur=',encodeToDcsv(`zg`.`utm_secteur`),'; ',
'zg_date_modification=',`zg`.`date_modification`) AS `observation_information_complement`,
`o`.`date_modification` AS `saisie_date_modification`,
`o`.`date_creation` AS `saisie_date_creation`
from (`cel_obs` `o`
left join `cel_zones_geo` `zg` on((`o`.`ce_zone_geo` = `zg`.`id_zone_geo`)))
where `o`.`transmission` = 1
AND (`o`.`mots_cles_texte` NOT LIKE '%sensible%' OR `o`.`mots_cles_texte` IS NULL);
 
 
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
/branches/v1.7-croissant/doc
Property changes:
Added: svn:mergeinfo
Merged /trunk/doc:r1841,1881
Merged /branches/topic-dbsingleton/doc:r1720-1764
/branches/v1.7-croissant/Changelog
1,8 → 1,3
Changements <next>:
config jrest: ajout de api_host, dédié à la simplification des appels aux webservices
config jrest: ajout de images_temp_url, dédié à la lecture des images temporaires du widget de saisie
config widget: imagesTempUrlTpl est désormais obsolète
config widget/photo: ajout de motif_guid
war/config.default.js: bdtfx 2.00 et bdtxa 1.01
 
Changements 20130917 [création de la branche "v1.7-Croissant"]:
/branches/v1.7-croissant/jrest/lib/GestionObservation.php
1,30 → 1,27
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5.2
*
* @category PHP
* @package jrest
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010, 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @link /doc/jrest/
*
* Classe de gestion de l'ajout, modification et suppression des observations
*
* TODO: $sous_requete .= ' date_modification = now() '
* devrait être une clause ON UPDATE ou un TRIGGER
* afin de mettre à jour la date de modification uniquement lorsqu'une modification a effectivement eu lieu
*
*/
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* Classe de gestion de l'ajout, modification et suppression des observations
*
* in=utf8
* out=utf8
*
*/
class GestionObservation extends Cel {
 
static $cel_obs = array(
"id_observation", "ordre", "ce_utilisateur", "prenom_utilisateur", "nom_utilisateur", "courriel_utilisateur", "nom_sel", "nom_sel_nn", "nom_ret", "nom_ret_nn", "nt", "famille", "nom_referentiel",
"ce_zone_geo", "zone_geo", "lieudit", "station", "milieu", "latitude", "longitude", "altitude", "geodatum", "date_observation", "mots_cles_texte", "commentaire", "transmission",
"date_creation", "date_modification", "date_transmission", "abondance", "certitude", "phenologie", "code_insee_calcul");
 
/**
* Ajoute une observation grâce aux paramètres fournis
*
34,28 → 31,13
* @return true ou false suivant le succès de l'opération
*/
public function ajouterObservation($utilisateur, $parametres) {
$origin_params = $parametres;
$base_param = array('nom_sel_nn' => NULL,
'nom_sel' => NULL,
'nom_ret_nn' => NULL,
'nom_referentiel' => NULL);
$parametres = array_merge($base_param, $parametres);
 
$retour = true;
$parametres['ordre'] = $this->renvoyerDernierOrdreUtilisePlusUn($utilisateur);
$this->traiterEspece($parametres);
$this->formaterParametresObservation($parametres);
 
// si la détermination à échoué, alors:
// soit le référentiel d'origine était "valide", soit non
if(!$parametres['nom_sel_nn']) {
// quoiqu'il en soit, on le met à "autre"
$parametres['nom_referentiel'] = Cel::$fallback_referentiel;
}
 
$this->ajoutInfoUtilisateurARequete($parametres);
self::formaterParametresObservation($parametres);
 
$requete_insertion_observation = 'INSERT INTO cel_obs ';
$sous_requete_colonnes = $this->traiterParametresObservationEtConstruireSousRequeteAjout($parametres);
128,12 → 110,13
'nom_sel' => NULL,
'nom_ret_nn' => NULL,
'nom_referentiel' => NULL);
// $parametres = array_merge($base_param, $parametres);
$parametres = array_merge($base_param, $parametres);
$retour = true;
$requete_modification = "UPDATE cel_obs SET " ;
 
// si pas de nom_sel : on supprime les champs automatiques. et le référentiel.
if(false && (!isset($parametres['nom_sel']) || !@$parametres['nom_sel'])) {
if(!isset($parametres['nom_sel']) || !@$parametres['nom_sel']) {
$parametres['nom_referentiel'] = NULL; // pas d'update de traiterParametresObservationEtConstruireSousRequeteMaj()
$requete_modification .= "nom_referentiel = NULL, nom_sel_nn = NULL, nom_ret_nn = NULL, nom_ret = NULL, nt = NULL, famille = NULL,";
}
152,25 → 135,20
famille = IF(SUBSTR(nom_referentiel, 1, 5) != "$r", NULL, famille),
EOF;
}
elseif(isset($parametres['nom_sel'])) {
else {
// uniquement en cas de nom_sel présent
$this->traiterEspece($parametres);
}
$this->formaterParametresObservation($parametres);
 
self::formaterParametresObservation($parametres);
$requete_modification .= $this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) .
" WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur);
 
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
$champ_maj[] = "date_modification = now()";
 
$requete_modification .=
implode(', ', $champ_maj)
. " WHERE ordre IN (".$ordre.") AND ce_utilisateur = ".Cel::db()->proteger($utilisateur);
 
 
// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
// ce qui peut arriver dans les commentaires
// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__);
$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification);
if ($resultat_modification === false) {
$retour = false;
179,39 → 157,6
return $retour;
}
 
/**
* @return nombre d'observations mises à jour, ou FALSE en cas de problème
*/
static function modifierMultiplesObservation($utilisateur, Array $ordre, $parametres) {
// nous pouvons aussi retirer 'ce_utilisateur' (== $utilisateur) qui sera dans la clause WHERE
$exclusions = array('nom_sel_nn', 'nom_sel', 'nom_ret_nn', 'nom_referentiel', 'ce_utilisateur');
$parametres = array_diff_key($parametres, array_flip($exclusions));
$parametres = array_intersect_key($parametres, array_flip(self::$cel_obs));
 
$parametres = array_filter(
$parametres,
create_function('$e','return strpos($e, "(Valeurs multiples)") === false;'));
 
// modifie $parametres par référence
self::formaterParametresObservation($parametres);
 
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
if(!$champ_maj) return 0; // rien à mettre à jour finalement
 
$champ_maj[] = "date_modification = now()";
$nb_upd = Cel::db()->executer(sprintf(
"UPDATE cel_obs SET %s WHERE ordre IN (%s) AND ce_utilisateur = %s -- %s:%d",
implode(', ', $champ_maj),
implode(', ', $ordre),
Cel::db()->proteger($utilisateur),
__FILE__, __LINE__));
 
if($nb_upd === FALSE) return FALSE;
return $nb_upd;
// TODO: return json_encode(updated_rows());
}
 
/**
* Modifie une observation publique dont l'id et l'utilisateur sont passé en paramètre
230,15 → 175,11
$parametres = array_merge($base_param, $parametres);
 
$this->traiterEspece($parametres);
self::formaterParametresObservation($parametres);
$this->formaterParametresObservation($parametres);
 
$retour = true;
 
$champ_maj = self::traiterParametresObservationEtConstruireSousRequeteMaj($parametres);
$champ_maj[] = "date_modification = now()";
 
$requete_modification = "UPDATE cel_obs SET " .
implode(', ', $champ_maj) .
$this->traiterParametresObservationEtConstruireSousRequeteMaj($parametres) .
" WHERE id_observation = ".Cel::db()->proteger($id).
" AND ce_utilisateur = ".Cel::db()->proteger($utilisateur)." ".
" AND transmission = 1";
246,13 → 187,14
// important ! ne pas utiliser la fonction executerRequete qui renvoie une erreur si la requete contient des | (pipes)
// ce qui peut arriver dans les commentaires
// TODO: corriger la fonction ou bien continuer à utiliser executerRequeteSimple
$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification . ' -- ' . __FILE__ . ':' . __LINE__);
 
$resultat_modification = Cel::db()->executerRequeteSimple($requete_modification);
if ($resultat_modification === false) {
$retour = false;
$this->logger("CEL_bugs","Erreur de mise à jour de l\'observation : ".$id);
}
return $resultat_modification;
return $retour;
}
/**
432,7 → 374,7
 
// XXX: ne devrait plus être nécessaire maintenant que rechercherInformationsComplementairesSurNom() [plus précisément effectuerRequeteUrlRecherche()]
// a été modifiée pour retourner tous les champs nécessaire.
if ($deuxieme_passe && (! array_key_exists('nom_ret_nn', $parametres) || ! array_key_exists('nt', $parametres))) {
if ($deuxieme_passe && (!$parametres['nom_ret_nn'] || !$parametres['nt'])) {
// Utilisation d'un nom faisant parti du referentiel : recherche du nom valide correspondant
$chercheur_infos_complementaires = new RechercheInfosTaxonBeta($this->config , $code_referentiel);
$complement = $chercheur_infos_complementaires->effectuerRequeteInfosComplementairesSurNumNom($parametres['nom_sel_nn']);
458,16 → 400,6
$parametres['nom_referentiel'] = $code_referentiel;
}
 
// uniquement nécessaire lors de l'ajout
private function ajoutInfoUtilisateurARequete(&$parametres) {
if(! isset($parametres['ce_utilisateur'])) return;
$infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']);
$parametres['courriel_utilisateur'] = $infos_utilisateur['courriel'];
$parametres['nom_utilisateur'] = $infos_utilisateur['nom'];
$parametres['prenom_utilisateur'] = $infos_utilisateur['prenom'];
}
 
/**
* Formate les paramètres fournis en ajoutant des infos complementaires
*
475,7 → 407,16
*
* @return $parametres le tableau modifié selon ce qu'il contenait
*/
static function formaterParametresObservation(&$parametres) {
private function formaterParametresObservation(&$parametres) {
if(isset($parametres['ce_utilisateur'])) {
$infos_utilisateur = $this->getInfosComplementairesUtilisateur($parametres['ce_utilisateur']);
$parametres['courriel_utilisateur'] = $infos_utilisateur['courriel'];
$parametres['nom_utilisateur'] = $infos_utilisateur['nom'];
$parametres['prenom_utilisateur'] = $infos_utilisateur['prenom'];
}
// Pour empecher que des numéros de département de 1 à 9 soient saisis sans 0
// TODO: décider quoi faire pour les zones géo plus générales
if (isset($parametres['ce_zone_geo'])) {
488,9 → 429,9
}
if (strlen($parametres['ce_zone_geo']) > 0 && strlen($parametres['ce_zone_geo']) <= 2) {
$parametres['ce_zone_geo'] = Cel::obtenirCodeInseeCommunePourNomEtDepartement($parametres['zone_geo'], $parametres['ce_zone_geo']);
$parametres['ce_zone_geo'] = $this->obtenirCodeInseeCommunePourNomEtDepartement($parametres['zone_geo'], $parametres['ce_zone_geo']);
} else {
$parametres['ce_zone_geo'] = 'INSEE-C:'. $parametres['ce_zone_geo'];
$parametres['ce_zone_geo'] = $this->convertirCodeInseeVersCodeZoneGeo($parametres['ce_zone_geo']);
}
}
}
552,12 → 493,13
* @return string une sous requete utilisable pour la modification d'une observation
* selon la syntaxe UPDATE table SET colonne1 = valeur1, colonne2 = valeur2 WHERE condition
*/
static function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) {
$champs = array();
 
private function traiterParametresObservationEtConstruireSousRequeteMaj($parametres) {
$sous_requete = '';
// Nullifiage ...
// TODO: code dupliqué, en faire une fonction à mettre à la place appropriée
foreach($parametres as $cle => $valeur) {
// Pour apparaitre le premier dans les tris ...
if (trim($valeur) == "" || trim($valeur) == "null" || trim($valeur) == "000null") {
$valeur = "NULL";
564,8 → 506,13
} else {
$valeur = Cel::db()->proteger($valeur);
}
$champs[] = $cle." = ".$valeur;
$sous_requete .= $cle." = ".$valeur.", ";
}
return $champs;
$sous_requete .= ' date_modification = now() ';
return $sous_requete;
}
}
}
?>
/branches/v1.7-croissant/jrest/lib/ImageRecreation.php
1,8 → 1,8
<?php
Class ImageRecreation {
 
private $droits = 0755;
private $formats = array('CRX2S','CRXS','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L');
private $droits = 0705;
private $formats = array('CRX2S','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L');
const MODE_GD = 'gd';
const MODE_IMAGEMAGICK = 'imagemagick';
private $mode;
/branches/v1.7-croissant/jrest/lib/RechercheInfosTaxonBeta.php
40,7 → 40,6
$this->url_service_nom = str_replace('{referentiel}', $this->code_referentiel ,$config['eflore']['url_service_nom']);
$this->url_service_taxon = str_replace('{referentiel}', $this->code_referentiel ,$config['eflore']['url_service_taxon']);
$this->url_service_chorologie_obs = $config['eflore']['url_service_chorologie_obs'];
$this->config = $config;
}
public function rechercherGenreEspeceSurPrefixe($genre = null, $espece = null) {
85,30 → 84,26
public function rechercherInformationsComplementairesSurNom($nom_saisi) {
$nom_saisi = trim($nom_saisi);
// Essai de recherche sur le nom saisi tel quel
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, 'stricte');
if($liste_genre_espece) return $liste_genre_espece;
 
// Essai de recherche stricte en tentant de supprimer le nom d'auteur
if( ($nom_saisi_sans_auteur = self::supprimerAuteur($nom_saisi)) ) { // ne pas faire la requête sur un mot vide
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi_sans_auteur, 'stricte');
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, true);
if(empty($liste_genre_espece)) {
// Essai de recherche stricte en tentant de supprimer le nom d'auteur
$nom_saisi_sans_auteur = self::supprimerAuteur($nom_saisi);
if($nom_saisi_sans_auteur) { // ne pas faire la requête sur un mot vide
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi_sans_auteur, true);
}
if(empty($liste_genre_espece)) {
// Dernière tentative : essai de recherche étendue
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, false);
}
}
if($liste_genre_espece) return $liste_genre_espece;
 
// avant-dernière tentative : essai de recherche étendue
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, 'etendue');
if($liste_genre_espece) return $liste_genre_espece;
 
// dernière tentative: concaténation (nom_sci,auteur) (= nom-retenu généré utilisé comme nom_sci)
$liste_genre_espece = $this->effectuerRequeteUrlRecherche($nom_saisi, 'concat');
return $liste_genre_espece;
}
private function effectuerRequeteUrlRecherche($nom_saisi, $mode = 'stricte') {
private function effectuerRequeteUrlRecherche($nom_saisi, $stricte = true) {
$res = @json_decode(file_get_contents(sprintf('%1$s?masque=%2$s&recherche=%3$s&ns.format=txt&retour.champs=%4$s&navigation.limite=1',
$this->url_service_nom,
urlencode($nom_saisi),
$mode,
($stricte ? 'stricte' : 'etendue'),
implode(',', array("id","nom_sci","auteur","nom_retenu.id","famille","num_taxonomique","nom_retenu_complet")))));
if(!$res) return NULL;
$resultat = (array)$res->resultat;
141,20 → 136,7
return strpos($nom_saisi,'x ') === 0;
}
public function effectuerRequeteInfosComplementairesSurNumNom($num_nom, $ref = NULL) {
if($ref && isset($this->config['eflore']['api_host'])) {
return @json_decode(file_get_contents($this->config['eflore']['api_host'] . '/' .
$ref . '/' .
'noms' . '/' .
$num_nom .
'?retour.champs=' . implode(',', array('nom_sci,auteur',
'id',
'nom_retenu_complet',
'nom_retenu.id',
'num_taxonomique',
'famille'))));
}
// XXX: compat
public function effectuerRequeteInfosComplementairesSurNumNom($num_nom) {
return @json_decode(file_get_contents($this->url_service_nom.'/'.$num_nom.'?retour.champs=nom_sci,auteur,id,nom_retenu_complet,nom_retenu.id,num_taxonomique,famille'));
}
 
201,12 → 183,10
// TODO: ignorer la colonne référentiel, et utiliser le référentiel donné
// mais il faut alors avertir le service (d'import/modif) d'utiliser le référentiel
// passé au nom d'espèce
// Seul le effectuerRequeteInfosComplementairesSurNumNom() le supporte, car c'est encore
// un peu complexe à implémenter proprement pour cause d'attributs de classes.
}
// Numero nomenclatural
if ($type == 'nn') {
$obj = $this->effectuerRequeteInfosComplementairesSurNumNom($num, $ref);
$obj = $this->effectuerRequeteInfosComplementairesSurNumNom($num);
}
// Numero taxonomique
else {
/branches/v1.7-croissant/jrest/lib/Cel.php
121,7 → 121,10
 
protected function verifierSecuriteParametreUrl($param) {
//$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
return is_string($param) ? strip_tags($param) : $param;
if (!is_string($param)) return $param;
 
$param = strip_tags($param);
return $param;
}
 
private function definirParametresUrlParDefaut() {
216,12 → 219,12
print $contenu;
}
 
static function envoyerAuth($message_accueil, $message_echec) {
private function envoyerAuth($message_accueil, $message_echec) {
header('HTTP/1.0 401 Unauthorized');
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
header('Content-type: text/plain; charset=UTF-8');
print $message_echec;
exit;
exit(0);
}
 
//+----------------------------------------------------------------------------------------------------------------+
237,12 → 240,14
//+----------------------------------------------------------------------------------------------------------------+
// GESTION DE L'IDENTIFICATION
static function getAuthIdentifiant() {
return isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : null;
protected function getAuthIdentifiant() {
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
return $id;
}
 
static function getAuthMotDePasse() {
return isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : null;
protected function getAuthMotDePasse() {
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
return $mdp;
}
 
public function authentifierAdmin() {
263,11 → 268,19
}
 
public function isAdmin($id) {
return in_array($id, explode(',', $this->config['jrest_admin']['admin']));
$admins = $this->config['jrest_admin']['admin'];
$admin_tab = explode(',',$admins);
 
if (in_array($id,$admin_tab)) {
return true;
} else {
return false;
}
}
 
public function controleUtilisateur($id) {
if (@array_key_exists('name', $_SESSION['user']) && empty($_SESSION['user']['name'])) {
 
if (isset($_SESSION['user']) && isset($_SESSION['user']['name']) && $_SESSION['user']['name'] == '') {
//cas de la session temporaire, on ne fait rien de particulier
} else {
if (isset($_SESSION['user']) && isset($_SESSION['user']['name']) && !$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) {
279,10 → 292,12
}
public function controleAppelIpAutorisee() {
$ips_autorisees = explode(',', @$this->config['jrest_admin']['ip_autorisees']);
if(!in_array($_SERVER['REMOTE_ADDR'], $ips_autorisees) && $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) {
$ips_autorisees = explode(',', $this->config['jrest_admin']['ip_autorisees']);
$ip_appelante = $_SERVER['REMOTE_ADDR'];
if(!in_array($ip_appelante, $ips_autorisees) && $ip_appelante != $_SERVER['SERVER_ADDR']) {
header('HTTP/1.0 401 Unauthorized');
exit('Accès interdit');
echo 'Accès interdit';
exit(0);
}
return true;
}
300,26 → 315,26
}
 
private function authentifier($message_accueil, $message_echec, $type) {
if (!isset($_SERVER['PHP_AUTH_USER'])) {
self::envoyerAuth($message_accueil, $message_echec); // exit
}
 
if ($type == 'Utilisateur' && self::getAuthMotDePasse() == 'debug') {
$autorisation = true;
$id = $this->getAuthIdentifiant();
if (!isset($id)) {
$this->envoyerAuth($message_accueil, $message_echec);
} else {
$methodeAutorisation = "etre{$type}Autorise";
$autorisation = $this->$methodeAutorisation();
if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') {
$autorisation = true;
} else {
$methodeAutorisation = "etre{$type}Autorise";
$autorisation = $this->$methodeAutorisation();
}
if ($autorisation == false) {
$this->envoyerAuth($message_accueil, $message_echec);
}
}
if ($autorisation == false) {
self::envoyerAuth($message_accueil, $message_echec);
}
 
return true;
}
 
public function etreUtilisateurAutorise() {
$identifiant = self::getAuthIdentifiant();
$mdp = md5(self::getAuthMotDePasse());
$identifiant = $this->getAuthIdentifiant();
$mdp = md5($this->getAuthMotDePasse());
$service = "TestLoginMdp/$identifiant/$mdp";
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service);
$json = $this->getRestClient()->consulter($url);
330,26 → 345,36
}
 
public function etreAdminAutorise() {
$identifiant = self::getAuthIdentifiant();
$identifiant = $this->getAuthIdentifiant();
$autorisation = ($this->etreUtilisateurAutorise() && $this->etreAdminCel($identifiant)) ? true : false;
return $autorisation;
}
 
public function etreAdminCel($courriel) {
// parmi les admins ?
return in_array($courriel, explode(',', $this->config['jrest_admin']['admin']));
$admins = $this->config['jrest_admin']['admin'];
$courriels_autorises = explode(',', $admins);
 
$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
return $autorisation;
}
 
public function getInfosComplementairesUtilisateur($id_utilisateur) {
$defaut_infos = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur);
if(! is_numeric($id_utilisateur)) return $defaut_infos;
 
$resultat_infos_utilisateur = Cel::db()->requeter(
'SELECT prenom, nom, courriel FROM cel_utilisateurs'
. ' WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur));
$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur);
 
if($resultat_infos_utilisateur && count($resultat_infos_utilisateur)) return $resultat_infos_utilisateur[0];
return $defaut_infos; // autrement, info par défaut
if(is_numeric($id_utilisateur)) {
 
$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '.
'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur);
 
$resultat_infos_utilisateur = Cel::db()->requeter($requete_infos_utilisateur);
 
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) {
$infos_utilisateur = $resultat_infos_utilisateur[0];
}
}
 
return $infos_utilisateur;
}
 
public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) {
431,7 → 456,8
}
 
protected function tronquerCourriel($courriel) {
return preg_replace('/[^@]+$/i', '...', $courriel);
$courriel = preg_replace('/[^@]+$/i', '...', $courriel);
return $courriel;
}
 
protected function nettoyerTableau(Array $tableau) {
520,14 → 546,26
return $code_departement;
}
 
static function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $code_insee) {
$resultat = Cel::db()->requeter(sprintf(
'SELECT id_zone_geo FROM cel_zones_geo WHERE nom LIKE %s AND id_zone_geo LIKE %s',
Cel::db()->proteger($nom_commune),
Cel::db()->proteger("INSEE-C:" . $code_insee . '%')));
protected function convertirCodeInseeVersCodeZoneGeo($code_insee) {
return 'INSEE-C:'.$code_insee;
}
 
if($resultat && count($resultat)) return $resultat[0]['id_zone_geo'];
return $code_insee; // autrement retourne l'original
protected function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $dpt) {
 
$code_insee = $dpt;
 
$requete = 'SELECT id_zone_geo FROM cel_zones_geo '.
'WHERE nom LIKE '.Cel::db()->proteger($nom_commune).' '.
'AND id_zone_geo LIKE "INSEE-C:'.$dpt.'%"';
 
$resultat = Cel::db()->requeter($requete);
 
if(is_array($resultat) && count($resultat) > 0) {
$code_insee = $resultat[0]['id_zone_geo'];
}
 
return $code_insee;
 
}
 
protected function encoderMotCle($mot_cle) {
680,3 → 718,5
return $contenu;
}
}
 
?>
/branches/v1.7-croissant/jrest/lib/LiaisonMotsCles.php
1,14 → 1,24
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
*
* Librairie de liaison d'images et d'observation à des mots clés
*/
 
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* Librairie de liaison d'images et d'observation à des mots clés
*
*/
class LiaisonMotsCles extends Cel {
const SEPARATEUR_MOT_CLE_TEXTE = ',';
20,45 → 30,34
}
public function ajouterLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
$mode = $this->mode;
$champ_objet_lie = ($this->mode == 'obs') ? 'id_observation' : 'id_image';
$champ_mot_cle = ($this->mode == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image';
// le mot clé ignore est spécifique mysql, mais il est utilisé ici pour des raisons
// de performance, à remplacer par un test sur les mots clés déjà existant si ça gène
$requete_liaison_mots_cles = sprintf('INSERT IGNORE INTO cel_%s_mots_cles '.
'(%s, %s) VALUES ',
$mode,
$mode == 'obs' ? 'id_observation' : 'id_image',
$mode == 'obs' ? 'id_mot_cle_obs' : 'id_mot_cle_image');
$insert = array();
$requete_liaison_mots_cles = 'INSERT IGNORE INTO cel_'.$this->mode.'_mots_cles '.
'('.$champ_objet_lie.', '.$champ_mot_cle.') '.
'VALUES ';
foreach($ids_images_ou_obs as $id_image_ou_obs) {
foreach($mots_cles as $mot) {
// TODO!! ce_utilisateur
$insert[] = '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).')';
$requete_liaison_mots_cles .= '('.$id_image_ou_obs.','.Cel::db()->proteger($mot).'),';
}
}
 
if(!$insert) {
// peut arriver, par exemple lorsqu'on décoche tous les mots-clef associés à une image
$this->logger('CEL_bugs', 'Pas de mot-clef à ajouter à des '.$mode.' : '. implode(',', $ids_images_ou_obs));
$requete_liaison_mots_cles = rtrim($requete_liaison_mots_cles,',');
$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles);
foreach($ids_images_ou_obs as $id_image_ou_obs) {
$this->regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur);
}
else {
$resultat_liaison_mots_cles = Cel::db()->executer($requete_liaison_mots_cles . implode(',',$insert));
if(! $resultat_liaison_mots_cles) {
$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$mode.' : '.$requete_liaison_mots_cles);
// ne pas retourner car si nous sommes passés par InventoryKeyWordImageLink updateElement(),
// alors celui-ci à *purgé* les mots-clefs en amont et compte sur nous pour faire une réinitialisation
/// correcte ...
// return FALSE;
}
}
 
// ... donc dans tous les cas nous devons conserver une cohérence entre les deux modes de stockage des mots-clefs
$ret = TRUE;
foreach($ids_images_ou_obs as $id_image_ou_obs) {
$bool = self::regenererIndexTexteMotCle($id_image_ou_obs, $id_utilisateur, $mode);
$ret = $ret & ($bool !== FALSE); // peut légitimement retourner 0
if(!$resultat_liaison_mots_cles) {
$this->logger('CEL_bugs', 'Erreur d\'ajout de mots clés à des '.$this->mode.' : '.$requete_liaison_mots_cles);
}
return $ret;
return $resultat_liaison_mots_cles;
}
public function supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_images_ou_obs, $mots_cles) {
66,7 → 65,7
$retour = $this->supprimerLiaisonMotsCles($id_utilisateur, $ids_images_ou_obs, $mots_cles);
foreach($ids_images_ou_obs as $image_ou_obs) {
self::regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur, $this->mode);
$this->regenererIndexTexteMotCle($image_ou_obs, $id_utilisateur);
}
return $retour;
83,10 → 82,16
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle);
 
if ($requete_suppression_liaison_mot_cle !== false) return TRUE;
 
$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete");
return FALSE;
if ($requete_suppression_liaison_mot_cle !== false) {
$retour = true;
} else {
$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
$this->logger($message);
$retour = false;
}
return $retour;
}
public function supprimerToutesLiaisonsPourIdImageOuObs($id_utilisateur, $ids_images_ou_obs) {
100,11 → 105,15
$resultat_suppression_mot_cle = Cel::db()->executer($requete_suppression_liaison_mot_cle);
 
if ($requete_suppression_liaison_mot_cle !== false) {
return TRUE;
$retour = true;
} else {
$message = "Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete";
$this->logger($message);
$retour = false;
}
 
$this->logger("Erreur de suppression des mots clés de plusieurs ".$this->mode." : $requete");
return FALSE;
return $retour;
}
public function supprimerToutesLiaisonsPourIdMotCle($id_utilisateur, $tableau_ids_mots_cles) {
124,7 → 133,7
$resultat_requete_objets_lies_mot_cle = Cel::db()->requeter($requete_objets_lies_mot_cle);
foreach($resultat_requete_objets_lies_mot_cle as $objet_lie) {
self::regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur, $this->mode);
$this->regenererIndexTexteMotCle($objet_lie['id'], $id_utilisateur);
}
if ($requete_suppression_liaison_mot_cle !== false) {
139,37 → 148,42
return $retour;
}
static private function regenererIndexTexteMotCle($id_image_ou_obs, $identifiant_utilisateur, $mode) {
$mots_cles = self::obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode);
private function regenererIndexTexteMotCle($image_ou_obs, $identifiant_utilisateur) {
$mots_cles = $this->obtenirMotsClesTexte($image_ou_obs, $identifiant_utilisateur);
$mots_cles_texte_chaine = "";
if (count($mots_cles) > 0) {
$mots_cles_texte_chaine = self::formaterTableauMotCleTextePourInsertion($mots_cles);
$mots_cles_texte_chaine = $this->formaterTableauMotCleTextePourInsertion($mots_cles);
}
 
// self::executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur, $mode);
return Cel::db()->executer(sprintf('UPDATE %s SET mots_cles_texte = %s WHERE %s = %s AND ce_utilisateur = %s -- %s:%d',
$mode == 'obs' ? 'cel_obs' : 'cel_images',
Cel::db()->proteger($mots_cles_texte_chaine),
$mode == 'obs' ? 'id_observation' : 'id_image',
Cel::db()->proteger($id_image_ou_obs),
Cel::db()->proteger($identifiant_utilisateur),
__FILE__ , __LINE__));
$this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $image_ou_obs, $identifiant_utilisateur);
}
private static function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur, $mode) {
return Cel::db()->requeter(sprintf('SELECT mot_cle FROM cel_mots_cles_%1$s WHERE id_mot_cle_%2$s IN '.
' (SELECT id_mot_cle_%2$s FROM cel_%1$s_mots_cles WHERE %3$s = %4$s)'.
' AND id_utilisateur = %5$s -- %6$s:%7$d',
$mode,
$mode == 'obs' ? 'obs' : 'image',
$mode == 'obs' ? 'id_observation' : 'id_image',
Cel::db()->proteger($id_image_ou_obs),
Cel::db()->proteger($identifiant_utilisateur),
__FILE__ , __LINE__));
private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $identifiant_utilisateur) {
$requete = 'UPDATE '.(($this->mode == 'obs') ? 'cel_obs' : 'cel_images').' '.
'SET mots_cles_texte = '.Cel::db()->proteger($mots_cles_texte_chaine).' '.
'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs).
' AND ce_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur);
 
return Cel::db()->executer($requete);
}
private static function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
private function obtenirMotsClesTexte($id_image_ou_obs, $identifiant_utilisateur) {
$requete = 'SELECT mot_cle '.
'FROM '.'cel_mots_cles_'.$this->mode.' '.
'WHERE id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' IN '.
'('.
'SELECT id_mot_cle_'.(($this->mode == 'obs') ? 'obs' : 'image').' '.
'FROM cel_'.$this->mode.'_mots_cles '.
'WHERE '.(($this->mode == 'obs') ? 'id_observation' : 'id_image').' = '.Cel::db()->proteger($id_image_ou_obs).
')'.
' AND id_utilisateur = '.Cel::db()->proteger($identifiant_utilisateur);
 
$resultats = Cel::db()->requeter($requete);
return $resultats;
}
private function formaterTableauMotCleTextePourInsertion($tableau_mots_cles_texte) {
$mot_cles_texte_chaine = '';
if (is_array($tableau_mots_cles_texte)) {
183,7 → 197,7
return $mot_cles_texte_chaine;
}
static function nettoyerMotsCles($chaine) {
public function nettoyerMotsCles($chaine) {
$valeur = str_replace('null', '', $chaine);
$valeur = trim($valeur, ';;');
/branches/v1.7-croissant/jrest/jrest.ini.php.defaut
45,8 → 45,7
hostspec =
database = tela_prod_eflore_v1_1_principale
 
api_host = "http://localhost/service:eflore:0.1"
url_service_nom = "http://localhost/service:eflore:0.1/{referentiel}/noms"
url_service_nom = "http://localhost/service:eflore:0.1/bdtfx/noms"
url_service_taxon = "http://localhost/service:eflore:0.1/bdtfx/taxons"
url_service_chorologie_obs = "http://localhost/service:eflore:0.1/chorodep/observations"
url_service_chorologie_carte = "http://localhost/service:eflore:0.1/{referentiel_choro}/cartes"
59,7 → 58,6
chemin_images = /opt/lampp/htdocs/Documents/images_serveur
chemin_export = /opt/lampp/htdocs/Documents/export_images
chemin_stockage_temp = /home/tmp
images_temp_url = "http://localhost/tmp/images/%s"
 
url_images = http://localhost/Documents/images_serveur
url_export = http://localhost/Documents/export_images
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-ref-badbdnffnn.test.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nonom-nonum.result.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nom-nonum.test.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-from-nom-ret.test.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nonom-nonum.test.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nom-nonum.result.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nonom-num.test.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nom-num.result.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-ref-badbdnffnn.result.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nonom-num.result.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/ref-nom-num.test.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-from-nom-ret.result.php
File deleted
/branches/v1.7-croissant/jrest/tests/phptests/transmission.result.php
1,6 → 1,4
<?php
date_default_timezone_set("Europe/Paris");
return array (
<?php return array (
'transmission' => 'oui',
'date_transmission' => date("Y-m-d H:i:s") // attention au décallage (1sec par exemple)
//'date_transmission' => '2013-07-26 18:20:08',
);
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-bdnffnt.result.php
1,7 → 1,7
<?php return array (
'nom_sel' => 'Viola riviniana f. riviniana',
'nom_sel' => 'Viola riviniana subsp. riviniana',
'nom_sel_nn' => '72478',
'nom_ret' => 'Viola riviniana f. riviniana',
'nom_ret' => 'Viola riviniana subsp. riviniana',
'nom_ret_nn' => '72478',
'nt' => '5757',
'famille' => 'Violaceae',
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-noref-bdnffnn.result.php
1,3 → 1,3
<?php return array (
'nom_sel' => 'Viola riviniana subsp. bavarica',
'nom_referentiel' => 'bdtfx');
'nom_sel' => 'bdtfx:nn:72475',
'nom_referentiel' => 'autre');
/branches/v1.7-croissant/jrest/tests/phptests/determ-espece-badref-bdnffnn.result.php
1,3 → 1,3
<?php return array (
'nom_sel' => 'Viola riviniana subsp. bavarica',
'nom_referentiel' => 'bdtfx');
'nom_sel' => 'bdtfx:nn:72475',
'nom_referentiel' => 'bdtxa');
/branches/v1.7-croissant/jrest/tests/api.php
36,8 → 36,6
'phenologie' => 'Phénologie',
'images' => 'Image(s)',
'nom_commun' => 'Nom Commun',
 
'observateur' => 'Observateur',
);
 
 
106,10 → 104,8
'ce_utilisateur' => USER
));
 
//curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, TRUE);
//execute post
if(DEBUG) @fwrite(STDERR, sprintf("curl -F file=@%s '%s'\n", $file, $URL));
 
$result = curl_exec($ch);
curl_close($ch);
return $result;
/branches/v1.7-croissant/jrest/tests/cmd-test.php
1,10 → 1,9
#!/usr/bin/env php
<?php
 
define('DEFAULT_DOMAIN', 'http://cel');
define('DEFAULT_USER', 22506);
 
$options = getopt("hiou:d:e:p:FU:P:D",array("help", "images", "obs", "user:", "domain:", "email:", "pass:", "flush", "upload:", "phpsessid", "debug"));
$options = getopt("hiou:d:e:p:FU:P:",array("help", "images", "obs", "user:", "domain:", "email:", "pass:", "flush", "upload:", "phpsessid"));
if(isset($options['h']) || isset($options['help'])) die(__help());
 
 
12,11 → 11,8
define('DOMAIN', isset($options['d']) ? $options['d'] : (isset($options['domain']) ? $options['domain'] : DEFAULT_DOMAIN));
define('EMAIL', isset($options['e']) ? $options['e'] : (isset($options['email']) ? $options['email'] : NULL));
define('PASS', isset($options['p']) ? $options['p'] : (isset($options['pass']) ? $options['pass'] : NULL));
define('DEBUG', isset($options['D']) ? 1 : (isset($options['debug']) ? 1 : 0));
define('COOKIE', isset($options['P']) ? $options['P'] : (isset($options['phpsessid']) ? $options['phpsessid'] : NULL));
 
if (isset($options['P'])) define('COOKIE', $options['P']);
elseif (isset($options['phpsessid'])) define('COOKIE', $options['phpsessid']);
 
// API::auth() define()'s COOKIE
require_once('api.php');
 
31,7 → 27,7
$upload = isset($options['U']) ? $options['U'] : (isset($options['upload']) ? $options['upload'] : NULL);
if($upload) cel_upload_image($upload);
 
if(! defined('COOKIE')) { if(!auth()) die('no auth'); }
if(! COOKIE) { if(!auth()) die('no auth'); }
 
 
// $csv = genCSV(array('ordre' => 1, 'Date' => '23/06/1991', 'rien' => 'rien'));
62,9 → 58,8
La priorité est donnée à -P sur le couple (-e , -p) pour l'authentification, eg:
$ sqlite3 .mozilla/firefox/*.default/cookies.sqlite<<<"SELECT * FROM moz_cookies WHERE baseDomain = 'cel' AND name = 'PHPSESSID';"
 
%1\$s -U|--upload <file>
%1\$s -u|--upload <file>
Upload le fichier "file".
 
EOF
, // */
basename(__FILE__),
/branches/v1.7-croissant/jrest/services/CelWidgetUploadImageTemp.php
File deleted
\ No newline at end of file
/branches/v1.7-croissant/jrest/services/InventoryKeyWordImageLink.php
1,19 → 1,26
<?php
// declare(encoding='UTF-8');
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* Service de liaisons de mots clés à des images.
* Le service lie une ou plusieurs mots clés à une ou plusieurs images
*/
 
require_once('InventoryKeyWordObsLink.php');
 
*
*/
class InventoryKeyWordImageLink extends Cel {
public function getElement($uid) {
29,24 → 36,46
return;
}
$id_images = array_filter(explode(',', $pairs['images']));
$mots_cles = array_filter(explode(',', $pairs['mots_cles']));
$pairs['images'] = rtrim($pairs['images'],',');
$id_images = explode(',',$pairs['images']);
$pairs['mots_cles'] = rtrim($pairs['mots_cles'],',');
$mots_cles = explode(',',$pairs['mots_cles']);
// Pour le moment on ne peut que supprimer les mots clés et ajouter les nouveaux à cause du fonctionnement
// de l'arbre de mots clés des images
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'images');
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerToutesLiaisonsPourIdImageOuObs($pairs['ce_utilisateur'], $id_images);
return $gestionnaire_mots_cles->ajouterLiaisonMotsCles($pairs['ce_utilisateur'],$id_images, $mots_cles);
$liaison_mot_cle = $gestionnaire_mots_cles->ajouterLiaisonMotsCles($pairs['ce_utilisateur'],$id_images, $mots_cles);
return $liaison_mot_cle;
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || ! InventoryKeyWordObsLink::estUnIdentifiantMotCle($uid[2])) {
return FALSE;
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
}
$id_images = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'images');
$mots_cles = $gestionnaire_mots_cles->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $id_images, $mots_cles);
 
return InventoryKeyWordObsLink::unlinkKeyword($this->config, 'images', explode(',',$uid[1]), $uid[0], $uid[2]);
return $suppression_liaison_mot_cle;
}
 
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
}
?>
/branches/v1.7-croissant/jrest/services/InventoryKeyWordObsLink.php
1,18 → 1,31
<?php
// declare(encoding='UTF-8');
/**
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010, 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
*
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
/**
* in : utf8
* out : utf8
*
* Service de liaisons de mots clés à des observations.
* Le service lie une ou plusieurs mots clés à une ou plusieurs observations
*/
 
*
*/
class InventoryKeyWordObsLink extends Cel {
public function getElement($uid) { }
public function getElement($uid) {
}
public function createElement($pairs) {
// Controle detournement utilisateur
32,25 → 45,30
}
 
public function deleteElement($uid){
$retour = false;
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || ! self::estUnIdentifiantMotCle($uid[2])) {
return FALSE;
if (!isset($uid[0]) || !isset($uid[1]) || !isset($uid[2]) || !$this->estUnIdentifiantMotCle($uid[2])) {
return;
}
return self::unlinkKeyword($this->config, 'obs', explode(',',$uid[1]), $uid[0], $uid[2]);
}
$ids_obs = explode(',',$uid[1]);
$id_utilisateur = $uid[0];
$gestionnaire_mots_cles = new LiaisonMotsCles($this->config,'obs');
$mots_cles = $gestionnaire_mots_cles->nettoyerMotsCles($uid[2]);
$mots_cles = explode(',',$mots_cles);
$suppression_liaison_mot_cle = $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($id_utilisateur, $ids_obs, $mots_cles);
 
static function unlinkKeyword($config, $type /* = obs|images */, Array $obsIds, $uid, $keywordIds /* comma-separated string */) {
if($type != 'obs' && $type != 'images') return FALSE;
$gestionnaire_mots_cles = new LiaisonMotsCles($config, $type);
$mots_cles = explode(',', LiaisonMotsCles::nettoyerMotsCles($keywordIds));
return $gestionnaire_mots_cles->supprimerLiaisonMotsClesEtRegenererIndexTexte($uid, $obsIds, $mots_cles);
return $suppression_liaison_mot_cle;
}
 
static function estUnIdentifiantMotCle($chaine) {
private function estUnIdentifiantMotCle($chaine) {
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine);
}
 
}
}
?>
/branches/v1.7-croissant/jrest/services/CelImageDoublon.php
69,7 → 69,7
private function getDoublonHtml($parametres) {
$widget = null;
$utilisateur_mail = Cel::getAuthIdentifiant();
$utilisateur_mail = $this->getAuthIdentifiant();
$utilisateur_infos = new User($this->config);
$utilisateur = $utilisateur_infos->obtenirUtilisateurSiExiste($utilisateur_mail);
$utilisateur = $utilisateur['id_utilisateur'];
/branches/v1.7-croissant/jrest/services/InventoryKeyWordList.php
42,69 → 42,27
// Controle detournement utilisateur
$id_utilisateur = $uid[1] ;
$this->controleUtilisateur($uid[1]);
$this->setChampsEtTablePourSuffixe($uid[0]);
$this->envoyerJson(self::getMotsClefs($uid[1], $uid[0]));
return TRUE; // compat: pourquoi renvoyer true si vide ?
}
 
 
static function getMotsClefs($uid, $type) {
if($type == 'obs') {
return Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
' FROM cel_mots_cles_obs'.
' WHERE id_utilisateur = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid)));
$requete = 'SELECT mot_cle, id_mot_cle'.$this->suffixe_champ.', ce_mot_cle'.$this->suffixe_champ.'_parent '.
'FROM cel_mots_cles'.$this->suffixe_table.' '.
'WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur).' '.
'ORDER BY niveau ';
$resultats_mots_cles = Cel::db()->requeter($requete);
if (is_array($resultats_mots_cles)) {
$mots_cles = array();
foreach($resultats_mots_cles as $mot_cle) {
$mots_cles[] = $mot_cle;
}
$this->envoyerJson($mots_cles);
return true;
}
 
if($type == 'images') {
return Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
' FROM cel_mots_cles_images'.
' WHERE id_utilisateur = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid)));
}
/* pour extraire un mot-clef en particulier (bien que getMotsClefId() soit plus adapté:
array_walk($ret,
create_function('&$val, $k, $keyword',
'if($val["mot_cle"] != $keyword) $val = NULL;' .
'else $val = $val["id_mot_cle_obs"];'),
'XXX');
$obsKeywordIdToDetach = array_filter($ret);
$obsKeywordIdToDetach = array_pop($obsKeywordIdToDetach); */
 
return array();
}
 
 
static function getMotsClefId($uid, $type, $keyword) {
if($type == 'obs') {
$ret = Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_obs, ce_mot_cle_obs_parent'.
' FROM cel_mots_cles_obs'.
' WHERE id_utilisateur = %s'.
' AND mot_cle = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid),
Cel::db()->proteger($keyword) ));
}
 
if($type == 'images') {
$ret = Cel::db()->requeter(sprintf(
'SELECT mot_cle, id_mot_cle_image, ce_mot_cle_image_parent'.
' FROM cel_mots_cles_images'.
' WHERE id_utilisateur = %s'.
' AND mot_cle = %s'.
' ORDER BY niveau',
Cel::db()->proteger($uid),
Cel::db()->proteger($keyword) ));
}
return @$ret[0]['id_mot_cle_obs'];
}
 
public function updateElement($uid, $pairs) {
$id_utilisateur = $uid[1];
$this->controleUtilisateur($uid[1]);
132,7 → 90,7
}
} else if ($action == 'deplacement') {
self::commencerTransaction();
$this->commencerTransaction();
$transaction_reussie_1 = true;
$id_pere = $pairs['parent'];
171,10 → 129,10
if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false &&
$transaction_reussie_3 !== false && $transaction_reussie_4 !== false &&
$transaction_reussie_5 !== false && $transaction_reussie_6 !== false) {
self::completerTransaction();
$this->completerTransaction();
return true;
} else {
self::annulerTransaction();
$this->annulerTransaction();
return false;
}
}
196,6 → 154,8
 
$this->ajouterMotCleRacine($id_utilisateur);
 
$this->commencerTransaction();
 
$bornes = $this->calculerBornesEtNiveau($id_parent, $id_utilisateur);
$borne_pere = $bornes['bd'];
$niveau = $bornes['niveau'] + 1;
202,9 → 162,6
$bg = $bornes['bd'];
$bd = $bg + 1;
 
if(!$borne_pere) return false;
 
self::commencerTransaction();
$transaction_reussie_1 = $this->decalerBornesPlusDeux($borne_pere,$id_utilisateur) ? true : false;
$requete = 'INSERT INTO cel_mots_cles'.$this->suffixe_table.' '.
221,18 → 178,11
$transaction_reussie_2 = Cel::db()->executer($requete);
 
if ($transaction_reussie_1 && $transaction_reussie_2) {
// on sort de self::createElement ==> JRest::(get|post) ==> JRest->created() qui fait header().
// or si nous dépassons ini_get(output_buffering) nous ne pouvons plus réécrire le code de retour
// HTTP, de plus, si ini_get(output_buffering) == off, nous enverrions un warning.
// d'où ce clone de JRest::created();
header('HTTP/1.0 201 Created');
self::completerTransaction();
exit;
$this->completerTransaction();
return true;
} else {
// cf ci-dessus: JRest::badRequest
header('HTTP/1.0 400 Bad Request');
self::annulerTransaction();
exit;
$this->annulerTransaction();
return false;
}
return true;
}
247,7 → 197,7
$tableau_ids_mots_cles[] = $id_mot_cle;
 
$this->controleUtilisateur($id_utilisateur);
self::commencerTransaction();
$this->commencerTransaction();
 
$bornes = $this->calculerBornesEtNiveau($id_mot_cle, $id_utilisateur);
if($bornes) {
273,9 → 223,9
$transaction_reussie_2 = $this->decalerBornesMoinsIntervalle($bg, $bd, $id_utilisateur) ? true : false;
if ($transaction_reussie_1 !== false && $transaction_reussie_2 !== false) {
self::completerTransaction();
$this->completerTransaction();
} else {
self::annulerTransaction();
$this->annulerTransaction();
}
}
// Suppression des liaisons associées à ce mot clé
326,21 → 276,27
/**
* Désactive l'auto-commit puis débute la transaction
*/
static function commencerTransaction() {
private function commencerTransaction() {
// Désactive l'autocommit le temps de la manipulation de l'arbre
$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 0");
$requete = 'SET AUTOCOMMIT = 0 ';
$reussite_autocommit = Cel::db()->executer($requete);
 
// Débute une nouvelle transaction
$reussite_begin = Cel::db()->executer("BEGIN");
$requete = 'BEGIN ';
$reussite_begin = Cel::db()->executer($requete);
}
 
/**
* Termine la transaction puis réactive l'auto-commit
*/
static function completerTransaction() {
private function completerTransaction() {
// Complète la transaction
$reussite_commit = Cel::db()->executer("COMMIT");
$requete = 'COMMIT ';
$reussite_commit = Cel::db()->executer($requete);
 
// Réactive l'autocommit le temps de la manipulation de l'arbre
$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = Cel::db()->executer($requete);
 
echo 'OK';
}
348,11 → 304,14
/**
* Annule la transaction et réactive l'auto-commit
*/
static function annulerTransaction() {
private function annulerTransaction() {
// Annule la transaction
$reussite_rollback = Cel::db()->executer("ROLLBACK");
$requete = 'ROLLBACK ';
$reussite_rollback = Cel::db()->executer($requete);
 
// Réactive l'autocommit le temps de la manipulation de l'arbre
$reussite_autocommit = Cel::db()->executer("SET AUTOCOMMIT = 1");
$requete = 'SET AUTOCOMMIT = 1 ';
$reussite_autocommit = Cel::db()->executer($requete);
 
echo 'ERROR';
}
/branches/v1.7-croissant/jrest/services/InventoryObservationList.php
1,30 → 1,36
<?php
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
/**
* PHP Version 5.2
*
* @category PHP
* @package jrest
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010, 2013 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @link /doc/jrest/
*
* InventoryObservationList.php
* Cas d'utilisation :
* 1: Service recherche d'observations a partir de divers critères
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service renvoie la liste des observations correspondantes
*
* 2: Service modification en masse d'observations
* a: Le service recherche les observations correspondant aux identifiants donnés
* b: Le service modifie les observations correspondantes avec les infos données en paramètres
*
* 3: Service de suppression d'observations en masse
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service supprime la liste des observations correspondantes
*/
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Aurelien Peronnet <aurelien@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* InventoryObservationList.php
*
* in=utf8
* out=utf8
*
* Cas d'utilisation :
* 1: Service recherche d'observations a partir de divers critères
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service renvoie la liste des observations correspondantes
*
* 2: Service modification en masse d'observations
* a: Le service recherche les observations correspondant aux identifiants donnés
* b: Le service modifie les observations correspondantes avec les infos données en paramètres
*
* 3: Service de suppression d'observations en masse
* a: Le service recherche les observations correspondant aux critères demandés
* b: Le service supprime la liste des observations correspondantes
*/
class InventoryObservationList extends Cel {
/**
77,32 → 83,13
//TODO: envoyer un message d'erreur
return;
}
 
$obs = array_filter(array_map('intval', explode(',', $uid[1])));
if(count($obs) == 0) {
return;
}
$uid[1] = rtrim($uid[1],',');
$gestionnaire_observation = new GestionObservation($this->config);
if(count($obs) == 1) {
return $gestionnaire_observation->modifierObservation($uid[0], $obs[0], $pairs);
}
 
// cas de mise à jour de multiples observations:
$ret = GestionObservation::modifierMultiplesObservation($uid[0], $obs, $pairs);
if($ret === FALSE) return FALSE; // JRest::badRequest();
if($ret === 0) {
header('HTTP/1.0 304 Not Modified');
die;
}
 
header('HTTP/1.0 200 OK'); // et non pas une 201 !
// die(); // non, car incompatible avec PHPUnit
// throw(new Exception()); // non, lance une 400 (cf JRest::updateElement())
// return TRUE; // non, lance une 201
// return FALSE; // non, lance une 400
 
die; // tant pis
$modification_observation = $gestionnaire_observation->modifierObservation($uid[0],$uid[1],$pairs);
return true;
}
 
/**
/branches/v1.7-croissant/jrest/services/squelettes/image_temp.tpl.xml
File deleted
\ No newline at end of file
/branches/v1.7-croissant/jrest/services/InventoryTransmit.php
1,42 → 1,67
<?php
/*
* @author Raphaël Droz <raphael@tela-botanica.org>
* @author David Delon <david.delon@clapas.net>
* @copyright 2010, 2013 Tela-Botanica
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
*/
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
 
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author David Delon <david.delon@clapas.net>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
*
* in : utf8
* out : utf8
*
*
* Transmission observation vers Tela
*/
class InventoryTransmit extends Cel {
function updateElement($uid, $pairs) {
 
function updateElement($uid,$pairs) {
// Controle detournement utilisateur
$this->controleUtilisateur($uid[0]);
if (!isset($uid[1])) return false;
 
$transmission = intval($pairs['transmission']);
if($transmission != 0 && $transmission != 1) return false;
//TODO: modification pour passer ceci dans la classe gestion observation
if (isset($uid[1]) && $this->estUneSuiteIdentifiantsObservation($uid[1])) {
$requete_transmission = 'UPDATE cel_obs '.
'SET transmission = '.$pairs['transmission'].','.
'date_modification = now(), date_transmission = now() '.
'WHERE ce_utilisateur = '.Cel::db()->proteger($uid[0]).' AND ordre in ('.$uid[1].')';
}
 
$ids = array_filter(array_map(create_function('$v','return intval($v);'),
explode(',', $uid[1])));
if(!$ids) return FALSE;
 
$resultat_transmission = Cel::db()->executer(
sprintf('UPDATE cel_obs SET'.
// mise à jour de la valeur de transmission (peut-être ?)
' transmission = %1$d,'.
 
// date_transmission n'est réactualisé que si nécessaire, c'est à dire si le statut de "transmission" actuel n'est
// pas à 1 et que le nouveau statut est à 1. Autrement il est mis (ou reste) à NULL
' date_transmission = IF(transmission != 1 AND %1$s = 1, now(), NULL),'.
 
// idem pour date_modification qui n'est mise à now() que si l'on passe une observation
// de non-transmise à tranmise ou de transmise à non-transmise
' date_modification = IF(transmission != %1$d, now(), date_modification)'.
 
' WHERE ce_utilisateur = %2$s AND ordre in (%3$s)',
$transmission,
Cel::db()->proteger($uid[0]),
implode(',', $ids)));
return ($resultat_transmission != 0);
$resultat_transmission = Cel::db()->executer($requete_transmission);
if ($resultat_transmission === false) {
return false;
}
return true;
}
private function estUneSuiteIdentifiantsObservation($chaine) {
// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
// sans virgule terminale
$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
return preg_match($reg_exp, $chaine);
}
}
/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log$
* Revision 1.3 2008-01-30 08:57:28 ddelon
* fin mise en place mygwt
*
* Revision 1.2 2007-05-22 12:54:09 ddelon
* Securisation acces utilisateur
*
*/
?>
/branches/v1.7-croissant/jrest/services/CelValidationObservation.php
1,137 → 1,59
<?php
/**
* @category PHP
* @package jrest
* @author Aurélien Peronnet <aurelien@tela-botania.org>
* @author Raphaël Droz <raphael@tela-botania.org>
* @copyright 2013 Tela-Botanica
* @license Licence CECILL <http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*
*/
class CelValidationObservation extends Cel {
/**
* Méthode appelée avec une requête de type POST avec un identifiant d'obs.
* Modifie le taxon associé à une observation avec les informations envoyées
* Utilisé par:
* - del/services/modules/0.1/determinations/ValiderDetermination.php::modifierObservationParDetermination()
*
* @param int $uid[0] identifiant observation
* @param pairs array tableau contenant les valeurs à modifier
* @param pairs['obsKeywordDelete'] optional string: mot-clef à délier à cette observation
*/
public function updateElement($uid, $pairs) {
public function updateElement($uid,$pairs)
{
// ce service est uniquement destiné à être appelé en local,
// depuis le serveur lui même
// en particulier par l'application identiplante
$this->controleAppelIpAutorisee();
self::verifierParametresObligatoires($uid, $pairs);
$this->verifierParametresObligatoires($uid, $pairs);
$id = $uid[0];
 
$gestion_observation = new GestionObservation($this->config);
$pairs = array_map('trim', $pairs);
$utilisateur = $pairs['ce_utilisateur'];
unset($pairs['ce_utilisateur'], $pairs['id_observation']);
 
// mise à jour des mots-clefs suite à une validation:
// typiquement, DEL modifierObservationParDetermination()
// nous enverra obsKeywordDelete=aDeterminer en plus de certitude=Certaine
$obsKeywordDelete = @trim($pairs['obsKeywordDelete']);
// $imgKeywordDelete = @trim($pairs['imgKeywordDelete']);
unset($pairs['obsKeywordDelete']); // , $pairs['imgKeywordDelete']);
 
// complete les données de la proposition validée car:
// 1) la table tb_del.del_commentaire ne contient pas toutes les informations nécessaires
// 2) la table tb_del.del_commentaire ne *devrait* pas contenir beaucoup plus que nom_sel et nom_sel_nn
// 3) la génération de ces données ici, au moment de l'UPDATE, est le meilleur garant de leur fiabilité
$more_data = CelTaxonNomFrom::NN2($this->bdd, @$pairs['nom_sel_nn'], @$pairs['nom_referentiel']);
if($more_data) $pairs = array_merge($pairs, $more_data);
 
unset($pairs['ce_utilisateur']);
$modification = $gestion_observation->modifierObservationPublique($utilisateur, $id, $pairs);
if($modification) {
// quel impact de ces valeurs de retour ?
if($kid = InventoryKeyWordList::getMotsClefId($utilisateur, 'obs', $obsKeywordDelete))
InventoryKeyWordObsLink::unlinkKeyword($this->config, 'obs', explode(',', $id), $utilisateur, $kid);
/* if($kid = InventoryKeyWordList::getMotsClefId($utilisateur, 'images', $imgKeywordDelete))
InventoryKeyWordObsLink::unlinkKeyword($this->config, 'obs', explode(',', $id), $utilisateur, $kid); */
header("Content-Type: text/plain; charset=utf-8");
die("OK"); // attention, compatibilité avec ValiderDetermination.php de DEL !
if($modification !== false) {
$resultat = 'ok';
$this->envoyer($resultat);
exit;
} else {
$info = array();
$info = 'Impossible de modifier l\'observation associée à cet identifiant ';
$this->envoyer($info, 'text/html', 'utf-8', false);
exit;
}
// cf TODO: n'arrivera pas tant que l'UPDATE ajoutera systématiquement date_modification = now()
elseif($modification === 0) {
header("HTTP/1.0 304 Not Modified"); // XXX: PHP 5.4 // http_response_code(304); // Not Modified
header("Content-Type: text/plain; charset=utf-8");
die("Not Modified");
}
else {
header("HTTP/1.0 500 Internal Server Error"); // XXX: PHP: 5.4 // http_response_code(500); // Internal Server Error
header("Content-Type: text/plain; charset=utf-8");
die("Impossible de modifier l'observation associée à cet identifiant " . mysql_error());
}
}
static function verifierParametresObligatoires($uid, $params) {
if(!@intval($uid[0]) || !@intval($params['id_observation'])) {
header("Content-Type: text/plain; charset=utf-8");
die("L'identifiant d'observation doit être un entier");
private function verifierParametresObligatoires($uid ,$params) {
$params_obligatoires = array('id_observation',
'ce_utilisateur',
'nom_sel');
$info = array();
if(!isset($uid[0]) || !is_numeric($uid[0])) {
$info .= 'l\' identifiant doit être un entier ';
}
 
// TODO: check sur 'id_observation' en tant que param est superflu ?
// TODO: avec l'apparition de CelTaxonNomFrom, "nom_sel" devrait être optionnel
// puisque nous regénérons des données valides avant l'update et puisque
// seul un nom_sel_nn *valide* a pu nous provenir depuis une validation de proposition de la part de DEL.
$params_obligatoires = array('id_observation', 'ce_utilisateur', 'nom_sel');
foreach($params_obligatoires as $param) {
if(@trim($params[$param])) continue;
header("HTTP/1.0 412 Precondition Failed"); // XXX: PHP: 5.4 // http_response_code(412); // Precondition Failed
header("Content-Type: text/plain; charset=utf-8");
die(sprintf("Paramètre %s manquant (parmi %s)", $param, implode(', ', $params_obligatoires)));
if(!isset($params[$param]) || trim($params[$param]) == "") {
$info = 'le paramètre '.$param.' doit exister et ne peut pas être vide ';
}
}
if(!empty($info)) {
$this->envoyer($info, 'text/html', 'utf-8', false);
exit;
}
}
}
 
// pour les modifications touchants aux nom_sel(nn)/nom_ret(nn)/...
// les clefs du tableau (= les aliases de champs) correspondent aux champs attendus
// par tb_cel.cel_obs afin de pouvoir array_merger() et passer le résultat à modifierObservationPublique()
class CelTaxonNomFrom {
const db = 'tb_eflore';
const bdtfx = 'bdtfx_v2_00';
const bdtxa = 'bdtxa_v1_01';
const isfan = 'isfan_v2013';
 
// get from num_nom(_sel)
static function NN($db, $id, $ref) {
if(!$db || !$id || !$ref) return FALSE;
return $db->query(sprintf("SELECT num_nom_retenu AS nom_ret_nn, num_taxon AS nt, CONCAT(nom_sci, ' ', auteur) AS nom_sel".
" FROM cel_references".
" WHERE referentiel = %s AND num_nom = %d", $db->quote($ref), intval($id)))->fetch(PDO::FETCH_ASSOC);
}
 
// get from num_nom(_sel) directement via la DB
// ce qui nous permet l'initialisation des champs non-présents dans cel_references
// cf TODO
static function NN2($db, $id, $ref) {
if(!$db || !$id || !$ref) return FALSE;
switch($ref) {
case "bdtfx":
return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtfx, self::db, self::bdtfx, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "bdtxa":
return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_tax AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel". // subtilité: "num_tax"
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::bdtxa, self::db, self::bdtxa, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
case "isfan":
return $db->query(sprintf("SELECT o.num_nom_retenu AS nom_ret_nn, o.num_taxonomique AS nt, CONCAT(o.nom_sci, ' ', o.auteur) AS nom_sel".
" , o.famille, CONCAT(ret.nom_sci, ' ', ret.auteur) AS nom_ret".
" FROM %s.%s o".
" LEFT JOIN %s.%s ret ON o.num_nom_retenu != 0 AND o.num_nom_retenu = ret.num_nom".
" WHERE o.num_nom = %d -- %s:%d", self::db, self::isfan, self::db, self::isfan, intval($id), __FILE__, __LINE__))->fetch(PDO::FETCH_ASSOC);
}
return FALSE;
}
}
?>
/branches/v1.7-croissant/jrest/services/ImportXLS.php
482,9 → 482,6
C_NOM_RET_NN => NULL, C_NT => NULL, C_FAMILLE => NULL);
self::traiterEspece($ligne, $espece, $referentiel, $cel);
 
if(!$espece[C_NOM_SEL]) $referentiel = Cel::$fallback_referentiel;
if($espece[C_NOM_SEL] && !$espece[C_NOM_SEL_NN]) $referentiel = Cel::$fallback_referentiel;
 
// $localisation est rempli à partir de plusieurs champs: C_ZONE_GEO et C_CE_ZONE_GEO
$localisation = Array(C_ZONE_GEO => NULL, C_CE_ZONE_GEO => NULL);
self::traiterLocalisation($ligne, $localisation);
639,7 → 636,7
if(strpos($referentiel, 'autre') !== FALSE) return 'autre';
 
if($referentiel && isset($ligne[C_NOM_SEL]) && $ligne[C_NOM_SEL]) {
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel \"{$referentiel}\" inconnu", E_USER_NOTICE);
trigger_error("ligne \"{$ref_ligne}\": Attention: référentiel inconnu", E_USER_NOTICE);
return 'autre';
}
 
691,14 → 688,7
pour des questions de performances
*/
static function traiterEspece($ligne, Array &$espece, &$referentiel, $cel) {
if(empty($ligne[C_NOM_SEL])) {
// TODO: nous ne déclarons pas "Numéro nomenclatural" comme colonne importable
// Nous ne pouvons donc pas tenter d'être sympa sur la détermination par num_nom
/* if(!empty($ligne[C_NOM_SEL_NN]) && $referentiel != Cel::$fallback_referentiel)
$ligne[C_NOM_SEL] = $referentiel . ':nn:' . $ligne[C_NOM_SEL_NN];
else */
return;
}
if(empty($ligne[C_NOM_SEL])) return;
 
// nom_sel reste toujours celui de l'utilisateur
$espece[C_NOM_SEL] = trim($ligne[C_NOM_SEL]);
/branches/v1.7-croissant/jrest/services/CelWidgetMapPoint.php
249,7 → 249,7
if (isset($this->parametres['ne']) && $this->parametres['sw'] && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['ne']) && ! $this->etreNull($this->parametres['sw'])) {
$ne = $this->decomposerLatLng($this->parametres['ne']);
$sw = $this->decomposerLatLng($this->parametres['sw']);
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree($points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom);
$marqueurs['points'] = CartoGroupage::creerGroupesQuadtree(&$points, $ne['lat'], $ne['lng'], $sw['lat'], $sw['lng'], $zoom);
} else {
$marqueurs['points'] = $points;
}
/branches/v1.7-croissant/src/org/tela_botanica/cel-test.gwt.xml
File deleted
/branches/v1.7-croissant/src/org/tela_botanica/client/vues/observation/FormulaireSaisieObservationVue.java
83,7 → 83,7
* Le médiateur associé à la vue
*/
private ObservationMediateur observationMediateur = null;
 
FormPanel panneauFormulaire = null;
 
private DateField date = null;
101,56 → 101,56
private String referentielGeo = null;
 
// Pour remise a zero partielle lors d'une validation
 
private enum Champs {
DATE, LIEUDIT, STATION, MILIEU, COMMENT, COMMUNE, ESPECE, TOUT, LATITUDE, LONGITUDE, ALTITUDE, ABONDANCE, CERTITUDE, REFERENTIELTAXO, PHENOLOGIE;
 
@Override
public String toString() {
switch(this) {
case DATE:
return "date";
case COMMUNE:
return "commune";
case LIEUDIT:
return "lieu dit";
case STATION:
return "station";
case MILIEU:
return "milieu";
case COMMENT:
return "commentaire";
case ESPECE:
return "espèce";
case LATITUDE:
return "latitude";
case LONGITUDE:
return "longitude";
case ALTITUDE:
return "altitude";
case ABONDANCE:
return "abondance";
case CERTITUDE:
return "identification";
case REFERENTIELTAXO:
return "referentiel";
case PHENOLOGIE:
return "phenologie";
case TOUT:
return "date, commune, lieu dit, station, milieu, espèce, commentaire, latitude, longitude, altitude, abondance, identification, referentiel, phenologie";
}
157,7 → 157,7
return TOUT.toString();
}
};
 
private String formatDate = null ;
private Button boutonOK = new Button("Créer");
private Button boutonModifier = new Button("Modifier");
169,9 → 169,9
private boolean selectionAbondance = false;
private boolean selectionCertitude = false;
private boolean selectionPhenologie = false;
 
private Toolbar bt = null ;
 
private final String VALEURS_MULTIPLES = "(Valeurs multiples)";
private final String modeleMessageModif = "commune:lieu-dit:station:milieu:latitude:longitude:altitude:date:espece:commentaire:abondance:identification:referentiel:phenologie";
private boolean communeModifiee = false;
185,7 → 185,7
private boolean certitudeModifiee = false;
private boolean referentielTaxoModifie = false;
private boolean phenologieModifiee = false;;
 
private final int KEY_ALT = 18;
private final int KEY_BACKSPACE = 8;
private final int KEY_CTRL = 17;
202,7 → 202,7
private final int KEY_SHIFT = 16;
private final int KEY_TAB = 9;
private final int KEY_UP = 38;
 
/**
* Booleen d'instanciation
*/
217,55 → 217,55
private TextField longitude;
 
private TextField latitude;
 
private TextField altitude;
 
private MultiFieldPanel htmlCommunePanel = null;
 
private MultiFieldPanel coordPanel;
 
private TextField coordonnees;
 
private Label lienSelectionCommune = null;
 
private HTML afficherFormulaireLatLon;
 
private HTML basculerverscarto;
 
private boolean longlatAjoutee;
 
private boolean latModifiee;
 
private boolean longModifiee;
 
private boolean altModifiee;
 
protected boolean rechercheCommuneEnCours = false;
 
private Timer tCoord;
 
final String resultTplRefPerso = "<div class=\"search-item-commune\">{element_referentiel}</div>";
 
private ComboBox selecteurAbondance = null;
 
private ComboBox selecteurCertitude = null;
 
final String resultTplRefPerso = "<div class=\"search-item-commune\">{element_referentiel}</div>";
private ComboBox selecteurAbondance = null;
private ComboBox selecteurCertitude = null;
private ComboBox selecteurReferentielTaxo = null;
 
private ComboBox selecteurStadePheno = null;
 
private boolean selectionMultiple = false;
 
private HTML lienAfficherChampsEtendus = null;
 
Panel conteneurChampEtenduGauche = null;
Panel conteneurChampEtenduDroite = null;
 
private boolean afficherChampsEtendus = false;
private boolean premierAffichage = true;
 
private Map<String, TextField> listeChampsEtendus;
 
/**
* Constructeur sans argument (privé car ne doit pas être utilisé)
*/
274,75 → 274,75
{
super() ;
}
 
/**
* Constructeur avec argument
* @param im
*/
public FormulaireSaisieObservationVue(ObservationMediateur obs)
{
{
super("Saisie");
// on associe le médiateur
observationMediateur = obs ;
 
referentielTaxo = obs.getRefTaxSelectionne().getCode();
panneauFormulaire = new FormPanel(Position.RIGHT);
panneauFormulaire.setBorder(false);
 
// Panneau intermediaire qui contient deux colonnes de formulaire
panneauIntermediaire = new Panel();
 
panneauIntermediaire = new Panel();
if (Window.getClientWidth()> Window.getClientHeight()) {
panneauIntermediaire.setLayout(new ColumnLayout());
panneauIntermediaire.setLayout(new ColumnLayout());
}
else {
panneauIntermediaire.setLayout(new RowLayout());
panneauIntermediaire.setLayout(new RowLayout());
}
 
panneauIntermediaire.setBorder(false);
 
//création du panneau formulaire de gauche auquels on ajoute les champs
panneauPremierColonne = new Panel();
panneauPremierColonne.setLayout(new FormLayout());
panneauPremierColonne = new Panel();
panneauPremierColonne.setLayout(new FormLayout());
panneauPremierColonne.setBorder(false);
 
//création du panneau formulaire de droite
panneauSecondeColonne = new Panel();
panneauSecondeColonne.setLayout(new FormLayout());
panneauSecondeColonne = new Panel();
panneauSecondeColonne.setLayout(new FormLayout());
panneauSecondeColonne.setBorder(false);
 
this.setPaddings(5) ;
 
// Accesskey pour debugging
commune=new ComboBox("Commune","commune\" accesskey=\"1");
 
final String resultTplCommune = "<div class=\"search-item-commune\">{commune}</div>";
commune=new ComboBox("Commune","commune\" accesskey=\"1");
final String resultTplCommune = "<div class=\"search-item-commune\">{commune}</div>";
commune.setTpl(resultTplCommune);
commune.setMode(ComboBox.REMOTE);
commune.setItemSelector("div.search-item-commune");
commune.setTypeAhead(true);
commune.setLoadingText("Recherche...");
commune.setTypeAhead(true);
commune.setLoadingText("Recherche...");
commune.setHideTrigger(true);
 
//création du lien "Accès carto" dans le formulaire
//création du lien "Accès carto" dans le formulaire
basculerverscarto = new HTML(" <a id=\"lien_carto\" href=\"#\" tabindex=\"2\">Localiser la commune</a>");
basculerverscarto.addStyleName("lien_actif");
 
//création info bulle sur le lien "accès carto"
ToolTip tip2 = new ToolTip();
tip2.setHtml("Via une carte, obtenez les coordonnées (latitude/longitude) de votre observation ");
ToolTip tip2 = new ToolTip();
tip2.setHtml("Via une carte, obtenez les coordonnées (latitude/longitude) de votre observation ");
tip2.applyTo(basculerverscarto.getElement());
 
//Sur une meme ligne, ajout de plusieurs champs
htmlCommunePanel = new MultiFieldPanel();
 
htmlCommunePanel = new MultiFieldPanel();
int largeurCommune = Window.getClientWidth()/4;
htmlCommunePanel.addToRow(commune, largeurCommune);
htmlCommunePanel.addToRow(basculerverscarto, 160);
htmlCommunePanel.addToRow(basculerverscarto, 160);
 
htmlCommunePanel.setBorder(false);
htmlCommunePanel.setId("x-commune-panel");
htmlCommunePanel.setId("x-commune-panel");
 
panneauPremierColonne.add(htmlCommunePanel);
 
356,53 → 356,53
@Override
public void onValidationSaisie() {
validerSaisie(Champs.STATION);
}
}
};
panneauPremierColonne.add(station, new AnchorLayoutData("95%"));
 
panneauPremierColonne.add(station, new AnchorLayoutData("95%"));
latitude = new TextField("Lat", "lat");
latitude.setGrowMax(70);
latitude.setAllowBlank(true);
 
longitude = new TextField("Lon", "lon");
longitude.setGrowMax(70);
longitude.setAllowBlank(true);
 
altitude = new TextField("Alt (mètres)", "alt");
altitude.setGrowMax(70);
altitude.setAllowBlank(true);
 
lienSelectionCommune = new Label("");
 
 
lienSelectionCommune.setId("conteneur_selection_commune");
lienSelectionCommune.setStyleName("conteneur_selection_commune");
lienSelectionCommune.addStyleName("lien_actif");
 
// Panneau de type plusieurs champs de formulaire sur une meme ligne, où seront renseignés Lat/Lon
coordPanel = new MultiFieldPanel();
coordPanel = new MultiFieldPanel();
coordPanel.setPaddings(0, 0, 0, 10);
coordPanel.setVisible(false);
 
final double largeur ;
largeur = 120;
 
coordPanel.addToRow(latitude, new ColumnLayoutData(largeur));
coordPanel.addToRow(longitude, new ColumnLayoutData(largeur));
coordPanel.addToRow(lienSelectionCommune, new ColumnLayoutData(largeur));
coordPanel.addToRow(latitude, new ColumnLayoutData(largeur));
coordPanel.addToRow(longitude, new ColumnLayoutData(largeur));
coordPanel.addToRow(lienSelectionCommune, new ColumnLayoutData(largeur));
lienSelectionCommune.addClass("lien_decale");
coordPanel.setBorder(false);
 
coordPanel.addToRow(altitude, new ColumnLayoutData(largeur));
 
//création du champs coordonnées
//création du champs coordonnées
referentielGeo = Configuration.getReferentielGeo();
 
coordonnees = new TextField("Coordonnées", "", 0);
coordonnees.setMaxLength(0);
coordonnees.setReadOnly(true);
coordonnees.setCls("fieldname");
 
//création du lien "saisie X/Y" dans le formulaire
afficherFormulaireLatLon = new HTML("<span style=\"padding-left:30px;\" class=\"conteneur_lien_afficher_lat_lon\">" +
"<a title=\"Lat / Lon sont les latitudes / longitudes, à remplir en degrés décimaux\" class=\"lien_actif\" id=\"lien_coord\" href=\"#\" tabindex=\"6\">Saisie Lat/Lon ("+referentielGeo+")</a>" +
409,28 → 409,28
"<span><span style=\"padding-left:20px\" class=\"conteneur_lien_localiser_lat_lon\">"+
"<a title=\"Cliquez pour obtenir les coordonnées de votre observation à partir de la carte\" class=\"lien_actif\" id=\"lien_carto_coord\" href=\"#\" tabindex=\"7\">Localiser sur la carte</a>"+
"</span>");
 
//ajout d'un listener sur le lien "saisie X/Y"
//ajout d'un listener sur le lien "saisie X/Y"
coordPanel.addListener(new PanelListenerAdapter() {
 
@Override
public void onAfterLayout(Container c) {
surPremierAffichageCoordPanel(largeur);
}
});
 
//Sur une meme ligne, ajout de plusieurs champs
final MultiFieldPanel htmlPanel = new MultiFieldPanel();
 
htmlPanel.addToRow(coordonnees, 100);
htmlPanel.addToRow(afficherFormulaireLatLon, new ColumnLayoutData(0.9));
final MultiFieldPanel htmlPanel = new MultiFieldPanel();
htmlPanel.addToRow(coordonnees, 100);
htmlPanel.addToRow(afficherFormulaireLatLon, new ColumnLayoutData(0.9));
htmlPanel.setBorder(false);
htmlPanel.setId("x-coord-panel");
 
panneauPremierColonne.add(htmlPanel);
panneauPremierColonne.add(coordPanel);
 
date = new DateField("Date", "date", 250);
date = new DateField("Date", "date", 250);
date.setAllowBlank(true);
formatDate = "d/m/Y";
date.setFormat(formatDate) ;
437,11 → 437,11
date.setTitle("Date de l'observation au format jj/mm/aaaa");
date.setMaxValue(new Date());
//date.setTabIndex(5);
panneauPremierColonne.add(date, new AnchorLayoutData("55%"));
 
final String champsListeTpl = "<div class=\"x-combo-list-item search-item-tpl\" title=\"{label}\">{label}</div>";
panneauPremierColonne.add(date, new AnchorLayoutData("55%"));
final String champsListeTpl = "<div class=\"x-combo-list-item search-item-tpl\" title=\"{label}\">{label}</div>";
// Selection d'un référentiel par défaut (le premier spécifié dans la config)
referentielTaxo = Configuration.getReferentielsDispos().get(0).getCode();
selecteurReferentielTaxo = new ComboBox();
455,27 → 455,27
selecteurReferentielTaxo.setHideTrigger(false);
selecteurReferentielTaxo.setForceSelection(true);
selecteurReferentielTaxo.setTpl(champsListeTpl);
espece=new ComboBox("Espèce","nom");
final String resultTplEspece = "<div class=\"search-item-espece {indicateurNomRetenu}\">{nom}</div>";
espece=new ComboBox("Espèce","nom");
final String resultTplEspece = "<div class=\"search-item-espece {indicateurNomRetenu}\">{nom}</div>";
 
 
espece.setTpl(resultTplEspece);
espece.setMode(ComboBox.REMOTE);
espece.setItemSelector("div.search-item-espece");
espece.setTypeAhead(true);
espece.setLoadingText("Recherche...");
 
espece.setTypeAhead(true);
espece.setLoadingText("Recherche...");
espece.setHideTrigger(true);
 
Panel panelSeparationPp = new Panel();
panelSeparationPp.setHeight(15);
panelSeparationPp.setBorder(false);
 
panneauPremierColonne.add(panelSeparationPp);
panneauPremierColonne.add(selecteurReferentielTaxo, new AnchorLayoutData("85%"));
panneauPremierColonne.add(espece, new AnchorLayoutData("95%"));
 
panneauPremierColonne.add(selecteurReferentielTaxo, new AnchorLayoutData("85%"));
panneauPremierColonne.add(espece, new AnchorLayoutData("95%"));
selecteurAbondance = new ComboBox();
selecteurAbondance.setCls("champ-separation");
selecteurAbondance.setLabel("Abondance");
486,13 → 486,13
selecteurAbondance.setHideTrigger(false);
selecteurAbondance.setForceSelection(false);
selecteurAbondance.setTpl(champsListeTpl);
panneauPremierColonne.add(selecteurAbondance, new AnchorLayoutData("95%"));
panneauPremierColonne.add(selecteurAbondance, new AnchorLayoutData("95%"));
lieudit = new AutoCompletionRefComboBox("Lieu-dit", "lieudit",observationMediateur,TypesReferentiels.REFERENTIEL_LIEU_DIT) {
 
@Override
public void onModificationValeur() {
lieuDitModifie = true;
lieuDitModifie = true;
}
 
@Override
500,8 → 500,8
validerSaisie(Champs.LIEUDIT);
}
};
panneauSecondeColonne.add(lieudit, new AnchorLayoutData("95%"));
panneauSecondeColonne.add(lieudit, new AnchorLayoutData("95%"));
milieu = new AutoCompletionRefComboBox("Milieu","milieu",observationMediateur,TypesReferentiels.REFERENTIEL_MILIEU) {
 
@Override
513,22 → 513,22
public void onValidationSaisie() {
validerSaisie(Champs.MILIEU);
}
};
panneauSecondeColonne.add(milieu, new AnchorLayoutData("95%"));
 
comment = new TextArea("Notes", "comment");
comment = new TextArea("Notes", "comment");
comment.setAllowBlank(true);
comment.setHeight(50);
 
panneauSecondeColonne.add(comment, new AnchorLayoutData("95%") );
 
Panel panelSeparationPs = new Panel();
panelSeparationPs.setHeight(39);
panelSeparationPs.setBorder(false);
 
panneauSecondeColonne.add(panelSeparationPs);
 
selecteurCertitude = new ComboBox();
selecteurCertitude.setLabel("Identification");
selecteurCertitude.setStore(Ontologies.getValeursCertitude());
538,8 → 538,8
selecteurCertitude.setHideTrigger(false);
selecteurCertitude.setForceSelection(false);
selecteurCertitude.setTpl(champsListeTpl);
panneauSecondeColonne.add(selecteurCertitude, new AnchorLayoutData("95%"));
 
panneauSecondeColonne.add(selecteurCertitude, new AnchorLayoutData("95%"));
selecteurStadePheno = new ComboBox();
selecteurStadePheno.setLabel("Phénologie");
selecteurStadePheno.setStore(Ontologies.getValeursPhenologie());
549,8 → 549,8
selecteurStadePheno.setHideTrigger(false);
selecteurStadePheno.setForceSelection(false);
selecteurStadePheno.setTpl(champsListeTpl);
panneauSecondeColonne.add(selecteurStadePheno, new AnchorLayoutData("95%"));
 
panneauSecondeColonne.add(selecteurStadePheno, new AnchorLayoutData("95%"));
if (Window.getClientWidth() > Window.getClientHeight() || Window.getClientWidth() < 800) {
panneauIntermediaire.add(panneauPremierColonne, new ColumnLayoutData(.5));
panneauIntermediaire.add(panneauSecondeColonne, new ColumnLayoutData(.5));
557,11 → 557,11
}
else {
panneauIntermediaire.add(panneauPremierColonne);
panneauIntermediaire.add(panneauSecondeColonne);
panneauIntermediaire.add(panneauSecondeColonne);
}
 
panneauFormulaire.add(panneauIntermediaire);
 
if (Ext.isIE()) {
panneauPremierColonne.setButtonAlign(Position.RIGHT);
panneauPremierColonne.addButton(boutonOK);
570,34 → 570,34
panneauSecondeColonne.setButtonAlign(Position.LEFT);
panneauPremierColonne.addButton(boutonAnnuler);
}
else {
else {
panneauFormulaire.addButton(boutonOK);
panneauFormulaire.addButton(boutonModifier);
panneauFormulaire.addButton(boutonSupprimer);
panneauFormulaire.addButton(boutonAnnuler);
panneauFormulaire.addButton(boutonAnnuler);
}
 
this.add(panneauFormulaire) ;
 
this.setAutoScroll(true);
 
 
panneauFormulaire.addListener(new PanelListenerAdapter() {
@Override
public void onResize(BoxComponent component, int adjWidth, int adjHeight, int rawWidth, int rawHeight) {
panneauIntermediaire.setWidth(rawWidth);
panneauIntermediaire.setHeight(rawHeight);
panneauPremierColonne.doLayout();
panneauSecondeColonne.doLayout();
htmlCommunePanel.doLayout();
htmlPanel.doLayout();
doLayout();
}
});
 
lienAfficherChampsEtendus = new HTML("Afficher les champs étendus");
lienAfficherChampsEtendus.setStyleName("img-curseur-depl");
lienAfficherChampsEtendus.setStyleName("lienAfficherChampsEtendus");
613,7 → 613,7
conteneurChampEtenduDroite.hide();
}
lienAfficherChampsEtendus.setText("Afficher les champs étendus");
 
} else {
afficherChampsEtendus = true;
if(conteneurChampEtenduGauche != null && conteneurChampEtenduDroite != null) {
639,14 → 639,14
ajouterToolTipsBoutons();
saisieTabindex();
}
 
private void ajouterToolTipsBoutons() {
boutonOK.setTitle("Crée une nouvelle observation à partir des champs saisis dans le formulaire");
boutonModifier.setTitle("Modifie la ou les observations sélectionnées");
boutonSupprimer.setTitle("Supprime la ou les observations sélectionnées");
boutonAnnuler.setTitle("Vide tous les champs du formulaire");
boutonAnnuler.setTitle("Vide tous les champs du formulaire");
}
 
private void surPremierAffichageCoordPanel(final double largeur) {
ExtElement lienCoord = Ext.get("lien_coord");
lienCoord.removeAllListeners();
653,17 → 653,17
lienCoord.addListener("click", new EventCallback() {
@Override
public void execute(EventObject e) {
 
coordPanel.setVisible(!coordPanel.isVisible());
 
if(Ext.isIE()) {
latitude.focus();
}
 
CarnetEnLigneMediateur.fireResize();
}
}) ;
 
ExtElement lienCartoCoord = Ext.get("lien_carto_coord");
lienCartoCoord.removeAllListeners();
lienCartoCoord.addListener("click", new EventCallback() {
672,7 → 672,7
obtenirInformationCoord();
}
}) ;
 
ExtElement lienCarto = Ext.get("lien_carto");
lienCarto.removeAllListeners();
lienCarto.addListener("click", new EventCallback() {
679,32 → 679,32
 
@Override
public void execute(EventObject e) {
 
if(commune.getValue() != null && !commune.getValue().equals("") && !getDepartement().equals("")) {
obtenirInformationCommune();
longlatAjoutee = true;
 
} else {
Window.alert("Veuillez renseigner une commune et un numéro de département sous la forme : Commune (departement)");
}
}
});
 
if(!Ext.isIE() && Window.getClientWidth() < 1200) {
 
int largeurN = (int)largeur;
 
latitude.setWidth(largeurN+"px");
longitude.setWidth(largeurN+"px");
lienSelectionCommune.setWidth(largeurN+"px");
lienSelectionCommune.setWidth(largeurN+"px");
}
}
 
private void ajouterListeners()
{
// Listener completion communne
{
// Listener completion communne
final Rafraichissable r = this;
ListenerConfig listenerConfigCommune=new ListenerConfig();
listenerConfigCommune.setDelay(200);
listenerConfigCommune.setStopPropagation(false);
717,17 → 717,17
dateModifiee = true;
}
});
 
ListenerConfig listenerConfigAutocompletion=new ListenerConfig();
listenerConfigAutocompletion.setDelay(200);
listenerConfigAutocompletion.setStopPropagation(false);
listenerConfigAutocompletion.setStopEvent(false);
 
ListenerConfig listenerConfigEspece=new ListenerConfig();
listenerConfigEspece.setDelay(10);
listenerConfigEspece.setStopPropagation(false);
listenerConfigEspece.setStopEvent(false);
 
tCoord = new Timer() {
 
@Override
739,9 → 739,9
observationMediateur.obtenirInformationCoord(r,LatLng.newInstance(coord[0], coord[1]));
}
}
 
};
 
ajouterListenerChampEvenementsClavier(commune, listenerConfigCommune);
ajouterListenerChampEvenementsClavier(date);
ajouterListenerChampEvenementsClavier(selecteurReferentielTaxo);
750,118 → 750,118
ajouterListenerChampEvenementsClavier(latitude);
ajouterListenerChampEvenementsClavier(longitude);
ajouterListenerChampEvenementsClavier(altitude);
ajouterListenerChampEvenementsClavier(selecteurAbondance);
ajouterListenerChampEvenementsClavier(selecteurCertitude);
ajouterListenerChampEvenementsClavier(selecteurAbondance);
ajouterListenerChampEvenementsClavier(selecteurCertitude);
ajouterListenerChampEvenementsClavier(selecteurStadePheno);
ajouterListenerChampsCombobox();
 
boutonOK.addListener(new ButtonListenerAdapter() {
@Override
public void onClick(Button button, EventObject e) {
public void onClick(Button button, EventObject e) {
ajouterObservation();
}
}
});
 
boutonModifier.addListener(new ButtonListenerAdapter() {
@Override
public void onClick(Button button, EventObject e) {
public void onClick(Button button, EventObject e) {
if(selectionMultiple) {
modifierObservationEnMasse(null);
} else {
modifierObservation() ;
}
}
}
});
 
boutonSupprimer.addListener(new ButtonListenerAdapter() {
@Override
public void onClick(Button button, EventObject e) {
public void onClick(Button button, EventObject e) {
if(!selectionMultiple) {
supprimerObservation();
} else {
observationMediateur.supprimerObservations();
}
}
}
});
 
boutonAnnuler.addListener(new ButtonListenerAdapter() {
boutonAnnuler.addListener(new ButtonListenerAdapter() {
@Override
public void onClick(Button button, EventObject e) {
public void onClick(Button button, EventObject e) {
setSelectionMultiple(false);
raz();
}
}
});
 
this.addListener(new ContainerListenerAdapter() {
@Override
public void onAfterLayout(Container self) {
commune.focus();
}
});
});
}
 
private void ajouterListenerChampsCombobox() {
commune.addListener(new ComboBoxListenerAdapter() {
commune.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
public void onSelect(ComboBox comboBox, Record record, int index) {
commune.setValue(record.getAsString("commune"));
departement=record.getAsString("departement");
codeInseeCommune=record.getAsString("codeInsee");
selectionCommune=true;
commune.collapse();
}
 
}
@Override
public void onExpand(ComboBox comboBox) {
comboBox.focus();
}
});
 
selecteurReferentielTaxo.addListener(new ComboBoxListenerAdapter() {
});
selecteurReferentielTaxo.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
referentielTaxo = record.getAsString("valeur");
observationMediateur.setRefTaxSelectionne(index);
referentielTaxoModifie = true;
}
});
 
espece.addListener(new ComboBoxListenerAdapter() {
}
});
espece.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
public void onSelect(ComboBox comboBox, Record record, int index) {
espece.setValue(record.getAsString("nom"));
numeroNom=record.getAsString("numeroNom");
selectionEspece=true;
observationMediateur.obtenirImageInformationExternes(referentielTaxo, numeroNom);
}
});
 
selecteurAbondance.addListener(new ComboBoxListenerAdapter() {
}
});
selecteurAbondance.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
public void onSelect(ComboBox comboBox, Record record, int index) {
selectionAbondance=true;
abondanceModifiee = true;
}
});
selecteurCertitude.addListener(new ComboBoxListenerAdapter() {
 
selecteurCertitude.addListener(new ComboBoxListenerAdapter() {
 
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
public void onSelect(ComboBox comboBox, Record record, int index) {
selectionCertitude=true;
certitudeModifiee = true;
}
});
 
selecteurStadePheno.addListener(new ComboBoxListenerAdapter() {
});
selecteurStadePheno.addListener(new ComboBoxListenerAdapter() {
@Override
public void onSelect(ComboBox comboBox, Record record, int index) {
public void onSelect(ComboBox comboBox, Record record, int index) {
selectionPhenologie=true;
phenologieModifiee = true;
}
});
});
}
 
private void ajouterListenerChampEvenementsClavier(final TextField champ) {
champ.addKeyPressListener(new EventCallback() {
@Override
870,8 → 870,8
}
});
}
 
 
private void ajouterListenerChampEvenementsClavier(final TextField champ, final ListenerConfig config) {
champ.addKeyPressListener(new EventCallback() {
@Override
880,9 → 880,9
}
}, config);
}
 
private void surEvenementClavier(EventObject e, TextField champ) {
switch(e.getKey()) {
switch(e.getKey()) {
case KEY_ALT:
case KEY_CTRL:
case KEY_DOWN:
897,55 → 897,55
case KEY_TAB:
case KEY_UP:
break;
 
case KEY_ENTER:
surEvenementClavierToucheEntree(champ);
break;
 
default:
gererEvenementClavierDefaut(champ);
break;
}
}
 
private void surEvenementClavierToucheEntree(TextField champ) {
//TODO: faire un switch ou une enum
if(champ.equals(selecteurStadePheno)) {
if(!selectionPhenologie) {
validerSaisie(Champs.PHENOLOGIE);
if(!selectionPhenologie) {
validerSaisie(Champs.PHENOLOGIE);
} else {
selectionPhenologie = false;
}
}
 
if(champ.equals(selecteurCertitude)) {
if(!selectionCertitude) {
validerSaisie(Champs.CERTITUDE);
if(!selectionCertitude) {
validerSaisie(Champs.CERTITUDE);
} else {
selectionCertitude = false;
}
}
 
if(champ.equals(selecteurAbondance)) {
if(!selectionAbondance) {
validerSaisie(Champs.ABONDANCE);
if(!selectionAbondance) {
validerSaisie(Champs.ABONDANCE);
} else {
selectionAbondance = false;
}
}
 
if(champ.equals(longitude)) {
validerSaisie(Champs.LONGITUDE);
}
 
if(champ.equals(latitude)) {
validerSaisie(Champs.LATITUDE);
if(champ.equals(latitude)) {
validerSaisie(Champs.LATITUDE);
}
 
if(champ.equals(altitude)) {
validerSaisie(Champs.ALTITUDE);
if(champ.equals(altitude)) {
validerSaisie(Champs.ALTITUDE);
}
 
if(champ.equals(espece)) {
if(selectionEspece) {
especeModifiee = true;
952,19 → 952,19
selectionEspece=false;
}
else {
validerSaisie(Champs.ESPECE);
validerSaisie(Champs.ESPECE);
}
}
 
if(champ.equals(selecteurReferentielTaxo)) {
validerSaisie(Champs.REFERENTIELTAXO);
validerSaisie(Champs.REFERENTIELTAXO);
}
 
if(champ.equals(date)) {
validerSaisie(Champs.DATE);
validerSaisie(Champs.DATE);
}
 
if(champ.equals(commune)) {
if(champ.equals(commune)) {
if(champ.equals(commune)) {
if (selectionCommune) {
communeModifiee= true;
971,12 → 971,12
selectionCommune=false;
}
else {
validerSaisie(Champs.COMMUNE);
validerSaisie(Champs.COMMUNE);
}
}
}
}
 
private void gererEvenementClavierDefaut(TextField champ) {
//TODO: faire un switch ou une enum
if(champ.equals(selecteurStadePheno)) {
985,7 → 985,7
phenologieModifiee = true;
selectionPhenologie = false;
}
 
if(champ.equals(selecteurCertitude)) {
selecteurCertitude.setRawValue(selecteurCertitude.getRawValue());
selecteurCertitude.setValue(selecteurCertitude.getRawValue());
992,7 → 992,7
certitudeModifiee = true;
selectionCertitude = false;
}
 
if(champ.equals(selecteurAbondance)) {
selecteurAbondance.setRawValue(selecteurAbondance.getRawValue());
selecteurAbondance.setValue(selecteurAbondance.getRawValue());
999,53 → 999,53
abondanceModifiee = true;
selectionAbondance = false;
}
 
if(champ.equals(longitude)) {
longModifiee = true;
tCoord.cancel();
tCoord.schedule(250);
}
 
if(champ.equals(latitude)) {
if(champ.equals(latitude)) {
latModifiee = true;
tCoord.cancel();
tCoord.schedule(250);
}
 
if(champ.equals(altitude)) {
altModifiee = true;
if(champ.equals(altitude)) {
altModifiee = true;
}
 
if(champ.equals(comment)) {
commModifie = true;
}
 
if(champ.equals(espece)) {
numeroNom="";
obtenirListeReferentielNom();
especeModifiee = true;
}
 
if(champ.equals(selecteurReferentielTaxo)) {
referentielTaxoModifie = true;
}
 
if(champ.equals(date)) {
dateModifiee = true;
}
 
if(champ.equals(commune)) {
departement="";
commune.collapse();
commune.collapse();
obtenirListeReferentielCommune();
communeModifiee= true;
communeModifiee= true;
}
}
 
/**
* Validation de la saisie
* Validation de la saisie
*/
 
private void validerSaisie(Champs champs) {
if(!selectionMultiple) {
ajouterObservation();
1054,7 → 1054,7
modifierObservationEnMasse(champs);
}
}
 
/**
* Desactive visuellement ce panneau
*/
1062,7 → 1062,7
{
this.setDisabled(true) ;
}
 
/**
* Active visuellement ce panneau
*/
1073,7 → 1073,7
 
@Override
public void rafraichir(Object nouvelleDonnees, boolean repandreRaffraichissement) {
 
// si l'on a reçu une liste du referentiel commune (completion referentiel commune)
if(nouvelleDonnees instanceof ListeReferentielCommune)
{
1080,36 → 1080,36
ListeReferentielCommune data = (ListeReferentielCommune) nouvelleDonnees ;
Object[][] communeData = new Object[data.size()][3];
int i = 0 ;
 
// on la parse et on récupère les informations quiç nous interessent
for (Iterator it = data.keySet().iterator(); it.hasNext();)
{
for (Iterator it = data.keySet().iterator(); it.hasNext();)
{
ReferentielCommune ref=data.get(it.next());
 
communeData[i][0]= ref.getCommune();
communeData[i][1]= ref.getDepartement();
communeData[i][2]= ref.getCodeInsee();
i++ ;
}
 
// creation du store
FieldDef defCommune = new StringFieldDef("commune");
FieldDef defDepartement = new StringFieldDef("departement");
FieldDef defCodeInsee = new StringFieldDef("codeInsee");
 
FieldDef[] defTab = { defCommune, defDepartement, defCodeInsee};
 
RecordDef rd = new RecordDef(defTab);
 
final MemoryProxy dataProxy = new MemoryProxy(communeData);
final ArrayReader reader = new ArrayReader(rd);
 
Store store=new Store(dataProxy,reader);
final ArrayReader reader = new ArrayReader(rd);
Store store=new Store(dataProxy,reader);
commune.setStore(store);
store.load();
 
}
 
// si l'on a reçu une liste du référentiel nom (complétion referentiel nom)
if(nouvelleDonnees instanceof ListeReferentielNom)
{
1118,11 → 1118,11
int i = 0 ;
 
// on la parse et on récupère les informations qui nous interessent
for (Iterator it = data.keySet().iterator(); it.hasNext();)
for (Iterator it = data.keySet().iterator(); it.hasNext();)
{
 
ReferentielNom ref=data.get(it.next());
 
nomData[i][0]= ref.getNom();
nomData[i][1]= ref.getNumeroNom();
if (ref.getStatut().equals("3")) {
1130,7 → 1130,7
}
else {
nomData[i][2]="";
}
}
i++ ;
}
 
1137,21 → 1137,21
FieldDef defNom = new StringFieldDef("nom");
FieldDef defNumeroNom = new StringFieldDef("numeroNom");
FieldDef indicateurNomRetenu = new StringFieldDef("indicateurNomRetenu");
 
FieldDef[] defTab = { defNom, defNumeroNom, indicateurNomRetenu};
 
RecordDef rd = new RecordDef(defTab);
 
final MemoryProxy dataProxy = new MemoryProxy(nomData);
final ArrayReader reader = new ArrayReader(rd);
 
Store store=new Store(dataProxy,reader);
final ArrayReader reader = new ArrayReader(rd);
Store store=new Store(dataProxy,reader);
espece.setStore(store);
store.load() ;
}
 
// On recoit une observation dont on veut afficher le detail
 
// On recoit une observation dont on veut afficher le detail
if(nouvelleDonnees instanceof Observation)
{
Observation obs = (Observation)nouvelleDonnees ;
1158,26 → 1158,26
setSelectionMultiple(false);
afficherDetailsObservation(obs) ;
}
 
if(nouvelleDonnees instanceof ListeObservation) {
 
ListeObservation listeObs = (ListeObservation)nouvelleDonnees;
setSelectionMultiple(true);
calculerAfficherDifferences(listeObs);
}
 
if(nouvelleDonnees instanceof String)
{
String str = (String)nouvelleDonnees ;
observationMediateur.obtenirNombreObservation() ;
}
 
if(nouvelleDonnees instanceof String[]) {
String[] anumNom = (String[])nouvelleDonnees ;
numeroNom = anumNom[1];
espece.setValue(anumNom[0]);
}
 
if(nouvelleDonnees instanceof EntiteGeographiqueObservation)
{
EntiteGeographiqueObservation infosComm = (EntiteGeographiqueObservation)nouvelleDonnees ;
1188,26 → 1188,26
}
}
}
 
private void afficherIndicationCommune(
final EntiteGeographiqueObservation infosCom) {
 
String nCommune = "";
if(infosCom != null && !infosCom.getZoneGeo().trim().equals("")){
nCommune += infosCom.getZoneGeo();
if(!infosCom.getIdZoneGeo().trim().equals(""))
nCommune += " ("+Util.convertirChaineZoneGeoVersDepartement(infosCom.getIdZoneGeo())+")";
 
lienSelectionCommune.setHtml("<a id=\"lien_selection_commune\" tabindex=\"9\">"+nCommune+"</a>");
lienSelectionCommune.setStyleName("img-curseur-depl");
 
Ext.get("lien_selection_commune").addListener("click",new EventCallback() {
@Override
public void execute(EventObject e) {
rafraichirCommune(infosCom);
}
}
});
 
Ext.get("lien_selection_commune").addListener("keypress",new EventCallback() {
@Override
public void execute(EventObject e) {
1214,23 → 1214,23
if(e.getCharCode() == KEY_ENTER) {
rafraichirCommune(infosCom);
}
}
}
});
 
Ext.get("lien_selection_commune").addListener("focus",new EventCallback() {
@Override
public void execute(EventObject e) {
Ext.get("lien_selection_commune").toggleClass("lien_sel");
}
}
});
 
Ext.get("lien_selection_commune").addListener("blur",new EventCallback() {
@Override
public void execute(EventObject e) {
Ext.get("lien_selection_commune").toggleClass("lien_sel");
}
}
});
 
} else {
if(rechercheCommuneEnCours) {
lienSelectionCommune.setHtml("<span id=\"aucune_selection_commune\"> Erreur de localisation </span>");
1242,14 → 1242,14
Ext.get(lienSelectionCommune.getElement()).unmask();
rechercheCommuneEnCours = false;
}
 
private void rafraichirCommune(EntiteGeographiqueObservation infosCom) {
String nCommune = "";
 
if(infosCom.getZoneGeo() != null && !infosCom.getZoneGeo().equals("")) {
nCommune += infosCom.getZoneGeo();
}
 
if(infosCom.getIdZoneGeo() != null && !infosCom.getIdZoneGeo().equals("")) {
String codeGeoFormate = Util.convertirChaineZoneGeoVersDepartement(infosCom.getIdZoneGeo());
nCommune += " ("+codeGeoFormate+")";
1263,7 → 1263,7
// on ne remplace la commune que si le champ était vide
if(commune.getRawValue() == null || commune.getRawValue().equals("")) {
rafraichirCommune(infosCom);
}
}
 
if(infosCom.getLat() != null && !infosCom.getLat().equals("")) {
latitude.setValue(infosCom.getLat());
1272,34 → 1272,34
if(infosCom.getLon() != null && !infosCom.getLon().equals("")) {
longitude.setValue(infosCom.getLon());
}
 
latModifiee = true;
longModifiee = true;
 
coordPanel.setVisible(true);
}
 
public void obtenirListeReferentielCommune() {
 
String com=commune.getText();
com=com.replaceAll("%","");
 
observationMediateur.obtenirListeReferentielCommune(this,com);
 
}
 
public void obtenirListeReferentielNom() {
public void obtenirListeReferentielNom() {
String esp=espece.getText().replaceAll(" ","/*");
esp=esp.replaceAll("%","");
String referentiel = this.referentielTaxo;
 
observationMediateur.obtenirListeReferentielNom(this,referentiel ,esp);
observationMediateur.obtenirListeReferentielNom(this,referentiel ,esp);
}
 
protected void obtenirReferentielStation() {
protected void obtenirReferentielStation() {
observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_STATION,station.getText());
}
 
protected void obtenirListeReferentielMilieu() {
observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_MILIEU,milieu.getText());
}
1307,15 → 1307,15
protected void obtenirReferentielLieuDit() {
observationMediateur.obtenirListeReferentielPerso(this,TypesReferentiels.REFERENTIEL_LIEU_DIT,lieudit.getText());
}
 
public void ajouterObservation() {
 
if(date.getRawValue() != null && !date.getRawValue().equals("") && !Util.verifierDateFormatCel(date.getRawValue())) {
Window.alert("Attention la date saisie est invalide, la date doit être au format jj/mm/aaaa");
date.setInvalidText("Date invalide");
return;
}
 
if(departement != null) {
if(departement.equals("000null") || departement.equals("")) {
String[] depCom = commune.getText().split(" ");
1325,7 → 1325,7
dep = dep.trim();
dep = dep.replace('\\',' ');
dep = dep.trim();
 
try
{
int nDep = Integer.parseInt(dep);
1343,8 → 1343,8
 
String dateObs = Util.remplacerSeparateursDateFormatCel(date.getRawValue());
 
Observation obs=new Observation(espece.getText(),numeroNom,commune.getText(),departement,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);
 
Observation obs=new Observation(espece.getText(),numeroNom,commune.getText(),departement,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);
String[] coords = getValeurCoordonnees();
obs.setLatitude(coords[0]);
obs.setLongitude(coords[1]);
1353,25 → 1353,25
obs.setAbondance(getAbondance());
obs.setCertitude(getCertitude());
obs.setPhenologie(getPhenologie());
 
obs.setReferentielTaxo(Ontologies.getInfosReferentielNomParCode(referentielTaxo).getCodeVersionComplet());
obs.setChampsEtendus(getValeursChampsEtendus());
 
observationMediateur.ajouterObservation(obs);
}
 
private void modifierObservation() {
 
if(!Window.confirm("Êtes-vous sur de vouloir modifier l'observation sélectionnée ?")) {
return;
}
 
if(date.getRawValue() != null && !date.getRawValue().equals("") && !Util.verifierDateFormatCel(date.getRawValue())) {
Window.alert("Attention la date saisie est invalide, la date doit être au format jj/mm/aaaa");
date.setInvalidText("Date invalide");
return;
}
 
if(departement.equals("000null") || departement.equals("")) {
String[] depCom = commune.getText().split(" ");
if(depCom.length > 1) {
1380,7 → 1380,7
dep = dep.trim();
dep = dep.replace('\\',' ');
dep = dep.trim();
 
try
{
int nDep = Integer.parseInt(dep);
1394,29 → 1394,29
}
}
}
 
String dateObs = Util.remplacerSeparateursDateFormatCel(date.getRawValue());
 
Observation obs=new Observation(espece.getText(),numeroNom,commune.getText(),departement,lieudit.getText(),station.getText(),milieu.getText(), comment.getText(),dateObs);
obs.setNumeroOrdre(numeroOrdre);
 
String[] coords = getValeurCoordonnees();
 
obs.setLatitude(coords[0]);
obs.setLongitude(coords[1]);
obs.setAltitude(altitude.getText());
 
obs.setAbondance(getAbondance());
obs.setCertitude(getCertitude());
obs.setPhenologie(getPhenologie());
obs.setReferentielTaxo(getReferentielTaxo());
obs.setChampsEtendus(getValeursChampsEtendus());
 
observationMediateur.modifierObservation(obs);
}
 
private void modifierObservationEnMasse(Champs champModifie) {
 
//TODO: factoriser
String communeM = null;
String departementM = null;
1426,7 → 1426,7
String milieuM = null;
String dateM = null;
String especeM = null;
String commM = null;
String commM = null;
String latM = null;
String longM = null;
String altM = null;
1434,12 → 1434,12
String certitudeM = null;
String referentielTaxoM = null;
String phenologieM = null;
 
String champs = modeleMessageModif;
 
if(communeModifiee && ! commune.getRawValue().equals(VALEURS_MULTIPLES)) {
if(communeModifiee) {
communeM = commune.getText();
 
if(departement.equals("000null") || departement.equals("")) {
String[] depCom = commune.getText().split(" ");
if(depCom.length > 1) {
1448,111 → 1448,113
dep = dep.trim();
dep = dep.replace('\\',' ');
dep = dep.trim();
 
try {
try
{
int nDep = Integer.parseInt(dep);
if(nDep > 0 && nDep < 110) {
departement = dep ;
}
}
catch(NumberFormatException e) {
catch(NumberFormatException e)
{
departement = "" ;
}
}
}
departementM = departement;
}
else {
} else {
champs = champs.replaceAll("commune", "");
}
 
if(lieuDitModifie && ! lieudit.getRawValue().equals(VALEURS_MULTIPLES)) {
if(lieuDitModifie) {
lieuDitM = lieudit.getText();
} else {
}else {
champs = champs.replaceAll(":lieu-dit", "");
}
 
if(stationModifiee && ! station.getRawValue().equals(VALEURS_MULTIPLES)) {
if(stationModifiee) {
stationM = station.getText();
} else {
}else {
champs = champs.replaceAll(":station", "");
}
 
if(milieuModifie && ! milieu.getRawValue().equals(VALEURS_MULTIPLES)) {
if(milieuModifie) {
milieuM = milieu.getText();
} else {
}else {
champs = champs.replaceAll(":milieu", "");
}
 
if(dateModifiee && ! date.getRawValue().equals(VALEURS_MULTIPLES)) {
if(dateModifiee && !date.getRawValue().equals(VALEURS_MULTIPLES)) {
dateM = date.getRawValue();
dateM = Util.remplacerSeparateursDateFormatCel(dateM);
} else {
}else {
champs = champs.replaceAll(":date", "");
}
 
if(especeModifiee && ! espece.getRawValue().equals(VALEURS_MULTIPLES)) {
if(especeModifiee) {
especeM = espece.getText();
numNomSelM = numeroNom;
} else {
}else {
champs = champs.replaceAll(":espece", "");
}
 
if(commModifie && ! comment.getRawValue().equals(VALEURS_MULTIPLES)) {
if(commModifie) {
commM = comment.getText();
} else {
}else {
champs = champs.replaceAll(":commentaire", "");
}
 
if(latModifiee && ! latitude.getRawValue().equals(VALEURS_MULTIPLES)) {
if(latModifiee) {
latM = latitude.getText();
} else {
}else {
champs = champs.replaceAll(":latitude", "");
}
 
if(altModifiee && ! altitude.getRawValue().equals(VALEURS_MULTIPLES)) {
if(altModifiee) {
altM = altitude.getText();
} else {
}else {
champs = champs.replaceAll(":altitude", "");
}
 
if(longModifiee && ! longitude.getRawValue().equals(VALEURS_MULTIPLES)) {
if(longModifiee) {
longM = longitude.getText();
} else {
}else {
champs = champs.replaceAll(":longitude", "");
}
 
if(abondanceModifiee && !selecteurAbondance.getRawValue().equals(VALEURS_MULTIPLES)) {
abondanceM = getAbondance();
} else {
champs = champs.replaceAll(":abondance", "");
}
 
if(certitudeModifiee && !selecteurCertitude.getRawValue().equals(VALEURS_MULTIPLES)) {
certitudeM = getCertitude();
} else {
champs = champs.replaceAll(":identification", "");
}
 
if(referentielTaxoModifie && !selecteurReferentielTaxo.getRawValue().equals(VALEURS_MULTIPLES)) {
referentielTaxoM = getReferentielTaxo();
} else {
champs = champs.replaceAll(":referentiel", "");
}
 
if(phenologieModifiee && !selecteurStadePheno.getRawValue().equals(VALEURS_MULTIPLES)) {
phenologieM = getPhenologie();
} else {
champs = champs.replaceAll(":phenologie", "");
}
 
champs = champs.replaceAll(":",", ");
if(champs.startsWith(",")) {
champs = champs.replaceFirst(",", "");
}
 
String message = "Voulez vous modifier le(s) champ(s) suivant(s) : "+champs+" pour les observations selectionnées ?" ;
 
if(champs.trim().equals("")) {
Window.alert("Aucun champ n'a été modifié");
} else {
1571,11 → 1573,11
}
}
}
 
private void supprimerObservation() {
private void supprimerObservation() {
observationMediateur.supprimerObservation(this, numeroOrdre);
}
 
public void afficherDetailsObservation(Observation obs)
{
raz() ;
1595,7 → 1597,7
idLoc = idLoc.substring(0,2);
}
}
 
if(!obs.getDate().equals("null") && !obs.getDate().equals("000null") && !obs.getDate().equals(VALEURS_MULTIPLES)) {
String[] dateEtHeure = obs.getDate().split(" ", 2);
if(verifierFormatDate(dateEtHeure[0])) {
1603,7 → 1605,7
}
else
{
date.setRawValue("");
date.setRawValue("");
}
} else {
date.setRawValue(VALEURS_MULTIPLES);
1621,7 → 1623,7
if(!obs.getCommentaire().equals("null") && !obs.getCommentaire().equals("000null")) {
 
comment.setRawValue(Util.remplacerSautsDeligneMalEncodes(obs.getCommentaire()));
 
}
if(!obs.getLocalite().equals("null") && !obs.getLocalite().equals("000null")) {
if(!idLoc.equals("000null") && !idLoc.equals("")) {
1648,25 → 1650,25
if(!obs.getNumeroOrdre().equals("null") && !obs.getNumeroOrdre().equals("000null")) {
numeroOrdre = obs.getNumeroOrdre() ;
}
 
if(doitAfficherLatLon(obs)) {
latitude.setValue(Util.formaterNombre(obs.getLatitude())) ;
longitude.setValue(Util.formaterNombre(obs.getLongitude())) ;
}
 
if(!obs.getAltitude().isEmpty() && !obs.getAltitude().equals("null") && !obs.getAltitude().equals("000null")) {
altitude.setValue(Util.formaterNombre(obs.getAltitude())) ;
}
 
selecteurAbondance.getStore().load();
selecteurAbondance.setValue(obs.getAbondance());
 
selecteurCertitude.getStore().load();
selecteurCertitude.setValue(obs.getCertitude());
 
selecteurStadePheno.getStore().load();
selecteurStadePheno.setValue(obs.getPhenologie());
 
selecteurReferentielTaxo.getStore().load();
if(obs.getReferentielTaxo() != VALEURS_MULTIPLES) {
referentielTaxo = obs.getCodeCourtReferentielTaxo();
1678,21 → 1680,21
referentielTaxo = "";
selecteurReferentielTaxo.setRawValue(VALEURS_MULTIPLES);
}
 
afficherChampsEtendus(obs);
}
 
private boolean doitAfficherLatLon(Observation obs) {
return !obs.getLatitude().isEmpty() &&
!obs.getLatitude().equals("null") &&
!obs.getLatitude().equals("null") &&
!obs.getLatitude().equals("000null") &&
!Util.estZero(obs.getLatitude()) &&
!obs.getLongitude().isEmpty() &&
!obs.getLongitude().equals("null") &&
!Util.estZero(obs.getLatitude()) &&
!obs.getLongitude().isEmpty() &&
!obs.getLongitude().equals("null") &&
!obs.getLongitude().equals("000null") &&
!Util.estZero(obs.getLongitude());
}
 
private void viderChampsEtendus() {
if(listeChampsEtendus != null) {
for (Iterator<String> it = listeChampsEtendus.keySet().iterator(); it.hasNext();) {
1708,21 → 1710,21
listeChampsEtendus = null;
}
}
 
private void afficherChampsEtendus(Observation obs) {
viderChampsEtendus();
 
FormLayout flmd = new FormLayout();
flmd.setLabelWidth(150);
 
FormLayout flmg = new FormLayout();
flmg.setLabelWidth(150);
 
conteneurChampEtenduGauche = new Panel();
conteneurChampEtenduGauche.setLayout(flmg);
conteneurChampEtenduDroite = new Panel();
conteneurChampEtenduDroite.setLayout(flmd);
 
conteneurChampEtenduGauche.setAutoWidth(true);
conteneurChampEtenduGauche.setStyle("conteneurChampsEtendus");
conteneurChampEtenduGauche.setBodyBorder(false);
1729,10 → 1731,10
conteneurChampEtenduDroite.setAutoWidth(true);
conteneurChampEtenduDroite.setStyle("conteneurChampsEtendus");
conteneurChampEtenduDroite.setBodyBorder(false);
 
// pour corriger le décalage sur le panneau induit par le lien d'affichage
conteneurChampEtenduDroite.setPaddings(25, 0, 0, 0);
 
if(obs.getChampsEtendus() != null && obs.getChampsEtendus().size() > 0) {
lienAfficherChampsEtendus.setVisible(true);
listeChampsEtendus = new HashMap<String, TextField>(obs.getChampsEtendus().size());
1742,7 → 1744,7
ChampEtendu champ = obs.getChampsEtendus().get(id);
String valeur = champ.getValeur();
String label = champ.getLabel();
 
TextField champTexteEtendu = new TextField();
champTexteEtendu.setWidth("90%");
champTexteEtendu.setLabel(label);
1757,10 → 1759,10
listeChampsEtendus.put(id, champTexteEtendu);
gauche = !gauche;
}
 
panneauPremierColonne.add(conteneurChampEtenduGauche);
panneauSecondeColonne.add(conteneurChampEtenduDroite);
 
if(!afficherChampsEtendus) {
conteneurChampEtenduGauche.setVisible(false);
conteneurChampEtenduDroite.setVisible(false);
1770,7 → 1772,7
}
doLayout();
}
 
private Map<String, ChampEtendu> getValeursChampsEtendus() {
Map<String, ChampEtendu> valeursChampsEtendus = new HashMap<String, ChampEtendu>();
if(listeChampsEtendus != null) {
1785,11 → 1787,11
}
return valeursChampsEtendus;
}
 
public void raz()
{
raz(Champs.TOUT);
 
}
public void raz(Champs champs)
{
1797,19 → 1799,19
case DATE:
date.reset() ;
break;
 
case LIEUDIT:
lieudit.reset() ;
break;
 
case STATION:
station.reset() ;
break;
 
case MILIEU:
milieu.reset() ;
break;
 
case COMMENT:
comment.reset() ;
break;
1820,43 → 1822,43
latitude.reset();
longitude.reset();
break;
 
case ESPECE:
espece.reset();
numeroNom = "" ;
numeroOrdre = "";
break;
 
case LATITUDE:
latitude.reset();
afficherIndicationCommune(null);
break;
 
case LONGITUDE:
longitude.reset();
afficherIndicationCommune(null);
break;
 
case ALTITUDE:
altitude.reset();
break;
 
case ABONDANCE:
selecteurAbondance.setValue("");
break;
 
case CERTITUDE:
selecteurCertitude.setValue("");
break;
 
case REFERENTIELTAXO:
selecteurReferentielTaxo.setValue("");
break;
 
case PHENOLOGIE:
selecteurStadePheno.setValue("");
break;
 
case TOUT:
commune.reset();
date.reset() ;
1881,11 → 1883,11
break;
 
}
 
}
 
public boolean verifierFormatDate(String date) {
 
String regex = "[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}" ;
if(date.matches(regex) && !date.equals("0000-00-00")) {
return true ;
1905,13 → 1907,13
boutonOK.disable();
}
}
 
public boolean getSelectionMultiple() {
return selectionMultiple;
}
 
private void calculerAfficherDifferences(ListeObservation listeObs) {
 
String departement = null;
String commune = null;
String lieuDit = null;
1927,9 → 1929,9
String certitude = null;
String referentielTaxo = null;
String phenologie = null;
 
String ordreObs = "";
 
for(Iterator<String> it = listeObs.keySet().iterator();it.hasNext();) {
Observation obsEnCours = listeObs.get(it.next());
departement = comparerDifferencesChamps(departement, obsEnCours.getIdentifiantLocalite());
1937,7 → 1939,7
lieuDit = comparerDifferencesChamps(lieuDit, obsEnCours.getLieudit());
station = comparerDifferencesChamps(station, obsEnCours.getStation());
milieu = comparerDifferencesChamps(milieu, obsEnCours.getMilieu());
espece = comparerDifferencesChamps(espece, obsEnCours.getNomSaisi());
espece = comparerDifferencesChamps(espece, obsEnCours.getNomSaisi());
date = comparerDifferencesChamps(date, obsEnCours.getDate());
notes = comparerDifferencesChamps(notes, obsEnCours.getCommentaire());
lat = comparerDifferencesChamps(lat, obsEnCours.getLatitude());
1947,10 → 1949,10
certitude = comparerDifferencesChamps(certitude, obsEnCours.getCertitude());
referentielTaxo = comparerDifferencesChamps(referentielTaxo, obsEnCours.getReferentielTaxo());
phenologie = comparerDifferencesChamps(phenologie, obsEnCours.getPhenologie());
 
ordreObs += obsEnCours.getNumeroOrdre()+",";
}
 
Observation obs=new Observation(espece,numeroNom,commune,departement,lieuDit,station,milieu, notes,date);
obs.setNumeroOrdre(ordreObs);
obs.setLatitude(lat);
1960,13 → 1962,13
obs.setCertitude(certitude);
obs.setReferentielTaxo(referentielTaxo);
obs.setPhenologie(phenologie);
afficherDetailsObservation(obs);
afficherDetailsObservation(obs);
}
 
private String comparerDifferencesChamps(String valeurActuelle, String nouvelleValeur) {
 
String retour = "000null";
 
if(valeurActuelle == null) {
retour = nouvelleValeur;
} else {
1978,8 → 1980,8
}
return retour;
}
 
private void reinitialiserValeurModifiees() {
private void reinitialiserValeurModifiees() {
communeModifiee = false;
lieuDitModifie = false;
stationModifiee = false;
1995,7 → 1997,7
referentielTaxoModifie = false;
phenologieModifiee = false;
}
 
public void saisieTabindex()
{
commune.setTabIndex(1);
2012,9 → 2014,9
} else {
Ext.get("lien_carto").focus();
}
}
}
});
 
latitude.setTabIndex(8);
longitude.setTabIndex(9);
altitude.setTabIndex(10);
2026,9 → 2028,9
selecteurStadePheno.setTabIndex(16);
boutonOK.setTabIndex(17);
boutonAnnuler.setTabIndex(18);
 
}
 
private void obtenirInformationCoord() {
if(coordonneesValides() != null) {
observationMediateur.obtenirInformationCoord(LatLng.newInstance(coordonneesValides()[0],coordonneesValides()[1]));
2037,29 → 2039,29
}
 
}
 
private void obtenirInformationCommune() {
observationMediateur.obtenirInformationCommune(getCommuneSansDepartement(), Util.obtenirDepartementAPartirChaineCommune(departement, commune.getText()));
}
 
public double[] coordonneesValides() {
 
try {
 
double lat = Double.parseDouble(latitude.getValueAsString().replaceAll(",", "."));
double lon = Double.parseDouble(longitude.getValueAsString().replaceAll(",", "."));
 
double[] coord = {lat, lon};
return coord;
 
} catch (NumberFormatException ne) {
return null;
}
}
 
private String[] getValeurCoordonnees() {
double[] coDouble = coordonneesValides();
 
if(coDouble != null) {
String[] coord = {coDouble[0]+"",coDouble[1]+""};
return coord;
2068,33 → 2070,33
return coord;
}
}
 
public String getCommune() {
 
String valeurCommune = "";
 
if(commune.getValue() != null) {
valeurCommune = commune.getValue();
valeurCommune = commune.getValue();
}
return valeurCommune;
}
 
public String getDepartement() {
return Util.obtenirDepartementAPartirChaineCommune(departement, commune.getText());
}
 
public String getCommuneSansDepartement() {
return Util.supprimerNumDepartementChaineLocalite(getCommune());
}
 
private String getValeurChampListeLibre(ComboBox champ) {
String valeurChamp = champ.getValue();
String valeurChampBrute = champ.getRawValue();
 
// Test idiot qui permet de savoir si l'on utilise la valeur saisie directement ou bien la valeur
// selectionnee car lors du setValue sur le keypress, gwtext ne prends pas en compte le dernier
// selectionnee car lors du setValue sur le keypress, gwtext ne prends pas en compte le dernier
// caractère
 
if(valeurChampBrute.trim().length() == 0) {
valeurChamp = "";
} else {
2110,15 → 2112,15
public String getAbondance() {
return getValeurChampListeLibre(selecteurAbondance);
}
 
public String getCertitude() {
return getValeurChampListeLibre(selecteurCertitude);
}
 
public String getPhenologie() {
return getValeurChampListeLibre(selecteurStadePheno);
}
 
public String getReferentielTaxo() {
String codeCourt = getValeurChampListeLibre(selecteurReferentielTaxo);
return Ontologies.getInfosReferentielNomParCode(codeCourt).getCodeVersionComplet();
2127,13 → 2129,13
public boolean communeInitialisee() {
return communeModifiee;
}
 
public void redimensionnerFormulaire() {
afficherFormulaireLatLon.setWidth(panneauIntermediaire.getWidth()+"px");
panneauPremierColonne.doLayout();
panneauSecondeColonne.doLayout();
panneauIntermediaire.doLayout();
 
doLayout();
}
}
Property changes:
Modified: svn:mergeinfo
Reverse-merged /trunk/src/org/tela_botanica/client/vues/observation/FormulaireSaisieObservationVue.java:r1840-1908
/branches/v1.7-croissant/src/org/tela_botanica/cel2.gwt.xml
14,9 → 14,9
<!-- Parsing JSON -->
<inherits name='com.google.gwt.json.JSON' />
<!-- cartes -->
<!-- Encore des trucs pour les cartes -->
<inherits name="com.google.gwt.maps.GoogleMaps" />
<inherits name='com.gwtext.GwtExt'/>
<!-- Encore des trucs pour les user extensions -->
<inherits name='com.gwtextux.GwtExtUx' />
<!-- Specify the app entry point class. -->
/branches/v1.7-croissant/war/config.defaut.js
9,7 → 9,7
utiliseRedirectionImage:"1",
referentielGeo:"WGS84",
cleGoogleMaps:"ABQIAAAADBUAHF9l14gI02QVAbUYJBRqPsByHDhzHLE0yoC9hASLZaFmoRT4_9Zkiscf-BaH_gEy7DVHX5BxwQ",
referentielsDispos:"bdtfx:v2.00,Métropole (BDTFX);bdtxa:v1.01,Antilles Françaises (BDTXA);isfan:v1.00,Afrique du Nord (ISFAN);autre,Autre/Inconnu",
referentielsDispos:"bdtfx:v1.01,Métropole (BDTFX);bdtxa:v1.00,Antilles Françaises (BDTXA);isfan:v1.00,Afrique du Nord (ISFAN);autre,Autre/Inconnu",
refTaxVersion:"1",
lienEfloreBaseUrl:"www.tela-botanica.org/eflore",
licence:"",
/branches/v1.7-croissant/.
Property changes:
Modified: svn:mergeinfo
Reverse-merged /trunk:r1840,1842-1902,1904-1913