view taginthemiddle/middleware.py @ 1:837cfc05d4d9

add times to tags; cant things ever be easy?
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 04 May 2010 18:46:05 -0700
parents 1c5cbbde4299
children 1182315b18ac
line wrap: on
line source

"""
request dispatcher:
data persisting across requests should go here
"""

import os

from handlers import Index
from model import Tags

from genshi.template import TemplateLoader
from lxmlmiddleware import LXMLMiddleware
from paste.fileapp import FileApp
from pkg_resources import resource_filename
from webob import Request, Response, exc

class Tagger(LXMLMiddleware):

    # instance defaults
    defaults = { 'auto_reload': 'False',
                 'template_dirs': '',
                 'patterns': '*'
                 'tags_file': None,
                 'url': 'tags'
                 'post_url': '.tags'
                 }

    def __init__(self, app, **kw):
        self.app = app

        # set instance parameters from kw and defaults
        for key in self.defaults:
            setattr(self, key, kw.get(key, self.defaults[key]))
        self.auto_reload = self.auto_reload.lower() == 'true'
        assert self.tags_file is not None
        self.tags
        self.patterns = self.patterns.strip().split()

        # request handlers
        self.handlers = [ Cloud ]

        # template loader
        self.template_dirs = self.template_dirs.split()
        self.template_dirs.append(resource_filename(__name__, 'templates'))
        self.loader = TemplateLoader(self.template_dirs,
                                     auto_reload=self.auto_reload)

    def __call__(self, environ, start_response):

        # get a request object
        request = Request(environ)

        # get the path 
        path = request.path_info.strip('/').split('/')
        if path == ['']:
            path = []
        request.environ['path'] = path

        # match the request to a handler
        for h in self.handlers:
            handler = h.match(self, request)
            if handler is not None:
                break
        else:
            if self.app:
                return self.app(environ, start_response)
            handler = exc.HTTPNotFound

        # add navigation links to handler [example]
        if hasattr(handler, 'data'):
            handler.data.setdefault('links', [])
            for h in self.handlers:
                handler.data['links'].append((handler.link(h.handler_path), 
                                              h.__name__))

        # get response
        res = handler()
        return res(environ, start_response)