Mercurial > hg > TagInTheMiddle
diff taginthemiddle/handlers.py @ 0:1c5cbbde4299
initial commit of middleware tagging; doesnt yet work
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Tue, 04 May 2010 08:37:15 -0700 |
parents | |
children | 1182315b18ac |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taginthemiddle/handlers.py Tue May 04 08:37:15 2010 -0700 @@ -0,0 +1,129 @@ +""" +request handlers: +these are instantiated for every request, then called +""" + +from urlparse import urlparse +from webob import Response, exc + +class HandlerMatchException(Exception): + """the handler doesn't match the request""" + +class Handler(object): + + methods = set(['GET']) # methods to listen to + handler_path = [] # path elements to match + + @classmethod + def match(cls, app, request): + + # check the method + if request.method not in cls.methods: + return None + + # check the path + if request.environ['path'][:len(cls.handler_path)] != cls.handler_path: + return None + + try: + return cls(app, request) + except HandlerMatchException: + return None + + def __init__(self, app, request): + self.app = app + self.request = request + self.application_path = urlparse(request.application_url)[2] + + def link(self, path=(), permanant=False): + if isinstance(path, basestring): + path = [ path ] + path = [ i.strip('/') for i in path ] + if permanant: + application_url = [ self.request.application_url ] + else: + application_url = [ self.application_path ] + path = application_url + path + return '/'.join(path) + + def redirect(self, location): + raise exc.HTTPSeeOther(location=location) + +class GenshiHandler(Handler): + + def __init__(self, app, request): + Handler.__init__(self, app, request) + self.data = { 'request': request, + 'link': self.link } + + def __call__(self): + return getattr(self, self.request.method.title())() + + def Get(self): + # needs to have self.template set + template = self.app.loader.load(self.template) + return Response(content_type='text/html', + body=template.generate(**self.data).render('html')) + +class TagCloud(GenshiHandler): + template = 'cloud.html' + methods = set(['GET']) + + @classmethod + def match( + +class ViewTags(GenshiHandler): + # TODO: RSS + template = 'tags.html' + methods = set(['GET']) + + def match(cls, app, request): + pass + + +class PostTags(Handler): + methods = set(['POST']) + + @classmethod + def match(cls, app, request): + + # check the method + if request.method not in cls.methods: + return None + + # check auth + if not request.remote_user: + return None + + # check the path + if request.path_info.endswith('/%s' % app.post_url): + try: + return cls(app, request) + except HandlerMatchException: + return None + + def __call__(self): + + # get the url + url = self.request.path_info.rsplit('/' + self.app.post_url, 1)[0] + + # add and remove tags + # TODO + + # redirect to original resource + return exc.HTTPSeeOther(location=url) + +class Index(GenshiHandler): + template = 'index.html' + methods=set(['GET', 'POST']) + + def __init__(self, app, request): + GenshiHandler.__init__(self, app, request) + + def Get(self): + self.data['name'] = self.request.remote_user or self.app.name + return GenshiHandler.Get(self) + + def Post(self): + self.app.name = self.request.POST.get('name', self.app.name) + self.redirect(self.link(self.handler_path))