Skip to content

Commit

Permalink
Merge pull request #195 from PnX-SI/develop
Browse files Browse the repository at this point in the history
Develop > Master / 1.6.0
  • Loading branch information
camillemonchicourt authored Aug 23, 2023
2 parents 66fe1df + d668670 commit b021b23
Show file tree
Hide file tree
Showing 11 changed files with 162 additions and 43 deletions.
7 changes: 3 additions & 4 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/setup-node@v3
- name: Frontend code formatting check (Prettier)
uses: creyD/[email protected]
with:
dry: True
prettier_options: --config frontend/.prettierrc --ignore-path frontend/.prettierignore --check frontend/**/*.ts
run: npm install prettier && npm run format:check
working-directory: ./frontend
52 changes: 31 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,7 @@ Module permettant d'ajouter des fonctionnalités globales et transversales d'exp

# Installation du module

## Configuration

### Paramètres
* ``export_dsw_dir`` : chemin absolu ou relatif au dossier media du dossier où l'export sémantique au format Darwin-SW sera réalisé
* ``export_dsw_filename`` : nom du fichier de l'export sémantique au format turtle (``.ttl``)
* ``expose_dsw_api`` : Indique si la route d'appel à l'API du Darwin SW est active ou non. Par défaut la route n'est pas activée.

Vous pouvez modifier la configuration du module en créant un fichier
`exports_config.toml` dans le dossier `config` de GeoNature, en vous inspirant
du fichier `exports_config.toml.example` et en surcouchant les paramètres que vous souhaitez.

