Mercurial > hg > MakeItSo
annotate makeitso/handlers.py @ 151:e70421c50d0a
move to ABC
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Sat, 01 Dec 2012 19:01:18 -0800 |
parents | 6d1c703c5ffc |
children |
rev | line source |
---|---|
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
1 """ |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
2 request handlers: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
3 these are instantiated for every request, then called |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
4 """ |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
5 |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
6 import os |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
7 from pkg_resources import resource_filename |
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
8 from urlparse import urlparse |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
9 from tempita import HTMLTemplate |
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
10 from webob import Response, exc |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
11 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
12 class HandlerMatchException(Exception): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
13 """the handler doesn't match the request""" |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
14 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
15 class Handler(object): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
16 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
17 methods = set(['GET']) # methods to listen to |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
18 handler_path = [] # path elements to match |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
19 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
20 @classmethod |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
21 def match(cls, app, request): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
22 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
23 # check the method |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
24 if request.method not in cls.methods: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
25 return None |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
26 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
27 # check the path |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
28 if request.environ['path'][:len(cls.handler_path)] != cls.handler_path: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
29 return None |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
30 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
31 try: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
32 return cls(app, request) |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
33 except HandlerMatchException: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
34 return None |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
35 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
36 def __init__(self, app, request): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
37 self.app = app |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
38 self.request = request |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
39 self.application_path = urlparse(request.application_url)[2] |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
40 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
41 def link(self, path=(), permanant=False): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
42 if isinstance(path, basestring): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
43 path = [ path ] |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
44 path = [ i.strip('/') for i in path ] |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
45 if permanant: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
46 application_url = [ self.request.application_url ] |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
47 else: |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
48 application_url = [ self.application_path ] |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
49 path = application_url + path |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
50 return '/'.join(path) |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
51 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
52 def redirect(self, location): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
53 raise exc.HTTPSeeOther(location=location) |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
54 |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
55 class TempitaHandler(Handler): |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
56 |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
57 template_dirs = [ resource_filename(__name__, 'templates') ] |
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
58 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
59 def __init__(self, app, request): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
60 Handler.__init__(self, app, request) |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
61 self.data = { 'request': request, |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
62 'link': self.link } |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
63 |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
64 def __call__(self): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
65 return getattr(self, self.request.method.title())() |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
66 |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
67 def find_template(self, template): |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
68 for d in self.template_dirs: |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
69 path = os.path.join(d, template) |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
70 if os.path.exists(path): |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
71 return HTMLTemplate.from_filename(path) |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
72 |
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
73 def Get(self): |
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
74 # needs to have self.template set |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
75 template = self.find_template(self.template) |
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
76 return Response(content_type='text/html', |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
77 body=template.substitute(**self.data)) |
14
bf1ce840d0f0
make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
78 |
20
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
79 class Index(TempitaHandler): |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
80 template = 'index.html' |
6d1c703c5ffc
use tempita instead of genshi since we have it already (and dont need a really complex templating system)
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
81 methods=set(['GET']) |