[Checkins] SVN: zmi.core/trunk/src/zmi/core/applicationcontrol/ Copy browser code from zope.app.applicationcontrol.

Yusei Tahara yusei at domen.cx
Sun Jun 7 11:21:29 EDT 2009


Log message for revision 100687:
  Copy browser code from zope.app.applicationcontrol.
  

Changed:
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/__init__.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/configure.zcml
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/__init__.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_errorredirect.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_translationdomaincontrol.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_zodbcontrol.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/zodb.txt
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.pt
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.pt
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/tests/
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/tests/__init__.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_runtimeinfoview.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_servercontrolview.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_translationdomaincontrol.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.pt
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.py
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.pt
  A   zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.py

-=-
Added: zmi.core/trunk/src/zmi/core/applicationcontrol/__init__.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/__init__.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/__init__.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/configure.zcml
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/configure.zcml	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/configure.zcml	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,56 @@
+<zope:configure 
+   xmlns:zope="http://namespaces.zope.org/zope"
+   xmlns="http://namespaces.zope.org/browser">
+
+   <page
+      for="zope.app.applicationcontrol.interfaces.IApplicationControl"
+      name="servercontrol.html"
+      template="servercontrol.pt"
+      class=".servercontrol.ServerControlView"
+      permission="zope.ManageApplication"/>
+
+   <page
+      for="zope.app.applicationcontrol.interfaces.IApplicationControl"
+      name="index.html"
+      template="runtimeinfo.pt"
+      class=".runtimeinfo.RuntimeInfoView"
+      permission="zope.ManageApplication"/>
+
+  <menuItems
+      menu="zmi_views"
+      for="zope.app.applicationcontrol.interfaces.IApplicationControl">
+
+    <menuItem
+        order="-2"
+        title="Runtime Information"
+        action="index.html" />
+    <menuItem
+        order="-1"
+        title="Server Control"
+        action="servercontrol.html" />
+  </menuItems>
+
+  <page
+      for="zope.app.applicationcontrol.interfaces.IApplicationControl"
+      name="ZODBControl.html"
+      template="zodbcontrol.pt"
+      class=".zodbcontrol.ZODBControlView"
+      permission="zope.ManageApplication"
+      menu="zmi_views" title="ZODB Control"/>
+
+  <page
+      for="zope.app.applicationcontrol.interfaces.IApplicationControl"
+      name="TranslationDomain.html"
+      template="translationdomaincontrol.pt"
+      class=".translationdomaincontrol.TranslationDomainControlView"
+      permission="zope.ManageApplication"
+      menu="zmi_views" title="Translation Domains"/>
+
+  <!-- add a action tab to the root folder for navigation -->
+  <menuItem
+      menu="zmi_actions"
+      for="zope.traversing.interfaces.IContainmentRoot"
+      title="Manage Process"
+      action="++etc++process/index.html" />
+
+</zope:configure>

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/__init__.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/__init__.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/__init__.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1 @@
+# Import this.

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_errorredirect.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_errorredirect.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_errorredirect.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,40 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""ZODB Control Tests
+
+$Id: test_errorredirect.py 72480 2007-02-09 09:14:25Z baijum $
+"""
+import unittest
+
+from zope.app.testing.functional import BrowserTestCase
+from zope.app.applicationcontrol.testing import ApplicationControlLayer
+
+class ErrorRedirectTest(BrowserTestCase):
+
+    def testErrorRedirect(self):
+        response = self.publish('/++etc++process/@@errorRedirect.html',
+                                basic='globalmgr:globalmgrpw')
+        self.failUnlessEqual('http://localhost/@@errorRedirect.html',
+                             response.getHeader('Location'))
+        self.failUnlessEqual(302, response.getStatus())
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    ErrorRedirectTest.layer = ApplicationControlLayer
+    suite.addTest(unittest.makeSuite(ErrorRedirectTest))
+    return suite
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_translationdomaincontrol.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_translationdomaincontrol.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_translationdomaincontrol.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Translation Domain Control Tests
+
+$Id: test_translationdomaincontrol.py 72480 2007-02-09 09:14:25Z baijum $
+"""
+import unittest
+from zope.app.testing.functional import BrowserTestCase
+from zope.app.applicationcontrol.testing import ApplicationControlLayer
+
+class MessageCatalogControlTest(BrowserTestCase):
+
+    def testDomainOverview(self):
+        response = self.publish(
+            '/++etc++process/@@TranslationDomain.html',
+            basic='globalmgr:globalmgrpw')
+
+        body = response.getBody()
+        self.checkForBrokenLinks(body,
+                                 '/++etc++process/@@TranslationDomain.html',
+                                 basic='globalmgr:globalmgrpw')
+        
+    def testReload(self):
+        response = self.publish('/++etc++process/@@TranslationDomain.html',
+                                basic='globalmgr:globalmgrpw',
+                                form={'language': u'de',
+                                      'domain': u'zope',
+                                      'RELOAD': u'Reload'})
+        body = response.getBody()
+        self.assert_('Message Catalog for de language in zope domain'
+                     ' successfully reloaded.' in body)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    MessageCatalogControlTest.layer = ApplicationControlLayer
+    suite.addTest(unittest.makeSuite(MessageCatalogControlTest))
+    return suite
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_zodbcontrol.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_zodbcontrol.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/test_zodbcontrol.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,50 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""ZODB Control Tests
+
+$Id: test_zodbcontrol.py 72480 2007-02-09 09:14:25Z baijum $
+"""
+import unittest
+import ZODB.tests.util
+from ZODB.interfaces import IDatabase
+from zope.app.testing import functional
+from zope import component
+
+from zope.app.applicationcontrol.testing import ApplicationControlLayer
+
+def setUp(test):
+    test.databases = test.globs['getRootFolder']()._p_jar.db().databases
+    db2 = ZODB.tests.util.DB(databases=test.databases, database_name='2')
+
+    for name, db in test.databases.items():
+        component.provideUtility(db, IDatabase, name=name)
+
+
+def tearDown(test):
+    for db in test.databases.values():
+        db.close()
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    zodb = functional.FunctionalDocFileSuite('zodb.txt',
+                                             setUp=setUp,
+                                             tearDown=tearDown)
+    zodb.layer = ApplicationControlLayer
+    suite.addTest(zodb)
+    return suite
+
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/zodb.txt
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/zodb.txt	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/zodb.txt	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,28 @@
+=================
+ZODB Control View
+=================
+
+We provide default views which are relevant for administering mount points.
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.addHeader('Authorization','Basic mgr:mgrpw')
+  >>> browser.handleErrors = False
+
+  >>> browser.open('http://localhost/++etc++process/@@ZODBControl.html')
+  
+All registered databases are displayed. Each database can be packed by 
+selecting the according checkbox. Let us select the second database now:
+
+  >>> browser.getControl(name='dbs:list').value=['2']
+
+Now we define to pack the database back to 7 days:
+
+  >>> browser.getControl(name='days').value='7'
+  
+Finally let's submit the form and start packing the database:
+
+  >>> browser.getControl(name='PACK').click()
+  
+  >>> 'ZODB "2" successfully packed.' in browser.contents
+  True
\ No newline at end of file


Property changes on: zmi.core/trunk/src/zmi/core/applicationcontrol/ftests/zodb.txt
___________________________________________________________________
Added: svn:eol-style
   + native

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.pt	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.pt	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,69 @@
+<html metal:use-macro="context/@@standard_macros/view"
+    i18n:domain="zope">
+<head>
+  <title i18n:translate="">Zope Runtime Information</title>
+</head>
+<body>
+<div metal:fill-slot="body">
+
+  <tal:block tal:define="runtime_info view/runtimeInfo">
+     <div class="row">
+       <div class="label" i18n:translate="">Uptime</div>
+       <div class="field"
+            tal:content="runtime_info/Uptime"
+            i18n:translate="">Time</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">System platform</div>
+       <div class="field"
+            tal:content="runtime_info/SystemPlatform">Platform</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Zope version</div>
+       <div class="field"
+            tal:content="runtime_info/ZopeVersion">Version</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Python version</div>
+       <div class="field"
+            tal:content="runtime_info/PythonVersion">Version</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Command line</div>
+       <div class="field"
+            tal:content="runtime_info/CommandLine">Command line</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Preferred encoding</div>
+       <div class="field"
+            tal:content="runtime_info/PreferredEncoding">Encoding</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">FileSystem encoding</div>
+       <div class="field"
+            tal:content="runtime_info/FileSystemEncoding">Encoding</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Process id</div>
+       <div class="field"
+            tal:content="runtime_info/ProcessId">ID</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Developer mode</div>
+       <div class="field"
+            tal:content="runtime_info/DeveloperMode">ID</div>
+     </div>
+     <div class="row">
+       <div class="label" i18n:translate="">Python path</div>
+       <div class="field">
+        <ul>
+         <li tal:repeat="path runtime_info/PythonPath" 
+             tal:content="path">path</li>
+        </ul>
+       </div>
+     </div>
+  </tal:block>
+
+</div>
+</body>
+</html>

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/runtimeinfo.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,72 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Define runtime information view component for Application Control
+
+$Id: runtimeinfo.py 74321 2007-04-21 11:35:21Z ctheune $
+"""
+__docformat__ = 'restructuredtext'
+
+from zope.app.applicationcontrol.interfaces import IRuntimeInfo
+
+from zope.app.applicationcontrol.i18n import ZopeMessageFactory as _
+
+
+class RuntimeInfoView(object):
+
+    _fields = (
+        "ZopeVersion",
+        "PythonVersion",
+        "PythonPath",
+        "SystemPlatform",
+        "PreferredEncoding",
+        "FileSystemEncoding",
+        "CommandLine",
+        "ProcessId",
+        "DeveloperMode",
+        )
+    _unavailable = _("Unavailable")
+
+    def runtimeInfo(self):
+        try:
+            ri = IRuntimeInfo(self.context)
+        except TypeError:
+            formatted = dict.fromkeys(self._fields, self._unavailable)
+            formatted["Uptime"] = self._unavailable
+        else:
+            formatted = self._getInfo(ri)
+        return formatted
+
+    def _getInfo(self, ri):
+        formatted = {}
+        for name in self._fields:
+            try:
+                value = getattr(ri, "get" + name)()
+            except ValueError:
+                value = self._unavailable
+            formatted[name] = value
+        formatted["Uptime"] = self._getUptime(ri)
+        return formatted
+
+    def _getUptime(self, ri):
+        # make a unix "uptime" uptime format
+        uptime = long(ri.getUptime())
+        minutes, seconds = divmod(uptime, 60)
+        hours, minutes = divmod(minutes, 60)
+        days, hours = divmod(hours, 24)
+
+        return _('${days} day(s) ${hours}:${minutes}:${seconds}',
+                 mapping = {'days': '%d' % days,
+                            'hours': '%02d' % hours,
+                            'minutes': '%02d' % minutes,
+                            'seconds': '%02d' % seconds})

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.pt	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.pt	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,42 @@
+<html metal:use-macro="context/@@standard_macros/view" i18n:domain="zope">
+<head>
+  <title i18n:translate="">Zope Stub Server Controller</title>
+</head>
+<body>
+<div metal:fill-slot="body">
+
+  <div class="message"
+    i18n:translate=""
+    tal:define="status view/action"
+    tal:condition="status"
+    tal:content="status">
+   </div>
+
+  <form name="servercontrol" action="servercontrol.html" method="post">
+    <div class="row">
+        <div class="label"
+            i18n:translate="">Countdown until restart or shutdown</div>
+        <div class="field">
+            <input type="text" name="time:int" size="5" value="0" />
+            &nbsp;<span i18n:translate="">seconds</span>
+            <p i18n:translate="">
+              If you specify a time of 0 seconds, then the server
+              will be shutdown or restarted immediately.
+            </p>
+        </div>
+    </div>
+
+    <div class="row">
+        <div class="controls">
+            <input type="submit" name="restart" value="Restart server"
+                i18n:attributes="value" />
+            &nbsp;
+            <input type="submit" name="shutdown" value="Shutdown server"
+                i18n:attributes="value" />
+        </div>
+    </div>
+  </form>
+
+</div>
+</body>
+</html>

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/servercontrol.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,43 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Server Control View
+
+$Id: servercontrol.py 85497 2008-04-20 09:29:04Z lgs $
+"""
+__docformat__ = 'restructuredtext'
+
+import zope.component
+from zope.app.applicationcontrol.interfaces import IServerControl
+
+from zope.app.applicationcontrol.i18n import ZopeMessageFactory as _
+
+
+class ServerControlView(object):
+
+    def serverControl(self):
+        return zope.component.getUtility(IServerControl)
+
+    def action(self):
+        """Do the shutdown/restart!"""
+        control = self.serverControl()
+        time = self.request.get('time', 0)
+
+        if 'restart' in self.request:
+            control.restart(time)
+            return _("The server will be restarted in ${number} seconds.",
+                mapping={"number": time})
+        elif 'shutdown' in self.request:
+            control.shutdown(time)
+            return _("The server will be shutdown in ${number} seconds.",
+                mapping={"number": time})

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/tests/__init__.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/tests/__init__.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/tests/__init__.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_runtimeinfoview.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_runtimeinfoview.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_runtimeinfoview.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,80 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002, 2003 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.
+#
+##############################################################################
+"""Runtime View tests
+
+$Id: test_runtimeinfoview.py 74321 2007-04-21 11:35:21Z ctheune $
+"""
+import unittest
+from types import DictType
+from zope.app.testing import ztapi
+
+from zope.app.applicationcontrol.applicationcontrol import applicationController
+from zope.app.applicationcontrol.runtimeinfo import RuntimeInfo
+from zope.app.applicationcontrol.browser.runtimeinfo import RuntimeInfoView
+from zope.app.applicationcontrol.interfaces import \
+     IApplicationControl, IRuntimeInfo
+from zope.app.component.testing import PlacefulSetup
+
+class Test(PlacefulSetup, unittest.TestCase):
+
+    def _TestView__newView(self, container):
+        view = RuntimeInfoView()
+        view.context = container
+        view.request = None
+        return view
+
+    def test_RuntimeInfoView(self):
+        ztapi.provideAdapter(IApplicationControl, IRuntimeInfo, RuntimeInfo)
+        test_runtimeinfoview = self._TestView__newView(applicationController)
+
+        test_format = test_runtimeinfoview.runtimeInfo()
+        self.failUnless(isinstance(test_format, DictType))
+
+        assert_keys = ['ZopeVersion', 'PythonVersion', 'PythonPath',
+              'SystemPlatform', 'PreferredEncoding', 'FileSystemEncoding',
+              'CommandLine', 'ProcessId', 'Uptime', 'DeveloperMode' ]
+        test_keys = test_format.keys()
+
+        assert_keys.sort()
+        test_keys.sort()
+        self.failUnlessEqual(assert_keys, test_keys)
+
+        self.failUnlessEqual("Unavailable", test_format["ZopeVersion"])
+
+    def test_RuntimeInfoFailureView(self):
+        test_runtimeinfoview = self._TestView__newView(applicationController)
+
+        test_format = test_runtimeinfoview.runtimeInfo()
+        self.failUnless(isinstance(test_format, DictType))
+
+        assert_keys = ['ZopeVersion', 'PythonVersion', 'PythonPath',
+              'SystemPlatform', 'PreferredEncoding', 'FileSystemEncoding',
+              'CommandLine', 'ProcessId', 'Uptime', 'DeveloperMode' ]
+        test_keys = test_format.keys()
+
+        assert_keys.sort()
+        test_keys.sort()
+        self.failUnlessEqual(assert_keys, test_keys)
+
+        for key in assert_keys:
+            self.failUnlessEqual("Unavailable", test_format[key])
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(Test),
+        ))
+
+if __name__ == '__main__':
+    unittest.main()

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_servercontrolview.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_servercontrolview.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_servercontrolview.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,75 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002, 2003 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.
+#
+##############################################################################
+"""Server Control View Tests
+
+$Id: test_servercontrolview.py 85497 2008-04-20 09:29:04Z lgs $
+"""
+import unittest
+
+import zope.component
+from zope.interface import implements
+from zope.app.applicationcontrol.applicationcontrol import applicationController
+from zope.app.applicationcontrol.browser.servercontrol import ServerControlView
+from zope.app.applicationcontrol.interfaces import IServerControl
+from zope.app.component.testing import PlacefulSetup
+
+class ServerControlStub(object):
+    implements(IServerControl)
+    
+    did_restart = None
+    did_shutdown = None
+
+    def restart(self, time):
+        self.did_restart = time
+
+    def shutdown(self, time):
+        self.did_shutdown = time
+
+class Test(PlacefulSetup, unittest.TestCase):
+
+    def _TestView__newView(self, container, request):
+        view = ServerControlView()
+        view.context = container
+        view.request = request
+        return view
+
+    def test_ServerControlView(self):
+        control = ServerControlStub()
+        globalSiteManager = zope.component.getGlobalSiteManager()
+        globalSiteManager.registerUtility(control, IServerControl)
+
+        test_serverctrl = self._TestView__newView(
+            applicationController,
+            {'shutdown': 1,
+             'time': 100},
+            )
+        test_serverctrl.action()
+        self.assertEqual(control.did_shutdown, 100)
+
+        test_serverctrl = self._TestView__newView(
+            applicationController,
+            {'restart': 1,
+             'time': 100},
+            )
+        test_serverctrl.action()
+        self.assertEqual(control.did_restart, 100)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(Test),
+        ))
+
+if __name__ == '__main__':
+    unittest.main()

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_translationdomaincontrol.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_translationdomaincontrol.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/tests/test_translationdomaincontrol.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,113 @@
+##############################################################################
+#
+# Copyright (c) 2008 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.
+#
+##############################################################################
+"""Translation Domain Control View Tests
+
+$Id: test_translationdomaincontrol.py 85498 2008-04-20 09:31:04Z lgs $
+"""
+import unittest
+
+import zope.component
+
+from zope.interface import implements
+from zope.app.applicationcontrol.browser.translationdomaincontrol import (
+    TranslationDomainControlView)
+from zope.app.component.testing import PlacefulSetup
+from zope.i18n.interfaces import ITranslationDomain
+
+class TranslationDomainStub(object):
+    implements(ITranslationDomain)
+
+    def __init__(self, domain, languages):
+        self.domain = domain
+        self.languages = languages
+        self.reloadDone = False
+
+    def translate(self, msgid, mapping=None, context=None,
+                  target_language=None, default=None):
+        return msgid
+
+    def getCatalogsInfo(self):
+        template = 'locales/%s/LC_MESSAGES/%s.mo'
+        return dict([(lang, template % (lang, self.domain))
+                     for lang in self.languages])
+
+    def reloadCatalogs(self, fileNames):
+        self.reloadDone = True
+
+
+class Test(PlacefulSetup, unittest.TestCase):
+
+    def _TestView__newView(self, request):
+        view = TranslationDomainControlView()
+        view.context = object() # the context does not matter in this view
+        view.request = request
+        return view
+
+    def test_TranslationDomainControlView(self):
+        languages = ['de', 'en', 'es'] # these are sorted, see below
+        domains = ['zope', 'plone']
+        translationDomains = []
+        globalSiteManager = zope.component.getGlobalSiteManager()
+        for domain in domains:
+            translationDomain = TranslationDomainStub(domain, languages)
+            globalSiteManager.registerUtility(translationDomain,
+                                              ITranslationDomain,
+                                              domain)
+            translationDomains.append(translationDomain)
+
+        test_translationDomainView = self._TestView__newView({})
+        catalogs = test_translationDomainView.getCatalogsInfo()
+
+        self.assertEqual(len(catalogs), 2)
+        for i, domain in enumerate(domains):
+            catalog = catalogs[i]
+            self.assertEqual(domain, catalog['domain'])
+            langs = [li['language'] for li in catalog['languagesInfo']]
+            self.assertEqual(sorted(langs), languages)
+            files = [li['fileNames'] for li in catalog['languagesInfo']]
+            self.assertEqual(sorted(files), [
+                    'locales/de/LC_MESSAGES/%s.mo' % domain,
+                    'locales/en/LC_MESSAGES/%s.mo' % domain,
+                    'locales/es/LC_MESSAGES/%s.mo' % domain,
+                    ])
+
+
+        # test catalog reloading
+        translationDomain = translationDomains[0]
+        test_translationDomainView = self._TestView__newView({
+                'RELOAD': 1,
+                'domain': 'zope',
+                'language': 'fr' # fr is not in languages list
+                })
+
+        test_translationDomainView.reloadCatalogs()
+        self.assertEqual(translationDomain.reloadDone, False)
+
+        test_translationDomainView = self._TestView__newView({
+                'RELOAD': 1,
+                'domain': 'zope',
+                'language': 'en' # en is in languages list
+                })
+
+        test_translationDomainView.reloadCatalogs()
+        self.assertEqual(translationDomain.reloadDone, True)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(Test),
+        ))
+
+if __name__ == '__main__':
+    unittest.main()

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.pt	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.pt	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,48 @@
+<html metal:use-macro="context/@@standard_macros/view"
+    i18n:domain="zope">
+  <head>
+    <title i18n:translate="">Translation Domains</title>
+  </head>
+  <body>
+    <div metal:fill-slot="body">
+
+    <p tal:define="status view/reloadCatalogs"
+         tal:condition="status"
+         tal:content="status" i18n:translate=""/>
+
+    <div tal:repeat="domainInfo view/getCatalogsInfo">
+
+    <div class="row">
+        <div class="label" i18n:translate="">Domain</div>
+        <div class="field" tal:content="domainInfo/domain">domain</div>
+    </div>
+
+    <table class="listing">
+
+        <thead>
+        <tr>
+           <th i18n:translate="">Language</th>
+           <th i18n:translate="">Files</th>
+           <th>&nbsp;</th>
+        </tr>
+        </thead>
+
+        <tr tal:repeat="catalogInfo domainInfo/languagesInfo">
+            <td tal:content="catalogInfo/language"></td>
+            <td>
+                <div tal:repeat="fileName catalogInfo/fileNames"
+                     tal:content="fileName"></div>
+            </td>
+            <td>
+                <a tal:attributes="href string:?RELOAD=&domain=${domainInfo/domain}&language=${catalogInfo/language}"
+                   i18n:translate="reload-button">Reload</a>
+            </td>
+        </tr>
+
+    </table>
+
+    </div>
+
+    </div>
+  </body>
+</html>

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/translationdomaincontrol.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,57 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Server Control View
+
+$Id: translationdomaincontrol.py 85497 2008-04-20 09:29:04Z lgs $
+"""
+__docformat__ = 'restructuredtext'
+
+import zope.component
+from zope.i18n.interfaces import ITranslationDomain
+from zope.app.applicationcontrol.i18n import ZopeMessageFactory as _
+
+
+class TranslationDomainControlView(object):
+
+    def getCatalogsInfo(self):
+        info = []
+        for name, domain in zope.component.getUtilitiesFor(ITranslationDomain):
+            if not hasattr(domain, 'getCatalogsInfo'):
+                continue
+            lang_info = []
+            info.append({'domain': name, 'languagesInfo': lang_info})
+            for language, fileNames in domain.getCatalogsInfo().items():
+                lang_info.append({'language': language,
+                             'fileNames': fileNames})
+        return info
+
+    def reloadCatalogs(self):
+        """Do the reloading !"""
+        status = ''
+
+        if 'RELOAD' in self.request:
+            language = self.request.get('language')
+            domain = self.request.get('domain')
+
+            domain = zope.component.getUtility(ITranslationDomain, domain)
+            for lang, fileNames in domain.getCatalogsInfo().items():
+                if lang == language:
+                    domain.reloadCatalogs(fileNames)
+
+            status = _('Message Catalog for ${language} language'
+                       ' in ${domain} domain successfully reloaded.',
+                       mapping = {u'language': language,
+                                  u'domain': domain.domain})
+
+        return status

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.pt
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.pt	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.pt	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,57 @@
+<html metal:use-macro="context/@@standard_macros/view"
+    i18n:domain="zope">
+  <head>
+    <title i18n:translate="">ZODB Controller</title>
+  </head>
+  <body>
+    <div id="message" metal:fill-slot="message">
+      <div class="row" tal:repeat="status view/update">
+         <div class="field" tal:content="status" i18n:translate=""/>
+      </div>
+    </div>
+    <div metal:fill-slot="body">
+      <form action="." method="post" tal:attributes="action request/URL">
+      <div class="row">
+        <table border="1">
+            <tr>
+              <th i18n:translate="">Pack</th>
+              <th i18n:translate="">Utility Name</th>
+              <th i18n:translate="">Database Name</th>
+              <th i18n:translate="">Size</th>
+            </tr>
+            <tr tal:repeat="db view/databases">
+              <td>
+                <input type="checkbox" name="dbs:list"
+                       tal:attributes="value db/utilName"/>
+              </td>
+              <td>
+                <span tal:replace="db/utilName"/>
+              </td>
+
+              <td>
+                <span tal:replace="db/dbName"/>
+              </td>
+              <td>
+                <span tal:replace="db/size"/>
+              </td>
+            </tr>
+        </table>
+
+        <div class="row">
+          <span class="label" i18n:translate="">Keep up to</span>
+          <span class="field">
+            <input type="text" size="4" name="days" value="0"
+                   tal:attributes="value request/days|string:0" />
+            <span tal:omit-tag="" i18n:translate="">days</span>
+          </span>
+          <div class="controls">
+            <input type="submit" name="PACK" value="Pack"
+                i18n:attributes="value pack-button"/>
+          </div>
+        </div>
+
+      </div>
+      </form>
+    </div>
+  </body>
+</html>

