From c2443c361f3e3006e686f477167e0bdf0b6ee55d Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Tue, 9 Apr 2024 00:36:46 +0200 Subject: [PATCH] =?UTF-8?q?Am=C3=A9liore=20page=20activation=20module=20en?= =?UTF-8?q?treprises.=20Implements=20#634?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/auth/models.py | 13 ++++++- app/entreprises/__init__.py | 1 + app/entreprises/activate.py | 31 ++++++++++++++++ app/forms/main/activate_entreprises.py | 17 +++++++++ app/forms/main/config_main.py | 9 +---- app/scodoc/sco_roles_default.py | 32 ++++++++++------ app/templates/activate_entreprises.j2 | 51 ++++++++++++++++++++++++++ app/templates/configuration.j2 | 12 ++++++ app/views/scodoc.py | 34 +++++++++++++++++ 9 files changed, 179 insertions(+), 21 deletions(-) create mode 100644 app/entreprises/activate.py create mode 100644 app/forms/main/activate_entreprises.py create mode 100644 app/templates/activate_entreprises.j2 diff --git a/app/auth/models.py b/app/auth/models.py index ed29772f4..eb278dd13 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 1d41e77d0..006930cde 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 000000000..59a3d5c41 --- /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 000000000..c7a81e157 --- /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 214372494..101bbe38b 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 a727a94b2..083105522 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 000000000..390ea4a09 --- /dev/null +++ b/app/templates/activate_entreprises.j2 @@ -0,0 +1,51 @@ +{% extends "base.j2" %} +{% import 'wtf.j2' as wtf %} + +{% block app_content %} +

{{title}}

+ +
+

+

+

+

+
+ +
+
+
+ {{ form.hidden_tag() }} + {{ wtf.form_errors(form, hiddens="only") }} + + {% if is_enabled %} +

Le module relations entreprises est actuellement activé.

+

Il peut être activé ou désactivé à tout moment sans aucune perte de + données (la désactivation le fait simplement disparaitre des pages + utilisateurs). +

+ {% else %} +

Le module relations entreprises est actuellement désactivé. +

+

Il peut être activé ou désactivé à tout moment sans aucune perte de + données (la désactivation le fait simplement disparaitre des pages + utilisateurs). +

+

+ Lors de son activation, vous pouvez (re)positionner les rôles qu'il utilise + à leurs valeurs par défaut en cochant la case ci-dessous. +

+ {{ wtf.form_field(form.set_default_roles_permission) }} + {% endif %} +
+ {{ wtf.form_field(form.submit) }} + {{ wtf.form_field(form.cancel) }} +
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/app/templates/configuration.j2 b/app/templates/configuration.j2 index 31a0410b2..eec4a6955 100644 --- a/app/templates/configuration.j2 +++ b/app/templates/configuration.j2 @@ -39,6 +39,18 @@ Heure: {{ time.strftime("%d/%m/%Y %H:%M") }}
ScoDoc : paramètres généraux
+ +
+ Le module Relations Entreprises + {% if is_entreprises_enabled %} + est activé + {% else %} + n'est pas activé + {% endif %} + : {% if is_entreprises_enabled %}le désactiver{%else%}l'activer{%endif%} +
+ {{ form_scodoc.hidden_tag() }}
diff --git a/app/views/scodoc.py b/app/views/scodoc.py index 0967ff166..1bf6fe520 100644 --- a/app/views/scodoc.py +++ b/app/views/scodoc.py @@ -53,6 +53,7 @@ from werkzeug.exceptions import BadRequest, NotFound from app import db, log +from app import entreprises from app.auth.models import User, Role from app.auth.cas import set_cas_configuration from app.decorators import ( @@ -62,6 +63,7 @@ from app.decorators import ( ) from app.forms.generic import SimpleConfirmationForm from app.forms.main import config_logos, config_main +from app.forms.main.activate_entreprises import ActivateEntreprisesForm from app.forms.main.config_assiduites import ConfigAssiduitesForm from app.forms.main.config_apo import CodesDecisionsForm from app.forms.main.config_cas import ConfigCASForm @@ -484,6 +486,38 @@ def config_personalized_links(): ) +@bp.route("/ScoDoc/activate_entreprises", methods=["GET", "POST"]) +@admin_required +def activate_entreprises(): + """Form activation module entreprises""" + is_enabled = ScoDocSiteConfig.is_entreprises_enabled() + form = ActivateEntreprisesForm( + data={ + "set_default_roles_permission": True, + } + ) + if request.method == "POST" and form.cancel.data: # cancel button + return redirect(url_for("scodoc.configuration")) + if form.validate_on_submit(): + if entreprises.activate_module( + enable=not is_enabled, + set_default_roles_permission=form.data["set_default_roles_permission"], + ): + flash("Module entreprise " + ("activé" if not is_enabled else "désactivé")) + return redirect(url_for("scodoc.configuration")) + + if is_enabled: + form.submit.label.text = "Désactiver le module relations entreprises" + else: + form.submit.label.text = "Activer le module relations entreprises" + return render_template( + "activate_entreprises.j2", + form=form, + is_enabled=is_enabled, + title="Activation module Relations Entreprises", + ) + + @bp.route("/ScoDoc/table_etud_in_accessible_depts", methods=["POST"]) @login_required def table_etud_in_accessible_depts():