forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -603,8 +603,19 @@ class Role(db.Model):
|
|||||||
"""Create default roles if missing, then, if reset_permissions,
|
"""Create default roles if missing, then, if reset_permissions,
|
||||||
reset their permissions to default values.
|
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"
|
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()
|
role = Role.query.filter_by(name=role_name).first()
|
||||||
if role is None:
|
if role is None:
|
||||||
role = Role(name=role_name)
|
role = Role(name=role_name)
|
||||||
|
@ -59,3 +59,4 @@ def check_taxe_now(taxes):
|
|||||||
|
|
||||||
|
|
||||||
from app.entreprises import routes
|
from app.entreprises import routes
|
||||||
|
from app.entreprises.activate import activate_module
|
||||||
|
31
app/entreprises/activate.py
Normal file
31
app/entreprises/activate.py
Normal file
@ -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
|
17
app/forms/main/activate_entreprises.py
Normal file
17
app/forms/main/activate_entreprises.py
Normal file
@ -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})
|
@ -54,7 +54,6 @@ class BonusConfigurationForm(FlaskForm):
|
|||||||
|
|
||||||
class ScoDocConfigurationForm(FlaskForm):
|
class ScoDocConfigurationForm(FlaskForm):
|
||||||
"Panneau de configuration avancée"
|
"Panneau de configuration avancée"
|
||||||
enable_entreprises = BooleanField("activer le module <em>entreprises</em>")
|
|
||||||
disable_passerelle = BooleanField( # disable car par défaut activée
|
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."""
|
"""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.")
|
flash("Fonction bonus inchangée.")
|
||||||
return redirect(url_for("scodoc.index"))
|
return redirect(url_for("scodoc.index"))
|
||||||
elif form_scodoc.submit_scodoc.data and form_scodoc.validate():
|
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(
|
if ScoDocSiteConfig.disable_passerelle(
|
||||||
disabled=form_scodoc.data["disable_passerelle"]
|
disabled=form_scodoc.data["disable_passerelle"]
|
||||||
):
|
):
|
||||||
@ -182,6 +174,7 @@ def configuration():
|
|||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"configuration.j2",
|
"configuration.j2",
|
||||||
|
is_entreprises_enabled=ScoDocSiteConfig.is_entreprises_enabled(),
|
||||||
form_bonus=form_bonus,
|
form_bonus=form_bonus,
|
||||||
form_scodoc=form_scodoc,
|
form_scodoc=form_scodoc,
|
||||||
scu=scu,
|
scu=scu,
|
||||||
|
@ -51,7 +51,24 @@ SCO_ROLES_DEFAULTS = {
|
|||||||
p.UsersView,
|
p.UsersView,
|
||||||
p.ViewEtudData,
|
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 est un observateur de l'application entreprise
|
||||||
"ObservateurEntreprise": (p.RelationsEntrepView,),
|
"ObservateurEntreprise": (p.RelationsEntrepView,),
|
||||||
# UtilisateurEntreprise est un utilisateur de l'application entreprise (droit de modification)
|
# UtilisateurEntreprise est un utilisateur de l'application entreprise (droit de modification)
|
||||||
@ -70,19 +87,10 @@ SCO_ROLES_DEFAULTS = {
|
|||||||
p.RelationsEntrepValidate,
|
p.RelationsEntrepValidate,
|
||||||
p.RelationsEntrepViewCorrs,
|
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
|
# Les rôles accessibles via la page d'admin utilisateurs
|
||||||
# - associés à un département:
|
# - associés à un département:
|
||||||
ROLES_ATTRIBUABLES_DEPT = ("Ens", "Secr", "Admin", "RespPe")
|
ROLES_ATTRIBUABLES_DEPT = ("Ens", "Secr", "Admin", "RespPe")
|
||||||
|
51
app/templates/activate_entreprises.j2
Normal file
51
app/templates/activate_entreprises.j2
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{% extends "base.j2" %}
|
||||||
|
{% import 'wtf.j2' as wtf %}
|
||||||
|
|
||||||
|
{% block app_content %}
|
||||||
|
<h1>{{title}}</h1>
|
||||||
|
|
||||||
|
<div class="help">
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<form class="form form-horizontal spacediv" method="post" enctype="multipart/form-data" role="form">
|
||||||
|
{{ form.hidden_tag() }}
|
||||||
|
{{ wtf.form_errors(form, hiddens="only") }}
|
||||||
|
|
||||||
|
{% if is_enabled %}
|
||||||
|
<p>Le module <em>relations entreprises</em> est actuellement activé.</p>
|
||||||
|
<p>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).
|
||||||
|
<p>
|
||||||
|
{% else %}
|
||||||
|
<p>Le module <em>relations entreprises</em> est actuellement désactivé.
|
||||||
|
</p>
|
||||||
|
<p>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).
|
||||||
|
<p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
{{ wtf.form_field(form.set_default_roles_permission) }}
|
||||||
|
{% endif %}
|
||||||
|
<div class="form-group spacediv">
|
||||||
|
{{ wtf.form_field(form.submit) }}
|
||||||
|
{{ wtf.form_field(form.cancel) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<style>
|
||||||
|
.spacediv {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -39,6 +39,18 @@ Heure: <b><tt>{{ time.strftime("%d/%m/%Y %H:%M") }}</tt></b>
|
|||||||
|
|
||||||
<div class="scobox">
|
<div class="scobox">
|
||||||
<div class="scobox-title">ScoDoc : paramètres généraux</div>
|
<div class="scobox-title">ScoDoc : paramètres généraux</div>
|
||||||
|
|
||||||
|
<div style="margin-top: 16px;">
|
||||||
|
Le module <em>Relations Entreprises</em>
|
||||||
|
{% if is_entreprises_enabled %}
|
||||||
|
est <b>activé</b>
|
||||||
|
{% else %}
|
||||||
|
n'est pas activé
|
||||||
|
{% endif %}
|
||||||
|
: <a class="stdlink" href="{{url_for('scodoc.activate_entreprises')
|
||||||
|
}}">{% if is_entreprises_enabled %}le désactiver{%else%}l'activer{%endif%}</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<form id="configuration_form_scodoc" class="sco-form" action="" method="post" enctype="multipart/form-data" novalidate>
|
<form id="configuration_form_scodoc" class="sco-form" action="" method="post" enctype="multipart/form-data" novalidate>
|
||||||
{{ form_scodoc.hidden_tag() }}
|
{{ form_scodoc.hidden_tag() }}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -53,6 +53,7 @@ from werkzeug.exceptions import BadRequest, NotFound
|
|||||||
|
|
||||||
|
|
||||||
from app import db, log
|
from app import db, log
|
||||||
|
from app import entreprises
|
||||||
from app.auth.models import User, Role
|
from app.auth.models import User, Role
|
||||||
from app.auth.cas import set_cas_configuration
|
from app.auth.cas import set_cas_configuration
|
||||||
from app.decorators import (
|
from app.decorators import (
|
||||||
@ -62,6 +63,7 @@ from app.decorators import (
|
|||||||
)
|
)
|
||||||
from app.forms.generic import SimpleConfirmationForm
|
from app.forms.generic import SimpleConfirmationForm
|
||||||
from app.forms.main import config_logos, config_main
|
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_assiduites import ConfigAssiduitesForm
|
||||||
from app.forms.main.config_apo import CodesDecisionsForm
|
from app.forms.main.config_apo import CodesDecisionsForm
|
||||||
from app.forms.main.config_cas import ConfigCASForm
|
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"])
|
@bp.route("/ScoDoc/table_etud_in_accessible_depts", methods=["POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def table_etud_in_accessible_depts():
|
def table_etud_in_accessible_depts():
|
||||||
|
Loading…
Reference in New Issue
Block a user