[Checkins] SVN: zmi.core/trunk/s Copy sqlscript browser package.
Yusei Tahara
yusei at domen.cx
Sat Sep 5 05:03:49 EDT 2009
Log message for revision 103584:
Copy sqlscript browser package.
Changed:
U zmi.core/trunk/setup.py
A zmi.core/trunk/src/zmi/core/sqlscript/
A zmi.core/trunk/src/zmi/core/sqlscript/__init__.py
A zmi.core/trunk/src/zmi/core/sqlscript/add.pt
A zmi.core/trunk/src/zmi/core/sqlscript/configure.zcml
A zmi.core/trunk/src/zmi/core/sqlscript/edit.pt
A zmi.core/trunk/src/zmi/core/sqlscript/sqlscript.py
A zmi.core/trunk/src/zmi/core/sqlscript/test.pt
A zmi.core/trunk/src/zmi/core/sqlscript/testresults.pt
A zmi.core/trunk/src/zmi/core/sqlscript/tests.py
-=-
Modified: zmi.core/trunk/setup.py
===================================================================
--- zmi.core/trunk/setup.py 2009-09-05 08:46:01 UTC (rev 103583)
+++ zmi.core/trunk/setup.py 2009-09-05 09:03:48 UTC (rev 103584)
@@ -51,6 +51,7 @@
'zope.app.applicationcontrol',
'zope.app.authentication',
'zope.app.broken',
+ 'zope.app.cache',
'zope.app.component',
'zope.app.container',
'zope.app.error',
@@ -59,9 +60,9 @@
'zope.app.i18n',
'zope.app.intid',
'zope.app.principalannotation',
+ 'zope.app.securitypolicy',
+ 'zope.app.sqlscript',
'zope.app.undo',
- 'zope.app.securitypolicy',
- 'zope.app.cache',
],
extras_require=dict(test=['zope.app.testing',
'zope.securitypolicy',
Added: zmi.core/trunk/src/zmi/core/sqlscript/__init__.py
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/__init__.py (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/__init__.py 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.
Added: zmi.core/trunk/src/zmi/core/sqlscript/add.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/add.pt (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/add.pt 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,19 @@
+<html metal:use-macro="context/@@standard_macros/page"
+ i18n:domain="zope">
+
+ <head>
+ <title>SQL Script</title>
+ </head>
+ <body>
+
+ <div metal:fill-slot="body">
+
+ <div metal:use-macro="view/generated_form/macros/addform">
+ <input type="submit" i18n:attributes="value add-and-test"
+ value="Add and Test" metal:fill-slot="extra_buttons"
+ name="add_test" />
+ </div>
+ </div>
+ </body>
+
+</html>
Added: zmi.core/trunk/src/zmi/core/sqlscript/configure.zcml
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/configure.zcml (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/configure.zcml 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,76 @@
+<configure
+ xmlns='http://namespaces.zope.org/zope'
+ xmlns:browser='http://namespaces.zope.org/browser'
+ i18n_domain='zope'
+ >
+
+ <browser:addMenuItem
+ title="SQL Script"
+ description="A content-based script to execute dynamic SQL."
+ class="zope.app.sqlscript.SQLScript"
+ permission="zope.ManageContent"
+ view="zope.app.sqlscript.SQLScript"
+ />
+
+ <browser:addform
+ schema="zope.app.sqlscript.interfaces.ISQLScript"
+ label="Add a SQL Script"
+ content_factory="..sqlscript.SQLScript"
+ keyword_arguments="connectionName source arguments"
+ name="zope.app.sqlscript.SQLScript"
+ permission="zope.ManageContent"
+ template="add.pt"
+ class=".sqlscript.SQLScriptAdd"
+ />
+
+ <browser:editform
+ schema="zope.app.sqlscript.interfaces.ISQLScript"
+ name="edit.html"
+ menu="zmi_views"
+ label="Edit an SQL script"
+ permission="zope.ManageContent"
+ template="edit.pt"
+ class=".sqlscript.SQLScriptEdit"
+ />
+
+ <browser:pages
+ for="zope.app.sqlscript.interfaces.ISQLScript"
+ permission="zope.View"
+ class=".sqlscript.SQLScriptTest" >
+
+ <browser:page
+ name="test.html"
+ template="test.pt"
+ menu="zmi_views"
+ title="[test-page-title] Test"
+ />
+ <browser:page
+ name="testResults.html"
+ template="testresults.pt"
+ />
+
+ </browser:pages>
+
+ <browser:pages
+ for="zope.app.sqlscript.interfaces.ISQLScript"
+ permission="zope.ManageBindings"
+ class="zope.app.cache.browser.cacheable.CacheableView"
+ >
+
+ <browser:page
+ name="Caching.html"
+ attribute="form"
+ menu="zmi_views" title="Caching"
+ />
+ <browser:page
+ name="ChangeCaching.html"
+ attribute="action"
+ />
+ <browser:page
+ name="InvalidateCache.html"
+ attribute="invalidate"
+ />
+
+ </browser:pages>
+
+</configure>
Added: zmi.core/trunk/src/zmi/core/sqlscript/edit.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/edit.pt (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/edit.pt 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,19 @@
+<html metal:use-macro="context/@@standard_macros/view"
+ i18n:domain="zope">
+
+ <head>
+ <title>SQL Script</title>
+ </head>
+ <body>
+
+ <div metal:fill-slot="body">
+
+ <div metal:use-macro="view/generated_form/macros/body">
+ <input type="submit" i18n:attributes="value change-and-test"
+ value="Change and Test" metal:fill-slot="extra_buttons"
+ name="change_test" />
+ </div>
+ </div>
+ </body>
+
+</html>
Added: zmi.core/trunk/src/zmi/core/sqlscript/sqlscript.py
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/sqlscript.py (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/sqlscript.py 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,195 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 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.
+#
+##############################################################################
+"""SQL Script Views
+
+$Id: sqlscript.py 67630 2006-04-27 00:54:03Z jim $
+"""
+from zope.rdb.interfaces import DatabaseException
+from zope.traversing.browser import absoluteURL
+from zope.app.form.browser.submit import Update
+from zope.app.sqlscript.interfaces import ISQLScript
+
+class SQLScriptTest(object):
+ """Test the SQL inside the SQL Script
+ """
+
+ __used_for__ = ISQLScript
+
+ error = None
+
+ def getArguments(self):
+ form = self.request.form
+ arguments = {}
+
+ for argname, argvalue in self.context.getArguments().items():
+ value = form.get(argname)
+ if value is None:
+ value = argvalue.get('default')
+ if value is not None:
+ arguments[argname.encode('UTF-8')] = value
+ return arguments
+
+ def getTestResults(self):
+ try:
+ return self.context(**self.getArguments())
+ except (DatabaseException, AttributeError, Exception), error:
+ self.error = error
+ return []
+
+ def getFormattedError(self):
+ error = str(self.error)
+ return error
+
+ def getRenderedSQL(self):
+ return self.context.getTemplate()(**self.getArguments())
+
+class SQLScriptAdd(object):
+ """Provide interface to add SQL Script
+ """
+
+ def update(self):
+ """Set the Update variable for Add and Test
+ >>> from zope.publisher.browser import TestRequest
+
+ >>> rqst = TestRequest()
+ >>> class Base(object):
+ ... def __init__(self, request):
+ ... self.request = request
+ ... def update(self):
+ ... self.updated = True
+
+ >>> class V(SQLScriptAdd, Base):
+ ... pass
+
+ >>> dc = V(rqst)
+ >>> dc.update()
+ >>> dc.updated
+ True
+ >>> 'UPDATE_SUBMIT' in rqst
+ False
+ >>> d = {'add_test': True}
+ >>> rqst1 = TestRequest(form = d)
+ >>> dc1 = V(rqst1)
+ >>> dc1.update()
+ >>> 'UPDATE_SUBMIT' in rqst1
+ True
+ """
+ if 'add_test' in self.request:
+ self.request.form[Update] = ''
+
+ return super(SQLScriptAdd, self).update()
+
+ def nextURL(self):
+ """
+ >>> from zope.publisher.browser import TestRequest
+ >>> from zope.app.testing.placelesssetup import setUp, tearDown
+ >>> setUp()
+ >>> rqst = TestRequest()
+ >>> class Base(object):
+ ... def __init__(self, request):
+ ... self.request = request
+ ... self.context = self
+ ... self.contentName = 'new srcipt'
+ ... def __getitem__(self, key):
+ ... return None
+ ... def nextURL(self):
+ ... return "www.zeomega.com"
+
+ >>> class V(SQLScriptAdd, Base):
+ ... pass
+ >>>
+ >>> rqst = TestRequest()
+ >>> dc = V(rqst)
+ >>> dc.nextURL()
+ 'www.zeomega.com'
+ >>> d = {'add_test': True}
+ >>> rqst1 = TestRequest(form = d)
+ >>> dc1 = V(rqst1)
+ >>> dc1.nextURL()
+ 'http://127.0.0.1/test.html'
+ """
+ if 'add_test' in self.request:
+ name = self.context.contentName
+ container = self.context.context
+ obj = container[name]
+ url = absoluteURL(obj, self.request)
+ url = '%s/test.html' % url
+ return url
+ else:
+ return super(SQLScriptAdd, self).nextURL()
+
+class SQLScriptEdit(object):
+ """Provide interface to Edit and Test SQL Script
+ """
+
+ def update(self):
+ """Set the Update variable for Change and Test
+ >>> from zope.publisher.browser import TestRequest
+
+ >>> rqst = TestRequest()
+ >>> class Base(object):
+ ... def __init__(self, request):
+ ... self.request = request
+ ... self.errors = ('no errors')
+ ... def update(self):
+ ... self.updated = True
+ ... return "update returned"
+
+ >>> class V(SQLScriptEdit, Base):
+ ... pass
+
+ >>> dc = V(rqst)
+ >>> dc.update()
+ 'update returned'
+ >>> dc.updated
+ True
+ >>> 'UPDATE_SUBMIT' in rqst
+ False
+ >>>
+
+ >>> d = {'change_test': True}
+ >>> rqst1 = TestRequest(form = d)
+ >>> dc1 = V(rqst1)
+ >>> dc1.errors = ()
+ >>> dc1.update()
+ 'update returned'
+ >>> 'UPDATE_SUBMIT' in rqst1
+ True
+ >>> dc1.updated
+ True
+ >>> rqst1.response.getHeader('location')
+ 'test.html'
+ >>> rqst1.response.getStatus()
+ 302
+
+ >>> d = {'change_test': True}
+ >>> rqst2 = TestRequest(form = d)
+ >>> dc2 = V(rqst2)
+ >>> dc2.errors = ('errorname', 1234)
+ >>> dc2.update()
+ 'update returned'
+ >>> 'UPDATE_SUBMIT' in rqst2
+ True
+ >>> rqst2.response.getHeader('location')
+
+ >>> rqst2.response.getStatus()
+ 599
+ """
+ if 'change_test' in self.request:
+ self.request.form[Update] = ''
+ super(SQLScriptEdit, self).update()
+ if not self.errors:
+ url = 'test.html'
+ self.request.response.redirect(url)
+ return super(SQLScriptEdit, self).update()
Added: zmi.core/trunk/src/zmi/core/sqlscript/test.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/test.pt (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/test.pt 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,39 @@
+<html metal:use-macro="context/@@standard_macros/view"
+ i18n:domain="zope">
+<body>
+
+<div metal:fill-slot="body">
+<form action="." method="post">
+
+ <pre tal:content="context/source" />
+
+ <table border="1"
+ tal:define="args context/getArguments"
+ tal:condition="args">
+ <tbody>
+ <tr>
+ <th i18n:translate="">Argument Name</th>
+ <th i18n:translate="">Type</th>
+ <th i18n:translate="">Value</th>
+ </tr>
+
+ <tr tal:repeat="arg python: args.keys()">
+ <td tal:content="arg"></td>
+ <td tal:content="python: args[arg].get('type')"> </td>
+ <td><input type="text" name="" size="10" value=""
+ tal:attributes="value python: args[arg].get('default');
+ name arg"/></td>
+ </tr>
+
+
+ </tbody>
+ </table>
+
+ <input type="submit" name="testResults.html:method" value="Test"
+ i18n:attributes="value test-button"/>
+
+</form>
+</div>
+
+</body>
+</html>
Added: zmi.core/trunk/src/zmi/core/sqlscript/testresults.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/testresults.pt (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/testresults.pt 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,36 @@
+<html metal:use-macro="context/@@standard_macros/page"
+ i18n:domain="zope">
+<body>
+
+<div metal:fill-slot="body">
+
+ <pre tal:content="view/getRenderedSQL" />
+
+ <table border="1" cellspacing="0" cellpadding="2"
+ tal:define="result view/getTestResults"
+ tal:condition="result">
+ <tbody>
+
+ <tr>
+ <th tal:repeat="field result/columns"
+ tal:content="field">Field Name</th>
+ </tr>
+
+ <tr tal:repeat="row result">
+ <td tal:repeat="field result/columns"
+ tal:content="python: getattr(row, field)">Value</td>
+ </tr>
+
+
+ </tbody>
+ </table>
+
+ <tal:block tal:condition="view/error">
+ <h3 i18n:translate="">An Error occurred</h3>
+ <pre tal:content="view/getFormattedError" />
+ </tal:block>
+
+</div>
+
+</body>
+</html>
Added: zmi.core/trunk/src/zmi/core/sqlscript/tests.py
===================================================================
--- zmi.core/trunk/src/zmi/core/sqlscript/tests.py (rev 0)
+++ zmi.core/trunk/src/zmi/core/sqlscript/tests.py 2009-09-05 09:03:48 UTC (rev 103584)
@@ -0,0 +1,150 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 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
+#
+##############################################################################
+"""DTML Page Evaluation Tests
+
+$Id: tests.py 81155 2007-10-28 02:17:04Z srichter $
+"""
+import unittest
+from xml.sax.saxutils import escape
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.app.testing.functional import BrowserTestCase
+from zope.app.sqlscript.sqlscript import SQLScript
+from zope.app.sqlscript.testing import SQLScriptLayer
+
+
+class SQLScriptTest(BrowserTestCase):
+
+ content = u'SELECT * FROM foo'
+
+ def addSQLScript(self):
+ sqlscript = SQLScript()
+ sqlscript.source = self.content
+ root = self.getRootFolder()
+ root['sqlscript'] = sqlscript
+ self.commit()
+
+
+ def testAddForm(self):
+ response = self.publish(
+ '/+/zope.app.sqlscript.SQLScript=',
+ basic='mgr:mgrpw')
+ self.assertEqual(response.getStatus(), 200)
+ body = response.getBody()
+ self.assert_('Add a SQL Script' in body)
+ self.assert_('Connection Name' in body)
+ self.assert_('(no value)' in body)
+ self.assert_('Arguments' in body)
+ self.assert_('Source' in body)
+ self.assert_('Object Name' in body)
+ self.assert_('"Add"' in body)
+ self.assert_('"Add and Test"' in body)
+ self.checkForBrokenLinks(body, '/+/zope.app.sqlscript.SQLScript=',
+ 'mgr:mgrpw')
+
+
+ def testAdd(self):
+ response = self.publish(
+ '/+/zope.app.sqlscript.SQLScript=',
+ form={'type_name': u'zope.app.sqlscript.SQLScript',
+ 'field.source': u'SELECT * FROM foo',
+ 'field.connectionName.used': u'',
+ 'field.connectionName': u'',
+ 'add_input_name': u'sqlscript',
+ 'UPDATE_SUBMIT': u'Add'},
+ basic='mgr:mgrpw')
+ self.assertEqual(response.getStatus(), 302)
+ self.assertEqual(response.getHeader('Location'),
+ 'http://localhost/@@contents.html')
+ root = self.getRootFolder()
+ self.assert_('sqlscript' in root)
+ sqlscript = root['sqlscript']
+ self.assertEqual(sqlscript.source, self.content)
+ self.assertEqual(sqlscript.arguments, '')
+ self.assertEqual(sqlscript.connectionName, None)
+
+ response = self.publish(
+ '/+/zope.app.sqlscript.SQLScript=',
+ form={'type_name': u'zope.app.sqlscript.SQLScript',
+ 'field.source': u'SELECT * FROM foo',
+ 'field.arguments': u'table',
+ 'field.connectionName.used': u'',
+ 'field.connectionName': u'',
+ 'add_input_name': u'sqlscript1',
+ 'UPDATE_SUBMIT': u'Add'},
+ basic='mgr:mgrpw')
+ root = self.getRootFolder()
+ sqlscript = root['sqlscript1']
+ self.assertEqual(sqlscript.source, 'SELECT * FROM foo')
+ self.assertEqual(sqlscript.arguments, 'table')
+ self.assertEqual(sqlscript.connectionName, None)
+
+
+ def testEditForm(self):
+ self.addSQLScript()
+ response = self.publish(
+ '/sqlscript/@@edit.html',
+ basic='mgr:mgrpw')
+ self.assertEqual(response.getStatus(), 200)
+ body = response.getBody()
+ self.assert_('Connection Name' in body)
+ self.assert_('(no value)' in body)
+ self.assert_('Arguments' in body)
+ self.assert_('Source' in body)
+ self.assert_('Connection Name' in body)
+ self.assert_('"Change"' in body)
+ self.assert_('"Change and Test"' in body)
+ self.assert_(escape(self.content) in body)
+ self.checkForBrokenLinks(body, '/sqlscript/@@edit.html', 'mgr:mgrpw')
+
+
+ def testEdit(self):
+ self.addSQLScript()
+ response = self.publish(
+ '/sqlscript/@@edit.html',
+ form={'field.source': u'SELECT * FROM bar',
+ 'field.connectionName.used': u'',
+ 'field.connectionName': u'',
+ 'UPDATE_SUBMIT': u'Change'},
+ basic='mgr:mgrpw')
+ self.assertEqual(response.getStatus(), 200)
+ body = response.getBody()
+ self.assert_('Edit an SQL script' in body)
+ self.assert_(escape(u'SELECT * FROM bar') in body)
+ root = self.getRootFolder()
+ sqlscript = root['sqlscript']
+ self.assertEqual(sqlscript.source, 'SELECT * FROM bar')
+
+ def testTestForm(self):
+ self.addSQLScript()
+ response = self.publish(
+ '/sqlscript/@@test.html',
+ basic='mgr:mgrpw')
+ body = response.getBody()
+ self.assert_('"Test"' in body)
+ self.assert_(escape(self.content) in body)
+ self.assertEqual(response.getStatus(), 200)
+ self.checkForBrokenLinks(body, '/sqlscript/@@test.html', 'mgr:mgrpw')
+
+
+def test_suite():
+ SQLScriptTest.layer = SQLScriptLayer
+ return unittest.TestSuite((
+ doctest.DocTestSuite('zmi.core.sqlscript.sqlscript',
+ setUp=setup.placelessSetUp,
+ tearDown=setup.placelessTearDown),
+ unittest.makeSuite(SQLScriptTest),
+ ))
+
+if __name__ == '__main__': unittest.main()
More information about the checkins
mailing list