Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
amandine-sahl committed Mar 22, 2021
2 parents 958b85c + 67e69be commit bf0ef19
Show file tree
Hide file tree
Showing 36 changed files with 466 additions and 909 deletions.
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,15 @@ config/conf_gn_module.toml
config/monitoring/*
!config/monitoring/generic
frontend/assets/*.jpg


# Node
.npm
node_modules
npm-debug.log
coverage/
node_modules/
tmp/
npm-debug.log*
yarn-error.log*
.ng_pkg_build/
37 changes: 28 additions & 9 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Module GeoNature de suivis génériques
Module générique de gestion des données de protocoles de type suivis
********************************************************************

Ce module permet de gérer de façon générique des données de protocoles "simples" articulés en 3 niveaux :
des sites (nom, type, localisation) dans lesquels on fait des visites (dates, observateurs)
Ce module permet de gérer de façon générique des données de protocoles "simples" articulés en 3 niveaux :
des sites (nom, type, localisation) dans lesquels on fait des visites (dates, observateurs)
dans lesquelles on peut faire des observations (espèces).

Ces 3 niveaux peuvent être complétés des données spécifiques à chaque protocole, qui sont stockées dynamiquement dans la base de données sous forme de jsonb.
Expand Down Expand Up @@ -33,6 +33,8 @@ Sommaire
* `Documentation technique <docs/documentation_technique.rst>`_
* `Création d'un sous-module <docs/sous_module.rst>`_
* `Mise à jour du module <docs/MAJ.rst>`_
* `Liste des commandes <docs/commandes.rst>`_
* `Permissions`_

Installation
************
Expand Down Expand Up @@ -116,11 +118,11 @@ Lancer la commande d'installation du sous-module

flask monitorings install <chemin_absolu_vers_le_sous_module>

- Par défaut la commande d'installation extrait le code du module depuis le chemin.
- Par défaut la commande d'installation extrait le code du module depuis le chemin.
- Par exemple ``<chemin_absolu_vers_le_module_de_suivi>/contrib/test/`` donnera la valeur ``test`` à ``module_code``.
- Le caractère ``/`` à la fin de ``<chemin_absolu_vers_le_sous_module>`` est optionnel.

Si la commande précise que le module est déjà installé (test sur le ``module_code``) on peut préciser une valeur différente pour ``module_code`` avec la commande :
Si la commande précise que le module est déjà installé (test sur le ``module_code``) on peut préciser une valeur différente pour ``module_code`` avec la commande :

::

Expand Down Expand Up @@ -159,9 +161,9 @@ Cliquez sur le bouton ``Éditer``
--------------------------------

Le formulaire d'édition du module s'affiche et vous pouvez choisir les variable suivantes :

- Jeux de données *(obligatoire)* :

- Un module peut concerner plusieurs jeux de données, le choix sera ensuite proposé au niveau de chaque visite.

- Liste des observateurs *(obligatoire)*:
Expand All @@ -176,9 +178,9 @@ Le formulaire d'édition du module s'affiche et vous pouvez choisir les variable
- Activer la synthèse *(non obligatoire, désactivée par défaut)* ?

- Si on décide d'intégrer les données du sous-module dans la synthèse de GeoNature.

- Affichage des taxons *(obligatoire)* ?

- Définit comment sont affichés les taxons dans le module :

- ``lb_nom`` : Nom latin,
Expand All @@ -191,7 +193,7 @@ Le formulaire d'édition du module s'affiche et vous pouvez choisir les variable

- Options spécifiques du sous-module :

- Un sous-module peut présenter des options qui lui sont propres et définies dans les paramètres spécifiques du sous-module.
- Un sous-module peut présenter des options qui lui sont propres et définies dans les paramètres spécifiques du sous-module.

Exemples de sous-modules
========================
Expand All @@ -201,3 +203,20 @@ D'autres exemples de sous-modules sont disponibles sur le dépôt https://github
* Protocole de suivi des oedicnèmes,
* Protocole de suivi des mâles chanteurs de l'espèce chevêche d'Athena;
* Protocole Suivi Temporel des Oiseaux de Montagne (STOM)


Permissions
************

Les permissions ne sont implémentées que partiellement, la notion de portée (mes données, les données de mon organisme, toutes les données) n'est pas prise en compte. Si un utilisateur à le droit de réaliser une action sur un type d'objet, il peut le faire sur l'ensemble des données.

La gestion des permissions pour les rôles (utilisateur ou groupe) se réalise au niveau de l'interface d'administration des permissions de GeoNature.

Il est possible de spéficier les permissions pour chaque type d'objet (groupes de sites, sites, visites et observations).

Si aucune permission n'est associé à l'objet, les permissions auront comme valeurs celles associées au module qui lui même hérite des permissions du supermodule Monitoring qui lui même hérite de GéoNature.



Par défaut, dès qu'un utilisateur à un droit suppérieur à 0 pour une action (c-a-d aucune portée) il peut réaliser cette action. Il est possible de surcharger les paramètres au niveau des fichiers de configuration des objets du module. (cf configuration des sous-modules).

2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.2.1
0.2.2dev
81 changes: 78 additions & 3 deletions backend/command/cmd_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
from sqlalchemy import and_
from sqlalchemy.sql import text
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm.exc import NoResultFound

from geonature.utils.env import DB
from geonature.core.gn_permissions.models import CorObjectModule, TObjects
from pypnnomenclature.models import TNomenclatures, BibNomenclaturesTypes

from ..monitoring.models import TMonitoringModules
Expand Down Expand Up @@ -42,10 +44,10 @@ def install_monitoring_module(module_config_dir_path, module_code, build):

# on enleve le '/' de la fin de module_config_dir_path
if module_config_dir_path[-1] == '/':
module_config_dir_path = module_config_dir_path[:-1]
module_config_dir_path = module_config_dir_path[:-1]

module_code = module_code or module_config_dir_path.split('/')[-1]

print('Install module {}'.format(module_code))

module_monitoring = get_simple_module('module_code', 'MONITORINGS')
Expand Down Expand Up @@ -115,6 +117,10 @@ def install_monitoring_module(module_config_dir_path, module_code, build):
DB.session.add(module)
DB.session.commit()

# Insert permission object
if "permission_objects" in config:
id_module = module.id_module
insert_permission_object(id_module, config)

#  run specific sql
if os.path.exists(module_config_dir_path + '/synthese.sql'):
Expand Down Expand Up @@ -174,6 +180,75 @@ def install_monitoring_module(module_config_dir_path, module_code, build):
return


def insert_permission_object(id_module, permissions):
""" Insertion de l'association permission object
Args:
id_module ([type]): id du module
permissions ([type]): liste des permissions à associer au module
Raises:
e: [description]
"""
for perm in permissions:
print(f"Insert perm {perm}")
#load object
try:
object = DB.session.query(TObjects).filter(TObjects.code_object==perm).one()
# save
obj_mod = CorObjectModule(id_module=id_module, id_object = object.id_object)

try:
DB.session.add(obj_mod)
DB.session.commit()
print(f" Ok")
except IntegrityError:
DB.session.rollback()
print(f" Impossible d'insérer la permission {perm} pour des raisons d'intégrités")
except NoResultFound as e:
print(f" Permission {perm} does'nt exists")
except Exception as e:
print(f" Impossible d'insérer la permission {perm} :{e}")



@monitorings_cli.command('update_permission_objects')
@click.argument('module_code')
@with_appcontext
def update_perm_module_cmd(module_code):
"""
Mise à jour (uniquement insertion) des objets permissions associés au module
Défini par le paramètre permission_objects du fichier module.json
Args:
module_code ([string]): code du sous module
"""
try:
module = get_module('module_code', module_code)
except Exception:
print("le module n'existe pas")
return
path_module = CONFIG_PATH + '/' + module_code + '/module.json'

if not os.path.exists(path_module):
print(f"Il n'y a pas de fichier {path_module} pour ce module")
return
config_module = json_from_file(path_module, None)
if not config_module:
print('Il y a un problème avec le fichier {}'.format(path_module))
return

print(f"Insertion des objets de permissions pour le module {module_code}")
# Insert permission object
if "permission_objects" in config_module:
id_module = module.id_module
insert_permission_object(id_module, config_module["permission_objects"])
else:
print("no permission")



@monitorings_cli.command('remove')
@click.argument('module_code')
@with_appcontext
Expand Down
8 changes: 4 additions & 4 deletions backend/monitoring/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ def config_value(self, param_name):
field_name = self.config_param(param_name)
return self.get_value(field_name)

def parent_type(self):
def parent_type(self):
'''
on renvoie le premier de la liste
'''
Expand Down Expand Up @@ -191,8 +191,8 @@ def id_parent(self):

return getattr(self._model, self.id_parent_fied_name())

def get_cruved(self):
return cruved_scope_for_user_in_monitoring_module(self._module_code)
def get_cruved(self, object_type=None):
return cruved_scope_for_user_in_monitoring_module(self._module_code, object_type)

def cond_filters(self):
filters = self.config_param('filters')
Expand All @@ -201,7 +201,7 @@ def cond_filters(self):
return True
print('filters', filters, self)

cond = True
cond = True
for key in filters:
cond = cond and self.get_value(key) == filters[key]

Expand Down
8 changes: 7 additions & 1 deletion backend/monitoring/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def get_parent(self):
return

if not self._parent:
self._parent = (
self._parent = (
monitoring_definitions
.monitoring_object_instance(
self._module_code,
Expand Down Expand Up @@ -161,6 +161,12 @@ def serialize(self, depth=1):

if self._object_type == 'module':
monitoring_object_dict['cruved'] = self.get_cruved()
monitoring_object_dict['cruved_objects'] = {}
monitoring_object_dict['cruved_objects']['site'] = self.get_cruved("GNM_SITES")
monitoring_object_dict['cruved_objects']['sites_group'] = self.get_cruved("GNM_GRP_SITES")
monitoring_object_dict['cruved_objects']['visite'] = self.get_cruved("GNM_VISITES")
monitoring_object_dict['cruved_objects']['observation'] = self.get_cruved("GNM_OBSERVATIONS")


properties['id_parent'] = to_int(self.id_parent())
if(children):
Expand Down
Loading

0 comments on commit bf0ef19

Please sign in to comment.