Hi Florian,

I use events to trigger post initialization of my content object. setUpMyapp is 
called
by such a subscriber. This example is *not* complete. Maybe its helpful.

To register utilities I use a helper function 'addLocalUtility'.

from zope.app import zapi
from zope.app.container.interfaces import INameChooser
from zope.app.component.interfaces.registration import ActiveStatus
from zope.app.component.interfaces import ISite
from zope.app.utility import UtilityRegistration


def addLocalUtility(site, name, iface, utility, 
package='default',folderishUtility=None):
    """Add a utility to a site

    The utility is added to the package and activated.
    If folderishUtility is given, this Folder is treated as SiteManagementFolder
    and the utility is added and registered in this SiteManagementFolder.
    """

    # preconditions
    if not ISite.providedBy(site):
        raise TypeError('ISite required.')

    # get site manager and site management folder
    sitemanager = site.getSiteManager()
    if folderishUtility != None:
        default = folderishUtility
    else:
        default = sitemanager[package]

    # add utility to site management folder
    chooser = INameChooser(default)
    folder_name = chooser.chooseName(utility.__name__, utility)
    default[folder_name] = utility

    # do utility registration
    path = zapi.getPath(utility)
    registration = UtilityRegistration(name, iface, utility)
    key = default.registrationManager.addRegistration(registration)

    zapi.traverse(default.registrationManager, key).status = ActiveStatus
    return zapi.traverse(sitemanager, path)


This is the setup code called by event subscriber. Should be placed near the 
Myapp class.

def setUpMyapp(context):

    # create a LocalSiteManager
    sm = site.LocalSiteManager(context)
    # and assign it to Myapp folder
    context.setSiteManager(sm)

    context.dataBaseConnectionString = context.dataBaseConnectionString

    addLocalUtility(context,'psycopg',
                    IZopeDatabaseAdapter,
                    PsycopgAdapter(context.dataBaseConnectionString))

    addLocalUtility(context,'sessionManager',
                    ISessionDataContainer,
                    PersistentSessionDataContainer())

    addLocalUtility(context,'Search',
                    ISearch,
                    Search())

    # adding PluggableAuthentication utility
    pluggable = addLocalUtility(context,'',
                                IAuthentication,
                                PluggableAuthentication(context.name + '.'))

    # adding PlugAuth GroupFolder utility
    groupFolder = addLocalUtility(context,'groups',
                                  IAuthenticatorPlugin,
                                  groupfolder.GroupFolder('group.'),
                                  folderishUtility=pluggable)

    # adding PlugAuth PrincipalFolder utility
    principalFolder = addLocalUtility(context,'principal',
                                      IAuthenticatorPlugin,
                                      PrincipalFolder('principal.'),
                                      folderishUtility=pluggable)

    # adding SessionCredentials utility
    sessionCredentials = addLocalUtility(context,'sessionCredentials',
                                         ICredentialsPlugin,
                                         SessionCredentialsPlugin(),
                                         folderishUtility=pluggable)

    # Plugin setup
    pluggable.credentialsPlugins = ('sessionCredentials',)
    pluggable.authenticatorPlugins = ('groups', 'principal')

    # setup groups
    localGroup = groupfolder.GroupInformation("Local user group")
    centralGroup = groupfolder.GroupInformation("Central user group")
    groupFolder['local'] = localGroup
    groupFolder['central'] = centralGroup

    # grant roles to groups

    prinRoleManager = IPrincipalRoleManager(context)
    prinRoleManager.assignRoleToPrincipal(pluggable.prefix+'role.CentralEditor',
                                          pluggable.prefix+'group.central')

    # FIXME: set up default users for devlopment purposes only

    principalFolder[u'admin'] = InternalPrincipal('admin','xxxxx','admin',
                                                 passwordManagerName='SHA1')
    principalFolder[u'local'] = InternalPrincipal('local','xxxxx','local',
                                                 passwordManagerName='SHA1')
    principalFolder[u'central'] = InternalPrincipal('central','xxxxx','central',
                                                 passwordManagerName='SHA1')

    # setting breakpoint
    import pdb; pdb.set_trace()
    # FIXME: This does not work. see my previous post 2006/04/11 on zope3.user
    #localGroup.principals = [pluggable.prefix+'principal.local',]
    #centralGroup.principals = [pluggable.prefix+'principal.central',]
    
prinRoleManager.assignRoleToPrincipal('zope.ManageContent','principal.admin')

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to