[Checkins] SVN: grok/trunk/ Add a grok.Site mixin. Mixed into an
existing Model or Container this
Martijn Faassen
faassen at infrae.com
Sat Nov 4 08:35:52 EST 2006
Log message for revision 71058:
Add a grok.Site mixin. Mixed into an existing Model or Container this
will turn the instances into sites (as soon as they get added to a container,
such as when the application is installed). Also expose getSite as
grok.getSite.
Changed:
U grok/trunk/grokblog/src/grokblog/blog.py
U grok/trunk/src/grok/__init__.py
U grok/trunk/src/grok/_grok.py
U grok/trunk/src/grok/components.py
U grok/trunk/src/grok/interfaces.py
A grok/trunk/src/grok/tests/site/
A grok/trunk/src/grok/tests/site/__init__.py
A grok/trunk/src/grok/tests/site/site.py
U grok/trunk/src/grok/tests/test_grok.py
-=-
Modified: grok/trunk/grokblog/src/grokblog/blog.py
===================================================================
--- grok/trunk/grokblog/src/grokblog/blog.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/grokblog/src/grokblog/blog.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -2,14 +2,8 @@
import grok
from zope import interface, schema
-from zope.app.component.hooks import setSite, getSite
-from zope.app.component.site import LocalSiteManager
-from zope.app.component.interfaces import IPossibleSite
-from zope.app.component.site import SiteManagerContainer
-class Blog(grok.Container, SiteManagerContainer):
- interface.implements(IPossibleSite)
-
+class Blog(grok.Container, grok.Site):
def __init__(self):
super(Blog, self).__init__()
self['entries'] = Entries()
@@ -20,12 +14,6 @@
except ValueError:
return None
return Year(year)
-
- at grok.subscribe(Blog, grok.IObjectAddedEvent)
-def blogAdded(blog, event):
- sitemanager = LocalSiteManager(blog)
- blog.setSiteManager(sitemanager)
- setSite(blog)
class Entries(grok.Container):
pass
@@ -86,7 +74,7 @@
return "Entries: %s" % ' '.join([entry.__name__ for entry in entries])
def entriesInDateRange(from_, until):
- entries = getSite()['entries']
+ entries = grok.getSite()['entries']
for entry in entries.values():
if from_ <= entry.published <= until:
yield entry
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/__init__.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -18,6 +18,7 @@
from zope.component import adapts
from zope.formlib.form import action
from zope.event import notify
+from zope.app.component.hooks import getSite
from zope.lifecycleevent import (
IObjectCreatedEvent, ObjectCreatedEvent,
IObjectModifiedEvent, ObjectModifiedEvent,
@@ -30,7 +31,7 @@
IContainerModifiedEvent, ContainerModifiedEvent)
from grok.components import Model, Adapter, MultiAdapter, View, XMLRPC
-from grok.components import PageTemplate, Utility, Container, Traverser
+from grok.components import PageTemplate, Utility, Container, Traverser, Site
from grok.components import EditForm, DisplayForm, schema_fields
from grok.directive import context, name, template, templatedir
from grok._grok import do_grok as grok # Avoid name clash within _grok
Modified: grok/trunk/src/grok/_grok.py
===================================================================
--- grok/trunk/src/grok/_grok.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/_grok.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -29,6 +29,7 @@
from zope.app.publisher.xmlrpc import MethodPublisher
from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
+from zope.app.component.site import LocalSiteManager
import grok
@@ -52,7 +53,15 @@
component.provideAdapter('index',
adapts=(grok.Container, IBrowserRequest),
provides=IDefaultViewName)
-
+ # register a subscriber for when grok.Sites are added to make them
+ # into Zope 3 sites
+ component.provideHandler(
+ addSiteHandler, adapts=(grok.Site, grok.IObjectAddedEvent))
+
+def addSiteHandler(site, event):
+ sitemanager = LocalSiteManager(site)
+ site.setSiteManager(sitemanager)
+
# add a cleanup hook so that grok will bootstrap itself again whenever
# the Component Architecture is torn down.
def resetBootstrap():
Modified: grok/trunk/src/grok/components.py
===================================================================
--- grok/trunk/src/grok/components.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/components.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -41,6 +41,7 @@
PageTemplateResourceFactory
from zope.app.container.btree import BTreeContainer
from zope.app.container.contained import Contained
+from zope.app.component.site import SiteManagerContainer
from grok import util, security, interfaces
@@ -56,6 +57,9 @@
pass
+class Site(SiteManagerContainer):
+ pass
+
class Adapter(object):
def __init__(self, context):
Modified: grok/trunk/src/grok/interfaces.py
===================================================================
--- grok/trunk/src/grok/interfaces.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/interfaces.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -20,6 +20,7 @@
Model = interface.Attribute("Base class for persistent content objects "
"(models).")
Container = interface.Attribute("Base class for containers.")
+ Site = interface.Attribute("Mixin class for sites.")
Adapter = interface.Attribute("Base class for adapters.")
MultiAdapter = interface.Attribute("Base class for multi-adapters.")
Utility = interface.Attribute("Base class for utilities.")
@@ -122,6 +123,9 @@
def notify(event):
"""Send ``event`` to event subscribers."""
+ def getSite():
+ """Get the current site."""
+
def PageTemplate(template):
"""Create a Grok PageTemplate object from ``template`` source
text. This can be used for inline PageTemplates."""
Added: grok/trunk/src/grok/tests/site/__init__.py
===================================================================
--- grok/trunk/src/grok/tests/site/__init__.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/tests/site/__init__.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -0,0 +1 @@
+# this is a package
Added: grok/trunk/src/grok/tests/site/site.py
===================================================================
--- grok/trunk/src/grok/tests/site/site.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/tests/site/site.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -0,0 +1,51 @@
+"""
+A site can be created by mixing in grok.Site into a grok.Model or
+grok.Container.
+
+ >>> grok.grok(__name__)
+
+ >>> from zope import interface
+ >>> from zope.app.component.interfaces import IPossibleSite, ISite
+ >>> manfred = Mammoth()
+ >>> IPossibleSite.providedBy(manfred)
+ True
+ >>> herd = Herd()
+ >>> IPossibleSite.providedBy(herd)
+ True
+ >>> nonsite = NonSite()
+ >>> IPossibleSite.providedBy(nonsite)
+ False
+ >>> nonsitecontainer = NonSiteContainer()
+ >>> IPossibleSite.providedBy(nonsitecontainer)
+ False
+
+While manfred and herd are possible sites, they are not yet sites;
+
+ >>> ISite.providedBy(manfred)
+ False
+ >>> ISite.providedBy(herd)
+ False
+
+When a site is added to a container it will be initialized as a site (
+when the ObjectAddedEvent is fired):
+
+ >>> nonsitecontainer['manfred'] = manfred
+ >>> ISite.providedBy(manfred)
+ True
+ >>> nonsitecontainer['herd'] = herd
+ >>> ISite.providedBy(herd)
+ True
+"""
+import grok
+
+class Mammoth(grok.Model, grok.Site):
+ pass
+
+class Herd(grok.Container, grok.Site):
+ pass
+
+class NonSite(grok.Model):
+ pass
+
+class NonSiteContainer(grok.Container):
+ pass
Modified: grok/trunk/src/grok/tests/test_grok.py
===================================================================
--- grok/trunk/src/grok/tests/test_grok.py 2006-11-04 13:26:28 UTC (rev 71057)
+++ grok/trunk/src/grok/tests/test_grok.py 2006-11-04 13:35:51 UTC (rev 71058)
@@ -34,7 +34,7 @@
suite = unittest.TestSuite()
for name in ['adapter', 'error', 'view', 'security', 'scan', 'event',
'zcml', 'static', 'utility', 'xmlrpc', 'container',
- 'traversal', 'form']:
+ 'traversal', 'form', 'site']:
suite.addTest(suiteFromPackage(name))
return suite
More information about the Checkins
mailing list