[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