-import os
+import os, sys
import cherrypy
from mako.template import Template
from mako.lookup import TemplateLookup
import simplejson
import datetime, decimal
+from StringIO import StringIO
from invirt.config import structs as config
from webcommon import State
def __init__(self):
self.lookups = {}
-
- def __call__(self, filename, directories, module_directory=None,
- collection_size=-1, content_type='text/html; charset=utf-8',
- imports=[]):
+
+ def get_lookup(self, directories, module_directory=None,
+ collection_size=-1, imports=[], **kwargs):
# Find the appropriate template lookup.
key = (tuple(directories), module_directory)
try:
imports=imports,
)
self.lookups[key] = lookup
- cherrypy.request.lookup = lookup
+ return lookup
+
+ def __call__(self, filename, directories, module_directory=None,
+ collection_size=-1, content_type='text/html; charset=utf-8',
+ imports=[]):
+ cherrypy.request.lookup = lookup = self.get_lookup(directories, module_directory,
+ collection_size, imports)
# Replace the current handler.
cherrypy.request.template = t = lookup.get_template(filename)
main = MakoLoader()
cherrypy.tools.mako = cherrypy.Tool('on_start_resource', main)
+def revertStandardError():
+ """Move stderr to stdout, and return the contents of the old stderr."""
+ errio = sys.stderr
+ if not isinstance(errio, StringIO):
+ return ''
+ sys.stderr = sys.stdout
+ errio.seek(0)
+ return errio.read()
+
+def catchStderr():
+ old_handler = cherrypy.request.handler
+ def wrapper(*args, **kwargs):
+ sys.stderr = StringIO()
+ ret = old_handler(*args, **kwargs)
+ e = revertStandardError()
+ if e:
+ if isinstance(ret, dict):
+ ret["error_text"] = e
+ return ret
+ if old_handler:
+ cherrypy.request.handler = wrapper
+
+cherrypy.tools.catch_stderr = cherrypy.Tool('before_handler', catchStderr)
+
class JSONEncoder(simplejson.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
def invirtwebstate_init():
"""Initialize the cherrypy.request.state object from Invirt"""
- cherrypy.request.state = State(cherrypy.request.login)
+ if not hasattr(cherrypy.request, "state"):
+ cherrypy.request.state = State(cherrypy.request.login)
cherrypy.tools.invirtwebstate = cherrypy.Tool('on_start_resource', invirtwebstate_init, priority=100)