From 56cf669ae60bf144c0871f410a505d5b7b898119 Mon Sep 17 00:00:00 2001 From: TheoLechemia Date: Tue, 12 Mar 2024 09:50:20 +0100 Subject: [PATCH 1/4] Possibilty to add custom export views in synthese - closes #2955 --- backend/geonature/core/gn_synthese/routes.py | 74 +++++++++++++------ backend/geonature/tests/test_synthese.py | 30 ++++++++ backend/geonature/utils/config_schema.py | 11 ++- config/default_config.toml.example | 4 + docs/CHANGELOG.md | 2 + frontend/cypress/e2e/synthese-spec.js | 2 +- .../synthese-form/synthese-data.service.ts | 6 +- .../modal-download.component.html | 19 ++++- .../modal-download.component.ts | 4 +- 9 files changed, 121 insertions(+), 31 deletions(-) diff --git a/backend/geonature/core/gn_synthese/routes.py b/backend/geonature/core/gn_synthese/routes.py index 52916aea83..abe0c51276 100644 --- a/backend/geonature/core/gn_synthese/routes.py +++ b/backend/geonature/core/gn_synthese/routes.py @@ -531,15 +531,39 @@ def export_observations_web(permissions): POST parameters: Use a list of id_synthese (in POST parameters) to filter the v_synthese_for_export_view + :query str export_format: str<'csv', 'geojson', 'shapefiles', 'gpkg'> :query str export_format: str<'csv', 'geojson', 'shapefiles', 'gpkg'> """ params = request.args # set default to csv export_format = params.get("export_format", "csv") + view_name_param = params.get("view_name", "gn_synthese.v_synthese_for_export") # Test export_format - if not export_format in current_app.config["SYNTHESE"]["EXPORT_FORMAT"]: + if export_format not in current_app.config["SYNTHESE"]["EXPORT_FORMAT"]: raise BadRequest("Unsupported format") + config_view = { + "view_name": "gn_synthese.v_synthese_for_web_app", + "geojson_4326_field": "geojson_4326", + "geojson_local_field": "geojson_local", + } + # Test export view name is config params for security reason + if view_name_param != "gn_synthese.v_synthese_for_export": + try: + config_view = next( + _view + for _view in current_app.config["SYNTHESE"]["EXPORT_OBSERVATIONS_CUSTOM_VIEWS"] + if _view["view_name"] == view_name_param + ) + except StopIteration: + raise Forbidden("This view is not available for export") + + geojson_4326_field = config_view["geojson_4326_field"] + geojson_local_field = config_view["geojson_local_field"] + try: + schema_name, view_name = view_name_param.split(".") + except ValueError: + raise BadRequest("view_name parameter must be a string with schema dot view_name") # get list of id synthese from POST id_list = request.get_json() @@ -555,12 +579,18 @@ def export_observations_web(permissions): # Useful to have geom column so that they can be replaced by blurred geoms # (only if the user has sensitive permissions) export_view = GenericTableGeo( - tableName="v_synthese_for_export", - schemaName="gn_synthese", + tableName=view_name, + schemaName=schema_name, engine=DB.engine, geometry_field=None, srid=local_srid, ) + mandatory_columns = {"id_synthese", geojson_4326_field, geojson_local_field} + if not mandatory_columns.issubset(set(map(lambda col: col.name, export_view.db_cols))): + print(set(map(lambda col: col.name, export_view.db_cols))) + raise BadRequest( + f"The view {view_name} miss one of required columns {str(mandatory_columns)}" + ) # If there is no sensitive permissions => same path as before blurring implementation if not blurring_permissions: @@ -591,8 +621,6 @@ def export_observations_web(permissions): ) # Overwrite geometry columns to compute the blurred geometry from the blurring cte - geojson_4326_col = current_app.config["SYNTHESE"]["EXPORT_GEOJSON_4326_COL"] - geojson_local_col = current_app.config["SYNTHESE"]["EXPORT_GEOJSON_LOCAL_COL"] columns_with_geom_excluded = [ col for col in export_view.tableDef.columns @@ -601,8 +629,8 @@ def export_observations_web(permissions): "geometrie_wkt_4326", # FIXME: hardcoded column names? "x_centroid_4326", "y_centroid_4326", - geojson_4326_col, - geojson_local_col, + geojson_4326_field, + geojson_local_field, ] ] # Recomputed the blurred geometries @@ -610,9 +638,9 @@ def export_observations_web(permissions): func.st_astext(cte_synthese_filtered.c.geom).label("geometrie_wkt_4326"), func.st_x(func.st_centroid(cte_synthese_filtered.c.geom)).label("x_centroid_4326"), func.st_y(func.st_centroid(cte_synthese_filtered.c.geom)).label("y_centroid_4326"), - func.st_asgeojson(cte_synthese_filtered.c.geom).label(geojson_4326_col), + func.st_asgeojson(cte_synthese_filtered.c.geom).label(geojson_4326_field), func.st_asgeojson(func.st_transform(cte_synthese_filtered.c.geom, local_srid)).label( - geojson_local_col + geojson_local_field ), ] @@ -625,14 +653,10 @@ def export_observations_web(permissions): .select_from( export_view.tableDef.join( cte_synthese_filtered, - cte_synthese_filtered.c.id_synthese == export_view.tableDef.c.id_synthese, + cte_synthese_filtered.c.id_synthese == export_view.tableDef.columns["id_synthese"], ) ) - .where( - export_view.tableDef.columns[ - current_app.config["SYNTHESE"]["EXPORT_ID_SYNTHESE_COL"] - ].in_(id_list) - ) + .where(export_view.tableDef.columns["id_synthese"].in_(id_list)) ) # Get the results for export @@ -642,11 +666,17 @@ def export_observations_web(permissions): db_cols_for_shape = [] columns_to_serialize = [] - # loop over synthese config to get the columns for export + # loop over synthese config to exclude columns if its default export for db_col in export_view.db_cols: - if db_col.key in current_app.config["SYNTHESE"]["EXPORT_COLUMNS"]: - db_cols_for_shape.append(db_col) - columns_to_serialize.append(db_col.key) + if view_name_param == "gn_synthese.v_synthese_for_export": + if db_col.key in current_app.config["SYNTHESE"]["EXPORT_COLUMNS"]: + db_cols_for_shape.append(db_col) + columns_to_serialize.append(db_col.key) + else: + # remove geojson fields of serialization + if db_col.key not in [geojson_4326_field, geojson_local_field]: + db_cols_for_shape.append(db_col) + columns_to_serialize.append(db_col.key) file_name = datetime.datetime.now().strftime("%Y_%m_%d_%Hh%Mm%S") file_name = filemanager.removeDisallowedFilenameChars(file_name) @@ -657,9 +687,7 @@ def export_observations_web(permissions): elif export_format == "geojson": features = [] for r in results: - geometry = json.loads( - getattr(r, current_app.config["SYNTHESE"]["EXPORT_GEOJSON_4326_COL"]) - ) + geometry = json.loads(getattr(r, geojson_4326_field)) feature = Feature( geometry=geometry, properties=export_view.as_dict(r, fields=columns_to_serialize), @@ -673,7 +701,7 @@ def export_observations_web(permissions): export_format=export_format, export_view=export_view, db_cols=db_cols_for_shape, - geojson_col=current_app.config["SYNTHESE"]["EXPORT_GEOJSON_LOCAL_COL"], + geojson_col=geojson_local_field, data=results, file_name=file_name, ) diff --git a/backend/geonature/tests/test_synthese.py b/backend/geonature/tests/test_synthese.py index aff7627fe2..a4b157cb6b 100644 --- a/backend/geonature/tests/test_synthese.py +++ b/backend/geonature/tests/test_synthese.py @@ -564,6 +564,36 @@ def test_export(self, users): ) assert response.status_code == 200 + @pytest.mark.parametrize( + "view_name,response_status_code", + [ + ("gn_synthese.v_synthese_for_web_app", 200), + ("gn_synthese.not_in_config", 403), + ("v_synthese_for_web_app", 400), # miss schema name + ("gn_synthese.v_metadata_for_export", 400), # miss required columns + ], + ) + def test_export_observations_custom_view(self, users, app, view_name, response_status_code): + set_logged_user(self.client, users["self_user"]) + if view_name != "gn_synthese.not_in_config": + app.config["SYNTHESE"]["EXPORT_OBSERVATIONS_CUSTOM_VIEWS"] = [ + { + "label": "Test export custom", + "view_name": view_name, + "geojson_4326_field": "st_asgeojson", + "geojson_local_field": "st_asgeojson", + } + ] + response = self.client.post( + url_for("gn_synthese.export_observations_web"), + json=[1, 2, 3], + query_string={ + "export_format": "geojson", + "view_name": view_name, + }, + ) + assert response.status_code == response_status_code + def test_export_observations(self, users, synthese_data, synthese_sensitive_data, modules): data_synthese = synthese_data.values() data_synthese_sensitive = synthese_sensitive_data.values() diff --git a/backend/geonature/utils/config_schema.py b/backend/geonature/utils/config_schema.py index 2dee8393f2..59aefdf90a 100644 --- a/backend/geonature/utils/config_schema.py +++ b/backend/geonature/utils/config_schema.py @@ -16,7 +16,6 @@ from geonature.core.gn_synthese.synthese_config import ( DEFAULT_EXPORT_COLUMNS, DEFAULT_LIST_COLUMN, - DEFAULT_COLUMNS_API_SYNTHESE, ) from geonature.utils.env import GEONATURE_VERSION, BACKEND_DIR, ROOT_DIR from geonature.utils.module import iter_modules_dist, get_module_config @@ -281,6 +280,13 @@ class GnFrontEndConf(Schema): DISPLAY_EMAIL_DISPLAY_INFO = fields.List(fields.String(), load_default=["NOM_VERN"]) +class ExportObservationSchema(Schema): + label = fields.String(required=True) + view_name = fields.String(required=True) + geojson_4326_field = fields.String(load_default="geojson_4326") + geojson_local_field = fields.String(load_default="geojson_local") + + class Synthese(Schema): # -------------------------------------------------------------------- # SYNTHESE - SEARCH FORM @@ -364,6 +370,9 @@ class Synthese(Schema): # -------------------------------------------------------------------- # SYNTHESE - DOWNLOADS (AKA EXPORTS) EXPORT_COLUMNS = fields.List(fields.String(), load_default=DEFAULT_EXPORT_COLUMNS) + EXPORT_OBSERVATIONS_CUSTOM_VIEWS = fields.List( + fields.Nested(ExportObservationSchema), load_default=[] + ) # Certaines colonnes sont obligatoires pour effectuer les filtres CRUVED EXPORT_ID_SYNTHESE_COL = fields.String(load_default="id_synthese") EXPORT_ID_DATASET_COL = fields.String(load_default="jdd_id") diff --git a/config/default_config.toml.example b/config/default_config.toml.example index 3a6f1323b8..9e14b921a3 100644 --- a/config/default_config.toml.example +++ b/config/default_config.toml.example @@ -336,6 +336,10 @@ MEDIA_CLEAN_CRONTAB = "0 1 * * *" # Formats d'export disponibles ["csv", "geojson", "shapefile", "gpkg"] EXPORT_FORMAT = ["csv", "geojson", "shapefile"] + # Vues d'export personnalisées + EXPORT_OBSERVATIONS_CUSTOM_VIEWS = [ + {"label" : "export customisé", "view_name"= "gn_synthese.ma_vue_personnalisee"} + ] # Noms des colonnes obligatoires de la vue ``gn_synthese.v_metadata_for_export`` EXPORT_METADATA_ID_DATASET_COL = "jdd_id" EXPORT_METADATA_ACTOR_COL = "acteurs" diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index be29b47200..7d6e0cc586 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,6 +7,8 @@ CHANGELOG - [Synthèse] Possibilité d'ajouter des champs supplémentaires à la liste de résultats via le paramètre `ADDITIONAL_COLUMNS_FRONTEND`. Ces champs sont masqués par défaut et controlables depuis l'interface (#2946) +- [Synthèse] Possibilité d'ajouter des exports customisés basé sur des vues SQL via le paramètre `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` + 2.14.0 - Talpa europaea 👓 (2024-02-28) --------------------------------------- diff --git a/frontend/cypress/e2e/synthese-spec.js b/frontend/cypress/e2e/synthese-spec.js index dc9fe6a233..a868a9a937 100644 --- a/frontend/cypress/e2e/synthese-spec.js +++ b/frontend/cypress/e2e/synthese-spec.js @@ -193,7 +193,7 @@ describe('Tests gn_synthese', () => { // }); it('Should download data at the csv format', function () { - cy.intercept('POST', '/synthese/export_observations?export_format=csv').as('exportCall'); + cy.intercept('POST', '/synthese/export_observations?export_format=csv**').as('exportCall'); cy.get('[data-qa="synthese-download-btn"]').click(); cy.get('[data-qa="download-csv"]').click({ diff --git a/frontend/src/app/GN2CommonModule/form/synthese-form/synthese-data.service.ts b/frontend/src/app/GN2CommonModule/form/synthese-form/synthese-data.service.ts index f63db135a4..98fac70769 100644 --- a/frontend/src/app/GN2CommonModule/form/synthese-form/synthese-data.service.ts +++ b/frontend/src/app/GN2CommonModule/form/synthese-form/synthese-data.service.ts @@ -102,10 +102,10 @@ export class SyntheseDataService { return this._api.get(`${this.config.API_ENDPOINT}/synthese/taxons_tree`); } - downloadObservations(idSyntheseList: Array, format: string) { + downloadObservations(idSyntheseList: Array, format: string, view_name: string) { this.isDownloading = true; - const queryString = new HttpParams().set('export_format', format); - + let queryString = new HttpParams().set('export_format', format); + queryString = queryString.set('view_name', view_name); const source = this._api.post( `${this.config.API_ENDPOINT}/synthese/export_observations`, idSyntheseList, diff --git a/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.html b/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.html index c0010cd365..ea78a130c8 100644 --- a/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.html +++ b/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.html @@ -64,7 +64,7 @@
Télécharger les observations
style="margin-left: 5px" *ngFor="let format of syntheseConfig.EXPORT_FORMAT" mat-raised-button - (click)="downloadObservations(format)" + (click)="downloadObservations(format, 'gn_synthese.v_synthese_for_export')" type="button" class="buttonLoad button-success format-btn" [attr.data-qa]="'download-' + format" @@ -72,6 +72,23 @@
Télécharger les observations
Format {{ format }} +
+
Télécharger les observations - {{ export.label }}
+ +
Télécharger les taxons
diff --git a/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.ts b/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.ts index 5d692757bc..54ae87fcb2 100644 --- a/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.ts +++ b/frontend/src/app/syntheseModule/synthese-results/synthese-list/modal-download/modal-download.component.ts @@ -24,8 +24,8 @@ export class SyntheseModalDownloadComponent { this.syntheseConfig = this.config.SYNTHESE; } - downloadObservations(format) { - this._dataService.downloadObservations(this._storeService.idSyntheseList, format); + downloadObservations(format, view_name) { + this._dataService.downloadObservations(this._storeService.idSyntheseList, format, view_name); } downloadTaxons(format, filename) { From 1666553df1303e9cb4ef6f9e0748083e6472f27b Mon Sep 17 00:00:00 2001 From: TheoLechemia Date: Mon, 18 Mar 2024 16:10:29 +0100 Subject: [PATCH 2/4] add changelog + doc --- config/default_config.toml.example | 13 ++++--------- docs/CHANGELOG.md | 8 +++++++- docs/admin-manual.rst | 28 ++++++++++++---------------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/config/default_config.toml.example b/config/default_config.toml.example index 9e14b921a3..f9042684b9 100644 --- a/config/default_config.toml.example +++ b/config/default_config.toml.example @@ -325,20 +325,15 @@ MEDIA_CLEAN_CRONTAB = "0 1 * * *" # Nombre max d'observations dans les exports NB_MAX_OBS_EXPORT = 50000 - # Noms des colonnes obligatoires de la vue ``gn_synthese.v_synthese_for_export`` - EXPORT_ID_SYNTHESE_COL = "id_synthese" - EXPORT_ID_DATASET_COL = "jdd_id" - EXPORT_ID_DIGITISER_COL = "id_digitiser" - EXPORT_OBSERVERS_COL = "observateurs" - EXPORT_GEOJSON_4326_COL = "geojson_4326" - EXPORT_GEOJSON_LOCAL_COL = "geojson_local" - # Formats d'export disponibles ["csv", "geojson", "shapefile", "gpkg"] EXPORT_FORMAT = ["csv", "geojson", "shapefile"] # Vues d'export personnalisées EXPORT_OBSERVATIONS_CUSTOM_VIEWS = [ - {"label" : "export customisé", "view_name"= "gn_synthese.ma_vue_personnalisee"} + { + label = "format personnalisé", + view_name = "schema_name.view_name" + } ] # Noms des colonnes obligatoires de la vue ``gn_synthese.v_metadata_for_export`` EXPORT_METADATA_ID_DATASET_COL = "jdd_id" diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7d6e0cc586..090da49721 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -7,7 +7,13 @@ CHANGELOG - [Synthèse] Possibilité d'ajouter des champs supplémentaires à la liste de résultats via le paramètre `ADDITIONAL_COLUMNS_FRONTEND`. Ces champs sont masqués par défaut et controlables depuis l'interface (#2946) -- [Synthèse] Possibilité d'ajouter des exports customisés basé sur des vues SQL via le paramètre `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` +- [Synthèse] Possiblité d'ajouter des exports personnalisés basé sur des vues SQL via le paramètre `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` (#2955) + +**⚠️ Notes de version** + +- Les paramètres de la synthèse permettant de spécifier le nom de certaines colonnes de la vue d'export sont déprécies (`EXPORT_ID_SYNTHESE_COL`, `EXPORT_ID_DIGITISER_COL`, `EXPORT_OBSERVERS_COL`, `EXPORT_GEOJSON_4326_COL`, `EXPORT_GEOJSON_LOCAL_COL`). Si vous aviez surcoucher la vue `gn_synthese.v_synthese_for_export`, il est recommandé de ne plus le faire et de plutôt utiliser le nouveau paramètre `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` permettant de se créer ses propres vues d'export personnalisées. + + 2.14.0 - Talpa europaea 👓 (2024-02-28) 2.14.0 - Talpa europaea 👓 (2024-02-28) --------------------------------------- diff --git a/docs/admin-manual.rst b/docs/admin-manual.rst index be9d6768ba..a139848281 100644 --- a/docs/admin-manual.rst +++ b/docs/admin-manual.rst @@ -2194,26 +2194,22 @@ Enlevez la ligne de la colonne que vous souhaitez désactiver. Les noms de colon L'entête ``[SYNTHESE]`` au dessus ``EXPORT_COLUMNS`` indique simplement que cette variable appartient au bloc de configuration de la synthese. Ne pas rajouter l'entête à chaque paramètre de la synthese mais une seule fois au dessus de toutes les variables de configuration du module. -Il est également possible de personnaliser ses exports en éditant le SQL de la vue ``gn_synthese.v_synthese_for_export`` (niveau SQL et administration GeoNature avancé). +Il est également possible de personnaliser ses exports en créant vos propres vues personnalisées et en remplissant le paramètre suivant avec une ou plusieurs vues d'export spécifiques : -Attention, certains champs sont cependant obligatoires pour assurer la réalisation des fichiers d'export (csv, geojson et shapefile) et des filtres CRUVED. - -La vue doit OBLIGATOIREMENT contenir les champs : - -- geojson_4326 -- geojson_local -- id_synthese, -- jdd_id (l'ID du jeu de données) -- id_digitiser -- observateurs - -Ces champs doivent impérativement être présents dans la vue, mais ne seront pas nécessairement dans le fichier d'export si ils ne figurent pas dans la variable ``EXPORT_COLUMNS``. De manière générale, préférez rajouter des champs plutôt que d'en enlever ! +:: -Le nom de ces champs peut cependant être modifié. Dans ce cas, modifiez le fichier ``geonature_config.toml``, section ``SYNTHESE`` parmis les variables suivantes (``EXPORT_ID_SYNTHESE_COL, EXPORT_ID_DATASET_COL, EXPORT_ID_DIGITISER_COL, EXPORT_OBSERVERS_COL, EXPORT_GEOJSON_4326_COL, EXPORT_GEOJSON_LOCAL_COL``). + [SYNTHESE] + ... + EXPORT_OBSERVATIONS_CUSTOM_VIEWS = [ + { + label = "format personnalisé", + view_name = "gn_synthese.v_synthese_for_web_app", + } + ] -NB : Lorsqu'on effectue une recherche dans la synthèse, on interroge la vue ``gn_synthese.v_synthese_for_web_app``. L'interface web passe ensuite une liste d'``id_synthese`` à la vue ``gn_synthese.v_synthese_for_export`` correspondant à la recherche précedemment effectuée (ce qui permet à cette seconde vue d'être totalement modifiable). -La vue ``gn_synthese.v_synthese_for_web_app`` est taillée pour l'interface web, il ne faut donc PAS la modifier. +Ces vues doivent obligatoirement avoir une colonne `id_synthese`, une colonne `geojson_local` représentant le geojson de la géometrie en projection locale (pour la génération du shapefile) et une colonne `geojson_4326` représentant le geojson de la géométrie en projection 4326 (pour la génération du geojson) (utilisez la fonction `st_asgeojson` - voir la vue par défaut `gn_synthese.v_synthese_for_export`). +Le floutage s'appliquera automatiquement à la vue d'export sur les même champs géométriques que la vue `gn_synthese.v_synthese_for_export`, à savoir `geometrie_wkt_4326`, `x_centroid_4326`, `y_centroid_4326`, `geojson_local` et `geojson_4326`. Si vous ajoutez des champs représentant la géométrie de l'observation portant des noms différents que les 4 noms précités, ceux-ci ne seront pas floutés. **Export des métadonnées** From d607d65689ea7872e709779e1193bc2e02265963 Mon Sep 17 00:00:00 2001 From: TheoLechemia Date: Mon, 18 Mar 2024 17:25:00 +0100 Subject: [PATCH 3/4] add deprecated warnings --- backend/geonature/utils/config_schema.py | 26 +++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/backend/geonature/utils/config_schema.py b/backend/geonature/utils/config_schema.py index 59aefdf90a..f066dee806 100644 --- a/backend/geonature/utils/config_schema.py +++ b/backend/geonature/utils/config_schema.py @@ -4,13 +4,9 @@ import os -from marshmallow import ( - Schema, - fields, - validates_schema, - ValidationError, - post_load, -) +from warnings import warn + +from marshmallow import Schema, fields, validates_schema, ValidationError, post_load, pre_load from marshmallow.validate import OneOf, Regexp, Email, Length from geonature.core.gn_synthese.synthese_config import ( @@ -441,6 +437,22 @@ class Synthese(Schema): # Activate the blurring of sensitive observations. Otherwise, exclude them BLUR_SENSITIVE_OBSERVATIONS = fields.Boolean(load_default=True) + @pre_load + def warn_deprecated(self, data, **kwargs): + deprecated = { + "EXPORT_ID_SYNTHESE_COL", + "EXPORT_ID_DIGITISER_COL", + "EXPORT_OBSERVERS_COL", + "EXPORT_GEOJSON_4326_COL", + "EXPORT_GEOJSON_LOCAL_COL", + } + for deprecated_field in deprecated & set(data.keys()): + warn( + f"{deprecated_field} is deprecated - " + "Please use `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` parameter to customize your synthese exports " + ) + return data + # Map configuration BASEMAP = [ From 65d138131174477b9e45bd6457216b09c355952b Mon Sep 17 00:00:00 2001 From: jacquesfize Date: Tue, 26 Mar 2024 09:33:43 +0100 Subject: [PATCH 4/4] (custom_export,synthese) change changelog + admin manual --- docs/CHANGELOG.md | 2 +- docs/admin-manual.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 090da49721..f6d332530f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -11,7 +11,7 @@ CHANGELOG **⚠️ Notes de version** -- Les paramètres de la synthèse permettant de spécifier le nom de certaines colonnes de la vue d'export sont déprécies (`EXPORT_ID_SYNTHESE_COL`, `EXPORT_ID_DIGITISER_COL`, `EXPORT_OBSERVERS_COL`, `EXPORT_GEOJSON_4326_COL`, `EXPORT_GEOJSON_LOCAL_COL`). Si vous aviez surcoucher la vue `gn_synthese.v_synthese_for_export`, il est recommandé de ne plus le faire et de plutôt utiliser le nouveau paramètre `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` permettant de se créer ses propres vues d'export personnalisées. +- Les paramètres de la synthèse permettant de spécifier le nom de certaines colonnes de la vue d'export sont déprécies (`EXPORT_ID_SYNTHESE_COL`, `EXPORT_ID_DIGITISER_COL`, `EXPORT_OBSERVERS_COL`, `EXPORT_GEOJSON_4326_COL`, `EXPORT_GEOJSON_LOCAL_COL`). Si vous aviez surcouché la vue par défaut `gn_synthese.v_synthese_for_export`, il est recommandé de ne plus le faire et de plutôt utiliser le nouveau paramètre `EXPORT_OBSERVATIONS_CUSTOM_VIEWS` permettant de se créer ses propres vues d'export personnalisées. 2.14.0 - Talpa europaea 👓 (2024-02-28) diff --git a/docs/admin-manual.rst b/docs/admin-manual.rst index a139848281..7b3758efbf 100644 --- a/docs/admin-manual.rst +++ b/docs/admin-manual.rst @@ -2209,7 +2209,7 @@ Il est également possible de personnaliser ses exports en créant vos propres v Ces vues doivent obligatoirement avoir une colonne `id_synthese`, une colonne `geojson_local` représentant le geojson de la géometrie en projection locale (pour la génération du shapefile) et une colonne `geojson_4326` représentant le geojson de la géométrie en projection 4326 (pour la génération du geojson) (utilisez la fonction `st_asgeojson` - voir la vue par défaut `gn_synthese.v_synthese_for_export`). -Le floutage s'appliquera automatiquement à la vue d'export sur les même champs géométriques que la vue `gn_synthese.v_synthese_for_export`, à savoir `geometrie_wkt_4326`, `x_centroid_4326`, `y_centroid_4326`, `geojson_local` et `geojson_4326`. Si vous ajoutez des champs représentant la géométrie de l'observation portant des noms différents que les 4 noms précités, ceux-ci ne seront pas floutés. +Selon les permissions de l'utilisation sur l'action Export du module Synthèse, le floutage pourra s'appliquer automatiquement à la vue d'export sur les même champs géométriques que la vue `gn_synthese.v_synthese_for_export`, à savoir `geometrie_wkt_4326`, `x_centroid_4326`, `y_centroid_4326`, `geojson_local` et `geojson_4326`. Si vous ajoutez des champs représentant la géométrie de l'observation portant des noms différents que les 4 noms précités, ceux-ci ne pourront pas être floutés. **Export des métadonnées**