Merge with 6f0fb6086bf396ea9083db6edd5d468612f85be0 ZTK-1.1
authorThierry Florac <tflorac@ulthar.net>
Mon, 12 Dec 2011 15:32:50 +0100
branchZTK-1.1
changeset 103 088a873802df
parent 92 bf59a3d6e437 (diff)
parent 93 6f0fb6086bf3 (current diff)
child 104 9355f0a396de
Merge with 6f0fb6086bf396ea9083db6edd5d468612f85be0
.pydevproject
--- a/.hgtags	Mon Dec 12 15:31:23 2011 +0100
+++ b/.hgtags	Mon Dec 12 15:32:50 2011 +0100
@@ -4,3 +4,4 @@
 35d95d221249504767e536df4aca0c012be147ad 0.3.0
 a8072195e0c6b9a9da43c1ec4239f08cdd0617cb 0.3.1
 96e344fe61666bcf26f9f0529f6efd761ab11b28 0.3.2
+165f37f89e5a3f5763cc59125d47e4cd7fc38ae6 0.3.3
--- a/.pydevproject	Mon Dec 12 15:31:23 2011 +0100
+++ b/.pydevproject	Mon Dec 12 15:32:50 2011 +0100
@@ -2,10 +2,42 @@
 <?eclipse-pydev version="1.0"?>
 
 <pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.5</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property>
 <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
-<path>/ZTFY.utils (hg)/ztfy</path>
+<path>/ZTFY.utils (hg)</path>
 </pydev_pathproperty>
 
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Python 2.5</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Python 2.6 (BB)</pydev_property>
+<pydev_pathproperty name="org.python.pydev.PROJECT_EXTERNAL_SOURCE_PATH">
+<path>/var/local/eggs/zope.testing-3.10.2-py2.6.egg</path>
+<path>/var/local/eggs/zope.tales-3.5.1-py2.6.egg</path>
+<path>/var/local/eggs/zope.interface-3.6.1-py2.6-linux-x86_64.egg</path>
+<path>/var/local/eggs/zope.datetime-3.4.0-py2.6.egg</path>
+<path>/var/local/eggs/zope.i18n-3.7.4-py2.6.egg</path>
+<path>/var/local/eggs/z3c.form-2.4.3-py2.6.egg</path>
+<path>/var/local/eggs/zope.app.file-3.6.1-py2.6.egg</path>
+<path>/var/local/eggs/zope.schema-3.7.1-py2.6.egg</path>
+<path>/var/local/eggs/zope.component-3.10.0-py2.6.egg</path>
+<path>/var/local/eggs/zope.annotation-3.5.0-py2.6.egg</path>
+<path>/var/local/eggs/zope.catalog-3.8.1-py2.6.egg</path>
+<path>/var/local/eggs/zope.container-3.12.0-py2.6-linux-x86_64.egg</path>
+<path>/var/local/eggs/zope.intid-3.7.2-py2.6.egg</path>
+<path>/var/local/eggs/zope.publisher-3.12.6-py2.6.egg</path>
+<path>/var/local/eggs/zope.security-3.8.0-py2.6-linux-x86_64.egg</path>
+<path>/var/local/eggs/ZODB3-3.10.2-py2.6-linux-x86_64.egg</path>
+<path>/var/local/eggs/zc.set-0.1dev_r75642-py2.6.egg</path>
+<path>/var/local/eggs/zope.session-3.9.3-py2.6.egg</path>
+<path>/var/local/eggs/zope.location-3.9.0-py2.6.egg</path>
+<path>/var/local/eggs/zope.index-3.6.1-py2.6-linux-x86_64.egg</path>
+<path>/var/local/eggs/zopyx.txng3.core-3.5.3-py2.6.egg</path>
+<path>/var/local/eggs/zopyx.txng3.ext-3.3.2-py2.6-linux-x86_64.egg</path>
+<path>/var/local/eggs/hurry.query-1.1.0-py2.6.egg</path>
+<path>/var/local/eggs/pytz-2010l-py2.6.egg</path>
+<path>/var/local/eggs/zope.authentication-3.7.1-py2.6.egg</path>
+<path>/var/local/eggs/zc.set-0.1dev_r75642-py2.6.egg</path>
+<path>/var/local/eggs/zope.pluggableauth-1.2-py2.6.egg</path>
+<path>/var/local/eggs/zc.set-0.1dev_r75642-py2.6.egg</path>
+<path>/var/local/eggs/zope.deprecation-3.4.1-py2.6.egg</path>
+<path>/var/local/eggs/fanstatic-0.11.3-py2.6.egg</path>
+</pydev_pathproperty>
 </pydev_project>
