forked from ScoDoc/ScoDoc
120 lines
4.8 KiB
Python
120 lines
4.8 KiB
Python
# -*- mode: python -*-
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""Definition of ScoDoc 8 permissions
|
|
used by auth
|
|
"""
|
|
# Définition des permissions: ne pas changer les numéros ou l'ordre des lignes !
|
|
_SCO_PERMISSIONS = (
|
|
# permission bit, symbol, description
|
|
# ScoSuperAdmin est utilisé pour:
|
|
# - ZScoDoc: add/delete departments
|
|
# - tous rôles lors creation utilisateurs
|
|
(1 << 1, "ScoSuperAdmin", "Super Administrateur"),
|
|
(1 << 2, "ScoView", "Voir"),
|
|
(1 << 3, "ScoEnsView", "Voir les parties pour les enseignants"),
|
|
(1 << 4, "ScoObservateur", "Observer (accès lecture restreint aux bulletins)"),
|
|
(1 << 5, "ScoUsersAdmin", "Gérer les utilisateurs"),
|
|
(1 << 6, "ScoUsersView", "Voir les utilisateurs"),
|
|
(1 << 7, "ScoChangePreferences", "Modifier les préférences"),
|
|
(1 << 8, "ScoChangeFormation", "Changer les formations"),
|
|
(1 << 9, "ScoEditFormationTags", "Tagguer les formations"),
|
|
(1 << 10, "ScoEditAllNotes", "Modifier toutes les notes"),
|
|
(1 << 11, "ScoEditAllEvals", "Modifier toutes les evaluations"),
|
|
(1 << 12, "ScoImplement", "Mettre en place une formation (créer un semestre)"),
|
|
(1 << 13, "ScoAbsChange", "Saisir des absences"),
|
|
(1 << 14, "ScoAbsAddBillet", "Saisir des billets d'absences"),
|
|
# changer adresse/photo ou pour envoyer bulletins par mail ou pour debouche
|
|
(1 << 15, "ScoEtudChangeAdr", "Changer les addresses d'étudiants"),
|
|
(1 << 16, "ScoEtudChangeGroups", "Modifier les groupes"),
|
|
# aussi pour demissions, diplomes:
|
|
(1 << 17, "ScoEtudInscrit", "Inscrire des étudiants"),
|
|
# aussi pour archives:
|
|
(1 << 18, "ScoEtudAddAnnotations", "Éditer les annotations"),
|
|
(1 << 19, "ScoEntrepriseView", "Voir la section 'entreprises'"),
|
|
(1 << 20, "ScoEntrepriseChange", "Modifier les entreprises"),
|
|
(1 << 21, "ScoEditPVJury", "Éditer les PV de jury"),
|
|
# ajouter maquettes Apogee (=> chef dept et secr):
|
|
(1 << 22, "ScoEditApo", "Ajouter des maquettes Apogées"),
|
|
)
|
|
|
|
|
|
class Permission:
|
|
"Permissions for ScoDoc"
|
|
NBITS = 1 # maximum bits used (for formatting)
|
|
ALL_PERMISSIONS = [-1]
|
|
description = {} # { symbol : blah blah }
|
|
|
|
@staticmethod
|
|
def init_permissions():
|
|
for (perm, symbol, description) in _SCO_PERMISSIONS:
|
|
setattr(Permission, symbol, perm)
|
|
# Crée aussi les attributs dans le module (ScoDoc7 compat)
|
|
globals()[symbol] = perm
|
|
Permission.description[symbol] = description
|
|
Permission.NBITS = len(_SCO_PERMISSIONS)
|
|
|
|
|
|
Permission.init_permissions()
|
|
|
|
import scolars
|
|
import sco_formsemestre
|
|
|
|
|
|
def can_suppress_annotation(context, annotation_id, REQUEST):
|
|
"""True if current user can suppress this annotation
|
|
Seuls l'auteur de l'annotation et le chef de dept peuvent supprimer
|
|
une annotation.
|
|
"""
|
|
cnx = context.GetDBConnexion()
|
|
annos = scolars.etud_annotations_list(cnx, args={"id": annotation_id})
|
|
if len(annos) != 1:
|
|
raise ScoValueError("annotation inexistante !")
|
|
anno = annos[0]
|
|
authuser = REQUEST.AUTHENTICATED_USER
|
|
# note: les anciennes installations n'ont pas le role ScoEtudSupprAnnotations
|
|
# c'est pourquoi on teste aussi ScoEtudInscrit (normalement détenue par le chef)
|
|
return (
|
|
(str(authuser) == anno["zope_authenticated_user"])
|
|
or authuser.has_permission(Permission.ScoEtudSupprAnnotations, context)
|
|
or authuser.has_permission(Permission.ScoEtudInscrit, context)
|
|
)
|
|
|
|
|
|
def can_edit_suivi(context, REQUEST=None):
|
|
"""Vrai si l'utilisateur peut modifier les informations de suivi sur la page etud" """
|
|
authuser = REQUEST.AUTHENTICATED_USER
|
|
return authuser.has_permission(Permission.ScoEtudChangeAdr, context)
|
|
|
|
|
|
def can_validate_sem(context, REQUEST, formsemestre_id):
|
|
"Vrai si utilisateur peut saisir decision de jury dans ce semestre"
|
|
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
|
if sem["etat"] != "1":
|
|
return False # semestre verrouillé
|
|
|
|
return is_chef_or_diretud(context, REQUEST, sem)
|
|
|
|
|
|
def can_edit_pv(context, REQUEST, formsemestre_id):
|
|
"Vrai si utilisateur peut editer un PV de jury de ce semestre"
|
|
|
|
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
|
if is_chef_or_diretud(context, REQUEST, sem):
|
|
return True
|
|
# Autorise les secrétariats, repérés via la permission ScoEtudChangeAdr
|
|
# (ceci nous évite d'ajouter une permission Zope aux installations existantes)
|
|
authuser = REQUEST.AUTHENTICATED_USER
|
|
return authuser.has_permission(Permission.ScoEtudChangeAdr, context)
|
|
|
|
|
|
def is_chef_or_diretud(context, REQUEST, sem):
|
|
"Vrai si utilisateur est admin, chef dept ou responsable du semestre"
|
|
authuser = REQUEST.AUTHENTICATED_USER
|
|
if authuser.has_permission(Permission.ScoImplement, context):
|
|
return True # admin, chef dept
|
|
uid = str(authuser)
|
|
if uid in sem["responsables"]:
|
|
return True
|
|
|
|
return False |