Code

bugfixes for redirect and form handling
[roundup.git] / roundup / cgi / PageTemplates / Expressions.py
index 105da31c1fbcfe5663484e790e62a1bb80a2f453..054e29344b2793c1c1b79997ed48aee1eb816282 100644 (file)
 
 Page Template-specific implementation of TALES, with handlers
 for Python expressions, string literals, and paths.
+
+
+Modified for Roundup 0.5 release:
+
+- Removed all Zope-specific code (doesn't even try to import that stuff now)
+- Removed all Acquisition
+- Made traceback info more informative
+
 """
 
-__version__='$Revision: 1.1 $'[11:-2]
+__version__='$Revision: 1.6 $'[11:-2]
 
 import re, sys
 from TALES import Engine, CompilerError, _valid_name, NAME_RE, \
@@ -112,7 +120,8 @@ class SubPathExpr:
                     # If the value isn't a string, assume it's a sequence
                     # of path names.
                     path[i:i+1] = list(val)
-        __traceback_info__ = base = self._base
+        base = self._base
+        __traceback_info__ = 'path expression "%s"'%('/'.join(self._path))
         if base == 'CONTEXTS':
             ob = econtext.contexts
         else:
@@ -255,6 +264,10 @@ class DeferExpr:
     def __repr__(self):
         return 'defer:%s' % `self._s`
 
+class TraversalError:
+    def __init__(self, path, name):
+        self.path = path
+        self.name = name
 
 def restrictedTraverse(self, path, securityManager,
                        get=getattr, has=hasattr, N=None, M=[],
@@ -270,17 +283,18 @@ def restrictedTraverse(self, path, securityManager,
     path.reverse()
     object = self
     #print 'TRAVERSE', (object, path)
+    done = []
     while path:
-        __traceback_info__ = REQUEST
         name = path.pop()
+        __traceback_info__ = TraversalError(done, name)
 
         if isinstance(name, TupleType):
             object = apply(object, name)
             continue
 
-        if name[0] == '_':
-            # Never allowed in a URL.
-            raise AttributeError, name
+#        if name[0] == '_':
+#            # Never allowed in a URL.
+#            raise AttributeError, name
 
         # Try an attribute.
         o = get(object, name, M)
@@ -310,6 +324,7 @@ def restrictedTraverse(self, path, securityManager,
                 raise
         #print '... object is now', `o`
         object = o
+        done.append((name, o))
 
     return object