[Checkins] SVN: grok/branches/darrylcousins-branch/ Brought in
megrok layer and viewlet packages
Darryl Cousins
darryl at darrylcousins.net.nz
Sun Jul 1 02:05:23 EDT 2007
Log message for revision 77278:
Brought in megrok layer and viewlet packages
Changed:
U grok/branches/darrylcousins-branch/buildout.cfg
A grok/branches/darrylcousins-branch/megrok.layer/
A grok/branches/darrylcousins-branch/megrok.layer/setup.py
A grok/branches/darrylcousins-branch/megrok.layer/src/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
A grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml
A grok/branches/darrylcousins-branch/megrok.viewlet/
A grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml
U grok/branches/darrylcousins-branch/setup.py
-=-
Modified: grok/branches/darrylcousins-branch/buildout.cfg
===================================================================
--- grok/branches/darrylcousins-branch/buildout.cfg 2007-07-01 04:53:58 UTC (rev 77277)
+++ grok/branches/darrylcousins-branch/buildout.cfg 2007-07-01 06:05:22 UTC (rev 77278)
@@ -1,62 +1,99 @@
[buildout]
-develop = . grokwiki ldapaddressbook martian
-parts = data instance testdata testinstance test
+develop = . grokwiki ldapaddressbook martian megrok.layer megrok.viewlet
+parts = app data instance test devpython
+find-links = http://download.zope.org/distribution/
[zope3]
-#recipe = zc.recipe.zope3checkout
-#url = svn://svn.zope.org/repos/main/Zope3/branches/3.3
-location = /home/faassen/buildout/z331-lp
+# this dead chicken is needed by some other recipe(s)
+location =
+[app]
+eggs = grok
+ grokwiki
+ martian
+ megrok.layer
+ megrok.viewlet
+recipe = zc.zope3recipes:app
+site.zcml = <include package="zope.security" file="meta.zcml" />
+ <include package="zope.i18n" file="meta.zcml" />
+ <include package="zope.app.securitypolicy" file="meta.zcml" />
+ <include package="zope.app.zcmlfiles" file="meta.zcml" />
+ <include package="zope.viewlet" file="meta.zcml" />
+ <include package="grok" file="meta.zcml" />
+ <include package="megrok.layer" file="meta.zcml" />
+ <include package="megrok.viewlet" file="meta.zcml" />
+
+ <include package="zope.annotation" />
+ <include package="zope.copypastemove" />
+ <include package="zope.contentprovider" />
+ <include package="zope.formlib" />
+ <include package="zope.i18n.locales" />
+ <include package="zope.publisher" />
+ <include package="zope.size" />
+ <include package="zope.traversing" />
+ <include package="zope.traversing.browser" />
+ <include package="zope.publisher" />
+ <include package="zope.viewlet" />
+ <include package="zope.app.zcmlfiles" />
+ <include package="zope.app.securitypolicy" />
+ <include package="zope.app.authentication" />
+ <include package="zope.app.catalog" />
+ <include package="zope.app.intid" />
+ <include package="zope.app.keyreference" />
+ <include package="zope.app.twisted" />
+ <include package="grok" />
+ <include package="grokwiki" />
+
+ <securityPolicy
+ component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+ <unauthenticatedPrincipal id="zope.anybody"
+ title="Unauthenticated User" />
+ <unauthenticatedGroup id="zope.Anybody"
+ title="Unauthenticated Users" />
+ <authenticatedGroup id="zope.Authenticated"
+ title="Authenticated Users" />
+ <everybodyGroup id="zope.Everybody"
+ title="All Users" />
+ <principal id="zope.manager"
+ title="Manager"
+ login="grok"
+ password_manager="Plain Text"
+ password="grok"
+ />
+
+ <!-- Replace the following directive if you don't want
+ public access -->
+ <grant permission="zope.View"
+ principal="zope.Anybody" />
+ <grant permission="zope.app.dublincore.view"
+ principal="zope.Anybody" />
+
+ <role id="zope.Manager" title="Site Manager" />
+ <role id="zope.Member" title="Site Member" />
+ <grantAll role="zope.Manager" />
+ <grant role="zope.Manager"
+ principal="zope.manager" />
+
[data]
recipe = zc.recipe.filestorage
-[testdata]
-recipe = zc.recipe.filestorage
-
-[testinstance]
-recipe = zc.recipe.zope3instance
-database = testdata
-user = grok:grok
-eggs = setuptools
- grok
-zcml = zope.annotation
- zope.copypastemove
- zope.formlib
- zope.i18n-meta
- zope.i18n.locales
- zope.publisher
- zope.security-meta
- zope.size
- zope.traversing
- zope.traversing.browser
- zope.app
- zope.app-meta
- zope.app.securitypolicy
- zope.app.securitypolicy-meta
- zope.app.authentication
- zope.app.catalog
- zope.app.intid
- zope.app.keyreference
- grok
- grok-meta
-
[instance]
-recipe = zc.recipe.zope3instance
-database = data
-user = grok:grok
-eggs = setuptools
- grok
- grokwiki
+recipe = zc.zope3recipes:instance
+application = app
+zope.conf = ${data:zconfig}
-zcml = ${testinstance:zcml}
- zope.app.twisted
- grokwiki
-
[test]
recipe = zc.recipe.testrunner
eggs = grok
-extra-paths = /home/faassen/buildout/z331-lp/lib/python
-working-directory = parts/testinstance
-defaults = ['--tests-pattern', '^f?tests$',
- '-v'
- ]
+ martian
+ megrok.layer
+ megrok.viewlet
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+
+# installs bin/devpython to do simple interpreter tests
+[devpython]
+recipe = zc.recipe.egg
+interpreter = devpython
+eggs = grok
+ martian
Added: grok/branches/darrylcousins-branch/megrok.layer/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/setup.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/setup.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,21 @@
+from setuptools import setup, find_packages
+
+setup(
+ name='megrok.layer',
+ version='0.1',
+ author='Grok Team',
+ author_email='grok-dev at zope.org',
+ url='http://svn.zope.org/grok/trunk',
+ description="""\
+Grok: Now even cavemen can use z3c.form!
+""",
+ packages=find_packages('src'),
+ package_dir = {'': 'src'},
+ include_package_data = True,
+ zip_safe=False,
+ license='ZPL',
+
+ install_requires=['setuptools',
+ ],
+)
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/setup.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,6 @@
+try:
+ # Declare this a namespace package if pkg_resources is available.
+ import pkg_resources
+ pkg_resources.declare_namespace('megrok')
+except ImportError:
+ pass
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,3 @@
+from directive import layer
+from components import ILayer, Skin
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,8 @@
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+class ILayer(IDefaultBrowserLayer):
+ pass
+
+class Skin(object):
+ pass
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,5 @@
+from grok.directive import (InterfaceOrClassDirective,
+ ClassOrModuleDirectiveContext)
+
+layer = InterfaceOrClassDirective('megrok.layer.layer',
+ ClassOrModuleDirectiveContext())
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/directive.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+# this is a package
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,36 @@
+import grok
+import megrok.layer
+
+class Mammoth(grok.Model):
+ pass
+
+class Index(grok.View):
+ grok.context(Mammoth)
+
+index = grok.PageTemplate("""\
+<html>
+<body>
+<a tal:attributes="href static/file.txt">Some text in a file</a>
+</body>
+</html>""")
+
+class MammothLayer(megrok.layer.ILayer):
+ pass
+
+class MammothSkin(megrok.layer.Skin):
+ megrok.layer.layer(MammothLayer)
+
+
+class CaveDrawings(grok.View):
+ grok.context(Mammoth)
+
+ def render(self):
+ return "stick figures"
+
+class TarPit(grok.View):
+ grok.context(Mammoth)
+ megrok.layer.layer(MammothLayer)
+
+ def render(self):
+ return "inky darkness all around"
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/ellie.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+some text
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/file.txt
___________________________________________________________________
Name: svn:keywords
+ Date Author
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/static.pt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,5 @@
+<html>
+<body>
+<h1 tal:content="string:will not be interpreted"/>
+</body>
+</html>
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+This is yet another file.
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/simple_fixture/static/subdir/otherfile.txt
___________________________________________________________________
Name: svn:keywords
+ Date Author
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,68 @@
+"""
+If there is a static/ directory inside of a grokked package, its
+contents will be available as static resources under a URL:
+
+ >>> import grok
+ >>> grok.grok('megrok.layer.ftests.layer.simple_fixture')
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open('http://localhost/@@/megrok.layer.ftests.layer.simple_fixture/'
+ ... 'file.txt')
+ >>> print browser.contents
+ some text
+
+We use a special name 'static' in page templates to allow easy linking
+to resources:
+
+ >>> root = getRootFolder()
+ >>> from megrok.layer.ftests.layer.simple_fixture.ellie import Mammoth
+ >>> root[u'ellie'] = Mammoth()
+ >>> browser.open('http://localhost/ellie')
+ >>> print browser.contents
+ <html>
+ <body>
+ <a href="http://localhost/@@/megrok.layer.ftests.layer.simple_fixture/file.txt">Some text in a file</a>
+ </body>
+ </html>
+
+Static also means that page templates will not be interpreted:
+
+ >>> browser.open('http://localhost/@@/megrok.layer.ftests.layer.simple_fixture/static.pt')
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1 tal:content="string:will not be interpreted"/>
+ </body>
+ </html>
+
+We also support subdirectories for resources:
+
+ >>> browser.open('http://localhost/@@/megrok.layer.ftests.layer.simple_fixture/subdir/otherfile.txt')
+ >>> print browser.contents
+ This is yet another file.
+
+Sanity check custom layers
+
+ >>> browser.open('http://localhost/ellie/@@cavedrawings')
+ >>> print browser.contents
+ stick figures
+
+ >>> browser.open('http://localhost/++skin++mammothskin/ellie/@@tarpit')
+ >>> print browser.contents
+ inky darkness all around
+
+
+grok.ILayer now inherits IDefaultBrowserLayer
+
+ >>> browser.open('http://localhost/++skin++mammothskin/@@/megrok.layer.ftests.layer.simple_fixture/subdir/otherfile.txt')
+ >>> print browser.contents
+ This is yet another file.
+
+
+ >>> browser.open('http://localhost/++skin++Rotterdam/@@/megrok.layer.ftests.layer.simple_fixture/subdir/otherfile.txt')
+ >>> print browser.contents
+ This is yet another file.
+
+"""
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/static.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,74 @@
+"""
+ >>> import grok
+ >>> from megrok.layer.ftests.layer.view import Mammoth
+ >>> grok.grok('megrok.layer.ftests.layer.view')
+ >>> getRootFolder()["manfred"] = Mammoth()
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open("http://localhost/++skin++Basic/manfred/cavedrawings")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>Hello, world!</h1>
+ </body>
+ </html>
+
+In another branch this would raise NotFound
+
+ >>> #browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
+ Traceback (most recent call last):
+ ...
+ NotFound: Object: <megrok.layer.ftests.layer.view.Mammoth object at ...>, name: u'cavedrawings'
+
+ >>> browser.open("http://localhost/++skin++Rotterdam/manfred/moredrawings")
+ >>> print browser.contents
+ Pretty
+
+ >>> browser.open("http://localhost/++skin++myskin/manfred/evenmoredrawings")
+ >>> print browser.contents
+ Awesome
+
+"""
+import grok
+from zope.app.basicskin import IBasicSkin
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.app.rotterdam import rotterdam
+from zope import interface
+
+import megrok.layer
+megrok.layer.layer(IBasicSkin)
+
+class MySkinLayer(megrok.layer.ILayer):
+ pass
+
+class MySkin(megrok.layer.Skin):
+ megrok.layer.layer(MySkinLayer)
+
+class Mammoth(grok.Model):
+ pass
+
+class CaveDrawings(grok.View):
+ pass
+
+cavedrawings = grok.PageTemplate("""\
+<html>
+<body>
+<h1>Hello, world!</h1>
+</body>
+</html>
+""")
+
+class MoreDrawings(grok.View):
+ megrok.layer.layer(rotterdam)
+
+ def render(self):
+ return "Pretty"
+
+class EvenMoreDrawings(grok.View):
+ megrok.layer.layer(MySkinLayer)
+
+ def render(self):
+ return "Awesome"
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,30 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+def suiteFromPackage(name):
+ files = resource_listdir(__name__, name)
+ suite = unittest.TestSuite()
+ #files = ['view.py']
+ for filename in files:
+ if not filename.endswith('.py'):
+ continue
+ if filename == '__init__.py':
+ continue
+
+ dottedname = 'megrok.layer.ftests.%s.%s' % (name, filename[:-3])
+ test = FunctionalDocTestSuite(dottedname)
+
+ suite.addTest(test)
+ return suite
+
+def test_suite():
+ suite = unittest.TestSuite()
+ for name in ['layer']:
+ suite.addTest(suiteFromPackage(name))
+ return suite
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,24 @@
+import martian
+import grok
+import zope.component
+from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+ IBrowserSkinType)
+from martian import util
+import megrok.layer
+
+class ILayerGrokker(martian.ClassGrokker):
+ component_class = megrok.layer.ILayer
+
+
+class SkinGrokker(martian.ClassGrokker):
+ component_class = megrok.layer.Skin
+
+ def grok(self, name, factory, context, module_info, templates):
+ layer = util.class_annotation(factory, 'megrok.layer.layer',
+ None) or module_info.getAnnotation('megrok.layer.layer',
+ None) or IDefaultBrowserLayer
+ name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+ zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
+
+ return True
+
Property changes on: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.zcml 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,2 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
+
Added: grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/setup.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/setup.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,22 @@
+from setuptools import setup, find_packages
+
+setup(
+ name='megrok.viewlet',
+ version='0.1',
+ author='Grok Team',
+ author_email='grok-dev at zope.org',
+ url='http://svn.zope.org/grok/trunk',
+ description="""\
+Grok: Now even cavemen can use z3c.form!
+""",
+ packages=find_packages('src'),
+ package_dir = {'': 'src'},
+ include_package_data = True,
+ zip_safe=False,
+ license='ZPL',
+
+ install_requires=['setuptools',
+ 'z3c.viewlet',
+ ],
+)
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/setup.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,6 @@
+try:
+ # Declare this a namespace package if pkg_resources is available.
+ import pkg_resources
+ pkg_resources.declare_namespace('megrok')
+except ImportError:
+ pass
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,3 @@
+from directive import viewletmanager
+from components import Viewlet, ViewletManager, ContentProvider
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,175 @@
+import grok
+from zope import component
+from zope import interface
+
+from zope.publisher.interfaces.browser import IBrowserView
+from zope.publisher.browser import BrowserView
+from zope.viewlet.interfaces import IViewlet
+from zope.publisher.publish import mapply
+
+from z3c.viewlet.manager import WeightOrderedViewletManager
+
+class ViewBase(object):
+
+ def _render_template(self):
+ namespace = self.template.pt_getContext()
+ namespace['request'] = self.request
+ namespace['view'] = self
+ namespace['context'] = self.context
+ namespace['static'] = self.static
+ return self.template.pt_render(namespace)
+
+ def application(self):
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, grok.Application):
+ return obj
+ obj = obj.__parent__
+ raise ValueErrror("No application found.")
+
+ def site(self):
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, grok.Site):
+ return obj
+ obj = obj.__parent__
+ raise ValueErrror("No site found.")
+
+ def application_url(self, name=None):
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, grok.Application):
+ return self.url(obj, name)
+ obj = obj.__parent__
+ raise ValueErrror("No application found.")
+
+ def url(self, obj=None, name=None):
+ # if the first argument is a string, that's the name. There should
+ # be no second argument
+ if isinstance(obj, basestring):
+ if name is not None:
+ raise TypeError(
+ 'url() takes either obj argument, obj, string arguments, '
+ 'or string argument')
+ name = obj
+ obj = None
+
+ if name is None and obj is None:
+ # create URL to view itself
+ obj = self
+ elif name is not None and obj is None:
+ # create URL to view on context
+ obj = self.context
+ return url(self.request, obj, name)
+
+ def redirect(self, url):
+ return self.request.response.redirect(url)
+
+ @property
+ def response(self):
+ return self.request.response
+
+ def update(self):
+ pass
+
+class TemplateContentBase(object):
+ """Mixin class to provide render method using given template"""
+
+ template = None
+
+ def render(self):
+ """My concern here is that if subclass overrides this method then it
+ will be the responsibility of the developer to call update()"""
+ mapply(self.update, (), self.request)
+ if self.request.response.getStatus() in (302, 303):
+ return
+ template = getattr(self, 'template', None)
+ if template is not None:
+ return self._render_template()
+
+
+class ContentProvider(ViewBase, TemplateContentBase):
+
+ def __init__(self, context, request, view):
+ self.__parent__ = self.view = view
+ self.context = context
+ self.request = request
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
+
+class Viewlet(BrowserView, ViewBase, TemplateContentBase):
+ """ A grok.View-like viewlet
+ """
+ interface.implements(IViewlet)
+
+ def __init__(self, context, request, view, manager):
+ #super(Viewlet, self).__init__(context, request)
+ self.__parent__ = self.view = view
+ self.context = context
+ self.request = request
+ self.manager = manager
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
+
+# using z3c orderedviewletmanager
+class ViewletManager(WeightOrderedViewletManager, ContentProvider):
+ """ A grok.View-like ViewletManager
+ """
+
+ def __init__(self, context, request, view):
+ self.__updated = False
+ self.__parent__ = self.view = view
+ self.context = context
+ self.request = request
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
+
+ def update(self):
+ """Subclasses can override this method just like on regular
+ grok.Views. It will be called before any viewlet processing
+ happens."""
+ pass
+
+ def update_manager(self):
+ """Update the manager, i.e. process the viewlets.
+
+ On ViewletManagers, this is what the update() method is.
+ In grok views, the update() method has a different meaning.
+ That's why this method is called update_manager() in grok manager."""
+ super(ViewletManager, self).update()
+
+ def render(self):
+ """First update the manager then the normal grok view update"""
+ self.update_manager()
+ #mapply(self.update, (), self.request)
+ if self.request.response.getStatus() in (302, 303):
+ return
+ template = getattr(self, 'template', None)
+ if template is not None:
+ return self._render_template()
+ else:
+ return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+
+ def filter(self, viewlets):
+ """Sort out all content providers
+
+ ``viewlets`` is a list of tuples of the form (name, viewlet).
+ """
+# Only return viewlets accessible to the principal
+# this is the original for z.v.manager.py but I would get ForbiddenAttribute: ('render'
+# for the viewlets??
+ #import zope.security
+ #return [(name, viewlet) for name, viewlet in viewlets
+ # if zope.security.canAccess(viewlet, 'render')]
+ return [(name, viewlet) for name, viewlet in viewlets]
+
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,5 @@
+from grok.directive import (InterfaceOrClassDirective,
+ ClassDirectiveContext)
+
+viewletmanager = InterfaceOrClassDirective('megrok.viewlet.viewletmanager',
+ ClassDirectiveContext())
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/directive.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,30 @@
+import unittest
+from pkg_resources import resource_listdir
+
+from grok.ftests.test_grok_functional import FunctionalDocTestSuite
+
+def suiteFromPackage(name):
+ files = resource_listdir(__name__, name)
+ suite = unittest.TestSuite()
+ #files = ['view.py']
+ for filename in files:
+ if not filename.endswith('.py'):
+ continue
+ if filename == '__init__.py':
+ continue
+
+ dottedname = 'megrok.viewlet.ftests.%s.%s' % (name, filename[:-3])
+ test = FunctionalDocTestSuite(dottedname)
+
+ suite.addTest(test)
+ return suite
+
+def test_suite():
+ suite = unittest.TestSuite()
+ for name in ['viewlet']:
+ suite.addTest(suiteFromPackage(name))
+ return suite
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+#
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,122 @@
+"""
+This doctest uses grok.ContentProvider, grok.ViewletManager and grok.Viewlet.
+
+ >>> import grok
+ >>> from megrok.viewlet.ftests.viewlet.view import Mammoth
+ >>> grok.grok('megrok.viewlet.ftests.viewlet.view')
+ >>> getRootFolder()["manfred"] = Mammoth()
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open("http://localhost/manfred/@@index")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>Manfred</h1>
+ <div id="leftcolumn">
+ <p>My simple viewlet</p>
+ <p>This is from a template for Manfred</p>
+ </div>
+ <div>Way cool</div>
+ <div id="rightcolumn">
+ </div>
+ </body>
+ </html>
+
+In another branch this would raise NotFound
+
+ >>> #browser.open("http://localhost/manfred/@@skinnedindex")
+ Traceback (most recent call last):
+ ...
+ NotFound...'@@skinnedindex'
+
+ >>> browser.open("http://localhost/++skin++myskin/manfred/@@skinnedindex")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>Manfred</h1>
+ <div id="leftcolumn">
+ <p>My skinned viewlet</p>
+ <p>My simple viewlet</p>
+ <p>This is from a template for Manfred</p>
+ </div>
+ <div>Way cool</div>
+ <div id="rightcolumn">
+ </div>
+ </body>
+ </html>
+
+"""
+import grok
+import megrok.layer
+import megrok.viewlet
+
+class Mammoth(grok.Model):
+ title = u'Manfred'
+
+class IMySkinLayer(megrok.layer.ILayer):
+ pass
+
+class MySkin(megrok.layer.Skin):
+ megrok.layer.layer(IMySkinLayer)
+
+class Index(grok.View):
+ """Template must be in *_templates, I tried and I tried to find out
+ why when the template is inline the `provider` tal directive isn't found"""
+ pass
+
+class SkinnedIndex(grok.View):
+ """Template must be in *_templates, I tried and I tried to find out
+ why when the template is inline the `provider` tal directive isn't found"""
+ megrok.layer.layer(IMySkinLayer)
+
+class Title(megrok.viewlet.ContentProvider):
+ """This has a template"""
+ grok.name('site.title')
+ grok.context(Mammoth)
+
+class FirstManager(megrok.viewlet.ViewletManager):
+ """This has a template also, ie it acts just like the above"""
+ grok.name('site.firstmanager')
+ grok.context(Mammoth)
+
+class RightColumnManager(megrok.viewlet.ViewletManager):
+ """This has no template and no viewlets, it renders nothing"""
+ grok.name('site.rightcolumnmanager')
+ grok.context(Mammoth)
+
+class LeftColumnManager(megrok.viewlet.ViewletManager):
+ """This has no template it renders its viewlets"""
+ grok.name('site.leftcolumnmanager')
+ grok.context(Mammoth)
+
+class FirstViewlet(megrok.viewlet.Viewlet):
+ """A simple viewlet"""
+ grok.name('site.viewlet.simple')
+ grok.context(Mammoth)
+ megrok.viewlet.viewletmanager(LeftColumnManager)
+ weight = 0
+
+ def render(self):
+ return u'<p>My simple viewlet</p>'
+
+class SecondViewlet(megrok.viewlet.Viewlet):
+ """A viewlet that has its own template"""
+ grok.name('site.viewlet.templated')
+ grok.context(Mammoth)
+ megrok.viewlet.viewletmanager(LeftColumnManager)
+ weight = 1
+
+class ThirdViewlet(megrok.viewlet.Viewlet):
+ """A simple viewlet for a specific layer only"""
+ grok.name('site.viewlet.skinned')
+ grok.context(Mammoth)
+ megrok.viewlet.viewletmanager(LeftColumnManager)
+ megrok.layer.layer(IMySkinLayer)
+ weight = 0
+
+ def render(self):
+ return u'<p>My skinned viewlet</p>'
+
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/firstmanager.pt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+<div>Way cool</div>
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/index.pt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,13 @@
+<html>
+<body>
+<tal:block tal:content="structure provider:site.title" />
+<div id="leftcolumn">
+<tal:block tal:content="structure provider:site.leftcolumnmanager" />
+</div>
+<tal:block tal:content="structure provider:site.firstmanager" />
+<div id="rightcolumn">
+<tal:block tal:content="structure provider:site.rightcolumnmanager" />
+</div>
+</body>
+</html>
+
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/secondviewlet.pt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+<p>This is from a template for <span tal:replace="context/title" /></p>
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/skinnedindex.pt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,14 @@
+<html>
+<body>
+<tal:block tal:content="structure provider:site.title" />
+<div id="leftcolumn">
+<tal:block tal:content="structure provider:site.leftcolumnmanager" />
+</div>
+<tal:block tal:content="structure provider:site.firstmanager" />
+<div id="rightcolumn">
+<tal:block tal:content="structure provider:site.rightcolumnmanager" />
+</div>
+</body>
+</html>
+
+
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view_templates/title.pt 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1 @@
+<h1 tal:content="context/title">Hello World!</h1>
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,117 @@
+import martian
+import grok
+from zope import component
+from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+ IBrowserView)
+from zope.viewlet.interfaces import IViewlet, IViewletManager
+from zope.contentprovider.interfaces import IContentProvider
+
+from martian import util
+import megrok.viewlet
+from grok.util import get_default_permission, make_checker
+
+class ViewGrokkerBase(martian.ClassGrokker):
+ """Code resuse for View, ContentProvider and Viewlet grokkers"""
+ component_class = None
+ factory_name = ''
+ view_context = None
+
+ def grok_start(self, name, factory, context, module_info, templates):
+ self.view_context = util.determine_class_context(factory, context)
+ factory.module_info = module_info
+ self.factory_name = factory.__name__.lower()
+
+ # find templates
+ template_name = util.class_annotation(factory, 'grok.template',
+ self.factory_name)
+ template = templates.get(template_name)
+
+ if self.factory_name != template_name:
+ # grok.template is being used
+ if templates.get(self.factory_name):
+ raise GrokError("Multiple possible templates for view %r. It "
+ "uses grok.template('%s'), but there is also "
+ "a template called '%s'."
+ % (factory, template_name, self.factory_name),
+ factory)
+
+ if template:
+ templates.markAssociated(template_name)
+ factory.template = template
+ else:
+ if not getattr(factory, 'render', None):
+ # we do not accept a view without any way to render it
+ raise GrokError("View %r has no associated template or "
+ "'render' method." % factory, factory)
+
+ def grok_end(self, factory):
+ # protect view, public by default
+ default_permission = get_default_permission(factory)
+ make_checker(factory, factory, default_permission)
+
+ # safety belt: make sure that the programmer didn't use
+ # @grok.require on any of the view's methods.
+ methods = util.methods_from_class(factory)
+ for method in methods:
+ if getattr(method, '__grok_require__', None) is not None:
+ raise GrokError('The @grok.require decorator is used for '
+ 'method %r in view %r. It may only be used '
+ 'for XML-RPC methods.'
+ % (method.__name__, factory), factory)
+
+class ContentProviderGrokker(ViewGrokkerBase):
+ """Also groks ViewletManager"""
+ component_class = megrok.viewlet.ContentProvider
+
+ def grok(self, name, factory, context, module_info, templates):
+ self.grok_start(name, factory, context, module_info, templates)
+
+ view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+ None) or module_info.getAnnotation('megrok.layer.layer',
+ None) or IDefaultBrowserLayer
+
+ view_name = util.class_annotation(factory, 'grok.name',
+ self.factory_name)
+ # __view_name__ is needed to support IAbsoluteURL on views
+ factory.__view_name__ = view_name
+ if util.check_subclass(factory, megrok.viewlet.ViewletManager):
+ view_provider = IViewletManager
+ else:
+ view_provider = IContentProvider
+ component.provideAdapter(factory,
+ adapts=(self.view_context, view_layer, IBrowserView),
+ provides=view_provider,
+ name=view_name)
+
+ self.grok_end(factory)
+
+ return True
+
+class ViewletGrokker(ViewGrokkerBase):
+ component_class = megrok.viewlet.Viewlet
+
+ def grok(self, name, factory, context, module_info, templates):
+ self.grok_start(name, factory, context, module_info, templates)
+
+ view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+ None) or module_info.getAnnotation('megrok.layer.layer',
+ None) or IDefaultBrowserLayer
+
+ view_name = util.class_annotation(factory, 'grok.name',
+ self.factory_name)
+ view_manager = util.class_annotation(factory, 'megrok.viewlet.viewletmanager',
+ None) or module_info.getAnnotation('megrok.viewlet.viewletmanager',
+ None) or IViewletManager
+ # __view_name__ is needed to support IAbsoluteURL on views
+ factory.__view_name__ = view_name
+ component.provideAdapter(factory,
+ adapts=(self.view_context, view_layer,
+ IBrowserView, view_manager),
+ provides=IViewlet,
+ name=view_name)
+
+
+ self.grok_end(factory)
+
+ return True
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.zcml 2007-07-01 06:05:22 UTC (rev 77278)
@@ -0,0 +1,2 @@
+<grok package=".meta" xmlns="http://namespaces.zope.org/grok" />
+
Modified: grok/branches/darrylcousins-branch/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/setup.py 2007-07-01 04:53:58 UTC (rev 77277)
+++ grok/branches/darrylcousins-branch/setup.py 2007-07-01 06:05:22 UTC (rev 77278)
@@ -16,6 +16,39 @@
include_package_data = True,
zip_safe=False,
install_requires=['setuptools',
- 'martian',
- 'simplejson'],
+ 'simplejson',
+ 'pytz',
+ 'ZODB3',
+ 'zope.annotation',
+ 'zope.app.catalog',
+ 'zope.app.component',
+ 'zope.app.container',
+ 'zope.app.folder',
+ 'zope.app.intid',
+ 'zope.app.pagetemplate',
+ 'zope.app.publication',
+ 'zope.app.publisher',
+ 'zope.app.testing',
+ 'zope.component',
+ 'zope.contentprovider',
+ 'zope.configuration',
+ 'zope.dottedname',
+ 'zope.event',
+ 'zope.formlib',
+ 'zope.interface',
+ 'zope.lifecycleevent',
+ 'zope.pagetemplate',
+ 'zope.publisher',
+ 'zope.schema',
+ 'zope.security',
+ 'zope.testing',
+ 'zope.traversing',
+ 'zope.viewlet',
+
+ # needed for ftests and typical deployments
+ 'zope.testbrowser',
+ 'zope.app.twisted',
+ 'zope.app.securitypolicy',
+ 'zope.app.zcmlfiles',
+ ],
)
More information about the Checkins
mailing list