Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Log history v2.11 #1835

Closed
wants to merge 10 commits into from
Closed

Log history v2.11 #1835

wants to merge 10 commits into from

Conversation

lpofredc
Copy link
Contributor

@lpofredc lpofredc commented Apr 6, 2022

PR intégrant une historisation des données de la synthèse (INSERT, UPDATE & DELETE):

Remplace la PR #1456

  • Les DELETE sont loggés dans la table gn_synthese.t_log_synthese par triggers
  • Les UPDATE & INSERT ne sont pas loggés par triggers car déjà présents dans gn_synthese.synthese par les champs meta_{create,update}_date.
  • Le tout est regroupé dans une vue gn_synthese.v_log_synthese.

L'API, désactivable par l'option ['SYNTHESE']['LOG_API'] = False, est basée sur la classe GenericQuery donc avec des possibilités de requêtage avancées (action supérieure à une date spécifique par exemple).

Cette API est nécessaire pour la mise à jour incrémentale de Gn2Pg.

Lien avec #789

@lpofredc lpofredc mentioned this pull request Apr 6, 2022
@codecov
Copy link

codecov bot commented Apr 6, 2022

Codecov Report

Base: 67.81% // Head: 54.61% // Decreases project coverage by -13.19% ⚠️

Coverage data is based on head (630ca3a) compared to base (25fb18c).
Patch coverage: 59.25% of modified lines in pull request are covered.

❗ Current head 630ca3a differs from pull request most recent head 3699065. Consider uploading reports for the commit 3699065 to get more accurate results

Additional details and impacted files
@@             Coverage Diff              @@
##           develop    #1835       +/-   ##
============================================
- Coverage    67.81%   54.61%   -13.20%     
============================================
  Files           83       76        -7     
  Lines         7369     7318       -51     
