# -*- 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