On 9/28/2004, "Matt Goodall" email@example.com wrote:
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.
This is what I'd expected to do -- instead of just returning a regular resource, return an EverythingLivesInsideHereResource (with a more suitable name) that contains everything the site needs to pass down to the resources.
Still, passing the context through the entire resource chain will let me cut out a _lot_ of cruft from [Paya]go. Kudos! :)