--- a/.settings/org.eclipse.core.resources.prefs	Mon Dec 12 15:31:23 2011 +0100
+++ b/.settings/org.eclipse.core.resources.prefs	Mon Dec 12 15:32:50 2011 +0100
@@ -1,4 +1,4 @@
-#Tue Oct 18 08:26:00 CEST 2011
+#Sun Nov 20 00:28:15 CET 2011
 eclipse.preferences.version=1
 encoding//build/lib/ztfy/utils/site.py=utf-8
 encoding//build/lib/ztfy/utils/tal/html.py=utf-8
@@ -18,6 +18,7 @@
 encoding//ztfy/utils/security.py=utf-8
 encoding//ztfy/utils/session.py=utf-8
 encoding//ztfy/utils/site.py=utf-8
+encoding//ztfy/utils/tal/fanstatic.py=utf-8
 encoding//ztfy/utils/tal/html.py=utf-8
 encoding//ztfy/utils/tal/interfaces.py=utf-8
 encoding//ztfy/utils/tal/request.py=utf-8
--- a/bin/i18ncompile	Mon Dec 12 15:31:23 2011 +0100
+++ b/bin/i18ncompile	Mon Dec 12 15:32:50 2011 +0100
@@ -35,6 +35,7 @@
     '/var/local/eggs/z3c.form-2.4.3-py2.6.egg',
     '/var/local/eggs/pytz-2011g-py2.6.egg',
     '/var/local/eggs/hurry.query-1.1.0-py2.6.egg',
+    '/var/local/eggs/fanstatic-0.11.3-py2.6.egg',
     '/var/local/eggs/zope.traversing-3.14.0-py2.6.egg',
     '/var/local/eggs/zope.site-3.9.2-py2.6.egg',
     '/var/local/eggs/zope.processlifetime-1.0-py2.6.egg',
@@ -67,6 +68,8 @@
     '/var/local/eggs/zope.pagetemplate-3.5.2-py2.6.egg',
     '/var/local/eggs/zope.contentprovider-3.7.2-py2.6.egg',
     '/var/local/eggs/zc.catalog-1.5-py2.6.egg',
+    '/var/local/eggs/WebOb-1.2b2-py2.6.egg',
+    '/var/local/env/bb-2.6/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg',
     '/var/local/eggs/zdaemon-2.0.4-py2.6.egg',
     '/var/local/eggs/ZConfig-2.8.0-py2.6.egg',
     '/var/local/eggs/zc.lockfile-1.0.0-py2.6.egg',
--- a/bin/i18nextract	Mon Dec 12 15:31:23 2011 +0100
+++ b/bin/i18nextract	Mon Dec 12 15:32:50 2011 +0100
@@ -35,6 +35,7 @@
     '/var/local/eggs/z3c.form-2.4.3-py2.6.egg',
     '/var/local/eggs/pytz-2011g-py2.6.egg',
     '/var/local/eggs/hurry.query-1.1.0-py2.6.egg',
+    '/var/local/eggs/fanstatic-0.11.3-py2.6.egg',
     '/var/local/eggs/zope.traversing-3.14.0-py2.6.egg',
     '/var/local/eggs/zope.site-3.9.2-py2.6.egg',
     '/var/local/eggs/zope.processlifetime-1.0-py2.6.egg',
@@ -67,6 +68,8 @@
     '/var/local/eggs/zope.pagetemplate-3.5.2-py2.6.egg',
     '/var/local/eggs/zope.contentprovider-3.7.2-py2.6.egg',
     '/var/local/eggs/zc.catalog-1.5-py2.6.egg',
+    '/var/local/eggs/WebOb-1.2b2-py2.6.egg',
+    '/var/local/env/bb-2.6/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg',
     '/var/local/eggs/zdaemon-2.0.4-py2.6.egg',
     '/var/local/eggs/ZConfig-2.8.0-py2.6.egg',
     '/var/local/eggs/zc.lockfile-1.0.0-py2.6.egg',
--- a/bin/i18nmergeall	Mon Dec 12 15:31:23 2011 +0100
+++ b/bin/i18nmergeall	Mon Dec 12 15:32:50 2011 +0100
@@ -35,6 +35,7 @@
     '/var/local/eggs/z3c.form-2.4.3-py2.6.egg',
     '/var/local/eggs/pytz-2011g-py2.6.egg',
     '/var/local/eggs/hurry.query-1.1.0-py2.6.egg',
