diff --git a/app/auth/models.py b/app/auth/models.py index ed29772f..eb278dd1 100644 --- a/app/auth/models.py +++ b/app/auth/models.py @@ -603,8 +603,19 @@ class Role(db.Model): """Create default roles if missing, then, if reset_permissions, reset their permissions to default values. """ + Role.reset_roles_permissions( + SCO_ROLES_DEFAULTS, reset_permissions=reset_permissions + ) + + @staticmethod + def reset_roles_permissions(roles_perms: dict[str, tuple], reset_permissions=True): + """Ajoute les permissions aux roles + roles_perms : { "role_name" : (permission, ...) } + reset_permissions : si vrai efface permissions déja existantes + Si le role n'existe pas, il est (re) créé. + """ default_role = "Observateur" - for role_name, permissions in SCO_ROLES_DEFAULTS.items(): + for role_name, permissions in roles_perms.items(): role = Role.query.filter_by(name=role_name).first() if role is None: role = Role(name=role_name) diff --git a/app/entreprises/__init__.py b/app/entreprises/__init__.py index 1d41e77d..006930cd 100644 --- a/app/entreprises/__init__.py +++ b/app/entreprises/__init__.py @@ -59,3 +59,4 @@ def check_taxe_now(taxes): from app.entreprises import routes +from app.entreprises.activate import activate_module diff --git a/app/entreprises/activate.py b/app/entreprises/activate.py new file mode 100644 index 00000000..59a3d5c4 --- /dev/null +++ b/app/entreprises/activate.py @@ -0,0 +1,31 @@ +############################################################################## +# ScoDoc +# Copyright (c) 1999 - 2024 Emmanuel Viennet. All rights reserved. +# See LICENSE +############################################################################## + +"""Activation du module entreprises + +L'affichage du module est contrôlé par la config ScoDocConfig.enable_entreprises + +Au moment de l'activation, il est en général utile de proposer de configurer les +permissions de rôles standards: AdminEntreprise UtilisateurEntreprise ObservateurEntreprise + +Voir associations dans sco_roles_default + +""" +from app.auth.models import Role +from app.models import ScoDocSiteConfig +from app.scodoc.sco_roles_default import SCO_ROLES_ENTREPRISES_DEFAULT + + +def activate_module( + enable: bool = True, set_default_roles_permission: bool = False +) -> bool: + """Active le module et en option donne les permissions aux rôles standards. + True si l'état d'activation a changé. + """ + change = ScoDocSiteConfig.enable_entreprises(enable) + if enable and set_default_roles_permission: + Role.reset_roles_permissions(SCO_ROLES_ENTREPRISES_DEFAULT) + return change diff --git a/app/forms/main/activate_entreprises.py b/app/forms/main/activate_entreprises.py new file mode 100644 index 00000000..c7a81e15 --- /dev/null +++ b/app/forms/main/activate_entreprises.py @@ -0,0 +1,17 @@ +""" +Formulaire activation module entreprises +""" + +from flask_wtf import FlaskForm +from wtforms.fields.simple import BooleanField, SubmitField + +from app.models import ScoDocSiteConfig + + +class ActivateEntreprisesForm(FlaskForm): + "Formulaire activation module entreprises" + set_default_roles_permission = BooleanField( + "(re)mettre les rôles 'Entreprise' à leurs valeurs par défaut" + ) + submit = SubmitField("Valider") + cancel = SubmitField("Annuler", render_kw={"formnovalidate": True}) diff --git a/app/forms/main/config_main.py b/app/forms/main/config_main.py index 21437249..101bbe38 100644 --- a/app/forms/main/config_main.py +++ b/app/forms/main/config_main.py @@ -54,7 +54,6 @@ class BonusConfigurationForm(FlaskForm): class ScoDocConfigurationForm(FlaskForm): "Panneau de configuration avancée" - enable_entreprises = BooleanField("activer le module entreprises") disable_passerelle = BooleanField( # disable car par défaut activée """cacher les fonctions liées à une passerelle de publication des résultats vers les étudiants ("œil"). N'affecte pas l'API, juste la présentation.""" ) @@ -127,13 +126,6 @@ def configuration(): flash("Fonction bonus inchangée.") return redirect(url_for("scodoc.index")) elif form_scodoc.submit_scodoc.data and form_scodoc.validate(): - if ScoDocSiteConfig.enable_entreprises( - enabled=form_scodoc.data["enable_entreprises"] - ): - flash( - "Module entreprise " - + ("activé" if form_scodoc.data["enable_entreprises"] else "désactivé") - ) if ScoDocSiteConfig.disable_passerelle( disabled=form_scodoc.data["disable_passerelle"] ): @@ -182,6 +174,7 @@ def configuration(): return render_template( "configuration.j2", + is_entreprises_enabled=ScoDocSiteConfig.is_entreprises_enabled(), form_bonus=form_bonus, form_scodoc=form_scodoc, scu=scu, diff --git a/app/scodoc/sco_roles_default.py b/app/scodoc/sco_roles_default.py index a727a94b..08310552 100644 --- a/app/scodoc/sco_roles_default.py +++ b/app/scodoc/sco_roles_default.py @@ -51,7 +51,24 @@ SCO_ROLES_DEFAULTS = { p.UsersView, p.ViewEtudData, ), - # Rôles pour l'application relations entreprises + # LecteurAPI peut utiliser l'API en lecture + "LecteurAPI": (p.ScoView,), + "Observateur": (p.Observateur,), + # RespPE est le responsable poursuites d'études + # il peut ajouter des tags sur les formations: + # (doit avoir un rôle Ens en plus !) + "RespPe": (p.EditFormationTags,), + # Super Admin est un root: création/suppression de départements + # _tous_ les droits + # Afin d'avoir tous les droits, il ne doit pas être asscoié à un département + "SuperAdmin": p.ALL_PERMISSIONS, +} + +# Rôles pour l'application relations entreprises +# séparés pour pouvoir les réinitialiser lors de l'activation du module Entreprises +# Note: Admin (chef de dept n'a par défaut aucun rôle lié à ce module) + +SCO_ROLES_ENTREPRISES_DEFAULT = { # ObservateurEntreprise est un observateur de l'application entreprise "ObservateurEntreprise": (p.RelationsEntrepView,), # UtilisateurEntreprise est un utilisateur de l'application entreprise (droit de modification) @@ -70,19 +87,10 @@ SCO_ROLES_DEFAULTS = { p.RelationsEntrepValidate, p.RelationsEntrepViewCorrs, ), - # LecteurAPI peut utiliser l'API en lecture - "LecteurAPI": (p.ScoView,), - "Observateur": (p.Observateur,), - # RespPE est le responsable poursuites d'études - # il peut ajouter des tags sur les formations: - # (doit avoir un rôle Ens en plus !) - "RespPe": (p.EditFormationTags,), - # Super Admin est un root: création/suppression de départements - # _tous_ les droits - # Afin d'avoir tous les droits, il ne doit pas être asscoié à un département - "SuperAdmin": p.ALL_PERMISSIONS, } +SCO_ROLES_DEFAULTS.update(SCO_ROLES_ENTREPRISES_DEFAULT) + # Les rôles accessibles via la page d'admin utilisateurs # - associés à un département: ROLES_ATTRIBUABLES_DEPT = ("Ens", "Secr", "Admin", "RespPe") diff --git a/app/templates/activate_entreprises.j2 b/app/templates/activate_entreprises.j2 new file mode 100644 index 00000000..390ea4a0 --- /dev/null +++ b/app/templates/activate_entreprises.j2 @@ -0,0 +1,51 @@ +{% extends "base.j2" %} +{% import 'wtf.j2' as wtf %} + +{% block app_content %} +
+
++
+