Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions backend/gn_module_monitoring/conf_schema_toml.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
}


class DynamicFormDefSchema(Schema):
fields_form = fields.List(fields.Dict())
show_advanced_filters = fields.Boolean(load_default=False)


class GnModuleSchemaConf(Schema):
DESCRIPTION_MODULE = fields.String(load_default="")
TITLE_MODULE = fields.String(load_default="Module monitoring")
Expand All @@ -28,6 +33,13 @@ class GnModuleSchemaConf(Schema):
PERMISSION_LEVEL = fields.Dict(
keys=fields.Str(), values=fields.Str(), load_default=PERMISSION_LEVEL_DEFAULT
)
SHOW_ADVANCED_FILTERS = fields.Boolean(load_default=False)
DYNAMIC_FORM_DEF_MONITORING = fields.Dict(
keys=fields.Str(),
values=fields.Nested(DynamicFormDefSchema),
required=False,
load_default={},
)


# AREA_TYPE = fields.List(fields.String(), missing=["COM", "M1", "M5", "M10"])
Expand Down
40 changes: 40 additions & 0 deletions backend/gn_module_monitoring/utils/enrich_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from flask import current_app
from .form_enricher import enrich_monitoring_form_def
from gn_module_monitoring.modules.repositories import (
get_modules,
)
from geonature.core.gn_permissions.tools import get_scopes_by_action


def enrich_config_from_remote(form_def_dict, _=None):
try:
modules = get_modules()
# modules_out = []
modules_out = [enrich_module(module) for module in modules if has_read_permission(module)]
except Exception as e:
current_app.logger.warning(f"Erreur lecture modules monitoring : {e}")
modules_out = []

return enrich_monitoring_form_def(form_def_dict or {}, modules_out)


def enrich_module(module):
module_out = module.as_dict(depth=0)
module_out["cruved"] = get_scopes_by_action(
module_code=module.module_code, object_code="MONITORINGS_MODULES"
)
return module_out


def has_read_permission(module):
"""Retourne True si l'utilisateur a le droit de lecture (R > 0) sur le module."""
try:
scopes = get_scopes_by_action(
module_code=module.module_code, object_code="MONITORINGS_MODULES"
)
return scopes.get("R", 0) > 0
except Exception as e:
current_app.logger.warning(
f"[Monitoring] Erreur permission module {module.module_code} : {e}"
)
return False
35 changes: 35 additions & 0 deletions backend/gn_module_monitoring/utils/form_enricher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from gn_module_monitoring.config.utils import config_from_files


def enrich_monitoring_form_def(form_def_dict, module_codes):
enriched_dict = {}

def get_case_insensitive_key(d: dict, key: str):
for k, v in d.items():
if k.lower() == key.lower():
return v
return None

for module in module_codes:
protocole_code = module["module_code"]
observation_def = config_from_files("observation", protocole_code)
protocole_form = get_case_insensitive_key(form_def_dict, protocole_code)
fields = protocole_form.get("fields_form", [])

enriched_fields = []
for field in fields:
attr = field.get("attribut_name")
if not attr:
continue

obs_def = observation_def.get("specific", {}).get(attr)
if not obs_def:
enriched_fields.append(field)
continue

enriched = {**obs_def, **field} # priorité au champ TOML
enriched_fields.append(enriched)

enriched_dict[protocole_code] = {"fields_form": enriched_fields}

return enriched_dict
15 changes: 14 additions & 1 deletion monitorings_config.toml.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,17 @@
#TITLE_MODULE = "Module de suivi"

# code of the observator list -- utilisateurs.t_listes
#CODE_OBSERVERS_LIST = "obsocctax"
#CODE_OBSERVERS_LIST = "obsocctax"

# Possibilité d'afficher les filtres avancées , liés aux champs additionnel, dans la synthese
# SHOW_ADVANCED_FILTERS = false

# Possibilité de configurer plus finement les filtres avancées à afficher et en définissant également les champs que l'on veut filtrer
# Penser à bien remplacer le MODULE_CODE par le code du sous module . Par exemple CHIROPTERES . Et également penser à définir les champs pour lequels on veut filtrer dans la synthese .
# Pour les champs s'appuyer sur les champs spécifiques au sous module (protocole) liés au formulaire d'observation.
[DYNAMIC_FORM_DEF_MONITORING.<MODULE_CODE>]
fields_form = [
{ attribut_name = "key_field_of_nomenclature", keyValue ="label_fr"},
{ attribut_name = "key_field_of_radio_button" }
]
show_advanced_filters = true
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"blueprint = gn_module_monitoring.blueprint:blueprint",
"config_schema = gn_module_monitoring.conf_schema_toml:GnModuleSchemaConf",
"migrations = gn_module_monitoring:migrations",
"form_def_enricher = gn_module_monitoring.utils.enrich_config:enrich_config_from_remote",
],
},
classifiers=[
Expand Down