+    '/var/local/eggs/fanstatic-0.11.3-py2.6.egg',
     '/var/local/eggs/zope.traversing-3.14.0-py2.6.egg',
     '/var/local/eggs/zope.site-3.9.2-py2.6.egg',
     '/var/local/eggs/zope.processlifetime-1.0-py2.6.egg',
@@ -67,6 +68,8 @@
     '/var/local/eggs/zope.pagetemplate-3.5.2-py2.6.egg',
     '/var/local/eggs/zope.contentprovider-3.7.2-py2.6.egg',
     '/var/local/eggs/zc.catalog-1.5-py2.6.egg',
+    '/var/local/eggs/WebOb-1.2b2-py2.6.egg',
+    '/var/local/env/bb-2.6/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg',
     '/var/local/eggs/zdaemon-2.0.4-py2.6.egg',
     '/var/local/eggs/ZConfig-2.8.0-py2.6.egg',
     '/var/local/eggs/zc.lockfile-1.0.0-py2.6.egg',
--- a/bin/i18nstats	Mon Dec 12 15:31:23 2011 +0100
+++ b/bin/i18nstats	Mon Dec 12 15:32:50 2011 +0100
@@ -35,6 +35,7 @@
     '/var/local/eggs/z3c.form-2.4.3-py2.6.egg',
     '/var/local/eggs/pytz-2011g-py2.6.egg',
     '/var/local/eggs/hurry.query-1.1.0-py2.6.egg',
+    '/var/local/eggs/fanstatic-0.11.3-py2.6.egg',
     '/var/local/eggs/zope.traversing-3.14.0-py2.6.egg',
     '/var/local/eggs/zope.site-3.9.2-py2.6.egg',
     '/var/local/eggs/zope.processlifetime-1.0-py2.6.egg',
@@ -67,6 +68,8 @@
     '/var/local/eggs/zope.pagetemplate-3.5.2-py2.6.egg',
     '/var/local/eggs/zope.contentprovider-3.7.2-py2.6.egg',
     '/var/local/eggs/zc.catalog-1.5-py2.6.egg',
+    '/var/local/eggs/WebOb-1.2b2-py2.6.egg',
+    '/var/local/env/bb-2.6/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg',
     '/var/local/eggs/zdaemon-2.0.4-py2.6.egg',
     '/var/local/eggs/ZConfig-2.8.0-py2.6.egg',
     '/var/local/eggs/zc.lockfile-1.0.0-py2.6.egg',
--- a/bin/test	Mon Dec 12 15:31:23 2011 +0100
+++ b/bin/test	Mon Dec 12 15:32:50 2011 +0100
@@ -29,6 +29,7 @@
     '/var/local/eggs/z3c.form-2.4.3-py2.6.egg',
     '/var/local/eggs/pytz-2011g-py2.6.egg',
     '/var/local/eggs/hurry.query-1.1.0-py2.6.egg',
+    '/var/local/eggs/fanstatic-0.11.3-py2.6.egg',
     '/var/local/eggs/zopyx.txng3.ext-3.3.2-py2.6-linux-x86_64.egg',
     '/var/local/eggs/zope.tal-3.5.2-py2.6.egg',
     '/var/local/eggs/zope.minmax-1.1.2-py2.6.egg',
@@ -60,6 +61,8 @@
     '/var/local/eggs/zope.pagetemplate-3.5.2-py2.6.egg',
     '/var/local/eggs/zope.contentprovider-3.7.2-py2.6.egg',
     '/var/local/eggs/zc.catalog-1.5-py2.6.egg',
+    '/var/local/eggs/WebOb-1.2b2-py2.6.egg',
+    '/var/local/env/bb-2.6/lib/python2.6/site-packages/Paste-1.7.5.1-py2.6.egg',
     '/var/local/eggs/zdaemon-2.0.4-py2.6.egg',
     '/var/local/eggs/ZConfig-2.8.0-py2.6.egg',
     '/var/local/eggs/zc.lockfile-1.0.0-py2.6.egg',
--- a/setup.py	Mon Dec 12 15:31:23 2011 +0100
+++ b/setup.py	Mon Dec 12 15:32:50 2011 +0100
@@ -25,7 +25,7 @@
 README = os.path.join(DOCS, 'README.txt')
 HISTORY = os.path.join(DOCS, 'HISTORY.txt')
 
