Mercurial > genshi > genshi-test
annotate examples/tutorial/geddit/controller.py @ 627:2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
author | cmlenz |
---|---|
date | Fri, 31 Aug 2007 23:13:27 +0000 |
parents | dba522b4c31d |
children | 693a7212b348 |
rev | line source |
---|---|
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
1 #!/usr/bin/env python |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
2 |
618
5a2059ce1f0b
Simplify the tutorial project: comments are now flat, not hierarchical.
cmlenz
parents:
616
diff
changeset
|
3 import operator |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
4 import os |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
5 import pickle |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
6 import sys |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
7 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
8 import cherrypy |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
9 from formencode import Invalid |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
10 from genshi.filters import HTMLFormFiller |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
11 |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
12 from geddit.form import LinkForm, CommentForm |
625 | 13 from geddit.lib import ajax, template |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
14 from geddit.model import Link, Comment |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
15 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
16 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
17 class Root(object): |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
18 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
19 def __init__(self, data): |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
20 self.data = data |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
21 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
22 @cherrypy.expose |
622 | 23 @template.output('index.xml', method='xml') |
24 def feed(self, id=None): | |
25 if id: | |
26 link = self.data.get(id) | |
27 if not link: | |
28 raise cherrypy.NotFound() | |
29 return template.render('info.xml', link=link) | |
30 else: | |
31 links = sorted(self.data.values(), key=operator.attrgetter('time')) | |
32 return template.render(links=links) | |
33 | |
34 @cherrypy.expose | |
615
0dc152d128f5
GenshiTutorial: make URLs dynamic so that the app could theoretically be mounted on some other SCRIPT_NAME.
cmlenz
parents:
613
diff
changeset
|
35 @template.output('index.html') |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
36 def index(self): |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
37 links = sorted(self.data.values(), key=operator.attrgetter('time')) |
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
38 return template.render(links=links) |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
39 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
40 @cherrypy.expose |
615
0dc152d128f5
GenshiTutorial: make URLs dynamic so that the app could theoretically be mounted on some other SCRIPT_NAME.
cmlenz
parents:
613
diff
changeset
|
41 @template.output('submit.html') |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
42 def submit(self, cancel=False, **data): |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
43 if cherrypy.request.method == 'POST': |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
44 if cancel: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
45 raise cherrypy.HTTPRedirect('/') |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
46 form = LinkForm() |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
47 try: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
48 data = form.to_python(data) |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
49 link = Link(**data) |
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
50 self.data[link.id] = link |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
51 raise cherrypy.HTTPRedirect('/') |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
52 except Invalid, e: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
53 errors = e.unpack_errors() |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
54 else: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
55 errors = {} |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
56 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
57 return template.render(errors=errors) | HTMLFormFiller(data=data) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
58 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
59 @cherrypy.expose |
627
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
60 @template.output('info.html') |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
61 def info(self, id): |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
62 link = self.data.get(id) |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
63 if not link: |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
64 raise cherrypy.NotFound() |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
65 return template.render(link=link) |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
66 |
2f4dc32a13e7
GenshiTutorial: minor tweaks to sync with Wiki page.
cmlenz
parents:
625
diff
changeset
|
67 @cherrypy.expose |
615
0dc152d128f5
GenshiTutorial: make URLs dynamic so that the app could theoretically be mounted on some other SCRIPT_NAME.
cmlenz
parents:
613
diff
changeset
|
68 @template.output('comment.html') |
622 | 69 def comment(self, id, cancel=False, **data): |
70 link = self.data.get(id) | |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
71 if not link: |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
72 raise cherrypy.NotFound() |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
73 if cherrypy.request.method == 'POST': |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
74 if cancel: |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
75 raise cherrypy.HTTPRedirect('/info/%s' % link.id) |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
76 form = CommentForm() |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
77 try: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
78 data = form.to_python(data) |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
79 comment = link.add_comment(**data) |
625 | 80 if not ajax.is_xhr(): |
81 raise cherrypy.HTTPRedirect('/info/%s' % link.id) | |
82 return template.render('_comment.html', comment=comment, | |
83 num=len(link.comments)) | |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
84 except Invalid, e: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
85 errors = e.unpack_errors() |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
86 else: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
87 errors = {} |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
88 |
625 | 89 if ajax.is_xhr(): |
90 stream = template.render('_form.html', link=link, errors=errors) | |
91 else: | |
92 stream = template.render(link=link, comment=None, errors=errors) | |
93 return stream | HTMLFormFiller(data=data) | |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
94 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
95 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
96 def main(filename): |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
97 # load data from the pickle file, or initialize it to an empty list |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
98 if os.path.exists(filename): |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
99 fileobj = open(filename, 'rb') |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
100 try: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
101 data = pickle.load(fileobj) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
102 finally: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
103 fileobj.close() |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
104 else: |
618
5a2059ce1f0b
Simplify the tutorial project: comments are now flat, not hierarchical.
cmlenz
parents:
616
diff
changeset
|
105 data = {} |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
106 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
107 def _save_data(): |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
108 # save data back to the pickle file |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
109 fileobj = open(filename, 'wb') |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
110 try: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
111 pickle.dump(data, fileobj) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
112 finally: |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
113 fileobj.close() |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
114 cherrypy.engine.on_stop_engine_list.append(_save_data) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
115 |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
116 # Some global configuration; note that this could be moved into a |
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
117 # configuration file |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
118 cherrypy.config.update({ |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
119 'request.throw_errors': True, |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
120 'tools.encode.on': True, 'tools.encode.encoding': 'utf-8', |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
121 'tools.decode.on': True, |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
122 'tools.trailing_slash.on': True, |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
123 'tools.staticdir.root': os.path.abspath(os.path.dirname(__file__)), |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
124 }) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
125 |
619
71d3edd302ae
GenshiTutorial: various updates to sync with wiki page.
cmlenz
parents:
618
diff
changeset
|
126 cherrypy.quickstart(Root(data), '/', { |
611
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
127 '/media': { |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
128 'tools.staticdir.on': True, |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
129 'tools.staticdir.dir': 'static' |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
130 } |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
131 }) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
132 |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
133 if __name__ == '__main__': |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
134 import formencode |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
135 formencode.api.set_stdtranslation(languages=['en']) |
16b1be35c265
Add current code for GenshiTutorial to the `examples` directory.
cmlenz
parents:
diff
changeset
|
136 main(sys.argv[1]) |