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

Occtax - Problème sur l'enregistrement des dénombrements #1479

Closed geobrun closed 2 years ago

geobrun commented 3 years ago

Bonjour tout le monde,

J'ai un comportement curieux qui est apparu dans la synthèse depuis notre passage en version 2.7 (début septembre). Notre version actuelle est la 2.7.5.

Parfois (rarement), il y a des mixtes d'enregistrement entre les relevés, les taxons et les dénombrements. Voilà une description du problème :

Dans Occtax, les deux relevés ont été correctement enregistrés. Par contre, deux soucis apparaissent dans la synthèse :

Quand on retourne dans Occtax, si on modifie les données des relevés en question, la synthèse se met à jour correctement. Du coup, on peut quand même corriger les relevés problématiques quand on les repère pour que la synthèse affiche les bonnes données.

Quelqu'un a-t-il déjà rencontré un problème comme celui-ci ?

jbrieuclp commented 3 years ago

Problème également observé par un collègue, mais non identifié. Aussi sous 2.7.5. En BD la ligne relevé est créée, la ligne observation est créée, la ligne dénombrement n'est pas créée.

geobrun commented 3 years ago

Je viens de regarder : j'ai 19 taxons sans dénombrement depuis le 21/07/2021 quand je suis passé en version 2.7.2 (pas de problème avant visiblement).

Normalement, ce n'est pas possible d'avoir un taxon sans dénombrement ?

@jbrieuclp : est-ce que ton collègue se retrouve aussi avec des lignes dans la synthèse où le taxon d'un relevé n'est pas le bon aussi ? Dans notre cas, c'est une mésange qui avait saisie sur le premier relevé sans dénombrement et qui s'est ensuite retrouvée enregistrée dans la synthèse à la place d'un cuivré commun sur le second relevé.

Ce problème n'est apparu que pour un seul observateur (celui qui saisit le plus chez nous).

jbrieuclp commented 3 years ago

Pour le moment je n'ai pas eu de retour sur ce type de cas. Après, à moins de repasser vérifier dans la synthèse toutes les données qui ont été saisies, on tombe sur ces erreurs par hasard.

Sur la question d'avoir un taxon sans dénombrement :

En tout cas techniquement c'est possible, en BD un taxon peut ne pas avoir de dénombrement.

geobrun commented 3 years ago

Ok, merci pour les infos !

A priori, le mixte avec les noms de taxon n'est apparu qu'une seule fois chez nous. Tous les autres cas sont seulement concernés par un non-enregistrement du dénombrement.

Pour info, j'ai identifié les occurrences sans dénombrement avec la requête suivante : SELECT * FROM pr_occtax.t_occurrences_occtax o WHERE NOT EXISTS ( SELECT * FROM pr_occtax.cor_counting_occtax c WHERE c.id_occurrence_occtax = o.id_occurrence_occtax) ORDER BY id_releve_occtax

geobrun commented 3 years ago

Notre agent a finalement trouvé comment reproduire ce comportement. L'erreur ne se produit que si l'enchainement des relevés est activé.

L'agent saisit un nouveau relevé avec un taxon et un dénombrement. Il modifie le taxon pour que les min/max du dénombrement ne soient plus à 1 mais à 2. Il reçoit alors le message d'erreur suivant lorsqu'il enregistre le nouveau dénombrement : " Erreur : cliquez pour reprendre ce taxon". Voici le log de GeoNature correspondant à cette action :

