Source code for guardrail.core.registry
# -*- coding: utf-8 -*-
from guardrail.core import exceptions
[docs]class _Registry(object):
"""Registry of schemas designated as permission agents and targets, as well
as the permission tables linking each agent-target pair. Should be used as
a singleton in ordinary use, but can be instantiated for use in tests.
"""
def __init__(self):
self._agents = set()
self._targets = set()
self._permissions = dict()
@property
def agents(self):
return self._agents
@property
def targets(self):
return self._targets
@property
def permissions(self):
return self._permissions.values()
[docs] def agent(self, agent):
"""Decorator that registers the decorated schema as a permission agent.
Example:
.. code-block:: python
@registry.agent
class User(Base):
id = sa.Column(sa.Integer, primary_key=True)
"""
self._agents.add(agent)
return agent
[docs] def target(self, target):
"""Decorator that registers the decorated schema as a permission target.
Example:
.. code-block:: python
@registry.target
class Post(Base):
id = sa.Column(sa.Integer, primary_key=True)
"""
self._targets.add(target)
return target
[docs] def add_permission(self, agent, target, permission):
"""Get the join table linking schemas `agent` and `target`.
:param agent: Agent schema class
:param target: Target schema class
:param schema: Permission join table
"""
self._permissions[(agent, target)] = permission
[docs] def get_permission(self, agent, target):
"""Get the join table linking schemas `agent` and `target`.
:param agent: Agent schema class
:param target: Target schema class
:returns: Permission join table
:raises: guardian.core.exceptions.SchemaNotFound if join table does not
exist
"""
try:
return self._permissions[(agent, target)]
except KeyError:
raise exceptions.SchemaNotFound(
'Could not find permission schema linking models {0} and {1}'.format(
agent.__name__,
target.__name__,
)
)
[docs] def make_schemas(self, factory):
"""Create and register join tables linking all registered agent-target
pairs.
:param factory: Callable that takes agent and target schemas and returns
the schema for a permission join table
"""
for agent in self.agents:
for target in self.targets:
permission = factory(agent, target)
self.add_permission(agent, target, permission)
registry = _Registry()