Pour appliquer les modifications de la configuration du module, consultez
la [rubrique dédiée de la documentation de GeoNature](https://docs.geonature.fr/installation.html#module-config).

## Commande d'installation
## Commandes d'installation

- Téléchargez le module dans ``/home/<myuser>/``, en remplacant ``X.Y.Z`` par la version souhaitée

Expand All @@ -51,9 +37,27 @@ mv ~/gn_module_export-X.Y.Z ~/gn_module_export
source ~/geonature/backend/venv/bin/activate
geonature install-gn-module ~/gn_module_export EXPORTS
sudo systemctl restart geonature
sudo systemctl restart geonature-worker
deactivate
```

Il vous faut désormais attribuer des permissions aux groupes ou utilisateurs que vous souhaitez, pour qu'ils puissent accéder et utiliser le module (voir https://docs.geonature.fr/admin-manual.html#gestion-des-droits). Si besoin une commande permet d'attribuer automatiquement toutes les permissions dans tous les modules à un groupe ou utilisateur administrateur.

## Configuration

### Paramètres

* ``export_dsw_dir`` : chemin absolu ou relatif au dossier media du dossier où l'export sémantique au format Darwin-SW sera réalisé
* ``export_dsw_filename`` : nom du fichier de l'export sémantique au format turtle (``.ttl``)
* ``expose_dsw_api`` : Indique si la route d'appel à l'API du Darwin SW est active ou non. Par défaut la route n'est pas activée.

Vous pouvez modifier la configuration du module en créant un fichier
`exports_config.toml` dans le dossier `config` de GeoNature, en vous inspirant
du fichier `exports_config.toml.example` et en surcouchant les paramètres que vous souhaitez.

Pour appliquer les modifications de la configuration du module, consultez
la [rubrique dédiée de la documentation de GeoNature](https://docs.geonature.fr/installation.html#module-config).

## Mise à jour du module

- Suivez les éventuelles notes de la version que vous souhaitez installer
Expand All @@ -77,7 +81,7 @@ mv ~/gn_module_export-X.Y.Z ~/gn_module_export
copiez le vers le dossier de configuration centralisée de GeoNature :

```bash
cp ~/gn_module_export_old/config/conf_gn_module.toml ~/geonature/config/exports_conf.toml
cp ~/gn_module_export_old/config/conf_gn_module.toml ~/geonature/config/exports_config.toml
```

- Rapatriez aussi vos éventuelles surcouches des documentations Swagger des exports depuis le dossier `~/gn_module_export_old/backend/templates/swagger/`.
Expand All @@ -98,7 +102,7 @@ Pour créer un nouvel export, il faut au préalable créer une vue dans la base

Pour des questions de lisibilité, il est conseillé de créer la vue dans le schéma ``gn_exports``.

Par défaut, un export public (accessible à tous les utilisateurs ayant accès au module Export d'une instance GeoNature) est créé basé sur la vue ``gn_exports.v_synthese_sinp``, contenant toutes les données présentes dans la Synthèse. Il est possible de limiter les données dans cet exeport (en ajoutant des critères dans la clause WHERE de la vue ``gn_exports.v_synthese_sinp``), de supprimer cet export ou de le limiter à certains utilisateurs uniquement.
Par défaut, un export est créé, basé sur la vue ``gn_exports.v_synthese_sinp``, contenant toutes les données présentes dans la Synthèse. Il est possible de limiter les données dans cet exeport (en ajoutant des critères dans la clause WHERE de la vue ``gn_exports.v_synthese_sinp``), de supprimer cet export, de le rendre public ou de définir quels utilisateur y ont accès.

Les fichiers exportés sont automatiquement supprimés 15 jours après avoir été générés (durée configurable avec le paramètre ``nb_days_keep_file``).

Expand All @@ -110,20 +114,26 @@ Dans la rubrique "Exports", sélectionner le menu ``Export`` puis cliquer sur ``

## Associer les roles ayant la permission d'accéder à cet export

Si l'export est défini comme "Public" (``gn_exports.t_exports.public = True``), alors tous les utilisateurs ayant accès au module pourront accéder à cet export. Sinon il est possible de définir les rôles (utilisateurs ou groupes) qui peuvent accéder à un export.
Si l'export est défini comme "Public" (``gn_exports.t_exports.public = True``), alors tous les utilisateurs ayant accès au module pourront accéder à cet export. Et son API sera accessible et ouverte publiquement, sans authentification.
Sinon il est possible de définir les rôles (utilisateurs ou groupes) qui peuvent accéder à un export.

Les permissions, définies à l'utilisateur ou à son groupe sur le module, permettent de donner accès aux exports de cette manière :

- R SCOPE 1 : J'accède au module, je vois et accède aux exports qui me sont associés ou à un groupe auquel j'appartiens.
- R SCOPE 3 : J'accède au module, je vois et accède à tous les exports
- C : Permet de créer des exports dans le module ADMIN (si j'ai accès à celui-ci)
- Action R / SCOPE 1 : J'accède au module, je vois et accède aux exports qui me sont associés ou à un groupe auquel j'appartiens
- Action R / SCOPE 3 : J'accède au module, je vois et accède à tous les exports
- Action C, U et D : Permet de créer, modifier ou supprimer des exports dans le module ADMIN (si j'ai accès à celui-ci)

# API JSON et documentation Swagger d'un export

Pour chaque export créé, une API JSON filtrable est automatiquement créée à l'adresse ``<URL_GeoNature>/api/exports/api/<id_export>``. Comme les exports fichiers, l'API JSON de chaque export est accessible à tous sans autorisation (si ``Public = True``) ou limitée à certains rôles (associés à l'export).

Si l'export est associé à certains rôles, ceux-ci peuvent accéder à l'API JSON de l'export grace à un token auto-généré pour chaque rôle associé à un export.
<URL_GEONATURE>/api/export/<ID_EXPORT>?token=xxxxxxxxx.

Il est aussi possible d'accéder à l'API en étant authentifié à GeoNature avec l'utilisateur ayant accès à l'export.

Il est également possible de passer le token via le header de la requête ("Authorization": "Bearer <token>").

Par défaut, une documentation Swagger est générée automatiquement pour chaque export à l'adresse ``<URL_GeoNature>/api/exports/swagger/<id_export>``, permettant de tester chaque API et d'identifier leurs filtres. Chaque champ est documenté automatiquement en affichant son commentaire défini dans la vue de l'export.

Il est possible de surcharger la documentation Swagger de chaque API en respectant certaines conventions :
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.5.2
1.6.0
2 changes: 1 addition & 1 deletion backend/gn_module_export/blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def getOneExportThread(scope, id_export, export_format):
return to_json_resp(
{
"api_success": "in_progress",
"message": "The Process is in progress ! You will receive an email shortly", # noqa 501
"message": "La génération du fichier est en cours ! Vous recevrez une notification quand le fichier sera prêt", # noqa 501
},
status=200,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
"""declare available permissions
Revision ID: 1db24d9b23bc
Revises: bcee745e5647
Create Date: 2023-06-08 10:07:06.982520
"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "1db24d9b23bc"
down_revision = "bcee745e5647"
branch_labels = None
depends_on = ("f051b88a57fd",)


def upgrade():
op.execute(
"""
INSERT INTO
gn_permissions.t_permissions_available (
id_module,
id_object,
id_action,
label,
scope_filter
)
SELECT
m.id_module,
o.id_object,
a.id_action,
v.label,
v.scope_filter
FROM
(
VALUES
('EXPORTS', 'ALL', 'C', False, 'Créer des exports')
,('EXPORTS', 'ALL', 'R', True, 'Voir les exports')
,('EXPORTS', 'ALL', 'U', False, 'Modifier les exports')
,('EXPORTS', 'ALL', 'D', False, 'Supprimer des exports')
) AS v (module_code, object_code, action_code, scope_filter, label)
JOIN
gn_commons.t_modules m ON m.module_code = v.module_code
JOIN
gn_permissions.t_objects o ON o.code_object = v.object_code
JOIN
gn_permissions.bib_actions a ON a.code_action = v.action_code
"""
)
op.execute(
"""
WITH bad_permissions AS (
SELECT
p.id_permission
FROM
gn_permissions.t_permissions p
JOIN gn_commons.t_modules m
USING (id_module)
WHERE
m.module_code = 'EXPORTS'
EXCEPT
SELECT
p.id_permission
FROM
gn_permissions.t_permissions p
JOIN gn_permissions.t_permissions_available pa ON
(p.id_module = pa.id_module
AND p.id_object = pa.id_object
AND p.id_action = pa.id_action)
)
DELETE
FROM
gn_permissions.t_permissions p
USING bad_permissions bp
WHERE
bp.id_permission = p.id_permission;
"""
)


def downgrade():
op.execute(
"""
DELETE FROM
gn_permissions.t_permissions_available pa
USING
gn_commons.t_modules m
WHERE
pa.id_module = m.id_module
AND
module_code = 'EXPORTS'
"""
)
2 changes: 1 addition & 1 deletion backend/gn_module_export/migrations/data/exports.sql
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ COMMENT ON COLUMN gn_exports.v_synthese_sinp."methode_determination" IS 'Descri

-- Ajout d'un export par défaut basé sur la vue gn_exports.v_synthese_sinp
INSERT INTO gn_exports.t_exports (label, schema_name, view_name, "desc", geometry_field, geometry_srid, public, id_licence)
VALUES ('Synthese SINP', 'gn_exports', 'v_synthese_sinp', 'Export des données de la synthèse au standard SINP', 'geom', 4326, TRUE, 1);
VALUES ('Synthese SINP', 'gn_exports', 'v_synthese_sinp', 'Export des données de la synthèse au standard SINP', 'geom', 4326, FALSE, 1);


-- Vue des données de la synthèse au format DEE du SINP
Expand Down
14 changes: 8 additions & 6 deletions backend/gn_module_export/tests/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,26 +80,28 @@ def test_generate_scheduled_exports(self, exports_schedule, export_directories):
)

def test_generate_users_exports(
self, export_directories, notifications_enabled, users, export_synthese_sinp
self, export_directories, notifications_enabled, users, exports
):
export_request = ExportRequest(
id_export=export_synthese_sinp.id, format="csv", user=users["admin_user"]
id_export=exports["private_user_associated"].id, format="csv", user=users["self_user"]
)
generate_export(
export_id=export_request.export.id,
file_name=export_request.get_full_path_file_name(),
export_url=None,
format=export_request.format,
id_role=users["admin_user"].id_role,
id_role=users["self_user"].id_role,
filters=None,
)
assert Path(export_request.get_full_path_file_name()).is_file()

# Test notifications
notifications = Notification.query.filter(
Notification.id_role == users["admin_user"].id_role
Notification.id_role == users["self_user"].id_role
).all()
assert {notification.id_role for notification in notifications} == {
users["admin_user"].id_role
users["self_user"].id_role
}
assert all(export_synthese_sinp.label in notif.content for notif in notifications)
assert all(
exports["private_user_associated"].label in notif.content for notif in notifications
)
2 changes: 1 addition & 1 deletion dependencies/GeoNature
Submodule GeoNature updated 67 files
+2 −0 .github/workflows/cypress.yml
+3 −4 .github/workflows/lint.yml
+1 −0 .gitignore
+1 −1 VERSION
+1 −1 backend/dependencies/TaxHub
+1 −1 backend/dependencies/UsersHub-authentification-module
+1 −1 backend/dependencies/Utils-Flask-SQLAlchemy
+1 −1 backend/dependencies/Utils-Flask-SQLAlchemy-Geo
+2 −2 backend/geonature/core/gn_commons/admin.py
+18 −6 backend/geonature/core/gn_commons/routes.py
+3 −1 backend/geonature/core/gn_meta/routes.py
+51 −33 backend/geonature/core/gn_permissions/admin.py
+11 −6 backend/geonature/core/gn_permissions/commands.py
+3 −1 backend/geonature/core/gn_permissions/routes.py
+10 −0 backend/geonature/core/gn_permissions/templates/role_or_group_detail.html
+32 −3 backend/geonature/core/gn_permissions/tools.py
+54 −23 backend/geonature/core/gn_synthese/routes.py
+23 −5 backend/geonature/core/gn_synthese/utils/query_select_sqla.py
+16 −6 backend/geonature/core/users/register_post_actions.py
+7 −2 backend/geonature/core/users/routes.py
+21 −0 backend/geonature/core/users/templates/account_created.html
+4 −0 backend/geonature/core/users/templates/email_admin_validate_account.html
+22 −1 backend/geonature/migrations/versions/95acee9f0452_add_comment_notification.py
+1 −0 backend/geonature/migrations/versions/f051b88a57fd_permissions_available.py
+209 −13 backend/geonature/tests/fixtures.py
+3 −3 backend/geonature/tests/test_gn_commons.py
+1 −0 backend/geonature/tests/test_gn_meta.py
+69 −3 backend/geonature/tests/test_permissions.py
+11 −0 backend/geonature/tests/test_pr_occtax.py
+1 −1 backend/geonature/tests/test_sensitivity.py
+533 −11 backend/geonature/tests/test_synthese.py
+7 −6 backend/geonature/utils/config_schema.py
+4 −2 backend/requirements-common.in
+4 −4 backend/requirements-dependencies.in
+57 −62 backend/requirements-dev.txt
+61 −64 backend/requirements.txt
+1 −1 backend/static/css/metadata_pdf.css
+5 −2 contrib/occtax/backend/occtax/blueprint.py
+42 −0 contrib/occtax/backend/occtax/commands.py
+1 −0 contrib/occtax/backend/occtax/conf_schema_toml.py
+32 −0 contrib/occtax/backend/occtax/migrations/data/sample_data_test.sql
+1 −2 contrib/occtax/backend/occtax/models.py
+1 −0 contrib/occtax/frontend/app/occtax-form/map/occtax-map.service.ts
+1 −1 contrib/occtax/frontend/app/occtax-form/occurrence/occurrence.component.ts
+3 −0 contrib/occtax/occtax_config.toml.example
+87 −9 docs/CHANGELOG.md
+68 −33 docs/admin-manual.rst
+7 −1 docs/development.rst
+11 −2 docs/installation.rst
+134 −8 docs/user-manual.rst
+7 −9 frontend/package-lock.json
+1 −1 frontend/package.json
+11 −9 frontend/src/app/GN2CommonModule/form/synthese-form/synthese-form.component.html
+9 −0 frontend/src/app/GN2CommonModule/map/map.component.ts
+7 −3 frontend/src/app/GN2CommonModule/map/marker/marker.component.ts
+7 −4 frontend/src/app/metadataModule/af/af-card.component.html
+8 −4 frontend/src/app/metadataModule/af/af-card.component.ts
+54 −32 frontend/src/app/metadataModule/metadata.component.html
+4 −0 frontend/src/app/metadataModule/metadata.component.ts
+3 −0 frontend/src/app/modules/login/sign-up/sign-up.component.html
+20 −8 frontend/src/app/modules/login/sign-up/sign-up.component.ts
+20 −37 frontend/src/app/syntheseModule/synthese-results/synthese-carte/synthese-carte.component.ts
+3 −1 frontend/src/app/syntheseModule/synthese.component.ts
+2 −2 install/03_create_db.sh
+1 −1 install/04_install_gn_modules.sh
+3 −3 install/install_all/install_all.ini
+3 −3 install/install_all/install_all.sh
24 changes: 18 additions & 6 deletions docs/changelog.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
CHANGELOG
=========

1.6.0 (unreleased)
------------------

Nécessite la version 2.13.0 (ou plus) de GeoNature

**🚀 Nouveautés**

- Compatibilité avec GeoNature 2.13.0 et la refonte des permissions, en définissant les permissions disponibles du module (#183)
- L'export "Synthese SINP", fourni par défaut lors de l'installation du module, n'est plus défini comme "public" pour les nouvelles installations, suite à l'ouverture sans authentification de l'API des exports publics (#184)

1.5.2 (2023-08-08)
------------------

Expand All @@ -14,14 +24,14 @@ CHANGELOG

**🐛 Corrections**

- Correction de l'URL des exports générés à la demande (#187)
- Correction de la dépendance de la migration d'ajout de notifications de génération des exports (#185)
- Correction du module_code vérifié pour les permissions d'accès à un export
* Correction de l'URL des exports générés à la demande (#187)
* Correction de la dépendance de la migration d'ajout de notifications de génération des exports (#185)
* Correction du `module_code` vérifié pour les permissions d'accès à un export

1.5.0 (2023-06-07) - Workshop 2023
----------------------------------

**Nouveautés**
**🚀 Nouveautés**

* Correction des performances de génération de gros fichiers en les construisant par blocs de lignes (#110, #132, #95, par @mvergez, @joelclems, @VicentCauchois, @bouttier)
* Centralisation et factorisation des fonctions de génération de fichiers dans les sous-modules [Utils-Flask-SQLAlchemy](https://github.com/PnX-SI/Utils-Flask-SQLAlchemy) et [Utils-Flask-SQLAlchemy-Geo](https://github.com/PnX-SI/Utils-Flask-SQLAlchemy-Geo) (#143, par @joelclems, @mvergez, @VincentCauchois, @bouttier)
Expand All @@ -33,6 +43,7 @@ CHANGELOG
* Suppression du champ permettant de renseigner un email lors de la demande de téléchargement d'un export (#170, par @amandine-sahl)
* Révision, simplification et correction des permissions du module (#154, par @TheoLechemia, @ch-cna)
* Simplification de l'association de rôles aux exports dans le module "Admin" en associant ceux-ci directement depuis le formulaire d'édition d'un export (#78, par @andriacap)
* Les exports définis comme "Public" ont désormais leur API accessible de manière ouverte sans authentification
* Suppression de la table `gn_exports.t_exports_logs` traçant les exports (#136, par @amandine-sahl)
* Ajout du champ `gn_exports.t_exports.view_pk_column` permettant de spécifier la colonne d'unicité des vues d'exports (#149, par @amandine-sahl)
* Mise en place d'une Github action pour lancer automatiquement les tests (#130 et #134, par @mvergez)
Expand All @@ -44,7 +55,7 @@ CHANGELOG
* Remplacement de l'utilisation de `as_dict` au profit de marshmallow (#172, par @amandine-sahl)
* Correction de la vue complémentaire (`gn_exports.v_synthese_sinp_dee`) au format DEE (#159, par @jpm-cbna)

**Corrections**
**🐛 Corrections**

* Correction de l'installation (#133, par @ch-cbna)
* Correction de l'URL de l'API listant les exports (#102, par @TheoLechemia)
Expand All @@ -54,8 +65,9 @@ CHANGELOG

Si vous mettez à jour le module :

* Les exports définis comme "Public" ont désormais leur API accessible de manière ouverte sans authentification. C'est donc le cas votre export SINP, si vous aviez gardé cet export public créé par défaut lors de l'installation du module
* Si vous les aviez surcouché, supprimez les paramètres `export_schedules_dir`, `usr_generated_dirname` et `export_web_url` de la configuration du module
* La table listant les exports réalisée (`gn_exports.t_exports_logs`) sera automatiquement supprimée
* La table listant les exports réalisés (`gn_exports.t_exports_logs`) sera automatiquement supprimée
* Les exports au format SHP seront convertis automatiquement en export au format GPKG. Attention si vous aviez des exports planifiés au format SHP, leur URL changera avec le même nom mais avec l'extension `.gpkg`.
* Les droits d'accès au module et aux exports ne se basent désormais plus que sur l'action R (read), et non plus E (export).
* Une colomne permettant d'indiquer le champ d'unicité des vues a été ajoutée dans la table des exports (`gn_exports.t_exports.view_pk_column`). Pour les exports existants, cette colonne est automatiquement remplie avec la valeur de la première colonne des vues exports. Vous pouvez vérifier ou modifier ce champs pour les exports existants.
Expand Down
3 changes: 2 additions & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"description": "GeoNature export data module",
"license": "GPLv3",
"scripts": {
"format": "prettier --config .prettierrc --ignore-path .prettierignore --write '**/*.ts' "
"format": "prettier --config .prettierrc --ignore-path .prettierignore --write '**/*.ts' ",
"format:check": "prettier --config .prettierrc --ignore-path .prettierignore '**/*.ts' "
},
"devDependencies": {
"prettier": "^3.0.1"
Expand Down
2 changes: 1 addition & 1 deletion requirements.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
utils-flask-sqlalchemy>=0.3.5
utils-flask-sqlalchemy-geo>=0.2.8
pypnusershub>=1.6.7
geonature>=2.12.0
geonature>=2.13.0
rdflib

0 comments on commit b021b23

Please sign in to comment.