[Checkins] SVN: grokapps/rdbz3cformexample/ Copied the rdbexample to adapt it to megrok.z3cform
Vincent Fretin
vincent.fretin at gmail.com
Fri Sep 18 04:48:04 EDT 2009
Log message for revision 104277:
Copied the rdbexample to adapt it to megrok.z3cform
Changed:
A grokapps/rdbz3cformexample/
A grokapps/rdbz3cformexample/trunk/
A grokapps/rdbz3cformexample/trunk/bootstrap.py
A grokapps/rdbz3cformexample/trunk/buildout.cfg
A grokapps/rdbz3cformexample/trunk/etc/
A grokapps/rdbz3cformexample/trunk/etc/README.txt
A grokapps/rdbz3cformexample/trunk/etc/debug.ini.in
A grokapps/rdbz3cformexample/trunk/etc/deploy.ini.in
A grokapps/rdbz3cformexample/trunk/etc/site.zcml.in
A grokapps/rdbz3cformexample/trunk/etc/zdaemon.conf.in
A grokapps/rdbz3cformexample/trunk/etc/zope.conf.in
A grokapps/rdbz3cformexample/trunk/setup.py
A grokapps/rdbz3cformexample/trunk/sources.cfg
A grokapps/rdbz3cformexample/trunk/src/
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/__init__.py
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.py
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.txt
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentindex.pt
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentsindex.pt
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/facultyindex.pt
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/rdbexampleindex.pt
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/configure.zcml
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/ftesting.zcml
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/static/
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/static/README.txt
A grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/tests.py
-=-
Added: grokapps/rdbz3cformexample/trunk/bootstrap.py
===================================================================
--- grokapps/rdbz3cformexample/trunk/bootstrap.py (rev 0)
+++ grokapps/rdbz3cformexample/trunk/bootstrap.py 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,84 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+
+$Id: bootstrap.py 85041 2008-03-31 15:57:30Z andreasjung $
+"""
+
+import os, shutil, sys, tempfile, urllib2, logging
+
+def remove_old_logger_handlers():
+ # zc.buildout installs a new log stream on every call of
+ # main(). We remove any leftover handlers to avoid multiple output
+ # of same content (doubled lines etc.)
+ root_logger = logging.getLogger()
+ if 'zc.buildout' in root_logger.manager.loggerDict.keys():
+ logger = logging.getLogger('zc.buildout')
+ for handler in logger.handlers:
+ logger.removeHandler(handler)
+ return
+
+
+tmpeggs = tempfile.mkdtemp()
+
+try:
+ import pkg_resources
+except ImportError:
+ ez = {}
+ exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
+ ).read() in ez
+ ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+ import pkg_resources
+
+if sys.platform == 'win32':
+ def quote(c):
+ if ' ' in c:
+ return '"%s"' % c # work around spawn lamosity on windows
+ else:
+ return c
+else:
+ def quote (c):
+ return c
+
+cmd = 'from setuptools.command.easy_install import main; main()'
+ws = pkg_resources.working_set
+assert os.spawnle(
+ os.P_WAIT, sys.executable, quote (sys.executable),
+ '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout',
+ dict(os.environ,
+ PYTHONPATH=
+ ws.find(pkg_resources.Requirement.parse('setuptools')).location
+ ),
+ ) == 0
+
+ws.add_entry(tmpeggs)
+ws.require('zc.buildout')
+import zc.buildout.buildout
+zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap'])
+remove_old_logger_handlers()
+shutil.rmtree(tmpeggs)
+
+# grokproject specific addition to standard bootstrap.py:
+# Install eggbasket too. This should be verbose to give the user
+# information about what is happening, since this can take a while.
+zc.buildout.buildout.main(sys.argv[1:] + ['-v', 'install', 'eggbasket'])
+if sys.platform == 'win32':
+ print "Now you can run 'bin\buildout.exe'"
+else:
+ print "Now you can run 'bin/buildout'"
Added: grokapps/rdbz3cformexample/trunk/buildout.cfg
===================================================================
--- grokapps/rdbz3cformexample/trunk/buildout.cfg (rev 0)
+++ grokapps/rdbz3cformexample/trunk/buildout.cfg 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,131 @@
+[buildout]
+develop = .
+parts =
+ eggbasket
+ app
+ i18n
+ test
+ mkdirs
+ zpasswd
+ zope_conf
+ site_zcml
+ zdaemon_conf
+ deploy_ini
+ debug_ini
+# For backward compatibility, telling buildout not to throw away
+# the data and log subdirectories from the parts directory.
+ data
+ log
+newest = false
+
+extends = http://grok.zope.org/releaseinfo/grok-1.0b2.cfg
+# eggs will be installed in the default buildout location
+# (see .buildout/default.cfg in your home directory)
+# unless you specify an eggs-directory option here.
+
+versions = versions
+
+[versions]
+collective.recipe.template = 1.4
+docutils = 0.5
+elementtree = 1.2.7-20070827-preview
+grokcore.startup = 0.2
+megrok.rdb = 0.9.1
+mr.developer = 1.1
+Paste = 1.7.2
+PasteDeploy = 1.3.3
+PasteScript = 1.7.3
+SQLAlchemy = 0.5.6
+transaction = 1.0.0
+z3c.evalexception = 2.0
+z3c.recipe.dev = 0.5.4
+z3c.recipe.i18n = 0.5.0
+z3c.recipe.mkdir = 0.3.1
+z3c.saconfig = 0.9.1
+zc.buildout = 1.4.1
+zc.recipe.egg = 1.2.2
+zc.recipe.filestorage = 1.0.1
+zope.sqlalchemy = 0.4
+
+[app]
+recipe = zc.recipe.egg
+eggs = rdbz3cformexample
+ z3c.evalexception>=2.0
+ Paste
+ PasteScript
+ PasteDeploy
+interpreter = python-console
+
+[mkdirs]
+recipe = z3c.recipe.mkdir
+paths =
+ ${zope_conf:filestorage}
+ ${zope_conf:logfiles}
+ ${zope_conf:blobstorage}
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = rdbz3cformexample
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+
+# this section named so that the i18n scripts are called bin/i18n...
+[i18n]
+recipe = z3c.recipe.i18n:i18n
+packages = rdbz3cformexample
+eggs = rdbz3cformexample
+domain = rdbz3cformexample
+output = src/rdbz3cformexample/locales
+zcml =
+
+# This section is named so that the zpasswd utility is
+# called `zpasswd`
+[zpasswd]
+recipe = z3c.recipe.dev:script
+eggs = rdbz3cformexample
+module = zope.app.server.zpasswd
+method = main
+
+[zope_conf]
+recipe = collective.recipe.template
+input = etc/zope.conf.in
+output = ${buildout:parts-directory}/etc/zope.conf
+filestorage = ${buildout:directory}/var/filestorage
+blobstorage = ${buildout:directory}/var/blobstorage
+logfiles = ${buildout:directory}/var/log
+extra =
+# 'extra' is copied verbatim. Use it for product config sections and so.
+
+# The [data] and [log] parts are still in here to instruct buildout to not
+# unintentionally throw away the parts/data and parts/log subdirectories
+# that contain the Data.fs and the log files. These files should be
+# copied to the new locations. See the upgrade notes for more information.
+[data]
+recipe = zc.recipe.filestorage
+
+[log]
+recipe = zc.recipe.filestorage
+
+[site_zcml]
+recipe = collective.recipe.template
+input = etc/site.zcml.in
+output = ${buildout:parts-directory}/etc/site.zcml
+
+[zdaemon_conf]
+recipe = collective.recipe.template
+input = etc/zdaemon.conf.in
+output = ${buildout:parts-directory}/etc/zdaemon.conf
+
+[deploy_ini]
+recipe = collective.recipe.template
+input = etc/deploy.ini.in
+output = ${buildout:parts-directory}/etc/deploy.ini
+
+[debug_ini]
+recipe = collective.recipe.template
+input = etc/debug.ini.in
+output = ${buildout:parts-directory}/etc/debug.ini
+
+[eggbasket]
+recipe = z3c.recipe.eggbasket
+eggs = grok
+url = http://grok.zope.org/releaseinfo/grok-eggs-1.0b2.tgz
Added: grokapps/rdbz3cformexample/trunk/etc/README.txt
===================================================================
--- grokapps/rdbz3cformexample/trunk/etc/README.txt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/etc/README.txt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,26 @@
+In this directory you can find templates which are used by
+``zc.buildout`` to create the configuration files in the parts/etc/ subdir
+of your project.
+
+If you modify files in this directory, you have to run::
+
+ $ bin/buildout
+
+afterwards to rebuild the configuration files in parts/etc/.
+
+In the templates you can use placesholders recognized by zc.buildout
+to name local paths, etc. A zc.buildout placeholder looks like this::
+
+ ${buildout:directory}
+
+which gives you the path of the project directory and will be
+substituted with the real path when you run buildout the next
+time. The set of available placeholders depends on your
+buildout.cfg.
+
+You can also modify files in parts/etc directly, but those changes
+will be overwritten after running bin/buildout the next time.
+
+To run your project you can do::
+
+ $ bin/paster serve parts/etc/deploy.ini
Added: grokapps/rdbz3cformexample/trunk/etc/debug.ini.in
===================================================================
--- grokapps/rdbz3cformexample/trunk/etc/debug.ini.in (rev 0)
+++ grokapps/rdbz3cformexample/trunk/etc/debug.ini.in 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,66 @@
+# debug.ini
+#
+# Debugging configuration for use with paster/WSGI
+#
+
+[loggers]
+keys = root, wsgi
+
+[handlers]
+keys = console, accesslog
+
+[formatters]
+keys = generic, accesslog
+
+[formatter_generic]
+format = %(asctime)s %(levelname)s [%(name)s] %(message)s
+
+[formatter_accesslog]
+format = %(message)s
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[handler_accesslog]
+class = FileHandler
+args = (os.path.join(r'${zope_conf:logfiles}', 'access.log'),
+ 'a')
+level = INFO
+formatter = accesslog
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_wsgi]
+level = INFO
+handlers = accesslog
+qualname = wsgi
+propagate = 0
+
+[filter:translogger]
+use = egg:Paste#translogger
+setup_console_handler = False
+logger_name = wsgi
+
+[filter-app:main]
+# Change the last part from 'ajax' to 'pdb' for a post-mortem debugger
+# on the console:
+use = egg:z3c.evalexception#ajax
+next = zope
+
+[app:zope]
+use = egg:rdbz3cformexample
+filter-with = translogger
+
+[server:main]
+use = egg:Paste#http
+host = 127.0.0.1
+port = 8080
+
+[DEFAULT]
+# set the name of the zope.conf file
+zope_conf = %(here)s/zope.conf
\ No newline at end of file
Added: grokapps/rdbz3cformexample/trunk/etc/deploy.ini.in
===================================================================
--- grokapps/rdbz3cformexample/trunk/etc/deploy.ini.in (rev 0)
+++ grokapps/rdbz3cformexample/trunk/etc/deploy.ini.in 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,60 @@
+# deploy.ini
+#
+# Deployment configuration for use with paster/WSGI
+#
+
+[loggers]
+keys = root, wsgi
+
+[handlers]
+keys = console, accesslog
+
+[formatters]
+keys = generic, accesslog
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_wsgi]
+level = INFO
+handlers = accesslog
+qualname = wsgi
+propagate = 0
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[handler_accesslog]
+class = FileHandler
+args = (os.path.join(r'${zope_conf:logfiles}', 'access.log'),
+ 'a')
+level = INFO
+formatter = accesslog
+
+[formatter_generic]
+format = %(asctime)s %(levelname)s [%(name)s] %(message)s
+
+[formatter_accesslog]
+format = %(message)s
+
+[filter:translogger]
+use = egg:Paste#translogger
+setup_console_handler = False
+logger_name = wsgi
+
+[app:main]
+use = egg:rdbz3cformexample
+filter-with = translogger
+
+[server:main]
+use = egg:Paste#http
+host = 127.0.0.1
+port = 8080
+
+[DEFAULT]
+# set the name of the zope.conf file
+zope_conf = %(here)s/zope.conf
Added: grokapps/rdbz3cformexample/trunk/etc/site.zcml.in
===================================================================
--- grokapps/rdbz3cformexample/trunk/etc/site.zcml.in (rev 0)
+++ grokapps/rdbz3cformexample/trunk/etc/site.zcml.in 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,36 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="rdbz3cformexample">
+
+ <include package="rdbz3cformexample" />
+
+ <configure i18n_domain="rdbz3cformexample">
+
+ <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="admin"
+ password_manager="SHA1"
+ password="b551f0e9d033e22ae348aeb5660fc2140aec35850c4da997"
+ />
+
+ <!-- Replace the following directive if you do not 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" />
+ </configure>
+</configure>
Added: grokapps/rdbz3cformexample/trunk/etc/zdaemon.conf.in
===================================================================
--- grokapps/rdbz3cformexample/trunk/etc/zdaemon.conf.in (rev 0)
+++ grokapps/rdbz3cformexample/trunk/etc/zdaemon.conf.in 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,8 @@
+<runner>
+ program bin/paster serve ${buildout:directory}/parts/etc/deploy.ini
+ daemon on
+ transcript ${zope_conf:logfiles}/zdaemon.log
+ socket-name ${zope_conf:logfiles}/zdaemonsock
+ # Enable this to run the child process as a different user
+ # user zope
+</runner>
Added: grokapps/rdbz3cformexample/trunk/etc/zope.conf.in
===================================================================
--- grokapps/rdbz3cformexample/trunk/etc/zope.conf.in (rev 0)
+++ grokapps/rdbz3cformexample/trunk/etc/zope.conf.in 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,55 @@
+# Identify the component configuration used to define the site:
+site-definition ${site_zcml:output}
+
+<zodb>
+ # Standard blob storage
+ <blobstorage>
+ blob-dir ${zope_conf:blobstorage}
+ <filestorage>
+ path ${zope_conf:filestorage}/Data.fs
+ </filestorage>
+ </blobstorage>
+
+# Uncomment this if you want a blob-less standard file storage instead:
+# <filestorage>
+# path ${zope_conf:filestorage}
+# </filestorage>
+
+# Uncomment this if you want to connect to a ZEO server instead:
+# <zeoclient>
+# server localhost:8100
+# storage 1
+# # ZEO client cache, in bytes
+# cache-size 20MB
+# # Uncomment to have a persistent disk cache
+# #client zeo1
+# </zeoclient>
+
+</zodb>
+
+<eventlog>
+ # This sets up logging to a file.
+ # The "path" setting can be a relative or absolute
+ # filesystem path.
+
+ <logfile>
+ path ${zope_conf:logfiles}/z3.log
+ formatter zope.exceptions.log.Formatter
+ </logfile>
+
+ # This sets up logging to to standard output.
+ # The "path" setting can be the tokens STDOUT or STDERR
+
+# <logfile>
+# path STDOUT
+# formatter zope.exceptions.log.Formatter
+# </logfile>
+</eventlog>
+
+# Comment this line to disable developer mode. This should be done in
+# production
+devmode on
+
+# Extra configuration lines can be added to zope_conf's extra option. Put for
+# instance productconf sections in here.
+${zope_conf:extra}
Added: grokapps/rdbz3cformexample/trunk/setup.py
===================================================================
--- grokapps/rdbz3cformexample/trunk/setup.py (rev 0)
+++ grokapps/rdbz3cformexample/trunk/setup.py 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,36 @@
+from setuptools import setup, find_packages
+
+version = '0.0'
+
+setup(name='rdbz3cformexample',
+ version=version,
+ description="",
+ long_description="""\
+""",
+ # Get strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+ classifiers=[],
+ keywords="",
+ author="",
+ author_email="",
+ url="",
+ license="",
+ package_dir={'': 'src'},
+ packages=find_packages('src'),
+ include_package_data=True,
+ zip_safe=False,
+ install_requires=['setuptools',
+ 'grok',
+ 'grokui.admin',
+ 'z3c.testsetup',
+ 'grokcore.startup',
+ 'megrok.rdb',
+ # Add extra requirements here
+ ],
+ entry_points = """
+ [console_scripts]
+ rdbz3cformexample-debug = grokcore.startup:interactive_debug_prompt
+ rdbz3cformexample-ctl = grokcore.startup:zdaemon_controller
+ [paste.app_factory]
+ main = grokcore.startup:application_factory
+ """,
+ )
Added: grokapps/rdbz3cformexample/trunk/sources.cfg
===================================================================
--- grokapps/rdbz3cformexample/trunk/sources.cfg (rev 0)
+++ grokapps/rdbz3cformexample/trunk/sources.cfg 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,12 @@
+[buildout]
+extends = buildout.cfg
+extensions += mr.developer
+auto-checkout +=
+ megrok.rdb
+ z3c.saconfig
+
+[sources]
+megrok.rdb = svn svn+ssh://svn.zope.org/repos/main/megrok.rdb/trunk
+z3c.saconfig = svn svn+ssh://svn.zope.org/repos/main/z3c.saconfig/trunk
+zope.sqlalchemy = svn svn+ssh://svn.zope.org/repos/main/zope.sqlalchemy/trunk
+
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/__init__.py
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/__init__.py (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/__init__.py 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1 @@
+# this directory is a package
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.py
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.py (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.py 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,152 @@
+import grok
+from megrok import rdb
+from megrok.rdb.schema import schema_from_model
+
+from zope.location.location import located
+
+from sqlalchemy.schema import Column, ForeignKey
+from sqlalchemy.types import Integer, String
+from sqlalchemy.orm import relation
+
+from z3c.saconfig import EngineFactory, GloballyScopedSession
+from z3c.saconfig.interfaces import IEngineCreatedEvent
+
+# we set up the engine factory and the session
+# we set them up as global utilities here. It is also possible to
+# use a local engine factory and a special locally scoped session
+TEST_DSN = 'sqlite:///:memory:'
+
+engine_factory = EngineFactory(TEST_DSN)
+scoped_session = GloballyScopedSession()
+
+grok.global_utility(engine_factory, direct=True)
+grok.global_utility(scoped_session, direct=True)
+
+# we set up the SQLAlchemy metadata object to which we'll associate all the
+# SQLAlchemy-backed objects
+metadata = rdb.MetaData()
+
+# we declare to megrok.rdb that all SQLAlchemy-managed mapped instances
+# are associated with this metadata. This directive can also be used
+# on a per rdb.Model subclass basis
+rdb.metadata(metadata)
+
+# we make sure that when the engine is created we set up the metadata for it
+ at grok.subscribe(IEngineCreatedEvent)
+def setUpDatabase(event):
+ rdb.setupDatabase(metadata)
+
+class RDBExample(grok.Application, grok.Model, rdb.QueryContainer):
+ """The application object.
+
+ We mix in grok.Model to make it persistent so it can be installed using
+ the Grok UI.
+
+ We mix in rdb.QueryContainer to let it behave like a container. We
+ need to implement the query method to supply it with a query object.
+ """
+ def query(self):
+ session = rdb.Session()
+ # we allow browsing into any Faculty object
+ # we could've restricted this query so that it would only
+ # allow browsing to a subset
+ return session.query(Faculty)
+
+class RDBExampleIndex(grok.View):
+ """The index page for RDBExample. This shows all faculties available.
+ """
+ grok.name('index')
+ grok.context(RDBExample)
+
+ def faculties(self):
+ session = rdb.Session()
+ for faculty in session.query(Faculty).all():
+ yield located(faculty, self.context, str(faculty.id))
+
+class AddFaculty(grok.AddForm):
+ """A form to add a new Faculty object to the application.
+ """
+ grok.context(RDBExample)
+
+ @property
+ def form_fields(self):
+ return grok.Fields(schema_from_model(Faculty))
+ #return rdb.Fields(Faculty)
+
+ @grok.action('add')
+ def handle_add(self, *args, **kw):
+ faculty = Faculty(**kw)
+ session = rdb.Session()
+ session.add(faculty)
+ self.redirect(self.url(self.context))
+
+class Departments(rdb.Container):
+ """This container implements the departments relation on Faculty.
+ """
+
+ # we browse to departments using the title attribute of Department,
+ # which is assumed (or constrained) to be unique. By default this
+ # would use the primary key of Department for browsing.
+ rdb.key('title')
+
+class Faculty(rdb.Model):
+ """This model implements the faculty content object.
+
+ It's backed by a relational database.
+ """
+
+ # we declare that the departments atribute can be browsed into
+ grok.traversable('departments')
+
+ # the attributes of a faculty, stored in the database
+ id = Column('id', Integer, primary_key=True)
+ title = Column('title', String(50))
+
+ # we declare a relation, using our special Departments class
+ departments = relation('Department',
+ backref='faculty',
+ collection_class=Departments)
+
+class FacultyIndex(grok.View):
+ """This is the default view for Faculty.
+ """
+ grok.name('index')
+ grok.context(Faculty)
+
+class Department(rdb.Model):
+ """This model implements the department content object.
+
+ Each department is in a faculty.
+
+ It's backed by a relational database.
+ """
+
+ # the attributes of a department
+ id = Column('id', Integer, primary_key=True)
+ # the id of the faculty that this department is in
+ faculty_id = Column('faculty_id', Integer, ForeignKey('faculty.id'))
+ title = Column('title', String(50))
+
+class AddDepartment(grok.AddForm):
+ grok.context(Departments)
+
+ @property
+ def form_fields(self):
+ return rdb.Fields(Department)
+
+ @grok.action('add')
+ def handle_add(self, *args, **kw):
+ department = Department(**kw)
+ session = rdb.Session()
+ session.add(department)
+ self.context.set(department)
+ self.redirect(self.url(self.context))
+
+class DepartmentIndex(grok.View):
+ grok.name('index')
+ grok.context(Department)
+
+class DepartmentsIndex(grok.View):
+ grok.name('index')
+ grok.context(Departments)
+
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.txt
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.txt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app.txt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,32 @@
+Do a functional doctest test on the app.
+========================================
+
+:Test-Layer: functional
+
+Let's first create an instance of Rdbz3cformexample at the top level:
+
+ >>> from rdbz3cformexample.app import Rdbz3cformexample
+ >>> root = getRootFolder()
+ >>> root['app'] = Rdbz3cformexample()
+
+
+Run tests in the testbrowser
+----------------------------
+
+The zope.testbrowser.browser module exposes a Browser class that
+simulates a web browser similar to Mozilla Firefox or IE. We use that
+to test how our application behaves in a browser. For more
+information, see http://pypi.python.org/pypi/zope.testbrowser.
+
+Create a browser and visit the instance you just created:
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.open('http://localhost/app')
+
+Check some basic information about the page you visit:
+
+ >>> browser.url
+ 'http://localhost/app'
+ >>> browser.headers.get('Status').upper()
+ '200 OK'
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentindex.pt
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentindex.pt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentindex.pt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,5 @@
+<html>
+<body>
+<h2>Department <span tal:content="context/title"></span></h2>
+</body>
+</html>
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentsindex.pt
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentsindex.pt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/departmentsindex.pt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,15 @@
+<html>
+<body>
+<h3>Departments of faculty <span tal:replace="context/__parent__/title"></span></h3>
+<ul>
+ <li tal:repeat="department context/values">
+ <a tal:attributes="href python:view.url(department)"
+ tal:content="department/title"></a>
+ </li>
+</ul>
+
+<p>
+ <a tal:attributes="href python:view.url(context, '@@adddepartment')">Add Department</a>
+</p>
+</body>
+</html>
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/facultyindex.pt
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/facultyindex.pt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/facultyindex.pt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,11 @@
+<html>
+<body>
+<h2>Faculty <span tal:content="context/title"></span></h2>
+<h3>Departments</h3>
+
+<p>
+ <a tal:attributes="href python:view.url(context.departments)">Departments</a>
+</p>
+
+</body>
+</html>
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/rdbexampleindex.pt
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/rdbexampleindex.pt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/app_templates/rdbexampleindex.pt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,14 @@
+<html>
+<body>
+<h2>RDB Example</h2>
+<h3>Faculty listing</h3>
+<ul>
+ <li tal:repeat="faculty view/faculties">
+ <a tal:attributes="href python:view.url(faculty)" tal:content="faculty/title"></a>
+ </li>
+</ul>
+<p>
+ <a tal:attributes="href python:view.url('@@addfaculty')">Add Faculty</a>
+</p>
+</body>
+</html>
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/configure.zcml
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/configure.zcml (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/configure.zcml 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,6 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ xmlns:grok="http://namespaces.zope.org/grok">
+ <include package="grok" />
+ <includeDependencies package="." />
+ <grok:grok package="." />
+</configure>
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/ftesting.zcml
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/ftesting.zcml (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/ftesting.zcml 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,34 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="rdbz3cformexample"
+ package="rdbz3cformexample"
+ >
+
+ <include package="rdbz3cformexample" />
+
+ <!-- Typical functional testing security setup -->
+ <securityPolicy
+ component="zope.securitypolicy.zopepolicy.ZopeSecurityPolicy"
+ />
+
+ <unauthenticatedPrincipal
+ id="zope.anybody"
+ title="Unauthenticated User"
+ />
+ <grant
+ permission="zope.View"
+ principal="zope.anybody"
+ />
+
+ <principal
+ id="zope.mgr"
+ title="Manager"
+ login="mgr"
+ password="mgrpw"
+ />
+
+ <role id="zope.Manager" title="Site Manager" />
+ <grantAll role="zope.Manager" />
+ <grant role="zope.Manager" principal="zope.mgr" />
+
+</configure>
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/static/README.txt
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/static/README.txt (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/static/README.txt 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,2 @@
+Put static files here, like javascript and css. They will be
+available as static/<filename> in views.
Added: grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/tests.py
===================================================================
--- grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/tests.py (rev 0)
+++ grokapps/rdbz3cformexample/trunk/src/rdbz3cformexample/tests.py 2009-09-18 08:48:03 UTC (rev 104277)
@@ -0,0 +1,12 @@
+import os.path
+import z3c.testsetup
+import rdbz3cformexample
+from zope.app.testing.functional import ZCMLLayer
+
+
+ftesting_zcml = os.path.join(
+ os.path.dirname(rdbz3cformexample.__file__), 'ftesting.zcml')
+FunctionalLayer = ZCMLLayer(ftesting_zcml, __name__, 'FunctionalLayer',
+ allow_teardown=True)
+
+test_suite = z3c.testsetup.register_all_tests('rdbz3cformexample')
More information about the checkins
mailing list