Skip to content

Instantly share code, notes, and snippets.

@stevepiercy
Last active February 28, 2016 21:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stevepiercy/a07e481b5f363cd5ce5b to your computer and use it in GitHub Desktop.
Save stevepiercy/a07e481b5f363cd5ce5b to your computer and use it in GitHub Desktop.
refactor check for existing page from view to new_page_factory in authorization step
from pyramid.httpexceptions import (
HTTPNotFound,
HTTPFound,
)
from pyramid.security import (
Allow,
Everyone,
)
from .models import Page
def includeme(config):
config.add_static_view('static', 'static', cache_max_age=3600)
config.add_route('view_wiki', '/')
config.add_route('login', '/login')
config.add_route('logout', '/logout')
config.add_route('view_page', '/{pagename}', factory=page_factory)
config.add_route('add_page', '/add_page/{pagename}',
factory=new_page_factory)
config.add_route('edit_page', '/{pagename}/edit_page',
factory=page_factory)
def new_page_factory(request):
pagename = request.matchdict['pagename']
if request.dbsession.query(Page).filter_by(name=pagename).count() > 0:
next_url = request.route_url('edit_page', pagename=pagename)
raise HTTPFound(location=next_url)
return NewPage(pagename)
class NewPage(object):
def __init__(self, pagename):
self.pagename = pagename
def __acl__(self):
return [
(Allow, 'role:editor', 'create'),
(Allow, 'role:basic', 'create'),
]
def page_factory(request):
pagename = request.matchdict['pagename']
page = request.dbsession.query(Page).filter_by(name=pagename).first()
if page is None:
raise HTTPNotFound
return PageResource(page)
class PageResource(object):
def __init__(self, page):
self.page = page
def __acl__(self):
return [
(Allow, Everyone, 'view'),
(Allow, 'role:editor', 'edit'),
(Allow, str(self.page.creator_id), 'edit'),
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment