PnX-SI / GeoNature

Application de saisie et de synthèse des observations faune et flore
GNU General Public License v3.0
104 stars 102 forks source link

Erreur lors de la saisie de taxons #1490

Closed MathieuLagarde closed 3 years ago

MathieuLagarde commented 3 years ago

Bonjour, J'effectue des tests relatifs au module OccTax, jusqu'à présent installé, mais non accessible au public et non utilisé sur notre plateforme régionale.

J'ai suivi la procédure décrite ici:

Au moment de créer des données d'observation, je n'ai pas de problème pour saisir un relevé. Par contre, la saisie d'un taxon me renvoit systématiquement un message d'erreur, sous la forme d'un bandeau rouge en haut du cadre "Taxons enregistrés", avec le nom du taxon saisi et le message "Erreur: cliquez pour reprendre ce taxon". Le champ "Nom cité" propose bien une liste de taxons.

Mes tables pr_occtax.cor_counting_occtax et pr_occtax.t_occurrences_occtax sont vides.

Version GéoNature: 2.6.2

Ai-je zappé une étape dans la configuration du module ? Est-ce que le fichier occtax/config/conf_gn_module.toml doit forcément remplit ? Merci pour votre aide.

camillemonchicourt commented 3 years ago

Salut, la doc utilisateur du module Occtax n'est plus à jour. Elle correspond à la v1 du module, alors qu'on est à la v2. Ça vaudrait coup de la reprendre si quelqu'un est partant.

Concernant la configuration du module, normalement tu n'est pas obligé de la renseigné si les valeurs par défaut te conviennent : https://github.com/PnX-SI/GeoNature/blob/master/contrib/occtax/config/conf_gn_module.toml.example

Tu saisis bien ton espèce dans le champs "Nom cité" ? La liste des taxons fonctionne bien ?

Que dit la console de ton navigateur ?

TheoLechemia commented 3 years ago