-version = '0.3.2'
+version = '0.3.3'
 long_description = open(README).read() + '\n\n' + open(HISTORY).read()
 
 tests_require = [
@@ -60,6 +60,7 @@
       install_requires=[
           'setuptools',
           # -*- Extra requirements: -*-
+          'fanstatic',
           'hurry.query',
           'pytz',
           'z3c.form',
--- a/ztfy.utils.egg-info/PKG-INFO	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy.utils.egg-info/PKG-INFO	Mon Dec 12 15:32:50 2011 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: ztfy.utils
-Version: 0.3.2
+Version: 0.3.3
 Summary: ZTFY utility functions and classes for Zope3
 Home-page: http://trac.ztfy.org/ztfy.utils
 Author: Thierry Florac
@@ -41,33 +41,37 @@
         Changelog
         =========
         
+        0.3.3
+        -----
+         - Added "fanstatic:" TALES expression
+        
         0.3.2
         -----
-        - Mark ztfy.utils.security functions and classes as deprecated
+         - Mark ztfy.utils.security functions and classes as deprecated
         
         0.3.1
         -----
-        - Updated signature in ztfy.utils.catalog.index to match last hurry.query release
+         - Updated signature in ztfy.utils.catalog.index to match last hurry.query release
         
         0.3
         ---
-        - Switched to ZTK-1.1.2
-        - Added "getAge" function in date module 
-        - Added session module and TALES adapter to get/set session values
-        - Check None value in catalog.getObjectId(...) and catalog.getObject(...) methods
+         - Switched to ZTK-1.1.2
+         - Added "getAge" function in date module 
+         - Added session module and TALES adapter to get/set session values
+         - Check None value in catalog.getObjectId(...) and catalog.getObject(...) methods
         
         0.2.1
         -----
-        - Added 'site.locateAndRegister' facility function
-        - Update ServerTimezoneUtility parent classes
+         - Added 'site.locateAndRegister' facility function
+         - Update ServerTimezoneUtility parent classes
         
         0.2
         ---
-        - Added 'data' namespace to access request data
+         - Added 'data' namespace to access request data
         
         0.1
         ---
-        - Initial release
+         - Initial release
         
 Keywords: ZTFY utilities for Zope3
 Platform: UNKNOWN
--- a/ztfy.utils.egg-info/SOURCES.txt	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy.utils.egg-info/SOURCES.txt	Mon Dec 12 15:32:50 2011 +0100
@@ -54,6 +54,7 @@
 ztfy/utils/protocol/xmlrpc.py
 ztfy/utils/tal/__init__.py
 ztfy/utils/tal/configure.zcml
+ztfy/utils/tal/fanstatic.py
 ztfy/utils/tal/html.py
 ztfy/utils/tal/interfaces.py
 ztfy/utils/tal/request.py
--- a/ztfy.utils.egg-info/requires.txt	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy.utils.egg-info/requires.txt	Mon Dec 12 15:32:50 2011 +0100
@@ -1,4 +1,5 @@
 setuptools
+fanstatic
 hurry.query
 pytz
 z3c.form
--- a/ztfy/utils/catalog/__init__.py	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy/utils/catalog/__init__.py	Mon Dec 12 15:32:50 2011 +0100
@@ -42,11 +42,11 @@
 def getIntIdUtility(name='', request=None, context=None):
     """Look for a named IIntIds utility"""
     if request is None:
-        request = request_utils.getRequest()
+        request = request_utils.queryRequest()
     intids = request_utils.getRequestData('IntIdsUtility::' + name, request)
     if intids is None:
         intids = queryUtility(IIntIds, name, context=context)
-        if intids is not None:
+        if (request is not None) and (intids is not None):
             request_utils.setRequestData('IntIdsUtility::' + name, intids, request)
     return intids
 
@@ -56,7 +56,7 @@
     if object is None:
         return None
     if request is None:
-        request = request_utils.getRequest()
+        request = request_utils.queryRequest()
     intids = getIntIdUtility(intids_name, request, context)
     if intids is not None:
         return intids.queryId(object)
--- a/ztfy/utils/docs/HISTORY.txt	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy/utils/docs/HISTORY.txt	Mon Dec 12 15:32:50 2011 +0100
@@ -1,30 +1,34 @@
 Changelog
 =========
 
+0.3.3
+-----
+ - Added "fanstatic:" TALES expression
+
 0.3.2
 -----
-- Mark ztfy.utils.security functions and classes as deprecated
+ - Mark ztfy.utils.security functions and classes as deprecated
 
 0.3.1
 -----
-- Updated signature in ztfy.utils.catalog.index to match last hurry.query release
+ - Updated signature in ztfy.utils.catalog.index to match last hurry.query release
 
 0.3
 ---
-- Switched to ZTK-1.1.2
-- Added "getAge" function in date module 
-- Added session module and TALES adapter to get/set session values
-- Check None value in catalog.getObjectId(...) and catalog.getObject(...) methods
+ - Switched to ZTK-1.1.2
+ - Added "getAge" function in date module 
+ - Added session module and TALES adapter to get/set session values
+ - Check None value in catalog.getObjectId(...) and catalog.getObject(...) methods
 
 0.2.1
 -----
-- Added 'site.locateAndRegister' facility function
-- Update ServerTimezoneUtility parent classes
+ - Added 'site.locateAndRegister' facility function
+ - Update ServerTimezoneUtility parent classes
 
 0.2
 ---
-- Added 'data' namespace to access request data
+ - Added 'data' namespace to access request data
 
 0.1
 ---
-- Initial release
+ - Initial release
--- a/ztfy/utils/request.py	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy/utils/request.py	Mon Dec 12 15:32:50 2011 +0100
@@ -28,6 +28,7 @@
 # import local packages
 
 from ztfy.utils import _
+from zope.security.interfaces import NoInteraction
 
 
 def getRequest():
@@ -39,6 +40,13 @@
     raise RuntimeError, _("No Request in interaction !")
 
 
+def queryRequest():
+    try:
+        return getRequest()
+    except NoInteraction:
+        return None
+
+
 def getRequestPrincipal(request=None):
     """Get principal from given request"""
     if request is None:
--- a/ztfy/utils/tal/configure.zcml	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy/utils/tal/configure.zcml	Mon Dec 12 15:32:50 2011 +0100
@@ -1,5 +1,6 @@
 <configure
 	xmlns="http://namespaces.zope.org/zope"
+	xmlns:tales="http://namespaces.zope.org/tales"
 	i18n_domain="ztfy.utils">
 
 	<adapter
@@ -32,4 +33,8 @@
 		provides="zope.traversing.interfaces.IPathAdapter"
 		for="zope.publisher.interfaces.browser.IBrowserRequest" />
 
+	<tales:expressiontype
+		name="fanstatic"
+		handler=".fanstatic.FanstaticTalesExpression" />
+
 </configure>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ztfy/utils/tal/fanstatic.py	Mon Dec 12 15:32:50 2011 +0100
@@ -0,0 +1,38 @@
+### -*- coding: utf-8 -*- ####################################################
+##############################################################################
+#
+# Copyright (c) 2008-2011 Thierry Florac <tflorac AT ulthar.net>
+# 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.
+#
+##############################################################################
+
+__docformat__ = "restructuredtext"
+
+# import standard packages
+
+# import Zope3 interfaces
+
+# import local interfaces
+
+# import Zope3 packages
+from zope.tales.expressions import StringExpr
+
+# import local packages
+from ztfy.utils.traversing import resolve
+
+
+class FanstaticTalesExpression(StringExpr):
+
+    def __call__(self, econtext):
+        lib, res = self._expr.split('#')
+        module = resolve(lib)
+        resource = getattr(module, res)
+        resource.need()
+        return ''
--- a/ztfy/utils/traversing.py	Mon Dec 12 15:31:23 2011 +0100
+++ b/ztfy/utils/traversing.py	Mon Dec 12 15:32:50 2011 +0100
@@ -37,3 +37,29 @@
             return interface(parent)
         parent = getattr(parent, '__parent__', None)
     return None
+
+
+# copied from fanstatic (which copied it from zope.dottedname !)
+def resolve(name, module=None):
+    name = name.split('.')
+    if not name[0]:
+        if module is None:
+            raise ValueError("relative name without base module")
+        module = module.split('.')
+        name.pop(0)
+        while not name[0]:
+            module.pop()
+            name.pop(0)
+        name = module + name
+
+    used = name.pop(0)
+    found = __import__(used)
+    for n in name:
+        used += '.' + n
+        try:
+            found = getattr(found, n)
+        except AttributeError:
+            __import__(used)
+            found = getattr(found, n)
+
+    return found