view taginthemiddle/middleware.py @ 17:c85d42296c06

make the model almost be real
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 24 May 2010 07:44:39 -0700
parents 1701e5b0b0eb
children 57ca873ed9bf
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

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

    def manipulate(self, request, response, tree):
        return tree