[CMF-checkins] SVN: CMF/trunk/CMF Forward-port caching_policy_manager export/import from 1.5 branch.

Tres Seaver tseaver at palladion.com
Tue Oct 11 16:21:11 EDT 2005


Log message for revision 39073:
  Forward-port caching_policy_manager export/import from 1.5 branch.

Changed:
  A   CMF/trunk/CMFDefault/profiles/default/caching_policy_mgr.xml
  U   CMF/trunk/CMFDefault/profiles/default/export_steps.xml
  U   CMF/trunk/CMFDefault/profiles/default/import_steps.xml
  U   CMF/trunk/CMFDefault/profiles/default/toolset.xml
  U   CMF/trunk/CMFSetup/README.txt
  A   CMF/trunk/CMFSetup/cachingpolicymgr.py
  A   CMF/trunk/CMFSetup/tests/test_cachingpolicymgr.py
  U   CMF/trunk/CMFSetup/utils.py
  A   CMF/trunk/CMFSetup/xml/cpmExport.xml

-=-
Added: CMF/trunk/CMFDefault/profiles/default/caching_policy_mgr.xml
===================================================================
--- CMF/trunk/CMFDefault/profiles/default/caching_policy_mgr.xml	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFDefault/profiles/default/caching_policy_mgr.xml	2005-10-11 20:21:10 UTC (rev 39073)
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<caching-policies>
+<!-- TODO:  add some sensible defaults -->
+</caching-policies>

Modified: CMF/trunk/CMFDefault/profiles/default/export_steps.xml
===================================================================
--- CMF/trunk/CMFDefault/profiles/default/export_steps.xml	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFDefault/profiles/default/export_steps.xml	2005-10-11 20:21:10 UTC (rev 39073)
@@ -121,4 +121,15 @@
  
  
  </export-step>
+ <export-step id="caching_policy_mgr"
+              handler="Products.CMFSetup.cachingpolicymgr.exportCachingPolicyManager"
+              title="Caching Policies">
+  
+  
+  
+  Export cacing policy manager's policies.
+ 
+ 
+ 
+ </export-step>
 </export-steps>

Modified: CMF/trunk/CMFDefault/profiles/default/import_steps.xml
===================================================================
--- CMF/trunk/CMFDefault/profiles/default/import_steps.xml	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFDefault/profiles/default/import_steps.xml	2005-10-11 20:21:10 UTC (rev 39073)
@@ -142,4 +142,16 @@
   
  
  </import-step>
+ <import-step id="caching_policy_mgr" version="20051011-01"
+              handler="Products.CMFSetup.cachingpolicymgr.importCachingPolicyManager"
+              title="Caching Policies">
+  <dependency step="toolset"/>
+  
+  
+  
+  Import cacing policy manager's policies.
+ 
+ 
+ 
+ </import-step>
 </import-steps>

Modified: CMF/trunk/CMFDefault/profiles/default/toolset.xml
===================================================================
--- CMF/trunk/CMFDefault/profiles/default/toolset.xml	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFDefault/profiles/default/toolset.xml	2005-10-11 20:21:10 UTC (rev 39073)
@@ -5,6 +5,8 @@
            class="Products.MailHost.MailHost.MailHost"/>
  <required tool_id="cookie_authentication"
            class="Products.CMFCore.CookieCrumbler.CookieCrumbler"/>
+ <required tool_id="caching_policy_manager"
+           class="Products.CMFCore.CachingPolicyManager.CachingPolicyManager"/>
  <required tool_id="portal_actions"
            class="Products.CMFCore.ActionsTool.ActionsTool"/>
  <required tool_id="portal_catalog"

Modified: CMF/trunk/CMFSetup/README.txt
===================================================================
--- CMF/trunk/CMFSetup/README.txt	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFSetup/README.txt	2005-10-11 20:21:10 UTC (rev 39073)
@@ -46,13 +46,27 @@
 
             o DCWorkflow definitions, including supporting scripts
 
-      - (_) 'portal_catalog'
+      - (x) 'cookie_authentication'
+
+            o tool properties
+
+      - (x) 'MailHost'
+
+            o tool properties
+
+      - (x) 'portal_catalog'
             (Products.CMFCore.CatalogTool.CatalogTool)
 
             o index names / types
 
             o metadata column names
 
+      - (x) folder structure
+
+      - (x) 'caching_policy_manager'
+
+            o policy settings
+
       - (_) 'portal_membership'
 
             o "skeleton" home folder (XXX: is this in the core?)
@@ -65,10 +79,6 @@
 
             o predicate -> portal_type bindings.
 
