
4 changed files with 85 additions and 1 deletions
@ -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 @@ |
|||||||
|
""" 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) |
@ -1,2 +1,8 @@ |
|||||||
def includeme(config): |
def includeme(config): |
||||||
|
""" |
||||||
|
Initialize routes in a Pyramid app. |
||||||
|
|
||||||
|
Activate this setup using ``config.include('ordr3.routes')``. |
||||||
|
|
||||||
|
""" |
||||||
config.add_static_view("static", "static", cache_max_age=3600) |
config.add_static_view("static", "static", cache_max_age=3600) |
||||||
|
Loading…
Reference in new issue