
On Tue, 2004-09-28 at 14:48, Donovan Preston wrote:
On Sep 28, 2004, at 12:41 AM, Alex Levy wrote:
I have a Realm class that does something akin to the following:
class MyRealm: def requestAvatar(self, id, mind, *interfaces): if IResource is in interfaces: user = figureOutWhoTheUserIs(id) resource = getResourceForUser(user) resource.remember(user, ICurrentUser) return (IResource, resource, lambda:None)
...and this doesn't seem to be working with the ubiquitous context. _Should_ it work, or do I need a new way to do something like this?
Help is appreciated; I'm trying hard to get back in the loop. :/
You are going to have to put user as an attribute on resource, then remember it in the context in an overridden locateChild.
Or, you can create a IResource wrapper that is used like this from requestAvatar:
return (IResource, RememberWrapper(resource, user), lambda:None)
and looks like this (untested):
class RememberWrapper: __implements__ = inevow.IResource,
def __init__(self, resource, user): self.resource = resource self.user = user
def locateChild(self, ctx, segments): ctx.remember(self.user, ICurrentUser) return self.resource, segments
def renderHTTP(self, ctx): ctx.remember(self.user, ICurrentUser) return self.resource.renderHTTP(ctx)
This avoids setting attributes on the resource which means you can reuse a single *real* resource object if that makes sense to your application.
Hope this helps.
Cheers, Matt