cmlenz@611: import os cmlenz@611: cmlenz@611: import cherrypy cmlenz@611: from genshi.core import Stream cmlenz@611: from genshi.output import encode, get_serializer cmlenz@615: from genshi.template import Context, TemplateLoader cmlenz@611: cmlenz@625: from geddit.lib import ajax cmlenz@625: cmlenz@611: loader = TemplateLoader( cmlenz@611: os.path.join(os.path.dirname(__file__), '..', 'templates'), cmlenz@611: auto_reload=True cmlenz@611: ) cmlenz@611: cmlenz@615: def output(filename, method='html', encoding='utf-8', **options): cmlenz@611: """Decorator for exposed methods to specify what template the should use cmlenz@611: for rendering, and which serialization method and options should be cmlenz@611: applied. cmlenz@611: """ cmlenz@611: def decorate(func): cmlenz@611: def wrapper(*args, **kwargs): cmlenz@611: cherrypy.thread_data.template = loader.load(filename) cmlenz@625: opt = options.copy() cmlenz@625: if not ajax.is_xhr() and method == 'html': cmlenz@625: opt.setdefault('doctype', 'html') cmlenz@625: serializer = get_serializer(method, **opt) cmlenz@611: stream = func(*args, **kwargs) cmlenz@611: if not isinstance(stream, Stream): cmlenz@611: return stream cmlenz@611: return encode(serializer(stream), method=serializer, cmlenz@611: encoding=encoding) cmlenz@611: return wrapper cmlenz@611: return decorate cmlenz@611: cmlenz@611: def render(*args, **kwargs): cmlenz@611: """Function to render the given data to the template specified via the cmlenz@611: ``@output`` decorator. cmlenz@611: """ cmlenz@611: if args: cmlenz@611: assert len(args) == 1, \ cmlenz@611: 'Expected exactly one argument, but got %r' % (args,) cmlenz@611: template = loader.load(args[0]) cmlenz@611: else: cmlenz@611: template = cherrypy.thread_data.template cmlenz@615: ctxt = Context(url=cherrypy.url) cmlenz@615: ctxt.push(kwargs) cmlenz@615: return template.generate(ctxt)