[Checkins] SVN: z3ext.skintool/tags/1.1.1/ tag

Nikolay Kim fafhrd at datacom.kz
Wed Dec 3 10:48:40 EST 2008


Log message for revision 93576:
  tag

Changed:
  A   z3ext.skintool/tags/1.1.1/
  D   z3ext.skintool/tags/1.1.1/CHANGES.txt
  A   z3ext.skintool/tags/1.1.1/CHANGES.txt
  D   z3ext.skintool/tags/1.1.1/setup.py
  A   z3ext.skintool/tags/1.1.1/setup.py
  D   z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py
  A   z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py
  D   z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py
  A   z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py
  D   z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py
  A   z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py

-=-
Deleted: z3ext.skintool/tags/1.1.1/CHANGES.txt
===================================================================
--- z3ext.skintool/trunk/CHANGES.txt	2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/CHANGES.txt	2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,61 +0,0 @@
-=======
-CHANGES
-=======
-
-1.1.0 (2008-11-21)
-------------------
-
-- Added z3ext:skin directive
-
-- API refactored
-
-- Added translations: nl, ru
-
-
-1.0.2 (2008-08-07)
-------------------
-
-- Added INoSkinSwitching for skin that does not allow skin switching
-
-
-1.0.1 (2008-05-16)
-------------------
-
-- Replace 'autoinclude' with 'includeDependendcies'
-
-
-1.0.0 (2008-03-28)
-------------------
-
-- Code cleanup
-
-- Added tests
-
-- Code moved to svn.zope.org
-
-
-0.13 (2008-02-28)
-----------------
-
-- Use z3c.autoinclude
-
-- Do not generate InterfaceClass object, just apply list of layers
-
-
-0.12 (2008-02-08)
------------------
-
-- Code cleanup
-
-
-0.11 (2008-02-06)
-------------------
-
-- Added ISkinable marker interface.
-  Now object should implement ISkinable implicitly to support skintool
-
-
-0.10 (2008-02-01)
-------------------
-
-- Initial release.

Copied: z3ext.skintool/tags/1.1.1/CHANGES.txt (from rev 93575, z3ext.skintool/trunk/CHANGES.txt)
===================================================================
--- z3ext.skintool/tags/1.1.1/CHANGES.txt	                        (rev 0)
+++ z3ext.skintool/tags/1.1.1/CHANGES.txt	2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,67 @@
+=======
+CHANGES
+=======
+
+1.1.1 (2008-12-03)
+------------------
+
+- Do not use _v_skin attribute
+
+
+1.1.0 (2008-11-21)
+------------------
+
+- Added z3ext:skin directive
+
+- API refactored
+
+- Added translations: nl, ru
+
+
+1.0.2 (2008-08-07)
+------------------
+
+- Added INoSkinSwitching for skin that does not allow skin switching
+
+
+1.0.1 (2008-05-16)
+------------------
+
+- Replace 'autoinclude' with 'includeDependendcies'
+
+
+1.0.0 (2008-03-28)
+------------------
+
+- Code cleanup
+
+- Added tests
+
+- Code moved to svn.zope.org
+
+
+0.13 (2008-02-28)
+----------------
+
+- Use z3c.autoinclude
+
+- Do not generate InterfaceClass object, just apply list of layers
+
+
+0.12 (2008-02-08)
+-----------------
+
+- Code cleanup
+
+
+0.11 (2008-02-06)
+------------------
+
+- Added ISkinable marker interface.
+  Now object should implement ISkinable implicitly to support skintool
+
+
+0.10 (2008-02-01)
+------------------
+
+- Initial release.

