Log message for revision 69259: The FiveSiteManager classes now work again, but are deprecated for the new zope.component support.
Changed: U Products.Five/trunk/CHANGES.txt U Products.Five/trunk/doc/localsite.txt U Products.Five/trunk/site/browser.py U Products.Five/trunk/site/localsite.py U Products.Five/trunk/site/metaconfigure.py U Products.Five/trunk/site/tests/functional.txt U Products.Five/trunk/site/tests/sitemanager.txt U Products.Five/trunk/site/tests/test_localsite.py U Products.Five/trunk/site/tests/test_utility.py -=- Modified: Products.Five/trunk/CHANGES.txt =================================================================== --- Products.Five/trunk/CHANGES.txt 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/CHANGES.txt 2006-07-25 18:17:23 UTC (rev 69259) @@ -23,6 +23,9 @@ * Changed the tests to reflect that defaultView no only works for views (and not on attributes). +* The FiveSiteManager classes now work again, but are deprecated for the + new zope.component support. + Five 1.5c (2006-05-29) ====================== Modified: Products.Five/trunk/doc/localsite.txt =================================================================== --- Products.Five/trunk/doc/localsite.txt 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/doc/localsite.txt 2006-07-25 18:17:23 UTC (rev 69259) @@ -9,6 +9,81 @@ their configuration be persisted in the ZODB as well as managed through the web interface. + +Five 1.5 supports two distinct and slightly incompatible versions of +local site support. The first one, (here known as "old" sites) was +introduced in Five 1.3 and is based on Zope 3.2s site implementation. +But the site implementation in Zope 3.2 was overly complicated, and +for 3.3 it was refactored, and Five 1.5 contains support for this new +local site support as well (known as "new" sites). + +For documentation of how to use local sites, see the Zope 3.3 documentation. +This document is mostly about how the implementation of the old sites work, +and how to migrate from Five 1.3 and 1.4. + + +Migration from old sites to new sites +------------------------------------- + +New sites are based on Zope 3.3s new site managers and persistent +component registries. Old sites are based on specific Five implementation +of site managers, and keeps utilities in a folder called "utilities". + +They are used basically the same, but they are created differently, +and also, when you look up a utility with getUtility or queryUtility, in +old sites, the utility will have an acquicition context, while in the new +sites it will not. + +Setting up the site +................... + +The old setup of a site was done by marking the class of the site as a +possible site with five:localsite, and then either manually through the ZMI +or programmatically through enableLocalSiteHook(site) turn it into a site. + +The new setup involves calling enableSite(site) and createing and setting +a site manager. The simplest way to do this programatically is to look +up the "components.html" view on the site, and calling view.makeSite(). +As any ObjectManager can be a site there is no longer any need to specially +mark the class as being a possible site. + +Registering local utilities +........................... + +The old usage was to get the site manager, either throgh adapting with +IFiveUtilityRegistry(site) or by calling getSiteManager(). You could then +register the utilities with sitemanager.registerUtility(interface, utility) + +The new way is to call getSiteManager().registerUtility(object, provided). +Note that in the old way, the first parameter is the interface name, and +the second the actual utility object, but in the new way, it is the other +way around. + +Migrating the actual sites +.......................... + +Not Yet Implemented. + +Experimental forwards compatibility +................................... + +If you have software using the old sites, and software using the new sites, +there is sligthly experimental support to make software expecting new sites +to work with old sites. Nothing is promised with this, as it is largely +untested. The best thing to do is without a doubt to convert your old site +software and your old sites to use new sites. + + + +Old site implementation details +------------------------------- + +The rest of this document documents the details of the old site implementation. +Everything from here on concerns only the old implementation and is of mainly +hysterical interest: + + + By default, Zope 3 has a global site which is configured through ZCML. It provides the fallback for all component look-up. Local sites are typically set during traversal, when the traverser encounters an Modified: Products.Five/trunk/site/browser.py =================================================================== --- Products.Five/trunk/site/browser.py 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/browser.py 2006-07-25 18:17:23 UTC (rev 69259) @@ -19,7 +19,7 @@ from zope.app.component.hooks import clearSite from Products.Five.browser import BrowserView -from Products.Five.component import enableSite, disableSite +from Products.Five.site.localsite import enableLocalSiteHook, disableLocalSiteHook class LocalSiteView(BrowserView): """View for convering a possible site to a site @@ -40,7 +40,7 @@ if self.isSite(): raise ValueError('This is already a site') - enableSite(self.context) + enableLocalSiteHook(self.context) return "This object is now a site" def unmakeSite(self): @@ -48,7 +48,7 @@ if not self.isSite(): raise ValueError('This is not a site') - disableSite(self.context) + disableLocalSiteHook(self.context) # disableLocalSiteHook circumcised our context so that it's # not an ISite anymore. That can mean that certain things for Modified: Products.Five/trunk/site/localsite.py =================================================================== --- Products.Five/trunk/site/localsite.py 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/localsite.py 2006-07-25 18:17:23 UTC (rev 69259) @@ -29,6 +29,9 @@ # make {get|query}NextSiteManager() work without having to # resort to Zope 2 acquisition self.context = self.__parent__ = context + warnings.warn("The FiveSiteManager is deprecated and will be removed " + "in Zope 2.12. \nSee Five/doc/localsite.txt .", + DeprecationWarning, 2) @property def __bases__(self): @@ -97,3 +100,30 @@ def setSiteManager(self, sm): raise NotImplementedError('This class has a fixed site manager') + + +#BBB: Goes away in Five Zope 2.12 + +import warnings +from Products.Five.component import enableSite, disableSite +from zope.app.component.hooks import setSite, clearSite, setHooks + +def enableLocalSiteHook(obj): + warnings.warn("The enableLocalSiteHook is deprecated and will be removed " + "in Zope 2.12. \nSee Five/doc/localsite.txt .", + DeprecationWarning, 2) + enableSite(obj) + components = FiveSiteManager(obj) + obj.setSiteManager(components) + setSite(obj) + setHooks() + +def disableLocalSiteHook(obj): + """Remove __before_traverse__ hook for Local Site + """ + warnings.warn("The disableLocalSiteHook is deprecated and will be removed " + "in Zope 2.12. \nSee Five/doc/localsite.txt .", + DeprecationWarning, 2) + disableSite(obj) + clearSite() + obj.setSiteManager(None) Modified: Products.Five/trunk/site/metaconfigure.py =================================================================== --- Products.Five/trunk/site/metaconfigure.py 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/metaconfigure.py 2006-07-25 18:17:23 UTC (rev 69259) @@ -25,7 +25,7 @@ from Products.Five.site.localsite import FiveSite -import logging +import logging, warnings LOG = logging.getLogger('Five') @@ -40,21 +40,18 @@ def installSiteHook(_context, class_, site_class=None): - if site_class is None: - if not IPossibleSite.implementedBy(class_): - # This is not a possible site, we need to monkey-patch it so that - # it is. - site_class = FiveSite - else: - if not IPossibleSite.implementedBy(site_class): - raise ConfigurationError('Site class does not implement ' - 'IPossibleClass: %s' % site_class) + warnings.warn_explicit("The five:localsite directive is deprecated and " + "will be removed in Zope 2.12. \n" + "See Five/doc/localsite.txt .", + DeprecationWarning, + _context.info.file, _context.info.line) if site_class is not None: _context.action( discriminator = (class_,), callable = classSiteHook, args=(class_, site_class) ) + if not IPossibleSite.implementedBy(class_): _context.action( discriminator = (class_, IPossibleSite), callable = classImplements, Modified: Products.Five/trunk/site/tests/functional.txt =================================================================== --- Products.Five/trunk/site/tests/functional.txt 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/tests/functional.txt 2006-07-25 18:17:23 UTC (rev 69259) @@ -48,7 +48,11 @@ ... /> ... ... </configure>""" + >>> import warnings + >>> showwarning = warnings.showwarning + >>> warnings.showwarning = lambda *a, **k: None >>> zcml.load_string(zcml_text) + >>> warnings.showwarning = showwarning then we add an instance to our folder: @@ -57,6 +61,9 @@ Now we check what the info view tells us about local component lookup: + >>> import warnings + >>> showwarning = warnings.showwarning + >>> warnings.showwarning = lambda *a, **k: None >>> print http(r''' ... GET /test_folder_1_/site/@@checkSiteManager.html HTTP/1.1 ... ''') @@ -74,6 +81,9 @@ >>> uf = self.folder.acl_users >>> uf._doAddUser('manager', 'r00t', ['Manager'], []) + >>> import warnings + >>> showwarning = warnings.showwarning + >>> warnings.showwarning = lambda *a, **k: None >>> print http(r''' ... POST /test_folder_1_/site/@@manage_site.html HTTP/1.1 ... Authorization: Basic manager:r00t @@ -83,6 +93,10 @@ HTTP/1.1 200 OK ... + >>> warnings.showwarning = showwarning + + >>> warnings.showwarning = showwarning + Now we call the info view again and find that local component lookup is working: @@ -132,6 +146,9 @@ At last we can "unmake" the site using the browser view provided by Five: + >>> import warnings + >>> showwarning = warnings.showwarning + >>> warnings.showwarning = lambda *a, **k: None >>> print http(r''' ... POST /test_folder_1_/site/@@manage_site.html HTTP/1.1 ... Authorization: Basic manager:r00t @@ -141,9 +158,14 @@ HTTP/1.1 200 OK ... + >>> warnings.showwarning = showwarning + And everything is back to normal with respect to local component lookup: + >>> import warnings + >>> showwarning = warnings.showwarning + >>> warnings.showwarning = lambda *a, **k: None >>> print http(r''' ... GET /test_folder_1_/site/@@checkSiteManager.html HTTP/1.1 ... ''') @@ -157,3 +179,4 @@ >>> from zope.app.testing.placelesssetup import tearDown >>> tearDown() + Modified: Products.Five/trunk/site/tests/sitemanager.txt =================================================================== --- Products.Five/trunk/site/tests/sitemanager.txt 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/tests/sitemanager.txt 2006-07-25 18:17:23 UTC (rev 69259) @@ -9,6 +9,10 @@ >>> import Products.Five >>> from Products.Five import zcml + >>> import warnings + >>> showwarning = warnings.showwarning + >>> warnings.showwarning = lambda *a, **k: None + >>> zcml.load_config("meta.zcml", Products.Five) >>> zcml.load_config("permissions.zcml", Products.Five) >>> zcml.load_config("configure.zcml", Products.Five.site) @@ -24,15 +28,16 @@ >>> nothing = manage_addDummySite(self.folder, 'dummysite') >>> dummysite = self.folder.dummysite - Local vs. global sites ---------------------- Let's make the possible site a real site: - >>> from Products.Five.component import enableSite - >>> enableSite(dummysite) + >>> from Products.Five.site.localsite import enableLocalSiteHook + >>> enableLocalSiteHook(dummysite) + >>> warnings.showwarning = showwarning + and tell Zope 3 about it: >>> from zope.app.component.hooks import setSite, setHooks @@ -118,7 +123,7 @@ Now we set the current site to the ``subsite``: - >>> enableSite(subsite) + >>> enableLocalSiteHook(subsite) >>> setSite(subsite) When we call getServices() now, we get the correct site manager: Modified: Products.Five/trunk/site/tests/test_localsite.py =================================================================== --- Products.Five/trunk/site/tests/test_localsite.py 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/tests/test_localsite.py 2006-07-25 18:17:23 UTC (rev 69259) @@ -95,7 +95,13 @@ <five:localsite xmlns:five="http://namespaces.zope.org/five" class="Products.Five.site.tests.dummy.DummySite" />""" + import warnings + showwarning = warnings.showwarning + warnings.showwarning = lambda *a, **k: None + zcml.load_string(zcml_text) + + warnings.showwarning = showwarning # Hook up custom component architecture calls; we need to do # this here because zope.app.component.hooks registers a Modified: Products.Five/trunk/site/tests/test_utility.py =================================================================== --- Products.Five/trunk/site/tests/test_utility.py 2006-07-25 17:58:06 UTC (rev 69258) +++ Products.Five/trunk/site/tests/test_utility.py 2006-07-25 18:17:23 UTC (rev 69259) @@ -31,6 +31,7 @@ from zope.app.testing.placelesssetup import setUp, tearDown from zope.app.component import getNextUtility from zope.app.component.hooks import setSite, clearSite, setHooks +from zope.component import getSiteManager import Products.Five from Products.Five import zcml @@ -38,6 +39,7 @@ from Products.Five.site.interfaces import IRegisterUtilitySimply from Products.Five.site.tests.dummy import manage_addDummySite, \ IDummyUtility, ISuperDummyUtility, DummyUtility +from Products.Five.site.localsite import enableLocalSiteHook class LocalUtilityServiceTest(ZopeTestCase.ZopeTestCase): @@ -51,10 +53,16 @@ <five:localsite xmlns:five="http://namespaces.zope.org/five" class="Products.Five.site.tests.dummy.DummySite" />""" + + import warnings + showwarning = warnings.showwarning + warnings.showwarning = lambda *a, **k: None + zcml.load_string(zcml_text) manage_addDummySite(self.folder, 'site') - enableSite(self.folder.site) - setSite(self.folder.site) + enableLocalSiteHook(self.folder.site) + + warnings.showwarning = showwarning # Hook up custom component architecture calls; we need to do # this here because zope.app.component.hooks registers a @@ -69,26 +77,26 @@ from Products.Five.site.localsite import FiveSiteManager from Products.Five.site.utility import SimpleLocalUtilityRegistry - local_sm = zapi.getSiteManager(None) + local_sm = getSiteManager(None) self.failIf(local_sm is zapi.getGlobalSiteManager()) self.failUnless(isinstance(local_sm, FiveSiteManager)) - local_sm = zapi.getSiteManager(self.folder.site) + local_sm = getSiteManager(self.folder.site) self.failIf(local_sm is zapi.getGlobalSiteManager()) self.failUnless(isinstance(local_sm, FiveSiteManager)) - sm = zapi.getSiteManager() + sm = getSiteManager() self.failUnless(isinstance(sm.utilities, SimpleLocalUtilityRegistry)) def test_getUtilitiesNoUtilitiesFolder(self): - sm = zapi.getSiteManager() + sm = getSiteManager() self.failUnless(sm.queryUtility(IDummyUtility) is None) self.assertEquals(list(sm.getUtilitiesFor(IDummyUtility)), []) self.assertEquals(list(sm.getAllUtilitiesRegisteredFor(IDummyUtility)), []) def test_registerUtilityOnUtilityRegistry(self): - utils = zapi.getSiteManager().utilities + utils = getSiteManager().utilities dummy = DummyUtility() utils.registerUtility(IDummyUtility, dummy, 'dummy') @@ -99,7 +107,7 @@ IDummyUtility)), [dummy]) def test_registerUtilityOnSiteManager(self): - sm = zapi.getSiteManager() + sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() sm.registerUtility(IDummyUtility, dummy, 'dummy') @@ -111,7 +119,7 @@ IDummyUtility)), [dummy]) def test_registerTwoUtilitiesWithSameNameDifferentInterface(self): - sm = zapi.getSiteManager() + sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() superdummy = DummyUtility() @@ -129,7 +137,7 @@ # anything registered for IDummyInterface of ISuperDummyInterface # should come back. - sm = zapi.getSiteManager() + sm = getSiteManager() self.failUnless(IRegisterUtilitySimply.providedBy(sm)) dummy = DummyUtility() superdummy = DummyUtility() @@ -169,13 +177,16 @@ def test_nestedSitesDontConflictButStillAcquire(self): # let's register a dummy utility in the dummy site dummy = DummyUtility() - sm = zapi.getSiteManager() + sm = getSiteManager() sm.registerUtility(IDummyUtility, dummy) # let's also create a subsite and make that our site manage_addDummySite(self.folder.site, 'subsite') - enableSite(self.folder.site.subsite) - setSite(self.folder.site.subsite) + import warnings + showwarning = warnings.showwarning + warnings.showwarning = lambda *a, **k: None + enableLocalSiteHook(self.folder.site.subsite) + warnings.showwarning = showwarning # we should still be able to lookup the original utility from # the site one level above @@ -184,7 +195,7 @@ # now we register a dummy utility in the subsite and see that # its registration doesn't conflict subdummy = DummyUtility() - sm = zapi.getSiteManager() + sm = getSiteManager() sm.registerUtility(IDummyUtility, subdummy) # when we look it up we get the more local one now because the @@ -205,7 +216,7 @@ def test_registeringTwiceIsConflict(self): dummy1 = DummyUtility() dummy2 = DummyUtility() - sm = zapi.getSiteManager() + sm = getSiteManager() sm.registerUtility(IDummyUtility, dummy1) self.assertRaises(ValueError, sm.registerUtility, IDummyUtility, dummy2) @@ -216,7 +227,7 @@ def test_utilitiesHaveProperAcquisitionContext(self): dummy = DummyUtility() - sm = zapi.getSiteManager() + sm = getSiteManager() sm.registerUtility(IDummyUtility, dummy) # let's see if we can acquire something all the way from the @@ -241,7 +252,7 @@ provideUtility(global_dummy, IDummyUtility) local_dummy = DummyUtility() - sm = zapi.getSiteManager() + sm = getSiteManager() sm.registerUtility(IDummyUtility, local_dummy) self.assertEquals(zapi.getUtility(IDummyUtility), local_dummy) @@ -250,11 +261,14 @@ # test local site vs. nested local site manage_addDummySite(self.folder.site, 'subsite') - enableSite(self.folder.site.subsite) - setSite(self.folder.site.subsite) + import warnings + showwarning = warnings.showwarning + warnings.showwarning = lambda *a, **k: None + enableLocalSiteHook(self.folder.site.subsite) + warnings.showwarning = showwarning sublocal_dummy = DummyUtility() - sm = zapi.getSiteManager() + sm = getSiteManager() sm.registerUtility(IDummyUtility, sublocal_dummy) self.assertEquals(zapi.getUtility(IDummyUtility), sublocal_dummy) _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins