annotate roundup/cgi/PageTemplates/PythonExpr.py @ 2163:791c66a3b738

fixed CSV export and CGI actions returning results
author Richard Jones <richard@users.sourceforge.net>
date Tue, 30 Mar 2004 06:43:08 +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/