[2021-10-04 15:04:10 +0000] [21076] [ERROR] Exception on /occtax/occurrence/3768 [POST]
Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.CheckViolation: new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/geonatureadmin/geonature/backend/geonature/core/gn_permissions/decorators.py", line 70, in __check_cruved_scope
    return fn(*args, **kwargs)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 589, in updateOccurrence
    occurrenceHandler(request=request, occurrence=occurrence, info_role=info_role)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 546, in occurrenceHandler
    occurrence, errors = occurrenceSchema.load(request.get_json(), instance=occurrence)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 658, in _do_load
    index_errors=self.opts.index_errors,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 283, in deserialize
    index=(index if index_errors else None)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
    value = getter_func(data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 276, in <lambda>
    data
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 265, in deserialize
    output = self._deserialize(value, attr, data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 464, in _deserialize
    data, errors = self.schema.load(value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 683, in _do_load
    original_data=data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 863, in _invoke_load_processors
    data=data, many=many, original_data=original_data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in _invoke_processors
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in <listcomp>
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 71, in make_instance
    setattr(instance, key, value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 280, in __set__
    instance_state(instance), instance_dict(instance), value, None
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 1326, in set
    old = self.get(state, dict_, passive=PASSIVE_ONLY_PERSISTENT)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
    value = self.callable_(state, passive)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 760, in _load_for_state
    session, state, primary_key_identity, passive
  File "<string>", line 1, in <lambda>
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 902, in _emit_lazyload
    .with_post_criteria(set_default_params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 544, in all
    return list(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 439, in __iter__
    self.session._autoflush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1633, in _autoflush
    util.raise_(e, with_traceback=sys.exc_info()[2])
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1622, in _autoflush
    self.flush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2540, in flush
    self._flush(objects)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2682, in _flush
    transaction.rollback(_capture_exception=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    with_traceback=exc_tb,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2642, in _flush
    flush_context.execute()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
    rec.execute(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
    uow,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj
    update,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 995, in _emit_update_statements
    statement, multiparams
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1011, in execute
    return meth(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1130, in _execute_clauseelement
    distilled_params,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1317, in _execute_context
    e, statement, parameters, cursor, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1511, in _handle_dbapi_exception
    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(psycopg2.errors.CheckViolation) new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

[SQL: UPDATE pr_occtax.cor_counting_occtax SET count_min=%(count_min)s WHERE pr_occtax.cor_counting_occtax.id_counting_occtax = %(pr_occtax_cor_counting_occtax_id_counting_occtax)s]
[parameters: {'count_min': 2, 'pr_occtax_cor_counting_occtax_id_counting_occtax': 3802}]
(Background on this error at: http://sqlalche.me/e/13/gkpj)
[2021-10-04 15:04:10 +0000] [21386] [ERROR] Exception on /occtax/occurrence/3768 [POST]
Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.CheckViolation: new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/geonatureadmin/geonature/backend/geonature/core/gn_permissions/decorators.py", line 70, in __check_cruved_scope
    return fn(*args, **kwargs)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 589, in updateOccurrence
    occurrenceHandler(request=request, occurrence=occurrence, info_role=info_role)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 546, in occurrenceHandler
    occurrence, errors = occurrenceSchema.load(request.get_json(), instance=occurrence)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 658, in _do_load
    index_errors=self.opts.index_errors,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 283, in deserialize
    index=(index if index_errors else None)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
    value = getter_func(data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 276, in <lambda>
    data
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 265, in deserialize
    output = self._deserialize(value, attr, data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 464, in _deserialize
    data, errors = self.schema.load(value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 683, in _do_load
    original_data=data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 863, in _invoke_load_processors
    data=data, many=many, original_data=original_data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in _invoke_processors
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in <listcomp>
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 71, in make_instance
    setattr(instance, key, value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 280, in __set__
    instance_state(instance), instance_dict(instance), value, None
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 1326, in set
    old = self.get(state, dict_, passive=PASSIVE_ONLY_PERSISTENT)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
    value = self.callable_(state, passive)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 760, in _load_for_state
    session, state, primary_key_identity, passive
  File "<string>", line 1, in <lambda>
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 902, in _emit_lazyload
    .with_post_criteria(set_default_params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 544, in all
    return list(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 439, in __iter__
    self.session._autoflush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1633, in _autoflush
    util.raise_(e, with_traceback=sys.exc_info()[2])
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1622, in _autoflush
    self.flush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2540, in flush
    self._flush(objects)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2682, in _flush
    transaction.rollback(_capture_exception=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    with_traceback=exc_tb,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2642, in _flush
    flush_context.execute()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
    rec.execute(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
    uow,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj
    update,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 995, in _emit_update_statements
    statement, multiparams
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1011, in execute
    return meth(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1130, in _execute_clauseelement
    distilled_params,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1317, in _execute_context
    e, statement, parameters, cursor, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1511, in _handle_dbapi_exception
    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(psycopg2.errors.CheckViolation) new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

[SQL: UPDATE pr_occtax.cor_counting_occtax SET count_min=%(count_min)s WHERE pr_occtax.cor_counting_occtax.id_counting_occtax = %(pr_occtax_cor_counting_occtax_id_counting_occtax)s]
[parameters: {'count_min': 2, 'pr_occtax_cor_counting_occtax_id_counting_occtax': 3802}]
(Background on this error at: http://sqlalche.me/e/13/gkpj)
[2021-10-04 15:04:10 +0000] [21386] [ERROR] Exception on /occtax/occurrence/3768 [POST]
Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.CheckViolation: new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/geonatureadmin/geonature/backend/geonature/core/gn_permissions/decorators.py", line 70, in __check_cruved_scope
    return fn(*args, **kwargs)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 589, in updateOccurrence
    occurrenceHandler(request=request, occurrence=occurrence, info_role=info_role)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 546, in occurrenceHandler
    occurrence, errors = occurrenceSchema.load(request.get_json(), instance=occurrence)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 658, in _do_load
    index_errors=self.opts.index_errors,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 283, in deserialize
    index=(index if index_errors else None)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
    value = getter_func(data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 276, in <lambda>
    data
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 265, in deserialize
    output = self._deserialize(value, attr, data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 464, in _deserialize
    data, errors = self.schema.load(value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 683, in _do_load
    original_data=data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 863, in _invoke_load_processors
    data=data, many=many, original_data=original_data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in _invoke_processors
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in <listcomp>
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 71, in make_instance
    setattr(instance, key, value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 280, in __set__
    instance_state(instance), instance_dict(instance), value, None
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 1326, in set
    old = self.get(state, dict_, passive=PASSIVE_ONLY_PERSISTENT)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
    value = self.callable_(state, passive)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 760, in _load_for_state
    session, state, primary_key_identity, passive
  File "<string>", line 1, in <lambda>
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 902, in _emit_lazyload
    .with_post_criteria(set_default_params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 544, in all
    return list(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 439, in __iter__
    self.session._autoflush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1633, in _autoflush
    util.raise_(e, with_traceback=sys.exc_info()[2])
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1622, in _autoflush
    self.flush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2540, in flush
    self._flush(objects)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2682, in _flush
    transaction.rollback(_capture_exception=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    with_traceback=exc_tb,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2642, in _flush
    flush_context.execute()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
    rec.execute(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
    uow,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj
    update,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 995, in _emit_update_statements
    statement, multiparams
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1011, in execute
    return meth(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1130, in _execute_clauseelement
    distilled_params,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1317, in _execute_context
    e, statement, parameters, cursor, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1511, in _handle_dbapi_exception
    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(psycopg2.errors.CheckViolation) new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

[SQL: UPDATE pr_occtax.cor_counting_occtax SET count_min=%(count_min)s WHERE pr_occtax.cor_counting_occtax.id_counting_occtax = %(pr_occtax_cor_counting_occtax_id_counting_occtax)s]
[parameters: {'count_min': 2, 'pr_occtax_cor_counting_occtax_id_counting_occtax': 3802}]
(Background on this error at: http://sqlalche.me/e/13/gkpj)
[2021-10-04 15:04:11 +0000] [21386] [ERROR] Exception on /occtax/occurrence/3768 [POST]
Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.CheckViolation: new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/geonatureadmin/geonature/backend/geonature/core/gn_permissions/decorators.py", line 70, in __check_cruved_scope
    return fn(*args, **kwargs)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 589, in updateOccurrence
    occurrenceHandler(request=request, occurrence=occurrence, info_role=info_role)
  File "/home/geonatureadmin/geonature/external_modules/occtax/backend/blueprint.py", line 546, in occurrenceHandler
    occurrence, errors = occurrenceSchema.load(request.get_json(), instance=occurrence)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 658, in _do_load
    index_errors=self.opts.index_errors,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 283, in deserialize
    index=(index if index_errors else None)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 62, in call_and_store
    value = getter_func(data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/marshalling.py", line 276, in <lambda>
    data
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 265, in deserialize
    output = self._deserialize(value, attr, data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/fields.py", line 464, in _deserialize
    data, errors = self.schema.load(value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 92, in load
    return super().load(data, **kwargs)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 576, in load
    result, errors = self._do_load(data, many, partial=partial, postprocess=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 683, in _do_load
    original_data=data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 863, in _invoke_load_processors
    data=data, many=many, original_data=original_data)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in _invoke_processors
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow/schema.py", line 961, in <listcomp>
    data = [utils.if_none(processor(item), item) for item in data]
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/marshmallow_sqlalchemy/schema/load_instance_mixin.py", line 71, in make_instance
    setattr(instance, key, value)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 280, in __set__
    instance_state(instance), instance_dict(instance), value, None
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 1326, in set
    old = self.get(state, dict_, passive=PASSIVE_ONLY_PERSISTENT)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
    value = self.callable_(state, passive)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 760, in _load_for_state
    session, state, primary_key_identity, passive
  File "<string>", line 1, in <lambda>
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/strategies.py", line 902, in _emit_lazyload
    .with_post_criteria(set_default_params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 544, in all
    return list(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/ext/baked.py", line 439, in __iter__
    self.session._autoflush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1633, in _autoflush
    util.raise_(e, with_traceback=sys.exc_info()[2])
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1622, in _autoflush
    self.flush()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2540, in flush
    self._flush(objects)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2682, in _flush
    transaction.rollback(_capture_exception=True)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    with_traceback=exc_tb,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 2642, in _flush
    flush_context.execute()
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 422, in execute
    rec.execute(self)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/unitofwork.py", line 589, in execute
    uow,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 236, in save_obj
    update,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/orm/persistence.py", line 995, in _emit_update_statements
    statement, multiparams
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1011, in execute
    return meth(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/sql/elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1130, in _execute_clauseelement
    distilled_params,
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1317, in _execute_context
    e, statement, parameters, cursor, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1511, in _handle_dbapi_exception
    sqlalchemy_exception, with_traceback=exc_info[2], from_=e
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
    raise exception
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/base.py", line 1277, in _execute_context
    cursor, statement, parameters, context
  File "/home/geonatureadmin/geonature/backend/venv/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 609, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(psycopg2.errors.CheckViolation) new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max"
DETAIL:  Failing row contains (3802, 9b02ba34-a00d-4e67-8478-1d8f32b66d36, 3768, 1, 171, 146, 94, 2, 1, {}).

[SQL: UPDATE pr_occtax.cor_counting_occtax SET count_min=%(count_min)s WHERE pr_occtax.cor_counting_occtax.id_counting_occtax = %(pr_occtax_cor_counting_occtax_id_counting_occtax)s]
[parameters: {'count_min': 2, 'pr_occtax_cor_counting_occtax_id_counting_occtax': 3802}]
(Background on this error at: http://sqlalche.me/e/13/gkpj)

Pour contourner ce problème, lors de la modification du taxon, il doit laisser le minimum à 1 et augmenter le maximum à 2. Il enregistre le nouveau dénombrement et recommence une nouvelle modification du taxon. Il passe le minimum à 2, sa modification est validée et il termine la saisie du relevé. Quand il retourne sur le relevé dans Occtax, aucun dénombrement n'a été enregistré.

Dernière action : si l'agent enchaîne un second relevé, le dernier dénombrement qu'il a enregistré s'affiche par défaut. Il renseigne son taxon/dénombrement et enregistre son relevé. Dans Occtax, le relevé est bien enregistré. Par contre, dans la synthèse, c'est le nom du taxon du précédent relevé qui s'affiche à la place et non le dernier nom saisi.

En regardant les logs, cela donne l'impression que la mise à jour du dénombrement échoue dans la base de données car il y a une mise à jour du minimum sans changer le maximum (par exemple, min = 2 et max = 1). Après, pourquoi les erreurs s'enchaînent, c'est assez obscur !

Rien de grave, il suffit de faire attention, mais mieux vaut prévenir les agents qui saisissent des données !

jbrieuclp commented 3 years ago

Ok, dans ce que tu as expliqué hier, il y a un second problème lié au dénombrements que nous avions également identifié. Mais non reproduit hier.

En ce qui concerne le premier problème, celui de la suppression d'un dénombrement et d'un autoremplissage de cette partie de ce formulaire il faut faire cette manipulation :

Du coup en expliquant ce principe avec les retours BD il se passe ceci, l'envoi du formulaire et le retour de BD étant les parties au format code :

envoi {id_releve_occtax: null, [...]} retour {id_releve_occtax: 123, [...]}

envoi {id_occurrence_occtax: null, [...], id_releve_occtax: 123, [{ id_counting_occtax: null, id_occurrence_occtax: null, [...]}]} retour {id_occurrence_occtax: 123456, [...], id_releve_occtax: 123, [{ id_counting_occtax: 987654, id_occurrence_occtax: 123456, [...]}]}

envoi {id_occurrence_occtax: 123456, [...], id_releve_occtax: 123, [{ id_counting_occtax: 987654, id_occurrence_occtax: 123456, [...]}]} retour {id_occurrence_occtax: 123456, [...], id_releve_occtax: 123, [{ id_counting_occtax: 987654, id_occurrence_occtax: 123456, [...]}]} => pas de changement ici

envoi {id_releve_occtax: null, [...]} retour {id_releve_occtax: 456, [...]}

envoi {id_occurrence_occtax: null, [...], id_releve_occtax: 456, [{ id_counting_occtax: 987654, id_occurrence_occtax: null, [...]}]} retour {id_occurrence_occtax: 654321, [...], id_releve_occtax: 456, [{ id_counting_occtax: 987654, id_occurrence_occtax: 654321, [...]}]} => la ligne du cor_counting correspond au premier relevé, mais la valeur du champ id_occurrence_occtax est remplacée.

J'identifie le problème ici : https://github.com/PnX-SI/GeoNature/blob/00489e8c8d4f9346ac1536b8e22c648be95848da/contrib/occtax/frontend/app/occtax-form/occurrence/occurrence.service.ts#L122-L138 avec une souscription à un Observable dans le résultat d'une souscription. Des operateurs de RxJS peuvent être plus adéquate : ici changer mergeMap par switchMap https://github.com/PnX-SI/GeoNature/blob/00489e8c8d4f9346ac1536b8e22c648be95848da/contrib/occtax/frontend/app/occtax-form/occurrence/occurrence.service.ts#L267

Pour résoudre le bug, contrairement à ce que j'ai détaillé au dessus (la souscription d'un Observable dans le résultat d'une souscription) il faut employer l'operateur RxJS combineLatest pour combiner l'observable des champs supplémentaire avec celui des valeurs de l'occurrence.

A côté de ce bug, dans les ajouts de codes qui ont été fait pour dev la fonctionnalité des champs supplémentaires, j'ai du mal à comprendre l'intérêt de certaines fonctions ou lignes de codes. La fonction ci dessous me semble effectuer des choses simples de manière complexes https://github.com/PnX-SI/GeoNature/blob/00489e8c8d4f9346ac1536b8e22c648be95848da/contrib/occtax/frontend/app/occtax-form/occurrence/occurrence.service.ts#L210

Idem pour la fonction ci-dessous qui s'embête à refaire ce qu'un array.filter(elem => elem.code_object === "OCCTAX_OCCURENCE") réaliserait simplement. https://github.com/PnX-SI/GeoNature/blob/00489e8c8d4f9346ac1536b8e22c648be95848da/contrib/occtax/frontend/app/occtax-form/occurrence/occurrence.service.ts#L243

Bref je vais publier une PR pour remettre un peu d'ordre là dedans car une simple issue n'est plus suffisante et on se retrouve actuellement comme des idiots avec une BDD en vrac.

geobrun commented 3 years ago

Ok, merci pour les retours ! Effectivement, il est possible que plusieurs structures se retrouvent avec quelques erreurs dans leur base de données sans s'en être rendu compte. :(

DonovanMaillard commented 3 years ago

Si les infos sont bonnes dans occtax, il faudrait prévoir de recalculer la synthèse pour les données d'occtax dans les prochains scripts de migration pour éviter les conséquences...

camillemonchicourt commented 3 years ago

OK merci pour ces éléments et explications. Si il y a potentiellement des conséquences sur les données, ça serait utile de fournir un fichier de migrations qui permet de les corriger dans la prochaine version.

geobrun commented 3 years ago

@DonovanMaillard : les infos dans Occtax ne sont pas toujours complètes : parfois, il manque les dénombrements dans certains taxons. Dans l'idéal, il faudrait aussi faire remonter les taxons où des dénombrements manques dans la prochain script de migration.

camillemonchicourt commented 2 years ago

Le problème de saisie a été corrigé dans la 2.9.0. La correction des données (initialement discutée sur https://github.com/PnX-SI/GeoNature/pull/1510#issuecomment-958800785) est en cours de tests dans la PR dédiée : https://github.com/PnX-SI/GeoNature/pull/1589

Splendens commented 2 years ago

Pour contourner ce problème, lors de la modification du taxon, il doit laisser le minimum à 1 et augmenter le maximum à 2. Il enregistre le nouveau dénombrement et recommence une nouvelle modification du taxon. Il passe le minimum à 2, sa modification est validée et il termine la saisie du relevé.

Bonjour, En version 2.9.2, j'ai toujours ce problème de saisie des dénombrements (plutôt de modification du min), avec l'erreur new row for relation "cor_counting_occtax" violates check constraint "check_cor_counting_occtax_count_max". Ce n'est pas ce problème de saisie qui avait été corrigé dans la 2.9.0 ? (désolée, ce ticket aborde plusieurs bugs, pas sûre d'avoir bien suivi ce qui s'est fait ou non).

TheoLechemia commented 2 years ago

@Splendens Est-ce que tu peux préciser exactement le cheminement que tu fais pour produire ce bug ? Merci !

Splendens commented 2 years ago

En voulant éditer un "dénombrement", si on renseigne un nouveau min supérieur à l'ancien max, il y a le bug.

Par exemple, pour reproduire ça :

TheoLechemia commented 2 years ago

Bon ben je reproduis toujours pas sur develop.. A garder en mémoire de retester quand tu auras déployer la 2.10

camillemonchicourt commented 2 years ago

Je teste sur le serveur de DEMO en 2.9.1 (https://demo.geonature.fr/geonature). Mais en fait, je ne comprends pas comment tu peux avoir un count_min saisi supérieur au count_max, vu que quand on renseigne un count_min supérieur au count_max, cela modifie automatiquement le count_max pour le mettre à la même valeur que le count_min.

Je saisis un dénombrement de 3 | 3 :

image

Je modifie le count_min pour le mettre à 5, cela passe le count_max à 5 automatiquement :

image

Si mon count_max est supérieur au count_min, et que je modifie en mettant un count_min supérieur au count_max, cela ne me modifie pas le count_max, mais ça me bloque le formulaire.

Je saisis un dénombrement 5 | 8 :

image

Je le modifie en 9 | 8, le formulaire est bloqué avec un message clair :

image

Splendens commented 2 years ago

Oui, bien sûr que je laisse un max supérieur au min ! Mais si le nouveau min et supérieur à l'ancien max, l'enregistrement de la modification du dénombrement ne fonctionne pas.

Par exemple j'enregistre un taxon avec en dénombrement min 1 max 2 : l'enregistrement fonctionne. Je met ce même taxon en édition pour le corriger, et je passe le min à 3 (ou n'importe quoi de plus que 2) et max à 4 (ou n'importe quoi de plus que le min que je viens de saisir) : là l'enregistrement ne fonctionne pas. De ce que je comprends, ce nouveau min est comparé à l'ancien max et pas au nouveau côté bd.

camillemonchicourt commented 2 years ago

Je ne reproduis pas sur le serveur de DEMO (https://demo.geonature.fr/geonature/) en version 2.9.1. On va faire des tests pour voir si on reproduit sur la branche DEVELOP.

camillemonchicourt commented 2 years ago

@Splendens, on est bien sur un soucis différent de celui concerné par le ticket initial. On vient de tester à nouveau et on ne reproduit pas non plus sur DEVELOP.

Splendens commented 2 years ago

Ah ! Il faudrait mieux que j'ouvre un autre ticket du coup ? Je me suis permise d'en parlé ici car @geobrun a soulevé le bug dans son message du 4 octobre 2021 :

L'agent saisit un nouveau relevé avec un taxon et un dénombrement. Il modifie le taxon pour que les min/max du dénombrement ne soient plus à 1 mais à 2. Il reçoit alors le message d'erreur suivant lorsqu'il enregistre le nouveau dénombrement : " Erreur : cliquez pour reprendre ce taxon".

Et j'ai exactement ce même problème dans une installation neuve de GeoNature 2.9.2. Si ce n'est pas sur develop, ça veut dire que le bug a disparu dans la prochaine version de GN ? (dans ce cas, c'est parfait, et désolée pour le bruit !)

jbrieuclp commented 2 years ago

Je viens de tester et je n'ai pas non plus ici. C'est peut-être du à une config spécifique ?

geobrun commented 2 years ago

Non @Splendens, ce n'était pas exactement le même problème que j'avais identifié : c'était effectivement un problème sur un dénombrement modifié par un utilisateur dans Occtax, mais qui s'enregistrait bien côté interface web. Par contre, c'était ensuite côté base de données qu'il y avait un souci : l'enregistrement avait été mal pris en compte (absent ou erroné de mémoire).

Splendens commented 2 years ago

Pour clôturer cette affaire de min/max en édition : c'est bon, plus de bug ! Cela devait être une histoire de cache. Merci à tous !

camillemonchicourt commented 2 years ago

Concernant le problème initial de ce ticket :