Source code for rbac.models

""" Role Based Access Control Application

    This handles the models for role based security for Cobalt.

    See `RBAC Overview`_ for more details.

    .. _RBAC Overview:
       ./rbac_overview.html
"""
from django.db import models
from accounts.models import User
from django.utils import timezone

RULE_TYPES = [("Allow", "Allow User Access"), ("Block", "Block User Access")]


[docs] class RBACGroup(models.Model): """Group definitions""" name_qualifier = models.CharField(max_length=50) """ eg "organisations.trumps" """ name_item = models.CharField(max_length=50) """ chosen by the admin. appends onto name_qualifier """ description = models.TextField() """ Free format description """ created_date = models.DateTimeField("Create Date", default=timezone.now) """ date created """ created_by = models.ForeignKey( User, on_delete=models.SET_NULL, blank=True, null=True ) """ Standard User object """ class Meta: unique_together = ["name_qualifier", "name_item"] def __str__(self): return f"{self.name_qualifier}.{self.name_item} - {self.description}" @property def name(self): return f"{self.name_qualifier}.{self.name_item}"
[docs] class RBACUserGroup(models.Model): """Maps users to Groups""" member = models.ForeignKey(User, on_delete=models.CASCADE) """ Standard User object """ group = models.ForeignKey(RBACGroup, on_delete=models.CASCADE) """ RBAC Group """ def __str__(self): return f"{self.group} - {self.member}"
[docs] class RBACGroupRole(models.Model): """Core model to map a group to a role.""" group = models.ForeignKey(RBACGroup, on_delete=models.CASCADE) """ RBACGroup for this Role """ app = models.CharField(max_length=15) """ Application level hierarchy """ model = models.CharField(max_length=15) """ model level hierarchy """ model_id = models.IntegerField(blank=True, null=True) """ Instance of model level hierarchy """ action = models.CharField(max_length=15) """ What this role allows you to do here """ rule_type = models.CharField(max_length=5, choices=RULE_TYPES, default="Allow") """ Rules can Allow or Block permissions """ def __str__(self): return f"{self.group} - {self.role} - {self.rule_type}" @property def role(self): "Returns the role in dotted format including the action." if self.model_id: return f"{self.app}.{self.model}.{self.model_id}.{self.action}" else: return f"{self.app}.{self.model}.{self.action}" @property def path(self): "Returns the role in dotted format excluding the action." if self.model_id: return f"{self.app}.{self.model}.{self.model_id}" else: return f"{self.app}.{self.model}"
[docs] class RBACModelDefault(models.Model): """Default behaviour for a model. Some models (e.g. forums.forum) need a default of allowing users access unless explicitly blocked. Other models (e.g. organisations.Organisation) need a default behaviour of blocking unless explicitly allowed.""" app = models.CharField(max_length=15) """ Application level hierarchy """ model = models.CharField(max_length=15) """ model level hierarchy """ default_behaviour = models.CharField( max_length=5, choices=RULE_TYPES, default="Allow" ) def __str__(self): return f"{self.app}.{self.model} {self.default_behaviour}"
[docs] class RBACAppModelAction(models.Model): """Valid Actions for an App and Model combination""" app = models.CharField(max_length=15) """ Application level hierarchy """ model = models.CharField(max_length=15) """ model level hierarchy """ valid_action = models.CharField(max_length=15) """ valid actions for this combination """ description = models.CharField(max_length=100) """ description of what this does """ class Meta: unique_together = ( "app", "model", "valid_action", )
[docs] class RBACAdminGroup(models.Model): """Admin Group definitions""" name_qualifier = models.CharField(max_length=50) """ eg "organisations.trumps" """ name_item = models.CharField(max_length=100) """ chosen by the admin. appends onto name_qualifier """ description = models.TextField() """ Free format decription """ created_date = models.DateTimeField("Create Date", default=timezone.now) """ date created """ created_by = models.ForeignKey( User, on_delete=models.SET_NULL, blank=True, null=True ) """ Standard User object """ class Meta: unique_together = ["name_qualifier", "name_item"] def __str__(self): return f"{self.name_qualifier}.{self.name_item} - {self.description}" @property def name(self): return f"{self.name_qualifier}.{self.name_item}"
[docs] class RBACAdminUserGroup(models.Model): """Maps admins to Groups""" member = models.ForeignKey(User, on_delete=models.CASCADE) """ Standard User object """ group = models.ForeignKey(RBACAdminGroup, on_delete=models.CASCADE) """ RBAC Group """ def __str__(self): return f"{self.group} - {self.member}"
[docs] class RBACAdminGroupRole(models.Model): """Admin model to map a group to a role.""" group = models.ForeignKey(RBACAdminGroup, on_delete=models.CASCADE) """ RBACGroup for this Role """ app = models.CharField(max_length=15) """ Application level hierarchy """ model = models.CharField(max_length=15) """ model level hierarchy """ model_id = models.IntegerField(blank=True, null=True) """ Instance of model level hierarchy """ def __str__(self): return f"{self.group} - {self.role}" @property def role(self): """Returns the role in dotted format.""" if self.model_id: return f"{self.app}.{self.model}.{self.model_id}" else: return f"{self.app}.{self.model}"
[docs] class RBACAdminTree(models.Model): """Control where in the tree a member of a group can create groups""" group = models.ForeignKey(RBACAdminGroup, on_delete=models.CASCADE) """ RBACGroup for this Role """ tree = models.CharField(max_length=100, unique=True) """ tree is an allowed entry point for a user. e.g. rbac.org.org """ def __str__(self): return self.tree