Deleted: z3ext.skintool/tags/1.1.1/setup.py
===================================================================
--- z3ext.skintool/trunk/setup.py	2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/setup.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,75 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 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.
-#
-##############################################################################
-"""Setup for z3ext.skintool package
-
-$Id$
-"""
-import sys, os
-from setuptools import setup, find_packages
-
-def read(*rnames):
-    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-
-version = '1.1.1dev'
-
-
-setup(name='z3ext.skintool',
-      version=version,
-      description="Tool for merging skin layers at runtime",
-      long_description=(
-          'Detailed Documentation\n' +
-          '======================\n'
-          + '\n\n' +
-          read('src', 'z3ext', 'skintool', 'README.txt')
-          + '\n\n' +
-          read('CHANGES.txt')
-          ),
-      classifiers=[
-        'Development Status :: 5 - Production/Stable',
-        'Environment :: Web Environment',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: Zope Public License',
-        'Programming Language :: Python',
-        'Natural Language :: English',
-        'Operating System :: OS Independent',
-        'Topic :: Internet :: WWW/HTTP',
-        'Framework :: Zope3'],
-      author='Nikolay Kim',
-      author_email='fafhrd91 at gmail.com',
-      url='http://z3ext.net/',
-      license='ZPL 2.1',
-      packages=find_packages('src'),
-      package_dir = {'':'src'},
-      namespace_packages=['z3ext'],
-      install_requires = ['setuptools',
-                          'zope.schema',
-			  'zope.proxy',
-                          'zope.component',
-                          'zope.interface',
-			  'zope.security',
-			  'zope.configuration',
-			  'zope.lifecycleevent',
-                          'zope.app.component',
-			  'zope.app.publication',
-                          'zope.i18nmessageid',
-                          'zope.i18n',
-			  'z3c.autoinclude',
-			  'z3ext.controlpanel',
-                          ],
-      extras_require = dict(test=['zope.app.testing',
-                                  'zope.testing',
-                                  ]),
-      include_package_data = True,
-      zip_safe = False
-      )

Copied: z3ext.skintool/tags/1.1.1/setup.py (from rev 93575, z3ext.skintool/trunk/setup.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/setup.py	                        (rev 0)
+++ z3ext.skintool/tags/1.1.1/setup.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,76 @@
+##############################################################################
+#
+# Copyright (c) 2007 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.
+#
+##############################################################################
+"""Setup for z3ext.skintool package
+
+$Id$
+"""
+import sys, os
+from setuptools import setup, find_packages
+
+def read(*rnames):
+    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+version = '1.1.1dev'
+
+
+setup(name='z3ext.skintool',
+      version=version,
+      description="Tool for merging skin layers at runtime",
+      long_description=(
+          'Detailed Documentation\n' +
+          '======================\n'
+          + '\n\n' +
+          read('src', 'z3ext', 'skintool', 'README.txt')
+          + '\n\n' +
+          read('CHANGES.txt')
+          ),
+      classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Web Environment',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved :: Zope Public License',
+        'Programming Language :: Python',
+        'Natural Language :: English',
+        'Operating System :: OS Independent',
+        'Topic :: Internet :: WWW/HTTP',
+        'Framework :: Zope3'],
+      author='Nikolay Kim',
+      author_email='fafhrd91 at gmail.com',
+      url='http://z3ext.net/',
+      license='ZPL 2.1',
+      packages=find_packages('src'),
+      package_dir = {'':'src'},
+      namespace_packages=['z3ext'],
+      install_requires = ['setuptools',
+                          'zope.schema',
+			  'zope.proxy',
+                          'zope.component',
+                          'zope.interface',
+			  'zope.security',
+			  'zope.configuration',
+			  'zope.lifecycleevent',
+			  'zope.app.intid',
+                          'zope.app.component',
+			  'zope.app.publication',
+                          'zope.i18nmessageid',
+                          'zope.i18n',
+			  'z3c.autoinclude',
+			  'z3ext.controlpanel',
+                          ],
+      extras_require = dict(test=['zope.app.testing',
+                                  'zope.testing',
+                                  ]),
+      include_package_data = True,
+      zip_safe = False
+      )

Deleted: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/subscribers.py	2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,48 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 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.
-#
-##############################################################################
-"""
-
-$Id$
-"""
-from zope import component
-from zope.proxy import removeAllProxies
-from zope.component import getUtility
-from zope.interface import directlyProvides
-from zope.app.component.interfaces import ISite
-from zope.app.publication.interfaces import IBeforeTraverseEvent
-
-from interfaces import ISkinTool, ISkinable, INoSkinSwitching
-
-
- at component.adapter(ISite, IBeforeTraverseEvent)
-def threadServiceSubscriber(site, event,
-                            ISkinable = ISkinable,
-                            removeAllProxies=removeAllProxies,
-                            directlyProvides=directlyProvides):
-
-    if INoSkinSwitching.providedBy(event.request):
-        return
-    
-    site = removeAllProxies(site)
-
-    if not ISkinable.providedBy(site):
-        return
-
-    skin = getattr(site, '_v_skin', None)
-    if skin is None:
-        skin = getUtility(ISkinTool).generate()
-        site._v_skin = skin
-
-    if skin:
-        directlyProvides(event.request, *skin)

