"Dan L. Pierson" wrote:
I'm trying to port the PTK PersistentUserSource stuff to the new LoginManager. A lot of things seem to be working, but I seem to have fallen into a Catch 22:
1. UserSources.BasicUserSource defines self._defaultClass as LoginUser, where UserSources.LoginUser is a simple RackMountable class (not a ZClass) defined earlier in the file.
2. PTK requires DemoPortal.LoginMember, a ZClass that inherits from LoginUser and PersistentUserSource.MemberMixin (actually, it's having the MemberMixin stuff that's crucial).
3. Rack._v_itemConstructor is a ComputedAttribute that looks at self._defaultClass: if it's a class, it uses it, if it's a string it looks in Products.meta_classes[self._defaultClass] for the class to use.
So PersistentUserSource needs to change _defaultClass to refer to DemoPortal.LoginMember. If I try to do it by using a ComputedAttribute:
def _defaultClass(self): c = Products.DemoPortal.LoginMember self._defaultClass = c
_defaultClass = ComputedAttribute(_defaultClass)
I get an error traceback from an AttributeError in Rack.createItem for _v_itemConstructor. BTW: this also happens if I also define _v_itemConstructor as a ComputedAttribute in PersistentUserSource. I need something like ComputedAttributes here, because DemoPortal doesn't (necessarily?) exist at the time PTKDemo is installed.
The _defaultClass only needs to become DemoPortal.LoginMember before a Portal's LoginManager instance is created. Therefore, you can leave the _defaultClass as LoginUser until the "install" method of DemoPortalBase is called (PTKDemo/Portal.py). In the "install" method, after creating a MembersClass(), set its _defaultClass to LoginMember. ...or have I misunderstood something important? :-) -- Steve Alexander Software Engineer Cat-Box limited