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