Browse Source

setting up pyramid app: resources

funding-tag
Holger Frey 5 years ago
parent
commit
351ce8d544
  1. 2
      ordr3/__init__.py
  2. 31
      ordr3/resources/__init__.py
  3. 47
      ordr3/resources/base.py
  4. 6
      ordr3/routes.py

2
ordr3/__init__.py

@ -26,7 +26,7 @@ def main(global_config, **settings): @@ -26,7 +26,7 @@ def main(global_config, **settings):
# config.set_root_factory(root_factory)
config.include(".adapters")
# config.include('.resources')
config.include(".resources")
config.include(".routes")
# config.include('.security')
# config.include('.views')

31
ordr3/resources/__init__.py

@ -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)

47
ordr3/resources/base.py

@ -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)

6
ordr3/routes.py

@ -1,2 +1,8 @@ @@ -1,2 +1,8 @@
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)

Loading…
Cancel
Save