[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" />
+ <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" />
+
+ <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> </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