
4 changed files with 85 additions and 1 deletions
@ -0,0 +1,31 @@
@@ -0,0 +1,31 @@
|
||||
""" base resource and resource root factory """ |
||||
|
||||
from pyramid.security import Allow, Everyone |
||||
|
||||
from .base import BaseResource |
||||
|
||||
|
||||
class Root(BaseResource): |
||||
""" Root resource """ |
||||
|
||||
__name__ = None |
||||
__parent__ = None |
||||
|
||||
nodes = {} |
||||
|
||||
def __init__(self, request): |
||||
self.request = request |
||||
|
||||
def __acl__(self): |
||||
""" access controll list """ |
||||
return [(Allow, Everyone, "view")] |
||||
|
||||
|
||||
def includeme(config): |
||||
""" |
||||
Initialize the resources for traversal in a Pyramid app. |
||||
|
||||
Activate this setup using ``config.include('ordr3.resources')``. |
||||
|
||||
""" |
||||
config.set_root_factory(Root) |
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
""" Base Resource and Mixin classes, not to be used directly """ |
||||
|
||||
import abc |
||||
|
||||
from sqlalchemy.inspection import inspect |
||||
|
||||
|
||||
class BaseResource(abc.ABC): |
||||
""" Base Resource for all other resources """ |
||||
|
||||
__parent__ = None # required by pyramid for location aware resources |
||||
__name__ = None # required by pyramid for location aware resources |
||||
|
||||
request = None # current request object |
||||
model = None # a related sqlalchemy model |
||||
nodes = {} # static child nodes |
||||
|
||||
def __init__(self, name, parent, sql_model_instance=None): |
||||
self.__name__ = name |
||||
self.__parent__ = parent |
||||
self.request = parent.request |
||||
self.model = sql_model_instance |
||||
|
||||
@abc.abstractmethod |
||||
def __acl__(self): |
||||
""" Access controll list """ |
||||
|
||||
def __getitem__(self, key): |
||||
""" returns child resources """ |
||||
child_node_class = self.nodes.get(key, None) |
||||
if child_node_class: |
||||
return child_node_class(key, self) |
||||
try: |
||||
return super().__getitem__(key) |
||||
except AttributeError: |
||||
raise KeyError() |
||||
|
||||
@classmethod |
||||
def from_sqla(cls, sql_model_instance, parent): |
||||
""" initializes a resource from an SQLalchemy object """ |
||||
primary_keys = inspect(sql_model_instance).identity |
||||
if primary_keys is None: |
||||
raise ValueError("Cannot init resource for primary key: None") |
||||
elif len(primary_keys) != 1: |
||||
raise ValueError("Cannot init resource for composite primary key") |
||||
primary_key = str(primary_keys[0]) |
||||
return cls(primary_key, parent, sql_model_instance) |
Loading…
Reference in new issue