[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