annotate roundup/cgi/PageTemplates/PythonExpr.py @ 2119:cc4667ef3f12

Added the ability to toggle where error messages go. They either go to the user (default, for backwards compatibility), the dispatcher, or both. These are able to be toggled via settings in config.py. Please refer to upgrading.txt for more details. (And Richard, let me know if I've done anything wrong with this checkin. :))
author Eddie Parker <eparker@users.sourceforge.net>
date Thu, 25 Mar 2004 19:27:15 +0000
parents fc52d57c6c3e
children b43efe461b3e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # This software is subject to the provisions of the Zope Public License,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # FOR A PARTICULAR PURPOSE
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 """Generic Python Expression Handler
1071
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
15
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
16 Modified for Roundup 0.5 release:
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
17
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
18 - more informative traceback info
c08b3820edd1 Adhering to ZPL
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
19
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1257
diff changeset
21 __docformat__ = 'restructuredtext'
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1257
diff changeset
23 __version__='$Revision: 1.5 $'[11:-2]
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 from TALES import CompilerError
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 from string import strip, split, join, replace, lstrip
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 from sys import exc_info
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 class getSecurityManager:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 '''Null security manager'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 def validate(self, *args, **kwargs):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 return 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 addContext = removeContext = validateValue = validate
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 class PythonExpr:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 def __init__(self, name, expr, engine):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 self.expr = expr = replace(strip(expr), '\n', ' ')
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 try:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 d = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 exec 'def f():\n return %s\n' % strip(expr) in d
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 self._f = d['f']
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 except:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 raise CompilerError, ('Python expression error:\n'
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 '%s: %s') % exc_info()[:2]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 self._get_used_names()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 def _get_used_names(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 self._f_varnames = vnames = []
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 for vname in self._f.func_code.co_names:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 if vname[0] not in '$_':
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 vnames.append(vname)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 def _bind_used_names(self, econtext):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 # Bind template variables
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 names = {}
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 vars = econtext.vars
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1071
diff changeset
57 getType = econtext.getCompiler().getTypes().get
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 for vname in self._f_varnames:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 has, val = vars.has_get(vname)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 if not has:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 has = val = getType(vname)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 if has:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 val = ExprTypeProxy(vname, val, econtext)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 if has:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 names[vname] = val
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 return names
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 def __call__(self, econtext):
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
69 __traceback_info__ = 'python expression "%s"'%self.expr
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 f = self._f
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 f.func_globals.update(self._bind_used_names(econtext))
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 return f()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 def __str__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 return 'Python expression "%s"' % self.expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 def __repr__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 return '<PythonExpr %s>' % self.expr
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 class ExprTypeProxy:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 '''Class that proxies access to an expression type handler'''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 def __init__(self, name, handler, econtext):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 self._name = name
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 self._handler = handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 self._econtext = econtext
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 def __call__(self, text):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 return self._handler(self._name, text,
1257
93b80ad11ca8 merged Zope Collector #372 fix from ZPT CVS trunk
Richard Jones <richard@users.sourceforge.net>
parents: 1071
diff changeset
87 self._econtext.getCompiler())(self._econtext)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88

Roundup Issue Tracker: http://roundup-tracker.org/