Added: zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.py
===================================================================
--- zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.py	                        (rev 0)
+++ zmi.core/trunk/src/zmi/core/applicationcontrol/zodbcontrol.py	2009-06-07 15:21:29 UTC (rev 100687)
@@ -0,0 +1,72 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+""" Server Control View
+
+$Id: zodbcontrol.py 73536 2007-03-25 08:17:24Z dobe $
+"""
+__docformat__ = 'restructuredtext'
+
+from ZODB.FileStorage.FileStorage import FileStorageError
+from zope.app.applicationcontrol.i18n import ZopeMessageFactory as _
+from zope.size import byteDisplay
+from ZODB.interfaces import IDatabase
+from zope import component
+
+class ZODBControlView(object):
+
+    status  = None
+    
+    @property
+    def databases(self):
+        res = []
+        for name, db in component.getUtilitiesFor(
+            IDatabase):
+            d = dict(
+                dbName = db.getName(),
+                utilName = str(name),
+                size = self._getSize(db),
+                )
+            res.append(d)
+        return res
+            
+    def _getSize(self, db):
+        """Get the database size in a human readable format."""
+        size = db.getSize()        
+        if not isinstance(size, (int, long, float)):
+            return str(size)
+        return byteDisplay(size)
+
+    def update(self):
+        if self.status is not None:
+            return self.status
+        status = []
+        if 'PACK' in self.request.form:
+            dbs = self.request.form.get('dbs', [])
+            try:
+                days = int(self.request.form.get('days','').strip() or 0)
+            except ValueError:
+                status.append(_('Error: Invalid Number'))
+                self.status = status
+                return self.status
+            for dbName in dbs:
+                db = component.getUtility(IDatabase, name=dbName)
+                try:
+                    db.pack(days=days)
+                    status.append(_('ZODB "${name}" successfully packed.',
+                               mapping=dict(name=str(dbName))))
+                except FileStorageError, err:
+                    status.append(_('ERROR packing ZODB "${name}": ${err}',
+                                    mapping=dict(name=str(dbName), err=err)))
+        self.status = status
+        return self.status



More information about the Checkins mailing list