# makodecorator.py
# License: None, public domain
# Version: 1.0.0
# Author: Robert Thomson - http://blog.corporatism.org/

from mako.lookup import TemplateLookup
from mako import exceptions
import settings

import sys
import os.path
from django.http import HttpResponse

# with thanks to Peter Hunt (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/465427)
decorator_with_args = lambda decorator: lambda *args, **kwargs: lambda func: \
                      decorator(func, *args, **kwargs)

@decorator_with_args
def mako(func, template=None):
    def MAKOIFY(request, *args, **kwargs):
        res = func(request, *args, **kwargs)
        if not res:
            res = {}
        if type(res) == dict:
            # use current_app/mako_templates/ as first search path.
            # the assumption is that the function's module is under current_app/
            d = os.path.join(
                  os.path.dirname(sys.modules[func.__module__].__file__),
                  "mako_templates/")
            lookup = TemplateLookup(directories=[d, 'mako_templates/'])
            res['request'] = request
            try:
                t = lookup.get_template(template)
                return HttpResponse(t.render(**res))
            except:
                if settings.DEBUG:
                    # display Mako's debug page on template error
                    return HttpResponse(exceptions.html_error_template()\
                                        .render(), status=500)
                raise
        else:
            # if not a dictionary or empty value, return literal result
            return res
    MAKOIFY.__name__ = func.__name__
    MAKOIFY.__doc__ = func.__doc__
    MAKOIFY.__dict__ = func.__dict__
    return MAKOIFY

"""Example usage:
from makodecorator import mako

@mako("index.mako")
def foo(request, id):
        return { "name" : "Robert Thomson" }
"""