Et les logs du serveurs surtout (de l'api)

MathieuLagarde commented 3 years ago

@TheoLechemia voici les dernières lignes de log. Est-ce suffisant ou je remonte encore un peu ?

fonction PL/pgsql pr_occtax.insert_in_synthese(integer), ligne 39 à instruction SQL
instruction SQL « SELECT pr_occtax.insert_in_synthese(NEW.id_counting_occtax::integer) »
fonction PL/pgsql pr_occtax.fct_tri_synthese_insert_counting(), ligne 17 à PERFORM

[SQL: INSERT INTO pr_occtax.cor_counting_occtax (unique_id_sinp_occtax, id_occurrence_occtax, id_nomenclature_life_stage, id_nomenclature_sex, id_nomenclature_obj_count, id_nomenclature_type_count, count_min, count_max) VALUES ((SELECT uuid_generate_v4() AS uuid_generate_v4_1), %(id_occurrence_occtax)s, %(id_nomenclature_life_stage)s, %(id_nomenclature_sex)s, %(id_nomenclature_obj_count)s, %(id_nomenclature_type_count)s, %(count_min)s, %(count_max)s) RETURNING pr_occtax.cor_counting_occtax.id_counting_occtax]
[parameters: {'id_occurrence_occtax': 112, 'id_nomenclature_life_stage': 1, 'id_nomenclature_sex': 171, 'id_nomenclature_obj_count': 146, 'id_nomenclature_type_count': 94, 'count_min': 1, 'count_max': 1}]
(Background on this error at: http://sqlalche.me/e/13/f405)
TheoLechemia commented 3 years ago

Oui un peu plus, on ne voit pas l'erreur là

MathieuLagarde commented 3 years ago

@camillemonchicourt Je saisis bien dans le champ "Nom cité", et la liste des taxon semble bien fonctionner (saisie OK sur noms scientifiques et noms français notamment).

Dans la console, j'ai les info suivantes:

HTTP/1.1 500 INTERNAL SERVER ERROR
Date: Mon, 11 Oct 2021 10:35:13 GMT
Server: gunicorn/19.7.0
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Type: application/json
Content-Length: 36
Access-Control-Allow-Origin: https://preprod.biodiversite-bretagne.fr
Access-Control-Allow-Credentials: true
Vary: Origin
Set-Cookie: token=eyJhbGciOiJIUzI1NiIsImlhdCI6MTYzMzk0NTcwMywiZXhwIjoxNjM0NTUwNTAzfQ.eyJpZF9yb2xlIjoxLCJub21fcm9sZSI6IkFkbWluaXN0cmF0ZXVyIiwicHJlbm9tX3JvbGUiOiJ0ZXN0IiwiaWRfYXBwbGljYXRpb24iOjMsImlkX29yZ2FuaXNtZSI6LTEsImlkZW50aWZpYW50IjoiYWRtaW4iLCJpZF9kcm9pdF9tYXgiOjF9.EyD5vE_YVYl9cE7iUQo2hd5VnlQo4odfJVRLtInJcwU; Expires=Mon, 18-Oct-2021 10:35:13 GMT; Path=/
Connection: close
POST /donnees/api/occtax/releve/5/occurrence HTTP/1.1
Host: preprod.biodiversite-bretagne.fr
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept: application/json, text/plain, */*
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Content-Length: 799
Origin: https://preprod.biodiversite-bretagne.fr
Connection: keep-alive
Referer: https://preprod.biodiversite-bretagne.fr/donnees/
Cookie: _pk_id.4.5d8c=c568a668c7fe9c33.1633945747.1.1633946247.1633945747.; token=eyJhbGciOiJIUzI1NiIsImlhdCI6MTYzMzk0NTcwMywiZXhwIjoxNjM0NTUwNTAzfQ.eyJpZF9yb2xlIjoxLCJub21fcm9sZSI6IkFkbWluaXN0cmF0ZXVyIiwicHJlbm9tX3JvbGUiOiJ0ZXN0IiwiaWRfYXBwbGljYXRpb24iOjMsImlkX29yZ2FuaXNtZSI6LTEsImlkZW50aWZpYW50IjoiYWRtaW4iLCJpZF9kcm9pdF9tYXgiOjF9.EyD5vE_YVYl9cE7iUQo2hd5VnlQo4odfJVRLtInJcwU; session=.eJyrVvJ3dg5xjFCyqlYqLU4tik8uKi1LTQFxnZWslIyVdJRcoLQrlA6C0qFQOgxM19bWAgAPNhKx.FEWZ6g.Ke9mfv6hmxaW6NFR1bIOzvFNgEM
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
MathieuLagarde commented 3 years ago
[SQL: INSERT INTO pr_occtax.cor_counting_occtax (unique_id_sinp_occtax, id_occurrence_occtax, id_nomenclature_life_stage, id_nomenclature_sex, id_nomenclature_obj_count, id_nomenclature_type_count, count_min, count_max) VALUES ((SELECT uuid_generate_v4() AS uuid_generate_v4_1), %(id_occurrence_occtax)s, %(id_nomenclature_life_stage)s, %(id_nomenclature_sex)s, %(id_nomenclature_obj_count)s, %(id_nomenclature_type_count)s, %(count_min)s, %(count_max)s) RETURNING pr_occtax.cor_counting_occtax.id_counting_occtax]
[parameters: {'id_occurrence_occtax': 111, 'id_nomenclature_life_stage': 1, 'id_nomenclature_sex': 171, 'id_nomenclature_obj_count': 146, 'id_nomenclature_type_count': 94, 'count_min': 1, 'count_max': 1}]
(Background on this error at: http://sqlalche.me/e/13/f405)
[2021-10-11 12:35:13 +0200] [13716] [ERROR] (psycopg2.errors.UndefinedTable) ERREUR:  la relation « new » n'existe pas
LINE 11:       FROM NEW AS updated_rows
                    ^
QUERY:  WITH cte AS (
        SELECT 
        gn_sensitivity.get_id_nomenclature_sensitivity(
          updated_rows.date_min::date, 
          taxonomie.find_cdref(updated_rows.cd_nom), 
          updated_rows.the_geom_local,
          ('{"STATUT_BIO": ' || updated_rows.id_nomenclature_bio_status::text || '}')::jsonb
        ) AS id_nomenclature_sensitivity,
        id_synthese,
        t_diff.cd_nomenclature as cd_nomenclature_diffusion_level
      FROM NEW AS updated_rows
      LEFT JOIN ref_nomenclatures.t_nomenclatures t_diff ON t_diff.id_nomenclature = updated_rows.id_nomenclature_diffusion_level
      WHERE updated_rows.id_nomenclature_sensitivity IS NULL
    )
    UPDATE gn_synthese.synthese AS s
    SET 
      id_nomenclature_sensitivity = c.id_nomenclature_sensitivity,
      id_nomenclature_diffusion_level = ref_nomenclatures.get_id_nomenclature(
        'NIV_PRECIS',
        gn_sensitivity.calculate_cd_diffusion_level(
          c.cd_nomenclature_diffusion_level, 
          t_sensi.cd_nomenclature
        )

      )
    FROM cte AS c
    LEFT JOIN ref_nomenclatures.t_nomenclatures t_sensi ON t_sensi.id_nomenclature = c.id_nomenclature_sensitivity
    WHERE c.id_synthese = s.id_synthese
CONTEXT:  fonction PL/pgsql gn_synthese.fct_tri_cal_sensi_diff_level_on_each_statement(), ligne 4 à instruction SQL
instruction SQL « INSERT INTO gn_synthese.synthese (
  unique_id_sinp,
  unique_id_sinp_grp,
  id_source,
  entity_source_pk_value,
  id_dataset,
  id_module,
  id_nomenclature_geo_object_nature,
  id_nomenclature_grp_typ,
  grp_method,
  id_nomenclature_obs_technique,
  id_nomenclature_bio_status,
  id_nomenclature_bio_condition,
  id_nomenclature_naturalness,
  id_nomenclature_exist_proof,
  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,
  id_nomenclature_behaviour,
  count_min,
  count_max,
  cd_nom,
  cd_hab,
  nom_cite,
  meta_v_taxref,
  sample_number_proof,
  digital_proof,
  non_digital_proof,
  altitude_min,
  altitude_max,
  depth_min,
  depth_max,
  place_name,
  precision,
  the_geom_4326,
  the_geom_point,
  the_geom_local,
  date_min,
  date_max,
  observers,
  determiner,
  id_digitiser,
  id_nomenclature_determination_method,
  comment_context,
  comment_description,
  last_action
  )
  VALUES(
    new_count.unique_id_sinp_occtax,
    releve.unique_id_sinp_grp,
    id_source,
    new_count.id_counting_occtax,
    releve.id_dataset,
    id_module,
    releve.id_nomenclature_geo_object_nature,
    releve.id_nomenclature_grp_typ,
    releve.grp_method,
    occurrence.id_nomenclature_obs_technique,
    occurrence.id_nomenclature_bio_status,
    occurrence.id_nomenclature_bio_condition,
    occurrence.id_nomenclature_naturalness,
    occurrence.id_nomenclature_exist_proof,
    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 = non saisissable: georeferencement
    ref_nomenclatures.get_id_nomenclature('TYP_INF_GEO', '1'),
    occurrence.id_nomenclature_behaviour,
    new_count.count_min,
    new_count.count_max,
    occurrence.cd_nom,
    releve.cd_hab,
    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.depth_min,
    releve.depth_max,
    releve.place_name,
    releve.precision,
    releve.geom_4326,
    ST_CENTROID(releve.geom_4326),
    releve.geom_local,
    date_trunc('day',releve.date_min)+COALESCE(releve.hour_min,'00:00:00'::time),
    date_trunc('day',releve.date_max)+COALESCE(releve.hour_max,'00:00:00'::time),
    COALESCE (myobservers.observers_name, releve.observers_txt),
    occurrence.determiner,
    releve.id_digitiser,
    occurrence.id_nomenclature_determination_method,
    releve.comment,
    occurrence.comment,
    'I'
  ) »
fonction PL/pgsql pr_occtax.insert_in_synthese(integer), ligne 39 à instruction SQL
instruction SQL « SELECT pr_occtax.insert_in_synthese(NEW.id_counting_occtax::integer) »
fonction PL/pgsql pr_occtax.fct_tri_synthese_insert_counting(), ligne 17 à PERFORM

[SQL: INSERT INTO pr_occtax.cor_counting_occtax (unique_id_sinp_occtax, id_occurrence_occtax, id_nomenclature_life_stage, id_nomenclature_sex, id_nomenclature_obj_count, id_nomenclature_type_count, count_min, count_max) VALUES ((SELECT uuid_generate_v4() AS uuid_generate_v4_1), %(id_occurrence_occtax)s, %(id_nomenclature_life_stage)s, %(id_nomenclature_sex)s, %(id_nomenclature_obj_count)s, %(id_nomenclature_type_count)s, %(count_min)s, %(count_max)s) RETURNING pr_occtax.cor_counting_occtax.id_counting_occtax]
[parameters: {'id_occurrence_occtax': 112, 'id_nomenclature_life_stage': 1, 'id_nomenclature_sex': 171, 'id_nomenclature_obj_count': 146, 'id_nomenclature_type_count': 94, 'count_min': 1, 'count_max': 1}]
(Background on this error at: http://sqlalche.me/e/13/f405)
TheoLechemia commented 3 years ago

Merci, est-ce qu'il s'agit d'une instance installée en 2.6.2 ou une instance qui a été monté de version ?

Est-ce que tu peux essayer de lancer ce bout de SQL :

DROP TRIGGER tri_insert_calculate_sensitivity on gn_synthese.synthese;
CREATE TRIGGER tri_insert_calculate_sensitivity
 AFTER INSERT ON gn_synthese.synthese
  REFERENCING NEW TABLE AS NEW
  FOR EACH STATEMENT
  EXECUTE PROCEDURE gn_synthese.fct_tri_cal_sensi_diff_level_on_each_statement();
MathieuLagarde commented 3 years ago

C'est une instance qui a été montée de version.

Concernant le SQL, le DROP est passé sans problème. Le CREATE plante. Il semblerait que la version de postgres soit trop ancienne (9.6.23).

ERROR: ERREUR:  erreur de syntaxe sur ou près de « REFERENCING »
LINE 3:   REFERENCING NEW TABLE AS NEW
          ^

SQL state: 42601
Character: 89

https://docs.postgresql.fr/9.6/sql-createtrigger.html : L'instruction CREATE TRIGGER de PostgreSQL™ implante un sous-ensemble du standard SQL. Les fonctionnalités manquantes sont :

SQL permet de définir des alias pour les lignes « old » et « new » ou pour les tables utilisée dans la définition des actions déclenchées (c'est-à-dire CREATE TRIGGER ... ON nomtable REFERENCING OLD ROW AS unnom NEW ROW AS unautrenom...). PostgreSQL™ autorise l'écriture de procédures de déclencheurs dans tout langage l'utilisateur. De ce fait, l'accès aux données est géré spécifiquement pour chaque langage.
TheoLechemia commented 3 years ago

Effectivement, GeoNature necessite Postgresql 10 depuis la version 2.6.0. https://github.com/PnX-SI/GeoNature/releases/tag/2.6.0