Mercurial > hg > flowerbed
annotate flowerbed/handlers.py @ 0:0613e2bb0ebe
initial creation of flowerbed
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Mon, 20 Dec 2010 09:24:48 -0800 |
parents | |
children |
rev | line source |
---|---|
0
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
1 """ |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
2 request handlers: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
3 these are instantiated for every request, then called |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
4 """ |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
5 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
6 import os |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
7 from pkg_resources import resource_filename |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
8 from urlparse import urlparse |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
9 from webob import Response, exc |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
10 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
11 class HandlerMatchException(Exception): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
12 """the handler doesn't match the request""" |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
13 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
14 class Handler(object): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
15 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
16 methods = set(['GET']) # methods to listen to |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
17 handler_path = [] # path elements to match |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
18 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
19 @classmethod |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
20 def match(cls, app, request): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
21 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
22 # check the method |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
23 if request.method not in cls.methods: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
24 return None |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
25 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
26 # check the path |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
27 if request.environ['path'][:len(cls.handler_path)] != cls.handler_path: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
28 return None |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
29 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
30 try: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
31 return cls(app, request) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
32 except HandlerMatchException: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
33 return None |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
34 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
35 def __init__(self, app, request): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
36 self.app = app |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
37 self.request = request |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
38 self.application_path = urlparse(request.application_url)[2] |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
39 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
40 def link(self, path=(), permanant=False): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
41 if isinstance(path, basestring): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
42 path = [ path ] |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
43 path = [ i.strip('/') for i in path ] |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
44 if permanant: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
45 application_url = [ self.request.application_url ] |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
46 else: |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
47 application_url = [ self.application_path ] |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
48 path = application_url + path |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
49 return '/'.join(path) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
50 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
51 def redirect(self, location): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
52 raise exc.HTTPSeeOther(location=location) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
53 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
54 class GenshiHandler(Handler): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
55 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
56 def __init__(self, app, request): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
57 Handler.__init__(self, app, request) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
58 self.data = { 'request': request, |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
59 'link': self.link } |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
60 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
61 def __call__(self): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
62 return getattr(self, self.request.method.title())() |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
63 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
64 def Get(self): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
65 # needs to have self.template set |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
66 template = self.app.loader.load(self.template) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
67 return Response(content_type='text/html', |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
68 body=template.generate(**self.data).render('html')) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
69 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
70 class Index(GenshiHandler): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
71 template = 'index.html' |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
72 methods=set(['GET', 'POST']) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
73 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
74 def __init__(self, app, request): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
75 GenshiHandler.__init__(self, app, request) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
76 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
77 def Get(self): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
78 self.data['name'] = self.request.remote_user or self.app.name |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
79 return GenshiHandler.Get(self) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
80 |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
81 def Post(self): |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
82 self.app.name = self.request.POST.get('name', self.app.name) |
0613e2bb0ebe
initial creation of flowerbed
Jeff Hammel <jhammel@mozilla.com>
parents:
diff
changeset
|
83 self.redirect(self.link(self.handler_path)) |