-      - (_) 'caching_policy_manager'
-
-            o policy settings
-
       - (_) 'portal_metadata'
 
             o global properties
@@ -82,18 +92,8 @@
 
             o action title / icon bindings
 
-      - (x) 'cookie_authentication'
-
-            o tool properties
-
-      - (x) 'MailHost'
-
-            o tool properties
-
       - (_) user folder configuration
 
-      - (_) folder structure
-
   TODO
 
       - (x) Display / download diffs between configurations (profiles

Added: CMF/trunk/CMFSetup/cachingpolicymgr.py
===================================================================
--- CMF/trunk/CMFSetup/cachingpolicymgr.py	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFSetup/cachingpolicymgr.py	2005-10-11 20:21:10 UTC (rev 39073)
@@ -0,0 +1,140 @@
+##############################################################################
+#
+# Copyright (c) 2005 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.
+#
+##############################################################################
+"""CachingPolicyManager setup handlers.
+
+$Id$
+"""
+
+from AccessControl import ClassSecurityInfo
+from AccessControl.Permission import Permission
+from Globals import InitializeClass
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+
+from Products.CMFCore.utils import getToolByName
+
+from permissions import ManagePortal
+from utils import CONVERTER
+from utils import DEFAULT
+from utils import ExportConfiguratorBase
+from utils import ImportConfiguratorBase
+from utils import KEY
+from utils import _xmldir
+
+#
+#   Configurator entry points
+#
+_FILENAME = 'cachingpolicymgr.xml'
+
+def importCachingPolicyManager(context):
+    """ Import cache policy maanger settings from an XML file.
+    """
+    site = context.getSite()
+    cpm = getToolByName(site, 'caching_policy_manager', None)
+    if cpm is None:
+        return 'Cache policy manager: No tool!'
+
+    body = context.readDataFile(_FILENAME)
+    if body is None:
+        return 'Cache policy manager: Nothing to import.'
+
+    if context.shouldPurge():
+        cpm.__init__()
+
+    # now act on the settings we've retrieved
+    configurator = CachingPolicyManagerImportConfigurator(site)
+    cpm_info = configurator.parseXML(body)
+
+    for policy in cpm_info['policies']:
+        cpm.addPolicy(**policy)
+
+    return 'Cache policy manager settings imported.'
+
+def exportCachingPolicyManager(context):
+    """ Export caching policy manager settings as an XML file.
+    """
+    site = context.getSite()
+    mhc = CachingPolicyManagerExportConfigurator( site ).__of__( site )
+    text = mhc.generateXML()
+
+    context.writeDataFile( _FILENAME, text, 'text/xml' )
+
+    return 'Caching policy manager settings exported.'
+
+class CachingPolicyManagerExportConfigurator(ExportConfiguratorBase):
+    """ Synthesize XML description of cc properties.
+    """
+    security = ClassSecurityInfo()
+
+    security.declareProtected( ManagePortal, 'listPolicyInfo' )
+    def listPolicyInfo(self):
+        """ Return a list of mappings describing the tool's policies.
+        """
+        cpm = getToolByName(self._site, 'caching_policy_manager')
+        for policy_id, policy in cpm.listPolicies():
+            yield {'policy_id': policy_id,
+                   'predicate': policy.getPredicate(),
+                   'mtime_func': policy.getMTimeFunc(),
+                   'vary': policy.getVary(),
+                   'etag_func': policy.getETagFunc(),
+                   'max_age_secs': policy.getMaxAgeSecs(),
+                   's_max_age_secs': policy.getSMaxAgeSecs(),
+                   'pre_check': policy.getPreCheck(),
+                   'post_check': policy.getPostCheck(),
+                   'last_modified': bool(policy.getLastModified()),
+                   'no_cache': bool(policy.getNoCache()),
+                   'no_store': bool(policy.getNoStore()),
+                   'must_revalidate': bool(policy.getMustRevalidate()),
+                   'proxy_revalidate': bool(policy.getProxyRevalidate()),
+                   'no_transform': bool(policy.getNoTransform()),
+                   'public': bool(policy.getPublic()),
+                   'private': bool(policy.getPrivate()),
+                   'enable_304s': bool(policy.getEnable304s()),
+                  }
+
+    security.declarePrivate('_getExportTemplate')
+    def _getExportTemplate(self):
+
+        return PageTemplateFile('cpmExport.xml', _xmldir)
+
+InitializeClass(CachingPolicyManagerExportConfigurator)
+
+class CachingPolicyManagerImportConfigurator(ImportConfiguratorBase):
+
+    def _getImportMapping(self):
+        return {
+          'caching-policies':
+             { 'caching-policy': {KEY: 'policies', DEFAULT: ()} },
+          'caching-policy':
+             { 'policy_id':         {},
+               'remove':            {},
+               'predicate':         {},
+               'mtime_func':        {},
+               'vary':              {},
+               'etag_func':         {},
+               'max_age_secs':      {CONVERTER: self._convertToInteger},
+               's_max_age_secs':    {CONVERTER: self._convertToInteger},
+               'pre_check':         {CONVERTER: self._convertToInteger},
+               'post_check':        {CONVERTER: self._convertToInteger},
+               'last_modified':     {CONVERTER: self._convertToBoolean},
+               'no_cache':          {CONVERTER: self._convertToBoolean},
+               'no_store':          {CONVERTER: self._convertToBoolean},
+               'must_revalidate':   {CONVERTER: self._convertToBoolean},
+               'proxy_revalidate':  {CONVERTER: self._convertToBoolean},
+               'no_transform':      {CONVERTER: self._convertToBoolean},
+               'public':            {CONVERTER: self._convertToBoolean},
+               'private':           {CONVERTER: self._convertToBoolean},
+               'enable_304s':       {CONVERTER: self._convertToBoolean},
+             },
+          }
+
+InitializeClass(CachingPolicyManagerImportConfigurator)

Added: CMF/trunk/CMFSetup/tests/test_cachingpolicymgr.py
===================================================================
--- CMF/trunk/CMFSetup/tests/test_cachingpolicymgr.py	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFSetup/tests/test_cachingpolicymgr.py	2005-10-11 20:21:10 UTC (rev 39073)
@@ -0,0 +1,250 @@
+##############################################################################
+#
+# Copyright (c) 2005 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.
+#
+##############################################################################
+"""CachingPolicyManager setup handler unit tests.
+
+$Id$
+"""
+import unittest
+#import Testing
+
+
+from common import BaseRegistryTests
+from common import DummyExportContext
+from common import DummyImportContext
+
+
+class _CachingPolicyManagerSetup(BaseRegistryTests):
+
+    POLICY_ID = 'policy_id'
+    PREDICATE = "python:object.getId() == 'foo'"
+    MTIME_FUNC = "object/modified"
+    MAX_AGE_SECS = 60
+    VARY = "Test"
+    ETAG_FUNC = "object/getETag"
+    S_MAX_AGE_SECS = 120
+    PRE_CHECK = 42
+    POST_CHECK = 43
+
+    _EMPTY_EXPORT = """\
+<?xml version="1.0"?>
+<caching-policies>
+</caching-policies>
+"""
+
+    _WITH_POLICY_EXPORT = """\
+<?xml version="1.0"?>
+<caching-policies>
+ <caching-policy
+    policy_id="%s"
+    predicate="%s"
+    mtime_func="%s"
+    vary="%s"
+    etag_func="%s"
+    max_age_secs="%d"
+    s_max_age_secs="%d"
+    pre_check="%d"
+    post_check="%d"
+    last_modified="False"
+    no_cache="True"
+    no_store="True"
+    must_revalidate="True"
+    proxy_revalidate="True"
+    no_transform="True"
+    public="True"
+    private="True"
+    enable_304s="True"
+    />
+</caching-policies>
+""" % (POLICY_ID,
+       PREDICATE,
+       MTIME_FUNC,
+       VARY,
+       ETAG_FUNC,
+       MAX_AGE_SECS,
+       S_MAX_AGE_SECS,
+       PRE_CHECK,
+       POST_CHECK,
+      )
+
+    def _initSite(self, with_policy=False):
+        from OFS.Folder import Folder
+        from Products.CMFCore.CachingPolicyManager import CachingPolicyManager
+
+        self.root.site = Folder(id='site')
+        site = self.root.site
+        mgr = CachingPolicyManager()
+        site._setObject( mgr.getId(), mgr )
+
+        if with_policy:
+            mgr.addPolicy( policy_id=self.POLICY_ID
+                         , predicate=self.PREDICATE
+                         , mtime_func=self.MTIME_FUNC
+                         , max_age_secs=self.MAX_AGE_SECS
+                         , no_cache=True
+                         , no_store=True
+                         , must_revalidate=True
+                         , vary=self.VARY
+                         , etag_func=self.ETAG_FUNC
+                         , s_max_age_secs=self.S_MAX_AGE_SECS
+                         , proxy_revalidate=True
+                         , public=True
+                         , private=True
+                         , no_transform=True
+                         , enable_304s=True
+                         , last_modified=False
+                         , pre_check=self.PRE_CHECK
+                         , post_check=self.POST_CHECK
+                         )
+        return site
+
+class CachingPolicyManagerExportConfiguratorTests(_CachingPolicyManagerSetup):
+
+    def _getTargetClass(self):
+        from Products.CMFSetup.cachingpolicymgr \
+                import CachingPolicyManagerExportConfigurator
+
+        return CachingPolicyManagerExportConfigurator
+
+    def test_generateXML_empty(self):
+        site = self._initSite(with_policy=False)
+        configurator = self._makeOne(site).__of__(site)
+
+        self._compareDOM(configurator.generateXML(), self._EMPTY_EXPORT)
+
+    def test_generateXML_with_policy(self):
+        site = self._initSite(with_policy=True)
+        configurator = self._makeOne(site).__of__(site)
+
+        self._compareDOM(configurator.generateXML(), self._WITH_POLICY_EXPORT)
+
+
+class CachingPolicyManagerImportConfiguratorTests(_CachingPolicyManagerSetup):
+
+    def _getTargetClass(self):
+        from Products.CMFSetup.cachingpolicymgr \
+                import CachingPolicyManagerImportConfigurator
+
+        return CachingPolicyManagerImportConfigurator
+
+    def test_parseXML_empty(self):
+        site = self._initSite(with_policy=False)
+        configurator = self._makeOne(site)
+        cpm_info = configurator.parseXML(self._EMPTY_EXPORT)
+
+        self.assertEqual(len(cpm_info['policies']), 0)
+
+    def test_parseXML_with_policy(self):
+        site = self._initSite(with_policy=False)
+        configurator = self._makeOne(site)
+        cpm_info = configurator.parseXML(self._WITH_POLICY_EXPORT)
+
+        self.assertEqual(len(cpm_info['policies']), 1)
+
+        info = cpm_info['policies'][0]
+        self.assertEqual(info['policy_id'], self.POLICY_ID)
+        self.assertEqual(info['predicate'], self.PREDICATE)
+        self.assertEqual(info['mtime_func'], self.MTIME_FUNC)
+        self.assertEqual(info['vary'], self.VARY)
+        self.assertEqual(info['etag_func'], self.ETAG_FUNC)
+        self.assertEqual(info['max_age_secs'], self.MAX_AGE_SECS)
+        self.assertEqual(info['s_max_age_secs'], self.S_MAX_AGE_SECS)
+        self.assertEqual(info['pre_check'], self.PRE_CHECK)
+        self.assertEqual(info['post_check'], self.POST_CHECK)
+        self.assertEqual(info['last_modified'], False)
+        self.assertEqual(info['no_cache'], True)
+        self.assertEqual(info['no_store'], True)
+        self.assertEqual(info['must_revalidate'], True)
+        self.assertEqual(info['proxy_revalidate'], True)
+        self.assertEqual(info['no_transform'], True)
+        self.assertEqual(info['public'], True)
+        self.assertEqual(info['private'], True)
+        self.assertEqual(info['enable_304s'], True)
+
+class Test_exportCachingPolicyManager(_CachingPolicyManagerSetup):
+
+    def test_empty(self):
+        from Products.CMFSetup.cachingpolicymgr \
+            import exportCachingPolicyManager
+
+        site = self._initSite(with_policy=False)
+        context = DummyExportContext(site)
+        exportCachingPolicyManager(context)
+
+        self.assertEqual(len(context._wrote), 1)
+        filename, text, content_type = context._wrote[0]
+        self.assertEqual(filename, 'cachingpolicymgr.xml')
+        self._compareDOM(text, self._EMPTY_EXPORT)
+        self.assertEqual(content_type, 'text/xml')
+
+    def test_with_policy(self):
+        from Products.CMFSetup.cachingpolicymgr \
+            import exportCachingPolicyManager
+
+        site = self._initSite(with_policy=True)
+        context = DummyExportContext(site)
+        exportCachingPolicyManager(context)
+
+        self.assertEqual(len(context._wrote), 1)
+        filename, text, content_type = context._wrote[0]
+        self.assertEqual(filename, 'cachingpolicymgr.xml')
+        self._compareDOM(text, self._WITH_POLICY_EXPORT)
+        self.assertEqual(content_type, 'text/xml')
+
+
+class Test_importCachingPolicyManager(_CachingPolicyManagerSetup):
+
+    def test_normal(self):
+        from Products.CMFSetup.cachingpolicymgr \
+            import importCachingPolicyManager
+
+        site = self._initSite(with_policy=False)
+        cpm = site.caching_policy_manager
+        self.assertEqual(len(cpm.listPolicies()), 0)
+
+        context = DummyImportContext(site)
+        context._files['cachingpolicymgr.xml'] = self._WITH_POLICY_EXPORT
+        importCachingPolicyManager(context)
+
+        self.assertEqual(len(cpm.listPolicies()), 1)
+        policy_id, policy = cpm.listPolicies()[0]
+
+        self.assertEqual(policy.getPolicyId(), self.POLICY_ID)
+        self.assertEqual(policy.getPredicate(), self.PREDICATE)
+        self.assertEqual(policy.getMTimeFunc(), self.MTIME_FUNC)
+        self.assertEqual(policy.getVary(), self.VARY)
+        self.assertEqual(policy.getETagFunc(), self.ETAG_FUNC)
+        self.assertEqual(policy.getMaxAgeSecs(), self.MAX_AGE_SECS)
+        self.assertEqual(policy.getSMaxAgeSecs(), self.S_MAX_AGE_SECS)
+        self.assertEqual(policy.getPreCheck(), self.PRE_CHECK)
+        self.assertEqual(policy.getPostCheck(), self.POST_CHECK)
+        self.assertEqual(policy.getLastModified(), False)
+        self.assertEqual(policy.getNoCache(), True)
+        self.assertEqual(policy.getNoStore(), True)
+        self.assertEqual(policy.getMustRevalidate(), True)
+        self.assertEqual(policy.getProxyRevalidate(), True)
+        self.assertEqual(policy.getNoTransform(), True)
+        self.assertEqual(policy.getPublic(), True)
+        self.assertEqual(policy.getPrivate(), True)
+        self.assertEqual(policy.getEnable304s(), True)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(CachingPolicyManagerExportConfiguratorTests),
+        unittest.makeSuite(CachingPolicyManagerImportConfiguratorTests),
+        unittest.makeSuite(Test_exportCachingPolicyManager),
+        unittest.makeSuite(Test_importCachingPolicyManager),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')

Modified: CMF/trunk/CMFSetup/utils.py
===================================================================
--- CMF/trunk/CMFSetup/utils.py	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFSetup/utils.py	2005-10-11 20:21:10 UTC (rev 39073)
@@ -138,6 +138,10 @@
 
         return val.lower() in ('true', 'yes', '1')
 
+    def _convertToInteger(self, val):
+
+        return int(val.strip())
+
     def _convertToUnique(self, val):
 
         assert len(val) == 1

Added: CMF/trunk/CMFSetup/xml/cpmExport.xml
===================================================================
--- CMF/trunk/CMFSetup/xml/cpmExport.xml	2005-10-11 20:16:25 UTC (rev 39072)
+++ CMF/trunk/CMFSetup/xml/cpmExport.xml	2005-10-11 20:21:10 UTC (rev 39073)
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<caching-policies xmlns:tal="http://xml.zope.org/namespaces/tal">
+ <caching-policy
+    policy_id="POLICY_ID"
+    predicate="PREDICATE"
+    mtime_func="MTIME_FUNC"
+    vary="VARY"
+    etag_func="ETAG_FUNC"
+    max_age_secs="MAX_AGE_SECS"
+    s_max_age_secs="S_MAX_AGE_SECS"
+    pre_check="PRE_CHECK"
+    post_check="POST_CHECK"
+    last_modified="LAST_MODIFIED"
+    no_cache="NO_CACHE"
+    no_store="NO_STORE"
+    must_revalidate="MUST_REVALIDATE"
+    proxy_revalidate="PROXY_REVALIDATE"
+    no_transform="NO_TRANSFORM"
+    public="PUBLIC"
+    private="PRIVATE"
+    enable_304s="ENABLE_304S"
+    tal:repeat="info context/listPolicyInfo"
+    tal:attributes="policy_id info/policy_id;
+                    predicate info/predicate;
+                    mtime_func info/mtime_func;
+                    vary info/vary;
+                    etag_func info/etag_func;
+                    max_age_secs info/max_age_secs;
+                    s_max_age_secs info/s_max_age_secs;
+                    pre_check info/pre_check;
+                    post_check info/post_check;
+                    last_modified info/last_modified;
+                    no_cache info/no_cache;
+                    no_store info/no_store;
+                    must_revalidate info/must_revalidate;
+                    proxy_revalidate info/proxy_revalidate;
+                    no_transform info/no_transform;
+                    public info/public;
+                    private info/private;
+                    enable_304s info/enable_304s;
+                   "
+    />
+</caching-policies>



More information about the CMF-checkins mailing list