Closed camillemonchicourt closed 6 years ago
Fait : https://github.com/PnX-SI/GeoNature/commit/65b3288ad863deae119b276c5d9e0fccc835e4c3
Et dans les scripts de MAJ de la BDD : https://github.com/PnX-SI/GeoNature/commit/fbd15e185c61461fbc3863ee77ca00af991fc758
Il y a encore pas mal de problèmes sur cette partie du trigger.
Si je modifie un relevé et que j'y rajoute un taxon, la nouvelle occurrence n'a pas de observer_txt
au niveau de la Synthèse.
Enfin plutôt; ça vide le champ observer_txt
des taxons existants précédemment sur ce relevé au niveau de la Synthèse.
Si je remodifie le relevé et réenregistre el relevé sans le modifier, ça vide le champs observer_txt
de la Synthèse de toutes les occurrences du relevé.
@gildeluermoz je viens d'installer la branche develop
et j'ai toujours des problèmes.
Quand j'ajoute un taxon sur un relevé existant, cela vide le champs observer_txt
de la synthèse pour les occurrences de ce relevé.
En regardant les récents commits, je crois que tu n'as rien changé sur ce volet en fait ?
Voila le problème en image : http://geonature.fr/docs/bugs/2018-10-geonature-bug-observer-txt.gif
Bon on va y arriver ! Vive les triggers ! J'avais pas capté le lien avec la modif concernant les occurrences de taxons. Mais comme je n'avais toujours pas le soucis sur mon poste en local, j'ai testé sur le serveur de test et j'ai bien pu reproduire ce que tu as mis en vidéo. Ensuite, j'ai passé la partie occtax du script rc2torc3 (ci-dessous) sur la base du serveur de test et ça a corrigé le soucis. Tu peux retester sur le serveur de test si tu veux. Voici ce que j'ai passé et on a la même chose sur le fichier occtax.sql (je réinstalle ma base pour en être sur) :
-- Fonction utilisée pour les triggers vers synthese CREATE OR REPLACE FUNCTION pr_occtax.insert_in_synthese(my_id_counting integer) RETURNS integer[] AS $BODY$ DECLARE new_count RECORD; occurrence RECORD; releve RECORD; id_source integer; validation RECORD; id_nomenclature_source_status integer; myobservers RECORD; id_role_loop integer;
BEGIN --recupération du counting à partir de son ID SELECT INTO new_count * FROM pr_occtax.cor_counting_occtax WHERE id_counting_occtax = my_id_counting;
-- Récupération de l'occurrence SELECT INTO occurrence * FROM pr_occtax.t_occurrences_occtax occ WHERE occ.id_occurrence_occtax = new_count.id_occurrence_occtax;
-- Récupération du relevé SELECT INTO releve * FROM pr_occtax.t_releves_occtax rel WHERE occurrence.id_releve_occtax = rel.id_releve_occtax;
-- Récupération de la source SELECT INTO id_source s.id_source FROM gn_synthese.t_sources s WHERE name_source ILIKE 'occtax';
-- Récupération du status de validation du counting dans la table t_validation SELECT INTO validation v.*, CONCAT(r.nom_role, r.prenom_role) as validator_full_name FROM gn_commons.t_validations v LEFT JOIN utilisateurs.t_roles r ON v.id_validator = r.id_role WHERE uuid_attached_row = new_count.unique_id_sinp_occtax;
-- Récupération du status_source depuis le JDD SELECT INTO id_nomenclature_source_status d.id_nomenclature_source_status FROM gn_meta.t_datasets d WHERE id_dataset = releve.id_dataset;
--Récupération et formatage des observateurs SELECT INTO myobservers array_to_string(array_agg(rol.nom_role || ' ' || rol.prenom_role), ', ') AS observers_name, array_agg(rol.id_role) AS observers_id FROM pr_occtax.cor_role_releves_occtax cor JOIN utilisateurs.t_roles rol ON rol.id_role = cor.id_role WHERE cor.id_releve_occtax = releve.id_releve_occtax;
-- insertion dans la synthese INSERT INTO gn_synthese.synthese ( unique_id_sinp, unique_id_sinp_grp, id_source, entity_source_pk_value, id_dataset, id_nomenclature_geo_object_nature, id_nomenclature_grp_typ, id_nomenclature_obs_meth, id_nomenclature_obs_technique, id_nomenclature_bio_status, id_nomenclature_bio_condition, id_nomenclature_naturalness, id_nomenclature_exist_proof, id_nomenclature_valid_status, id_nomenclature_diffusion_level, id_nomenclature_life_stage, id_nomenclature_sex, id_nomenclature_obj_count, id_nomenclature_type_count, id_nomenclature_observation_status, id_nomenclature_blurring, id_nomenclature_source_status, id_nomenclature_info_geo_type, count_min, count_max, cd_nom, nom_cite, meta_v_taxref, sample_number_proof, digital_proof, non_digital_proof, altitude_min, altitude_max, the_geom_4326, the_geom_point, the_geom_local, date_min, date_max, validator, validation_comment, observers, determiner, id_digitiser, id_nomenclature_determination_method, comments, last_action )
VALUES( new_count.unique_id_sinp_occtax, releve.unique_id_sinp_grp, id_source, new_count.id_counting_occtax, releve.id_dataset, --nature de l'objet geo: id_nomenclature_geo_object_nature Le taxon observé est présent quelque part dans l'objet géographique - NSP par défault pr_occtax.get_default_nomenclature_value('NAT_OBJ_GEO'), releve.id_nomenclature_grp_typ, occurrence.id_nomenclature_obs_meth, releve.id_nomenclature_obs_technique, occurrence.id_nomenclature_bio_status, occurrence.id_nomenclature_bio_condition, occurrence.id_nomenclature_naturalness, occurrence.id_nomenclature_exist_proof, -- statut de validation récupérer à partir de gn_commons.t_validations validation.id_nomenclature_valid_status, occurrence.id_nomenclature_diffusion_level, new_count.id_nomenclature_life_stage, new_count.id_nomenclature_sex, new_count.id_nomenclature_obj_count, new_count.id_nomenclature_type_count, occurrence.id_nomenclature_observation_status, occurrence.id_nomenclature_blurring, -- status_source récupéré depuis le JDD id_nomenclature_source_status, -- id_nomenclature_info_geo_type: type de rattachement = géoréferencement ref_nomenclatures.get_id_nomenclature('TYP_INF_GEO', '1') , new_count.count_min, new_count.count_max, occurrence.cd_nom, occurrence.nom_cite, occurrence.meta_v_taxref, occurrence.sample_number_proof, occurrence.digital_proof, occurrence.non_digital_proof, releve.altitude_min, releve.altitude_max, releve.geom_4326, ST_CENTROID(releve.geom_4326), releve.geom_local, (to_char(releve.date_min, 'DD/MM/YYYY') || ' ' || COALESCE(to_char(releve.hour_min, 'HH24:MI:SS'),'00:00:00'))::timestamp, (to_char(releve.date_max, 'DD/MM/YYYY') || ' ' || COALESCE(to_char(releve.hour_max, 'HH24:MI:SS'),'00:00:00'))::timestamp, validation.validator_full_name, validation.validation_comment, COALESCE (myobservers.observers_name, releve.observers_txt), occurrence.determiner, releve.id_digitiser, occurrence.id_nomenclature_determination_method, CONCAT(COALESCE('Relevé : '||releve.comment || ' / ', NULL ), COALESCE('Occurrence: '||occurrence.comment, NULL)), 'I' );
RETURN myobservers.observers_id ; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;
--UPDATE Occurrence CREATE OR REPLACE FUNCTION pr_occtax.fct_tri_synthese_update_occ() RETURNS trigger AS $BODY$ DECLARE releve RECORD; BEGIN -- récupération du releve pour le commentaire à concatener SELECT INTO releve FROM pr_occtax.t_releves_occtax WHERE id_releve_occtax = NEW.id_releve_occtax; IF releve.comment = '' THEN releve.comment = NULL; END IF; IF NEW.comment = '' THEN NEW.comment = NULL; END IF; UPDATE gn_synthese.synthese SET id_nomenclature_obs_meth = NEW.id_nomenclature_obs_meth, id_nomenclature_bio_condition = NEW.id_nomenclature_bio_condition, id_nomenclature_bio_status = NEW.id_nomenclature_bio_status, id_nomenclature_naturalness = NEW.id_nomenclature_naturalness, id_nomenclature_exist_proof = NEW.id_nomenclature_exist_proof, id_nomenclature_diffusion_level = NEW.id_nomenclature_diffusion_level, id_nomenclature_observation_status = NEW.id_nomenclature_observation_status, id_nomenclature_blurring = NEW.id_nomenclature_blurring, id_nomenclature_source_status = NEW.id_nomenclature_source_status, determiner = NEW.determiner, id_nomenclature_determination_method = NEW.id_nomenclature_determination_method, cd_nom = NEW.cd_nom, nom_cite = NEW.nom_cite, meta_v_taxref = NEW.meta_v_taxref, sample_number_proof = NEW.sample_number_proof, digital_proof = NEW.digital_proof, non_digital_proof = NEW.non_digital_proof, comments = CONCAT(COALESCE('Relevé : '||releve.comment || ' / ', NULL ), COALESCE('Occurrence: '||NEW.comment, NULL)), last_action = 'U' WHERE unique_id_sinp IN (SELECT unique_id_sinp_occtax FROM pr_occtax.cor_counting_occtax WHERE id_occurrence_occtax = NEW.id_occurrence_occtax); RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; -- UPDATE Releve CREATE OR REPLACE FUNCTION pr_occtax.fct_tri_synthese_update_releve() RETURNS trigger AS $BODY$ DECLARE theoccurrence RECORD; myobservers text; BEGIN --calcul de l'observateur. On privilégie le ou les observateur(s) de cor_role_releves_occtax --Récupération et formatage des observateurs SELECT INTO myobservers array_to_string(array_agg(rol.nom_role || ' ' || rol.prenom_role), ', ') FROM pr_occtax.cor_role_releves_occtax cor JOIN utilisateurs.t_roles rol ON rol.id_role = cor.id_role WHERE cor.id_releve_occtax = NEW.id_releve_occtax; IF myobservers IS NULL THEN myobservers = NEW.observers_txt; END IF; --mise à jour en synthese des informations correspondant au relevé uniquement UPDATE gn_synthese.synthese SET id_dataset = NEW.id_dataset, observers = myobservers, id_digitiser = NEW.id_digitiser, id_nomenclature_obs_technique = NEW.id_nomenclature_obs_technique, id_nomenclature_grp_typ = NEW.id_nomenclature_grp_typ, date_min = (to_char(NEW.date_min, 'DD/MM/YYYY') || ' ' || COALESCE(to_char(NEW.hour_min, 'HH24:MI:SS'),'00:00:00'))::timestamp, date_max = (to_char(NEW.date_max, 'DD/MM/YYYY') || ' ' || COALESCE(to_char(NEW.hour_max, 'HH24:MI:SS'),'00:00:00'))::timestamp, altitude_min = NEW.altitude_min, altitude_max = NEW.altitude_max, the_geom_4326 = NEW.geom_4326, the_geom_point = ST_CENTROID(NEW.geom_4326), last_action = 'U' WHERE unique_id_sinp IN (SELECT unnest(pr_occtax.get_unique_id_sinp_from_id_releve(NEW.id_releve_occtax::integer))); -- récupération de l'occurrence pour le releve et mise à jour des commentaires avec celui de l'occurence seulement si le commentaire à changé IF NEW.comment = '' THEN NEW.comment = NULL; END IF; IF(NEW.comment <> OLD.comment OR (NEW.comment IS NULL AND OLD.comment IS NOT NULL)) THEN FOR theoccurrence IN SELECT FROM pr_occtax.t_occurrences_occtax WHERE id_releve_occtax = NEW.id_releve_occtax LOOP UPDATE gn_synthese.synthese SET comments = CONCAT(COALESCE('Relevé : '||NEW.comment || ' / ', NULL ), COALESCE('Occurrence: '||theoccurrence.comment, NULL)) WHERE unique_id_sinp IN (SELECT unnest(pr_occtax.get_unique_id_sinp_from_id_releve(NEW.id_releve_occtax::integer))); END LOOP; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;
OK je viens de tester sur le serveur de TEST et en effet je n'ai plus le problème.
Je retiens le coup du GIF pour partager un bug. :-)
Je vais refaire une install de la develop et confirmer les corrections.
Merci.
Base toute neuve et ça fonctionne également.
Quand on modifie un relevé Occtax, si on ajoute un observateur (basé sur
t_roles
), celui est bien enregistré au niveau de Occtax, aussi au niveau degn_synthese.cor_observers_synthese
. Par contre l'observateur n'est pas ajouté dans le champobserver_txt
degn_synthese.synthese
.Il faut modifier puis enregistrer une seconde fois le relevé Occtax, pour que l'observateur soit bien ajouté dans
observer_txt
degn_synthese.synthese
.