annotate makeitso/handlers.py @ 16:1818cc524cde

change API making substitute return the substituted quantity
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 15 Nov 2010 18:28:10 -0800
parents bf1ce840d0f0
children 6d1c703c5ffc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 from urlparse import urlparse
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 from webob import Response, exc
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9 class HandlerMatchException(Exception):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 """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
11
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 class Handler(object):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 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
15 handler_path = [] # path elements to match
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 @classmethod
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 def match(cls, app, request):
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 # check the method
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21 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
22 return None
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 # check the path
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25 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
26 return None
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
28 try:
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
29 return cls(app, request)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
30 except HandlerMatchException:
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
31 return None
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
32
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
33 def __init__(self, app, request):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34 self.app = app
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35 self.request = request
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36 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
37
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 def link(self, path=(), permanant=False):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39 if isinstance(path, basestring):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40 path = [ path ]
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 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
42 if permanant:
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 application_url = [ self.request.application_url ]
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 else:
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45 application_url = [ self.application_path ]
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 path = application_url + path
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 return '/'.join(path)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 def redirect(self, location):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 raise exc.HTTPSeeOther(location=location)
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 class GenshiHandler(Handler):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54 def __init__(self, app, request):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 Handler.__init__(self, app, request)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 self.data = { 'request': request,
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 'link': self.link }
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 __call__(self):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 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
61
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 def Get(self):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 # needs to have self.template set
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 template = self.app.loader.load(self.template)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 return Response(content_type='text/html',
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66 body=template.generate(**self.data).render('html'))
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 class Index(GenshiHandler):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69 template = 'index.html'
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 methods=set(['GET', 'POST'])
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 def __init__(self, app, request):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 GenshiHandler.__init__(self, app, request)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 def Get(self):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 self.data['name'] = self.request.remote_user or self.app.name
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 return GenshiHandler.Get(self)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 def Post(self):
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 self.app.name = self.request.POST.get('name', self.app.name)
bf1ce840d0f0 make this a genshi view (should be: tempita view)
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 self.redirect(self.link(self.handler_path))