[Zope3-Users] Re: Creating objects in software space when making
site
Joseph Method
tristil at gmail.com
Tue Mar 7 15:37:12 EST 2006
This should definitely be a prominent How-To somewhere.
On 3/7/06, Andreas Elvers <andreas at work.de> wrote:
> Florian Lindner wrote:
> > Hello,
> > my content object depends on a number of utilities to be present. It is
> > usually also used as a site. During development it happens often that I
> > delete and recreate it.
> > Can I install a hook or something so I can make that these utilies are being
> > created when my objects becomes a site? How do I create utitlies in software
> > space?
>
> Hi,
>
> I'm creating a special add view of my application (). If you add a foo
> it will be created with a LocalSiteManager and a catalog. Hope this
> helps.
>
> Any other ways of doing this ?
>
> - Andreas
>
> in your browser configure:
>
> <configure
> xmlns="http://namespaces.zope.org/browser">
>
> <addform
> label="Add foo with initialization"
> name="AddMyContent.html"
> class=".foo.AddFoo"
> schema="myapp.interfaces.IFoo"
> content_factory="myapp.foo.Foo"
> fields="name"
> permission="zope.ManageContent"
> />
> ...
> </configure>
>
> Now create the view class you defined in the browser configure.zcml
> inside foo.py:
>
> from zope.app import zapi
> from zope.proxy import removeAllProxies
> from zope.app.component import site
> from zope.app.catalog.catalog import Catalog
> from zope.app.catalog.interfaces import ICatalog
> from zope.app.event.objectevent import ObjectCreatedEvent
> from zope.event import notify
> from myapp.helper import addLocalUtility
>
> class Foo(object):
> class AddFoo(object):
> """ Add a foo.
> This special addform class is needed to add special initialization.
> (Catalog init)
> """
>
> def createAndAdd(self,data):
> content = super(AddFoo, self).createAndAdd(data)
> # get foo object, stripping off security proxy
> bare = removeAllProxies(content)
> # create a LocalSiteManager
> sm = site.LocalSiteManager(bare)
> # and assign it to Labor folder
> content.setSiteManager(sm)
>
> # Catalog setup
>
> cat = Catalog()
> addLocalUtility(bare,'fooCatalog',
> ICatalog,
> cat)
> notify(ObjectCreatedEvent(cat))
>
> I found addLocalUtility somewhere in the zope mailing lists.
>
> 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'):
> """Add a utility to a site
>
> The utility is added to the package and activated.
> This assumes the site has already a Utility Service.
> """
>
> # preconditions
> if not ISite.providedBy(site):
> raise TypeError('ISite required.')
>
> # get site manager and site management folder
> sitemanager = site.getSiteManager()
> default = sitemanager[package]
>
> # add utility to site management folder
> chooser = INameChooser(default)
> folder_name = chooser.chooseName(utility.__name__, utility)
> default[folder_name] = utility
>
> # create service 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)
>
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users
>
--
-J. Method
More information about the Zope3-users
mailing list