Copied: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py (from rev 93575, z3ext.skintool/trunk/src/z3ext/skintool/subscribers.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py	                        (rev 0)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/subscribers.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,52 @@
+##############################################################################
+#
+# Copyright (c) 2007 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.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+from zope import component
+from zope.proxy import removeAllProxies
+from zope.component import getUtility
+from zope.interface import directlyProvides
+from zope.app.intid.interfaces import IIntIds
+from zope.app.component.interfaces import ISite
+from zope.app.publication.interfaces import IBeforeTraverseEvent
+
+from tool import cache
+from interfaces import ISkinTool, ISkinable, INoSkinSwitching
+
+
+ at component.adapter(ISite, IBeforeTraverseEvent)
+def threadServiceSubscriber(site, event,
+                            ISkinable = ISkinable,
+                            removeAllProxies=removeAllProxies,
+                            directlyProvides=directlyProvides):
+
+    if INoSkinSwitching.providedBy(event.request):
+        return
+    
+    site = removeAllProxies(site)
+
+    if not ISkinable.providedBy(site):
+        return
+
+    id = getUtility(IIntIds).queryId(site)
+    if id not in cache:
+        skin = getUtility(ISkinTool).generate()
+        cache[id] = skin
+    else:
+        skin = cache[id]
+
+    if skin:
+        directlyProvides(event.request, *skin)

Deleted: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/tests.py	2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,46 +0,0 @@
-##############################################################################
-#
-# 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.
-#
-##############################################################################
-""" 
-
-$Id$
-"""
-import unittest, doctest
-from zope import interface, component
-from zope.app.testing import setup
-
-from tool import SkinTool
-
-
-def setUp(test):
-    setup.placefulSetUp(site=True)
-    setup.setUpTestAsModule(test, 'z3ext.skintool.README')
-
-    # register utility
-    tool = SkinTool()
-    component.provideUtility(tool)
-
-
-def tearDown(test):
-    setup.placefulTearDown()
-    setup.tearDownTestAsModule(test)
-
-
-def test_suite():
-    return unittest.TestSuite((
-            doctest.DocFileSuite(
-                'README.txt',
-                setUp=setUp, tearDown=tearDown,
-                optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
-                ),
-            ))

Copied: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py (from rev 93575, z3ext.skintool/trunk/src/z3ext/skintool/tests.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py	                        (rev 0)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tests.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,51 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+""" 
+
+$Id$
+"""
+import unittest, doctest
+from zope import interface, component
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
+from zope.app.testing import setup
+
+from tool import SkinTool
+
+
+def setUp(test):
+    site = setup.placefulSetUp(site=True)
+    setup.setUpTestAsModule(test, 'z3ext.skintool.README')
+
+    site['intid'] = IntIds()
+    component.provideUtility(site['intid'], IIntIds)
+
+    # register utility
+    tool = SkinTool()
+    component.provideUtility(tool)
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+    setup.tearDownTestAsModule(test)
+
+
+def test_suite():
+    return unittest.TestSuite((
+            doctest.DocFileSuite(
+                'README.txt',
+                setUp=setUp, tearDown=tearDown,
+                optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+                ),
+            ))

Deleted: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py
===================================================================
--- z3ext.skintool/trunk/src/z3ext/skintool/tool.py	2008-12-03 12:49:03 UTC (rev 93574)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -1,84 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 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.
-#
-##############################################################################
-""" skintool implementation
-
-$Id$
-"""
-from zope import interface, component
-from zope.component import getSiteManager, getAdapters, getUtilitiesFor
-from zope.security.proxy import removeSecurityProxy
-from zope.lifecycleevent.interfaces import IObjectModifiedEvent
-from zope.publisher.interfaces.browser import \
-     IDefaultSkin, IBrowserRequest, IDefaultBrowserLayer
-from zope.app.component.hooks import getSite
-
-from interfaces import IDefaultLayer, IDefaultLayers, ISkinTool
-
-skins_byname = {}
-skins_registry = {}
-layers_byname = {}
-layers_registry = {}
-
-
-class SkinTool(object):
-    interface.implements(ISkinTool)
-
-    def generate(self):
-        bases = []
-
-        # first add default layers
-        for name, adapter in getAdapters((getSite(),), IDefaultLayers):
-            for layer in adapter.layers:
-                if layer not in bases:
-                    bases.append(layer)
-
-        for name, layer in getUtilitiesFor(IDefaultLayer):
-            if layer not in bases:
-                bases.append(layer)
-
-        # second add skin
-        if self.skin:
-            skin = skins_byname.get(self.skin)
-            if skin:
-                bases.append(skin)
-                info = skins_registry.get(skin)
-                if info:
-                    for layer in info[4]:
-                        if layer not in bases:
-                            bases.append(layer)
-
-        #third add layers
-        for name in self.layers:
-            layer = layers_byname.get(name)
-            if layer and layer not in bases:
-                bases.append(layer)
-
-        # get base skin
-        adapters = getSiteManager().adapters
-        skin = adapters.lookup((IBrowserRequest,), IDefaultSkin, name='')
-        if skin is not None:
-            bases.insert(0, skin)
-        else:
-            bases.insert(0, IDefaultBrowserLayer)
-
-        bases.reverse()
-        return bases
-
-
- at component.adapter(ISkinTool, IObjectModifiedEvent)
-def skinToolModified(*args):
-    try:
-        del removeSecurityProxy(getSite())._v_skin
-    except:
-        pass

Copied: z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py (from rev 93575, z3ext.skintool/trunk/src/z3ext/skintool/tool.py)
===================================================================
--- z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py	                        (rev 0)
+++ z3ext.skintool/tags/1.1.1/src/z3ext/skintool/tool.py	2008-12-03 15:48:39 UTC (rev 93576)
@@ -0,0 +1,88 @@
+##############################################################################
+#
+# Copyright (c) 2007 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.
+#
+##############################################################################
+""" skintool implementation
+
+$Id$
+"""
+from zope import interface, component
+from zope.component import getSiteManager
+from zope.component import getUtility, getAdapters, getUtilitiesFor
+from zope.security.proxy import removeSecurityProxy
+from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+from zope.publisher.interfaces.browser import \
+     IDefaultSkin, IBrowserRequest, IDefaultBrowserLayer
+from zope.app.component.hooks import getSite
+from zope.app.intid.interfaces import IIntIds
+
+from interfaces import IDefaultLayer, IDefaultLayers, ISkinTool
+
+cache = {}
+skins_byname = {}
+skins_registry = {}
+layers_byname = {}
+layers_registry = {}
+
+
+class SkinTool(object):
+    interface.implements(ISkinTool)
+
+    def generate(self):
+        bases = []
+
+        # first add default layers
+        for name, adapter in getAdapters((getSite(),), IDefaultLayers):
+            for layer in adapter.layers:
+                if layer not in bases:
+                    bases.append(layer)
+
+        for name, layer in getUtilitiesFor(IDefaultLayer):
+            if layer not in bases:
+                bases.append(layer)
+
+        # second add skin
+        if self.skin:
+            skin = skins_byname.get(self.skin)
+            if skin:
+                bases.append(skin)
+                info = skins_registry.get(skin)
+                if info:
+                    for layer in info[4]:
+                        if layer not in bases:
+                            bases.append(layer)
+
+        #third add layers
+        for name in self.layers:
+            layer = layers_byname.get(name)
+            if layer and layer not in bases:
+                bases.append(layer)
+
+        # get base skin
+        adapters = getSiteManager().adapters
+        skin = adapters.lookup((IBrowserRequest,), IDefaultSkin, name='')
+        if skin is not None:
+            bases.insert(0, skin)
+        else:
+            bases.insert(0, IDefaultBrowserLayer)
+
+        bases.reverse()
+        return bases
+
+
+ at component.adapter(ISkinTool, IObjectModifiedEvent)
+def skinToolModified(*args):
+    global cache
+
+    id = getUtility(IIntIds).queryId(getSite())
+    if id in cache:
+        del cache[id]



More information about the Checkins mailing list