view taginthemiddle/middleware.py @ 11:fc55d95be553

it is list.index, not list.find, silly!
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 05 May 2010 22:37:42 -0700
parents 8fb20b780341
children 1701e5b0b0eb
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': '*', # glob pattern: all URLs by default
                 'tags_file': None, 
                 'tags_url': 'tags', # base URL for viewing tags
                 'post_url': '.tags', # sub-URL for posting 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)