============================================
- Hits          4997     3997     -1000     
- Misses        2372     3321      +949     
Flag Coverage Δ
pytest 54.61% <59.25%> (-13.20%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
backend/geonature/core/gn_synthese/routes.py 76.77% <38.88%> (-2.20%) ⬇️
backend/geonature/core/gn_synthese/models.py 90.41% <100.00%> (+1.12%) ⬆️
backend/geonature/utils/config_schema.py 91.73% <100.00%> (+<0.01%) ⬆️
backend/geonature/core/gn_commons/repositories.py 19.16% <0.00%> (-58.75%) ⬇️
.../geonature/core/gn_permissions/backoffice/views.py 28.00% <0.00%> (-57.44%) ⬇️
backend/geonature/core/gn_permissions/routes.py 42.10% <0.00%> (-51.65%) ⬇️
backend/geonature/core/gn_profiles/routes.py 33.85% <0.00%> (-45.51%) ⬇️
...le_occhab/backend/gn_module_occhab/repositories.py 13.98% <0.00%> (-43.53%) ⬇️
backend/geonature/core/gn_commons/medias/routes.py 35.38% <0.00%> (-37.35%) ⬇️
backend/geonature/core/ref_geo/routes.py 63.24% <0.00%> (-29.42%) ⬇️
... and 55 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@DonovanMaillard
Copy link
Contributor

DonovanMaillard commented Apr 8, 2022

Merci Frédéric,

Une question/remarque au passage : dans le downgrade du fichier de migration alembic, on ne supprime pas la table t_log_synthese qui est créée :

DROP TABLE IF EXISTS gn_synthese.t_log_synthese;

Une seconde : dans le config_schema.py, c'est la variable missing=true qui est restée sur le nouveau paramètre. Ne faut-il pas passer à load_default=true ?

@DonovanMaillard
Copy link
Contributor

Merci Frédéric,

Une question/remarque au passage : dans le downgrade du fichier de migration alembic, on ne supprime pas la table t_log_synthese qui est créée :

DROP TABLE IF EXISTS gn_synthese.t_log_synthese;

Copy link
Contributor

@bouttier bouttier left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review partiel, il faut que je prenne un peu plus de temps pour me pencher sur l’utilisation de GenericQuery.


if config["SYNTHESE"]["LOG_API"]:

@routes.route("/log", methods=["get"])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Plutôt que d’indenter l’entièreté de la fonction, tu peux la déclarer sans le décorateur route, et après celle-ci, mettre :

if config["SYNTHESE"]["LOG_API"]:
    routes.add_url_rule("/log", view_func=log_delete_history, methods=["GET"])

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

la fonction routes.add_url_rule n'est utilisé nulle part ailleurs dans GeoNature. Est-ce vraiment pertinent d'ajouter une nouvelle pratique? J'aurai tendance à rester sur l'usage du décorateur...

@routes.route("/log", methods=["get"])
@permissions.check_cruved_scope("R", True)
@json_resp
def log_delete_history(info_role) -> dict:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nom induisant en erreur, on a l’impression que cette route sert à supprimer des entrées dans l’historique.
Suggestion : list_synthese_log_entries ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestion si besoin de renommer "list_synthese_deletions"

La route ne renvoi pas que les logs de suppression mais également de création et modification.

le NOT NULL sur l'uuid sinp semble quand meme intéressant pour pas faire transiter des données sans identifiants (et il est sans doute obligatoire pour gérer l'incrémental d'ailleurs)

Le module d’export permet d’exporter les données sans UUID (forcer l’UUID peut amener certains détenteur de données à générer des UUID pour des données dont ils n’ont pas la connaissance de l’UUID et dont ils ne sont pas les producteurs, amenant potentiellement à générer plusieurs UUID pour la même donnée) → il faut pouvoir gérer les données sans UUID.

La synchronisation doit donc se fonder sur l’id_synthese, qui est la clé primaire dont l’unicité est garantie pour une instance donnée (et qui sera stocké dans le champs entity_source_pk_value chez la destination). Je ne sais plus où, mais @hypsug0 m’a confirmé que c’est bien le comportement adopté par GN2PG.

cf. lpoaura/GN2PG#4

La synchro se base sur l'id_synthese propre à chaque source. Mais il parait pertinent que le fournisseur exclue d'office les données sans UUID des données de synthèse transmises.

op.create_table(
"t_log_synthese",
sa.Column("id_synthese", sa.Integer, primary_key=True),
sa.Column("unique_id_sinp", UUID(as_uuid=True), nullable=False),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le nullable=False me semble en trop.

if config["SYNTHESE"]["LOG_API"]:

@routes.route("/log", methods=["get"])
@permissions.check_cruved_scope("R", True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ne devrions nous pas avoir un R sur le module SYNTHESE ?

@DonovanMaillard
Copy link
Contributor

Suggestion si besoin de renommer "list_synthese_deletions"

le NOT NULL sur l'uuid sinp semble quand meme intéressant pour pas faire transiter des données sans identifiants (et il est sans doute obligatoire pour gérer l'incrémental d'ailleurs)

@bouttier
Copy link
Contributor

bouttier commented Apr 8, 2022

Suggestion si besoin de renommer "list_synthese_deletions"

La route ne renvoi pas que les logs de suppression mais également de création et modification.

le NOT NULL sur l'uuid sinp semble quand meme intéressant pour pas faire transiter des données sans identifiants (et il est sans doute obligatoire pour gérer l'incrémental d'ailleurs)

Le module d’export permet d’exporter les données sans UUID (forcer l’UUID peut amener certains détenteur de données à générer des UUID pour des données dont ils n’ont pas la connaissance de l’UUID et dont ils ne sont pas les producteurs, amenant potentiellement à générer plusieurs UUID pour la même donnée) → il faut pouvoir gérer les données sans UUID.

La synchronisation doit donc se fonder sur l’id_synthese, qui est la clé primaire dont l’unicité est garantie pour une instance donnée (et qui sera stocké dans le champs entity_source_pk_value chez la destination). Je ne sais plus où, mais @hypsug0 m’a confirmé que c’est bien le comportement adopté par GN2PG.

@lpofredc
Copy link
Contributor Author

Merci Frédéric,

Une question/remarque au passage : dans le downgrade du fichier de migration alembic, on ne supprime pas la table t_log_synthese qui est créée :

DROP TABLE IF EXISTS gn_synthese.t_log_synthese;

Elle est supprimée par la commande précédente:

op.drop_table("t_log_synthese", schema="gn_synthese")

# Ajoute une API requêtable de log listant sommairement les
# données mises à jour (id_synthese, uuid, dernière action, date de dernière action)
# Utilisée par GN2PG (https://github.com/lpoaura/GN2PG)
LOG_API = true
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En fait il apparaît superflu de rajouter un paramètre de configuration pour activer / désactiver cette route de l’API.

@camillemonchicourt
Copy link
Member

PR fermée par erreur suite à la suppression accidentelle de la branche DEVELOP

@camillemonchicourt camillemonchicourt added this to the 2.12 milestone Dec 21, 2022
@bouttier
Copy link
Contributor

Après discussions, afin de terminer cette PR :

  • Supprimer le paramètre LOG_API (superflu)
  • Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
  • Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route
  • L’UUID est-il vraiment nécessaire ? Si non, ne garder que l’id_synthese
  • Renommer le modèle TLogSynthese en SyntheseLogEntry
  • Vérifier la cohérence entre le modèle et le SQL de création de la table (par exemple, supprimer le NOT NULL sur le champs d’UUID dans le SQL)
  • Écrire des tests unitaires

@lpofredc
Copy link
Contributor Author

lpofredc commented Jan 3, 2023

Quelques premières modif:

  • Modèle TLogSynthese renommé en SyntheseLogEntry
  • Paramètre LOG_API supprimé
  • Fix des conflits et MaJ en v2.11

@lpofredc lpofredc changed the title Log history v2.10 Log history v2.11 Jan 3, 2023
@mvergez
Copy link
Contributor

mvergez commented Jan 26, 2023

Mise à jour du travail restant que nous allons effectuer :

  • Supprimer le paramètre LOG_API (superflu)
  • Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
  • Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route
  • L’UUID est-il vraiment nécessaire ? Si non, ne garder que l’id_synthese
  • Renommer le modèle TLogSynthese en SyntheseLogEntry
  • Vérifier la cohérence entre le modèle et le SQL de création de la table (par exemple, supprimer le NOT NULL sur le champs d’UUID dans le SQL)
  • Écrire des tests unitaires
  • Fix des conflits et MaJ en v2.11

from utils_flask_sqla.response import to_csv_resp, to_json_resp, json_resp
from utils_flask_sqla_geo.generic import GenericTableGeo

from geonature.utils import filemanager
from geonature.utils.config import config
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

toujours utile cet import ?

andriacap added a commit to andriacap/GeoNature that referenced this pull request Jan 30, 2023
Improvingfeat: log history synthese module

Improving PR
[https://github.com/PnX-SI/GeoNature/pull/1835](https://github.com/PnX-SI/GeoNature/pull/1835)
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: PnX-SI#1835
andriacap added a commit to andriacap/GeoNature that referenced this pull request Jan 30, 2023
Improvingfeat: log history synthese module

Improving PR
[https://github.com/PnX-SI/GeoNature/pull/1835](https://github.com/PnX-SI/GeoNature/pull/1835)
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: PnX-SI#1835
@andriacap
Copy link
Contributor

andriacap commented Jan 31, 2023

Mise à jour du travail restant que nous allons effectuer :

* [x]  Supprimer le paramètre LOG_API (superflu)

* [ ]  Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.

* [ ]  Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

* [ ]  L’UUID est-il vraiment nécessaire ? Si non, ne garder que l’id_synthese

* [x]  Renommer le modèle TLogSynthese en SyntheseLogEntry

* [ ]  Vérifier la cohérence entre le modèle et le SQL de création de la table (par exemple, supprimer le NOT NULL sur le champs d’UUID dans le SQL)

* [ ]  Écrire des tests unitaires

* [x]  Fix des conflits et MaJ en v2.11

Bonjour tout le monde,

Hier j'ai fork le projet GeoNature et j'ai récupéré la branche develop depuis le commit 7092f1c datant du 27 Janvier. A partir de ce commit , j'ai récupéré les changements apportés de cette PR.
J'ai travaillé sur les deux points suivants voir la PR sur mon dépot :

  • Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
  • Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Pour résumé ce qui a été fait :

L'extension de la classe BaseQuery en ajoutant les méthode de filtre, sort, paginate est basé sur le travail réalisé avec @mvergez dans le cadre du travail sur le module monitoring avec le MNHN.

Concernant le travail sur les autres points , notamment la partie test je voulais savoir si vous avez un exemple de fixture que pourrait retourner pour valider la réponse de la route /synthese/log .

Merci d'avance pour la lecture de ce message et bonne journée

@bouttier
Copy link
Contributor

Hello @andriacap, peux-tu ouvrir une PR directement sur GeoNature pour faciliter la relecture et les retours ? Merci !
Je ne crois pas qu’il y ait de fixture pour la mise-à-jour ou la suppression de données de la synthèse.

@andriacap andriacap mentioned this pull request Jan 31, 2023
2 tasks
@andriacap
Copy link
Contributor

Hello @andriacap, peux-tu ouvrir une PR directement sur GeoNature pour faciliter la relecture et les retours ? Merci ! Je ne crois pas qu’il y ait de fixture pour la mise-à-jour ou la suppression de données de la synthèse.

Salt Elie , c'est bon pour la PR . Bonne soirée

andriacap added a commit to andriacap/GeoNature that referenced this pull request Feb 2, 2023
Improving PR  PnX-SI#1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: PnX-SI#1835
andriacap added a commit to andriacap/GeoNature that referenced this pull request Feb 2, 2023
Improving PR  PnX-SI#1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: PnX-SI#1835
andriacap added a commit to andriacap/GeoNature that referenced this pull request Feb 3, 2023
Improving PR  PnX-SI#1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: PnX-SI#1835
bouttier pushed a commit that referenced this pull request Feb 13, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
bouttier pushed a commit that referenced this pull request Feb 13, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
bouttier pushed a commit that referenced this pull request Feb 13, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
bouttier pushed a commit that referenced this pull request Feb 13, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
@camillemonchicourt camillemonchicourt mentioned this pull request Feb 13, 2023
@camillemonchicourt
Copy link
Member

PR regroupée sur le dépôt GeoNature - #2337

bouttier pushed a commit that referenced this pull request Mar 8, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
bouttier pushed a commit that referenced this pull request Mar 10, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
bouttier pushed a commit that referenced this pull request Mar 10, 2023
Improving PR  #1835
According to this comment :
Supprimer l’usage de GenericQuery : la manière fléché par SQLAlchemy pour cela serait d’utiliser query_class ; on peut envisager de faire des fonctions de filtrage générique de cette manière mais il faut que cela soit bien réfléchit et bien couvert par les tests.
Supprimer la vue v_log_synthese (plus difficile à maintenir) au profit d’une requête d’union directement dans la route

Reviewed_by:andriac
[Refs_PR]: #1835
@bouttier
Copy link
Contributor

PR reprise et intégré dans #2337

@bouttier bouttier closed this Mar 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants