-
Notifications
You must be signed in to change notification settings - Fork 102
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
Log history v2.11 #1835
Conversation
Codecov ReportBase: 67.81% // Head: 54.61% // Decreases project coverage by
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
Flags with carried forward coverage won't be shown. Click here to find out 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. |
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 :
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 ? |
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 :
|
There was a problem hiding this 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"]) |
There was a problem hiding this comment.
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"])
There was a problem hiding this comment.
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: |
There was a problem hiding this comment.
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
?
There was a problem hiding this comment.
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 champsentity_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), |
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
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
?
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) |
La route ne renvoi pas que les logs de suppression mais également de création et modification.
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’ |
Elle est supprimée par la commande précédente: op.drop_table("t_log_synthese", schema="gn_synthese") |
config/default_config.toml.example
Outdated
# 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 |
There was a problem hiding this comment.
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.
PR fermée par erreur suite à la suppression accidentelle de la branche DEVELOP |
Après discussions, afin de terminer cette PR :
|
Quelques premières modif:
|
Mise à jour du travail restant que nous allons effectuer :
|
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
toujours utile cet import ?
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
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
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.
Pour résumé ce qui a été fait :
L'extension de la classe 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 |
Hello @andriacap, peux-tu ouvrir une PR directement sur GeoNature pour faciliter la relecture et les retours ? Merci ! |
Salt Elie , c'est bon pour la PR . Bonne soirée |
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
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
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
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
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
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
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
PR regroupée sur le dépôt GeoNature - #2337 |
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
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
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
PR reprise et intégré dans #2337 |
PR intégrant une historisation des données de la synthèse (
INSERT
,UPDATE
&DELETE
):Remplace la PR #1456
DELETE
sont loggés dans la table gn_synthese.t_log_synthese par triggersUPDATE
&INSERT
ne sont pas loggés par triggers car déjà présents dansgn_synthese.synthese
par les champsmeta_{create,update}_date
.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