fix: allow custom user getter for new_request_set_user()
hook
This commit is contained in:
parent
fc339ba81b
commit
0e0460b831
|
@ -35,6 +35,7 @@ However some custom apps may need to supplement or replace the event
|
||||||
hooks contained here, depending on the circumstance.
|
hooks contained here, depending on the circumstance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import functools
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -108,10 +109,29 @@ def new_request(event):
|
||||||
request.set_property(use_oruga, reify=True)
|
request.set_property(use_oruga, reify=True)
|
||||||
|
|
||||||
|
|
||||||
def new_request_set_user(event, db_session=None):
|
def default_user_getter(request, db_session=None):
|
||||||
|
"""
|
||||||
|
This is the default function used to retrieve user object from
|
||||||
|
database. Result of this is then assigned to :attr:`request.user`
|
||||||
|
as part of the :func:`new_request_set_user()` hook.
|
||||||
|
"""
|
||||||
|
uuid = request.authenticated_userid
|
||||||
|
if uuid:
|
||||||
|
config = request.wutta_config
|
||||||
|
app = config.get_app()
|
||||||
|
model = app.model
|
||||||
|
session = db_session or Session()
|
||||||
|
return session.get(model.User, uuid)
|
||||||
|
|
||||||
|
|
||||||
|
def new_request_set_user(
|
||||||
|
event,
|
||||||
|
user_getter=default_user_getter,
|
||||||
|
db_session=None,
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
Event hook called when processing a new :term:`request`, for sake
|
Event hook called when processing a new :term:`request`, for sake
|
||||||
of setting the ``request.user`` property.
|
of setting the :attr:`request.user` and similar properties.
|
||||||
|
|
||||||
The hook is auto-registered if this module is "included" by
|
The hook is auto-registered if this module is "included" by
|
||||||
Pyramid config object. Or you can explicitly register it::
|
Pyramid config object. Or you can explicitly register it::
|
||||||
|
@ -137,32 +157,38 @@ def new_request_set_user(event, db_session=None):
|
||||||
Flag indicating whether user is currently elevated to root
|
Flag indicating whether user is currently elevated to root
|
||||||
privileges. This is only possible if :attr:`request.is_admin`
|
privileges. This is only possible if :attr:`request.is_admin`
|
||||||
is also true.
|
is also true.
|
||||||
|
|
||||||
|
You may wish to "supplement" this hook by registering your own
|
||||||
|
custom hook and then invoking this one as needed. You can then
|
||||||
|
pass certain params to override only parts of the logic:
|
||||||
|
|
||||||
|
:param user_getter: Optional getter function to retrieve the user
|
||||||
|
from database, instead of :func:`default_user_getter()`.
|
||||||
|
|
||||||
|
:param db_session: Optional :term:`db session` to use,
|
||||||
|
instead of :class:`wuttaweb.db.Session`.
|
||||||
"""
|
"""
|
||||||
request = event.request
|
request = event.request
|
||||||
config = request.registry.settings['wutta_config']
|
config = request.registry.settings['wutta_config']
|
||||||
app = config.get_app()
|
app = config.get_app()
|
||||||
|
|
||||||
def user(request):
|
# request.user
|
||||||
uuid = request.authenticated_userid
|
if db_session:
|
||||||
if uuid:
|
user_getter = functools.partial(user_getter, db_session=db_session)
|
||||||
session = db_session or Session()
|
request.set_property(user_getter, name='user', reify=True)
|
||||||
model = app.model
|
|
||||||
return session.get(model.User, uuid)
|
|
||||||
|
|
||||||
request.set_property(user, reify=True)
|
|
||||||
|
|
||||||
|
# request.is_admin
|
||||||
def is_admin(request):
|
def is_admin(request):
|
||||||
auth = app.get_auth_handler()
|
auth = app.get_auth_handler()
|
||||||
return auth.user_is_admin(request.user)
|
return auth.user_is_admin(request.user)
|
||||||
|
|
||||||
request.set_property(is_admin, reify=True)
|
request.set_property(is_admin, reify=True)
|
||||||
|
|
||||||
|
# request.is_root
|
||||||
def is_root(request):
|
def is_root(request):
|
||||||
if request.is_admin:
|
if request.is_admin:
|
||||||
if request.session.get('is_root', False):
|
if request.session.get('is_root', False):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
request.set_property(is_root, reify=True)
|
request.set_property(is_root, reify=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ class TestNewRequestSetUser(TestCase):
|
||||||
'wutta.db.default.url': 'sqlite://',
|
'wutta.db.default.url': 'sqlite://',
|
||||||
})
|
})
|
||||||
|
|
||||||
self.request = testing.DummyRequest()
|
self.request = testing.DummyRequest(wutta_config=self.config)
|
||||||
self.pyramid_config = testing.setUp(request=self.request, settings={
|
self.pyramid_config = testing.setUp(request=self.request, settings={
|
||||||
'wutta_config': self.config,
|
'wutta_config': self.config,
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue