# Planète Casio v5 # models.privs: Database models for groups and privilege management from app import db from config import V5Config # Privileges are represented by strings (slugs), for instance "post-news" or # "delete-own-posts". Belonging to a group automatically grants a user the # privileges of that group; additionally, administrators (or any people with # the "grant-special-privileges" privilege) can grant privileges on a per-user # basis. # SpecialPrivilege: Privilege manually granted to a user class SpecialPrivilege(db.Model): __tablename__ = 'special_privilege' id = db.Column(db.Integer, primary_key=True) # User that is granted the privilege uid = db.Column(db.Integer, db.ForeignKey('user.id'), index=True) # Privilege name priv = db.Column(db.String(V5Config.PRIVS_MAXLEN)) def __repr__(self): return f'' # Group: User group, corresponds to a community role and a set of privileges class Group(db.Model): __tablename__ = 'group' # Unique group ID id = db.Column(db.Integer, primary_key=True) # Full name, such as "Administrateur" or "Membre d'honneur". name = db.Column(db.Unicode(50), unique=True) # The CSS code should not assume any specific layout and typically applies # to a text node. Use attributes like color, font-style, font-weight, etc. css = db.Column(db.UnicodeText) # List of members (lambda delays evaluation) members = db.relationship('Member', secondary=lambda:GroupMember, back_populates='groups') def __repr__(self): return f'' # Many-to-many relation for users belonging to groups GroupMember = db.Table('group_member', db.Model.metadata, db.Column('gid', db.Integer, db.ForeignKey('group.id')), db.Column('uid', db.Integer, db.ForeignKey('member.id'))) # GroupPrivilege: Privilege granted to all users in a group class GroupPrivilege(db.Model): __tablename__ = 'group_privilege' id = db.Column(db.Integer, primary_key=True) # Group that is granted the privilege gid = db.Column(db.Integer, db.ForeignKey('group.id'), index=True) # Privilege name priv = db.Column(db.String(V5Config.PRIVS_MAXLEN))