diff --git a/development.ini b/development.ini index 5ca6009..b097111 100644 --- a/development.ini +++ b/development.ini @@ -18,9 +18,13 @@ sqlalchemy.url = sqlite:///%(here)s/ordr3.sqlite retry.attempts = 3 +auth.secret = "change me for production" + session.secret = "change me for production" session.auto_csrf = true + + # By default, the toolbar only appears for clients from IP addresses # '127.0.0.1' and '::1'. # debugtoolbar.hosts = 127.0.0.1 ::1 diff --git a/ordr3/__init__.py b/ordr3/__init__.py index ab8e6e6..741894a 100644 --- a/ordr3/__init__.py +++ b/ordr3/__init__.py @@ -29,7 +29,7 @@ def main(global_config, **settings): config.include(".resources") config.include(".routes") config.include(".security") - # config.include('.views') + config.include(".views") config.include("pyramid_jinja2") diff --git a/ordr3/resources/base.py b/ordr3/resources.py similarity index 66% rename from ordr3/resources/base.py rename to ordr3/resources.py index 890e8ee..ac77bb9 100644 --- a/ordr3/resources/base.py +++ b/ordr3/resources.py @@ -1,7 +1,8 @@ -""" Base Resource and Mixin classes, not to be used directly """ +""" base resource and resource root factory """ import abc +from pyramid.security import Allow, Everyone from sqlalchemy.inspection import inspect @@ -27,13 +28,8 @@ class BaseResource(abc.ABC): 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() + child_node_class = self.nodes[key] + return child_node_class(key, self) @classmethod def from_sqla(cls, sql_model_instance, parent): @@ -45,3 +41,29 @@ class BaseResource(abc.ABC): raise ValueError("Cannot init resource for composite primary key") primary_key = str(primary_keys[0]) return cls(primary_key, parent, sql_model_instance) + + +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) diff --git a/ordr3/resources/__init__.py b/ordr3/resources/__init__.py deleted file mode 100644 index fa97c7b..0000000 --- a/ordr3/resources/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -""" 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) diff --git a/ordr3/routes.py b/ordr3/routes.py index 76fba52..27f4da9 100644 --- a/ordr3/routes.py +++ b/ordr3/routes.py @@ -1,8 +1,10 @@ def includeme(config): - """ - Initialize routes in a Pyramid app. + """ Initialize routes in a Pyramid app. Activate this setup using ``config.include('ordr3.routes')``. """ - config.add_static_view("static", "static", cache_max_age=3600) + settings = config.get_settings() + age = int(settings.get("static_views.cache_max_age", 3600)) + config.add_static_view("static", "static", cache_max_age=age) + # config.add_static_view('deform', 'deform:static', cache_max_age=age) diff --git a/ordr3/views/__init__.py b/ordr3/views/__init__.py new file mode 100644 index 0000000..37fe4e6 --- /dev/null +++ b/ordr3/views/__init__.py @@ -0,0 +1,25 @@ +""" views package + +some view helpers are defined here +""" + +from collections import namedtuple + +# a message for session.flash() +FlashMessage = namedtuple("FlashMessage", ["message", "description"]) + + +def flash(request, channel, message, description=""): + """ small wrapper around request.session.flash """ + msg = FlashMessage(message, description) + request.session.flash(msg, channel, allow_duplicate=False) + + +def includeme(config): + """ adding request helpers + + Activate this setup using ``config.include('ordr3.views')``. + """ + # this allows to use the request object like this: + # request.flash(channel, message, description) + config.add_request_method(flash, "flash") diff --git a/pyproject.toml b/pyproject.toml index 28a3e62..475a3e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,9 @@ dev = [ "pre-commit", ] +[tool.flit.entrypoints."paste.app_factory"] +main = "ordr3:main" + [tool.black] line-length = 79 py37 = true