view taginthemiddle/middleware.py @ 2:1182315b18ac

add rudimentary code for handlers
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 04 May 2010 19:15:21 -0700
parents 837cfc05d4d9
children 8fb20b780341
line wrap: on
line source

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

import os

from handlers import TagCloud, ViewTags, PostTags
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,
                 'tags_url': 'tags',
                 'post_url': '.tags',
                 'author': None, # for RSS
                 }

    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 = Tags(self.tags_file)
        self.patterns = self.patterns.strip().split()

        # request handlers
        self.handlers = [ TagCloud, ViewTags, PostTags ]

        # 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)