diff --git a/README.md b/README.md index 38e811090..6550dbbab 100644 --- a/README.md +++ b/README.md @@ -85,16 +85,22 @@ source ~/geonature/backend/venv/bin/activate #### Copie du dossier de configuration -Copier le dossier du sous-module dans le dossier `media` de GeoNature +Créer un dossier pour référencer les configurations des sous-modules dans GeoNature (`geonature/backend/media/monitorings`) : ```sh -cp -R ~/geonature/backend/media/monitorings/ +mkdir geonature/backend/media/monitorings ``` -PS : Si l'on souhaite développer un sous-module il peut être pratique de plutôt faire un lien symbolique vers le dossier du sous-module, plutôt que de le copier dans le dossier `media` de GeoNature : +Créer un lien symbolique vers le dossier du sous-module dans le dossier `media` de GeoNature : ```sh -ln -s ~/geonature/backend/media/monitorings/ +ln -s ~/geonature/backend/media/monitorings/ +``` + +Exemple pour le module "test" : + +``` +ln -s ~/gn_module_monitoring/contrib/test ~/geonature/backend/media/monitorings/test ``` #### Lancer la commande d'installation du sous-module diff --git a/VERSION b/VERSION index 7deb86fee..d5cc44d1d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.7.1 \ No newline at end of file +0.7.2 \ No newline at end of file diff --git a/backend/gn_module_monitoring/command/utils.py b/backend/gn_module_monitoring/command/utils.py index f661ebc3f..efbb2198b 100644 --- a/backend/gn_module_monitoring/command/utils.py +++ b/backend/gn_module_monitoring/command/utils.py @@ -297,14 +297,14 @@ def add_nomenclature(module_code): DB.session.commit() -def installed_modules(): +def installed_modules(session=None): return [ { "module_code": module.module_code, "module_label": module.module_label, "module_desc": module.module_desc, } - for module in get_modules() + for module in get_modules(session) ] diff --git a/backend/gn_module_monitoring/config/generic/site.json b/backend/gn_module_monitoring/config/generic/site.json index da4956690..f9c7f44b0 100644 --- a/backend/gn_module_monitoring/config/generic/site.json +++ b/backend/gn_module_monitoring/config/generic/site.json @@ -53,28 +53,14 @@ "base_site_description": { "type_widget": "textarea", "attribut_label": "Description" - }, - - "id_sites_group": { - "type_widget": "datalist", - "attribut_label": "Groupe de sites", - "type_util": "sites_group", - "keyValue": "id_sites_group", - "keyLabel": "sites_group_name", - "api": "__MONITORINGS_PATH/list/__MODULE.MODULE_CODE/sites_group?id_module=__MODULE.ID_MODULE&fields=id_sites_group&fields=sites_group_name", - "application": "GeoNature", - "required": false, - "hidden": true - }, + }, "id_nomenclature_type_site": { - "type_widget": "datalist", + "type_widget": "text", "attribut_label": "Type site", - "api": "nomenclatures/nomenclature/TYPE_SITE", - "application": "GeoNature", - "keyValue": "id_nomenclature", - "keyLabel": "label_fr", - "data_path": "values", "type_util": "nomenclature", + "value": { + "code_nomenclature_type": "TYPE_SITE" + }, "required": true }, "id_inventor": { @@ -86,7 +72,7 @@ "keyLabel": "nom_complet", "type_util": "user", "required": true - }, + }, "id_digitiser": { "type_widget": "text", "attribut_label": "Numérisateur", diff --git a/backend/gn_module_monitoring/config/utils.py b/backend/gn_module_monitoring/config/utils.py index a23e26bf3..4b79c4d0d 100644 --- a/backend/gn_module_monitoring/config/utils.py +++ b/backend/gn_module_monitoring/config/utils.py @@ -13,6 +13,15 @@ SUB_MODULE_CONFIG_DIR = Path(gn_config["MEDIA_FOLDER"]) / "monitorings/" +SITES_GROUP_CONFIG = { + "type_widget": "datalist", + "attribut_label": "Groupe de sites", + "type_util": "sites_group", + "keyValue": "id_sites_group", + "keyLabel": "sites_group_name", + "api": "__MONITORINGS_PATH/list/__MODULE.MODULE_CODE/sites_group?id_module=__MODULE.ID_MODULE&fields=id_sites_group&fields=sites_group_name", + "application": "GeoNature", +} def monitoring_module_config_path(module_code): return SUB_MODULE_CONFIG_DIR / module_code @@ -193,19 +202,22 @@ def process_schema(object_type, config): keys_s = list(specific.keys()) keys_g = list(generic.keys()) for key_s in keys_s: - for key_g in keys_g: - if key_s == key_g: - key = key_s - - type_widget_s = specific[key].get("type_widget") - type_widget_g = generic[key].get("type_widget") - - if type_widget_s and type_widget_s == type_widget_g: - generic[key] = copy_dict(specific[key]) - else: - generic[key].update(copy_dict(specific[key])) - - del specific[key] + # Cas particulier de sites_group + # définition spécifique du datalist + # récupérée depuis la constante SITES_GROUP_CONFIG + if key_s == "id_sites_group": + generic[key_s] = SITES_GROUP_CONFIG + if key_s in keys_g: + key = key_s + + type_widget_s = specific[key].get("type_widget") + type_widget_g = generic[key].get("type_widget") + + if type_widget_s and type_widget_s == type_widget_g: + generic[key] = copy_dict(specific[key]) + else: + generic[key].update(copy_dict(specific[key])) + del specific[key] def process_config_display(object_type, config): diff --git a/backend/gn_module_monitoring/migrations/c1528c94d350_upgrade_existing_permissions.py b/backend/gn_module_monitoring/migrations/c1528c94d350_upgrade_existing_permissions.py index 46afca08e..7b64602a5 100644 --- a/backend/gn_module_monitoring/migrations/c1528c94d350_upgrade_existing_permissions.py +++ b/backend/gn_module_monitoring/migrations/c1528c94d350_upgrade_existing_permissions.py @@ -25,7 +25,7 @@ def upgrade(): session = sa.orm.Session(bind=bind) # Création des permissions disponibles pour chaque module - for module in installed_modules(): + for module in installed_modules(session): process_available_permissions(module["module_code"], session=session) # ######## diff --git a/backend/gn_module_monitoring/modules/repositories.py b/backend/gn_module_monitoring/modules/repositories.py index 75aaa6070..e93052fb5 100644 --- a/backend/gn_module_monitoring/modules/repositories.py +++ b/backend/gn_module_monitoring/modules/repositories.py @@ -70,7 +70,7 @@ def get_module(field_name, value, moduleCls=TMonitoringModules): pass -def get_modules(): +def get_modules(session=None): """ récupère les modules de protocole de suivi renvoie un tableau de dictionnaires @@ -78,8 +78,10 @@ def get_modules(): :return: """ + if not session: + session = DB.session try: - res = DB.session.query(TMonitoringModules).order_by(TMonitoringModules.module_label).all() + res = session.query(TMonitoringModules).order_by(TMonitoringModules.module_label).all() return res diff --git a/backend/gn_module_monitoring/monitoring/models.py b/backend/gn_module_monitoring/monitoring/models.py index 96d11c994..916799a56 100644 --- a/backend/gn_module_monitoring/monitoring/models.py +++ b/backend/gn_module_monitoring/monitoring/models.py @@ -125,7 +125,6 @@ class TMonitoringVisits(TBaseVisits): ) ) - @geoserializable class TMonitoringSites(TBaseSites): __tablename__ = "t_site_complements" @@ -181,11 +180,7 @@ class TMonitoringSites(TBaseSites): ) ) - geom_geojson = column_property( - select([func.st_asgeojson(TBaseSites.geom)]) - .where(TBaseSites.id_base_site == id_base_site) - .correlate_except(TBaseSites) - ) + geom_geojson = column_property(func.ST_AsGeoJSON(TBaseSites.geom), deferred=True) @serializable diff --git a/contrib/test/config.json b/contrib/test/config.json index 6f4c83705..79245d873 100644 --- a/contrib/test/config.json +++ b/contrib/test/config.json @@ -1,10 +1,14 @@ { "tree": { "module": { - "site": { - "visit": { - "observation": null + "sites_group": { + "site": { + "visit": { + "observation": null + } } + }, + "site": { } } } diff --git a/contrib/test/site.json b/contrib/test/site.json index 64898b8cc..0b22b29e6 100644 --- a/contrib/test/site.json +++ b/contrib/test/site.json @@ -1,5 +1,6 @@ { "display_properties": [ + "id_sites_group", "base_site_name", "base_site_code", "base_site_description", @@ -30,6 +31,10 @@ "cd_nomenclature": "1" } }, + "id_sites_group": { + "required": true, + "hidden": false + }, "contact_name": { "type_widget": "text", "attribut_label": "contact" diff --git a/docs/changelog.md b/docs/changelog.md index ff1b07a5b..1ba3cf11d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,17 +1,31 @@ CHANGELOG ========= +0.7.2 (27-02-23) +------------------ + +**🚀 Nouveautés** + +* Mise à jour de la documentation sur l'alimentation de la synthèse et l'installation d'un sous-module +* Ajout des groupes de sites dans le sous-module de `test` + +**🐛 Corrections** + +* Erreur lors de l'installation du module (#284) +* Corrections des permissions (export PDF, groupes de sites) + 0.7.1 (05-12-23) ------------------ **🚀 Nouveautés** + * La gestion des permissions est définie pour chaque objet (module, site, visite) et l'objet ALL n'est plus pris en compte (#249). De fait les paramètres cruved des fichiers de configuration ainsi que permission object de `module.json` sont obsolètes. * Ajout de tests **🐛 Corrections** -* export avec un filtre par jeux de données (#241) +* Export avec un filtre par jeux de données (#241) 0.7.0 (2023-08-23) diff --git a/docs/synthese.md b/docs/synthese.md index 20a51a01d..d079ac6ac 100644 --- a/docs/synthese.md +++ b/docs/synthese.md @@ -17,6 +17,7 @@ La vue pour la synthèse * donner des valeurs plus spécifique au module pour les champs de type nomenclature (la plupart sont en commentaires dans la vue) + * :warning: Les colonnes `id_observation`, `unique_id_sinp` et `ids_observers` (tableau d'id_role) sont obligatoires pour assurer la synchronisation entre la vue et la synthese * À la configuration du sous-module (page du sous-module, cliquer sur `éditer le module`), activer la synthèse. diff --git a/frontend/app/components/monitoring-properties/monitoring-properties.component.html b/frontend/app/components/monitoring-properties/monitoring-properties.component.html index a1dbc54ea..667e8f286 100644 --- a/frontend/app/components/monitoring-properties/monitoring-properties.component.html +++ b/frontend/app/components/monitoring-properties/monitoring-properties.component.html @@ -92,7 +92,7 @@ (click)="processExportPdf(exportPdfConfig)" type="button" class="mr-2" - *ngIf="currentUser?.moduleCruved[obj.objectType].E >= 1" + *ngIf="currentUser?.moduleCruved['module'].E >= 1" >   {{exportPdfConfig.label}}