from mod_python import apache, util
import os
import sys
config = apache.import_module('zptool.config')
zptool = apache.import_module('zptool.zptool')

def handler(request):
    """A mod_python handler for zptool
    
        Example .htaccess configuration::
    
          SetHandler mod_python
          PythonPath "sys.path+['/path/to/zptool','/path/to/sapt']"
          PythonHandler zptool.handler | .pt .zpt
    """
    filename = request.filename
    # note that we let zptool handle dirs
    if (not os.path.isdir(filename) and 
            os.path.splitext(filename)[1] not in config.handler_extensions):
        return apache.DECLINED
    
    request.content_type = 'text/html;charset=%s' % (config.charset,)
    
    context = {'environ': {},
                'form': util.FieldStorage(request),
                'config': config,
                'request': request,
                'headers': {'content-type': 
                            'text/html; charset=%s' % config.charset},
                }
    context['environ'].update(dict([(k.lower(), v) for k, v in
                                apache.build_cgi_env(request).items()]))
    
    
    z = zptool.ZPTool(config.envdir)
    if not os.path.exists(filename):
        rendered = z.render_404(filename, context)
    elif os.path.isdir(filename):
        newfilename = os.path.join(filename, 'index.zpt')
        if os.path.isfile(newfilename):
            filename = newfilename
    try:
        rendered = z.render(filename, context)
    except:
        exc, e, tb = sys.exc_info()
        rendered = z.render_error_page(exc, e, tb, context)
        del tb
    ct = context['headers'].pop('content-type')
    request.content_type = ct
    for k, v in context['headers'].iteritems():
        request.headers_out['-'.join([x.capitalize() for 
                            x in k.split('-')])] = v
    request.write(rendered.encode(config.charset, 'replace'))
    
    return apache.OK

