Left: | ||
Right: |
OLD | NEW |
---|---|
1 # Copyright: 2012 MoinMoin:CheerXiao | |
1 # Copyright: 2003-2010 MoinMoin:ThomasWaldmann | 2 # Copyright: 2003-2010 MoinMoin:ThomasWaldmann |
2 # Copyright: 2011 MoinMoin:AkashSinha | 3 # Copyright: 2011 MoinMoin:AkashSinha |
3 # Copyright: 2011 MoinMoin:ReimarBauer | 4 # Copyright: 2011 MoinMoin:ReimarBauer |
4 # Copyright: 2008 MoinMoin:FlorianKrupicka | 5 # Copyright: 2008 MoinMoin:FlorianKrupicka |
5 # Copyright: 2010 MoinMoin:DiogenesAugusto | 6 # Copyright: 2010 MoinMoin:DiogenesAugusto |
6 # Copyright: 2001 Richard Jones <richard@bizarsoftware.com.au> | 7 # Copyright: 2001 Richard Jones <richard@bizarsoftware.com.au> |
7 # Copyright: 2001 Juergen Hermann <jh@web.de> | 8 # Copyright: 2001 Juergen Hermann <jh@web.de> |
8 # License: GNU GPL v2 (or any later version), see LICENSE.txt for details. | 9 # License: GNU GPL v2 (or any later version), see LICENSE.txt for details. |
9 | 10 |
10 """ | 11 """ |
11 MoinMoin - frontend views | 12 MoinMoin - frontend views |
12 | 13 |
13 This shows the usual things users see when using the wiki. | 14 This shows the usual things users see when using the wiki. |
14 """ | 15 """ |
15 | 16 |
16 | 17 |
17 import re | 18 import re |
18 import difflib | 19 import difflib |
19 import time | 20 import time |
20 from datetime import datetime | 21 from datetime import datetime |
21 from itertools import chain | 22 from itertools import chain |
22 from collections import namedtuple | 23 from collections import namedtuple |
24 from functools import wraps | |
25 | |
23 try: | 26 try: |
24 import json | 27 import json |
25 except ImportError: | 28 except ImportError: |
26 import simplejson as json | 29 import simplejson as json |
27 | 30 |
28 from flask import request, url_for, flash, Response, redirect, session, abort, j sonify | 31 from flask import request, url_for, flash, Response, redirect, session, abort, j sonify |
29 from flask import current_app as app | 32 from flask import current_app as app |
30 from flask import g as flaskg | 33 from flask import g as flaskg |
31 from flaskext.babel import format_date | 34 from flaskext.babel import format_date |
32 from flaskext.themes import get_themes_list | 35 from flaskext.themes import get_themes_list |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
256 flaskg.clock.stop('search render') | 259 flaskg.clock.stop('search render') |
257 else: | 260 else: |
258 html = render_template('search.html', | 261 html = render_template('search.html', |
259 query=query, | 262 query=query, |
260 medium_search_form=search_form, | 263 medium_search_form=search_form, |
261 title_name=title_name, | 264 title_name=title_name, |
262 ) | 265 ) |
263 return html | 266 return html |
264 | 267 |
265 | 268 |
269 def presenter(view, add_trail=False, abort404=True): | |
270 """ | |
271 Decorator to create new "presenter" views. | |
272 | |
273 Presenter views handle GET requests to locations like | |
274 +{view}/+<rev>/<item_name> and +{view}/<item_name>, and always try to | |
275 look up the item before processing. | |
276 | |
277 :param view: name of view | |
278 :param add_trail: whether to call flaskg.user.add_trail | |
waldi
2012/06/14 14:26:34
This is only used once.
xiaq
2012/06/14 14:28:32
yes, and same for abort404 too. but i didn't work
| |
279 :param abort404: whether to abort(404) for nonexistent items | |
280 """ | |
281 def decorator(wrapped): | |
282 @frontend.route('/+{view}/+<rev>/<itemname:item_name>'.format(view=view) ) | |
283 @frontend.route('/+{view}/<itemname:item_name>'.format(view=view), defau lts=dict(rev=CURRENT)) | |
284 @wraps(wrapped) | |
285 def wrapper(item_name, rev): | |
286 if add_trail: | |
287 flaskg.user.add_trail(item_name) | |
288 try: | |
289 item = Item.create(item_name, rev_id=rev) | |
290 except AccessDenied: | |
291 abort(403) | |
292 if abort404 and isinstance(item, NonExistent): | |
293 abort(404, item_name) | |
294 return wrapped(item) | |
295 return wrapper | |
296 return decorator | |
297 | |
298 | |
266 @frontend.route('/<itemname:item_name>', defaults=dict(rev=CURRENT), methods=['G ET']) | 299 @frontend.route('/<itemname:item_name>', defaults=dict(rev=CURRENT), methods=['G ET']) |
267 @frontend.route('/+show/+<rev>/<itemname:item_name>', methods=['GET']) | 300 @frontend.route('/+show/+<rev>/<itemname:item_name>', methods=['GET']) |
268 def show_item(item_name, rev): | 301 def show_item(item_name, rev): |
269 flaskg.user.add_trail(item_name) | 302 flaskg.user.add_trail(item_name) |
270 item_displayed.send(app._get_current_object(), | 303 item_displayed.send(app._get_current_object(), |
271 item_name=item_name) | 304 item_name=item_name) |
272 try: | 305 try: |
273 item = Item.create(item_name, rev_id=rev) | 306 item = Item.create(item_name, rev_id=rev) |
274 except AccessDenied: | 307 except AccessDenied: |
275 abort(403) | 308 abort(403) |
(...skipping 15 matching lines...) Expand all Loading... | |
291 show_navigation=show_navigation, | 324 show_navigation=show_navigation, |
292 ) | 325 ) |
293 return Response(content, status) | 326 return Response(content, status) |
294 | 327 |
295 | 328 |
296 @frontend.route('/+show/<itemname:item_name>') | 329 @frontend.route('/+show/<itemname:item_name>') |
297 def redirect_show_item(item_name): | 330 def redirect_show_item(item_name): |
298 return redirect(url_for_item(item_name)) | 331 return redirect(url_for_item(item_name)) |
299 | 332 |
300 | 333 |
301 @frontend.route('/+dom/+<rev>/<itemname:item_name>') | 334 @presenter('dom', abort404=False) |
302 @frontend.route('/+dom/<itemname:item_name>', defaults=dict(rev=CURRENT)) | 335 def show_dom(item): |
303 def show_dom(item_name, rev): | |
304 try: | |
305 item = Item.create(item_name, rev_id=rev) | |
306 except AccessDenied: | |
307 abort(403) | |
308 if isinstance(item, NonExistent): | 336 if isinstance(item, NonExistent): |
309 status = 404 | 337 status = 404 |
310 else: | 338 else: |
311 status = 200 | 339 status = 200 |
312 content = render_template('dom.xml', | 340 content = render_template('dom.xml', |
313 data_xml=Markup(item._render_data_xml()), | 341 data_xml=Markup(item._render_data_xml()), |
314 ) | 342 ) |
315 return Response(content, status, mimetype='text/xml') | 343 return Response(content, status, mimetype='text/xml') |
316 | 344 |
317 | 345 |
318 # XXX this is just a temporary view to test the indexing converter | 346 # XXX this is just a temporary view to test the indexing converter |
319 @frontend.route('/+indexable/+<rev>/<itemname:item_name>') | 347 @frontend.route('/+indexable/+<rev>/<itemname:item_name>') |
320 @frontend.route('/+indexable/<itemname:item_name>', defaults=dict(rev=CURRENT)) | 348 @frontend.route('/+indexable/<itemname:item_name>', defaults=dict(rev=CURRENT)) |
321 def indexable(item_name, rev): | 349 def indexable(item_name, rev): |
322 from MoinMoin.storage.middleware.indexing import convert_to_indexable | 350 from MoinMoin.storage.middleware.indexing import convert_to_indexable |
323 try: | 351 try: |
324 item = flaskg.storage[item_name] | 352 item = flaskg.storage[item_name] |
325 rev = item[rev] | 353 rev = item[rev] |
326 except KeyError: | 354 except KeyError: |
327 abort(404, item_name) | 355 abort(404, item_name) |
328 content = convert_to_indexable(rev.meta, rev.data) | 356 content = convert_to_indexable(rev.meta, rev.data) |
329 return Response(content, 200, mimetype='text/plain') | 357 return Response(content, 200, mimetype='text/plain') |
330 | 358 |
331 | 359 |
332 @frontend.route('/+highlight/+<rev>/<itemname:item_name>') | 360 @presenter('highlight') |
333 @frontend.route('/+highlight/<itemname:item_name>', defaults=dict(rev=CURRENT)) | 361 def highlight_item(item): |
334 def highlight_item(item_name, rev): | |
335 try: | |
336 item = Item.create(item_name, rev_id=rev) | |
337 except AccessDenied: | |
338 abort(403) | |
339 if isinstance(item, NonExistent): | |
340 abort(404, item_name) | |
341 return render_template('highlight.html', | 362 return render_template('highlight.html', |
342 item=item, item_name=item.name, | 363 item=item, item_name=item.name, |
343 data_text=Markup(item._render_data_highlight()), | 364 data_text=Markup(item._render_data_highlight()), |
344 ) | 365 ) |
345 | 366 |
346 | 367 |
347 @frontend.route('/+meta/<itemname:item_name>', defaults=dict(rev=CURRENT)) | 368 @presenter('meta', add_trail=True) |
348 @frontend.route('/+meta/+<rev>/<itemname:item_name>') | 369 def show_item_meta(item): |
349 def show_item_meta(item_name, rev): | 370 show_revision = request.view_args['rev'] != CURRENT |
350 flaskg.user.add_trail(item_name) | |
351 try: | |
352 item = Item.create(item_name, rev_id=rev) | |
353 except AccessDenied: | |
354 abort(403) | |
355 if isinstance(item, NonExistent): | |
356 abort(404, item_name) | |
357 show_revision = rev != CURRENT | |
358 show_navigation = False # TODO | 371 show_navigation = False # TODO |
359 first_rev = None | 372 first_rev = None |
360 last_rev = None | 373 last_rev = None |
361 if show_navigation: | 374 if show_navigation: |
362 rev_ids = list(item.rev.item.iter_revs()) | 375 rev_ids = list(item.rev.item.iter_revs()) |
363 if rev_ids: | 376 if rev_ids: |
364 first_rev = rev_ids[0] | 377 first_rev = rev_ids[0] |
365 last_rev = rev_ids[-1] | 378 last_rev = rev_ids[-1] |
366 return render_template('meta.html', | 379 return render_template('meta.html', |
367 item=item, item_name=item.name, | 380 item=item, item_name=item.name, |
(...skipping 21 matching lines...) Expand all Loading... | |
389 item = Item.create(item_name, rev_id=rev) | 402 item = Item.create(item_name, rev_id=rev) |
390 except AccessDenied: | 403 except AccessDenied: |
391 abort(403) | 404 abort(403) |
392 if isinstance(item, NonExistent): | 405 if isinstance(item, NonExistent): |
393 abort(404, item_name) | 406 abort(404, item_name) |
394 return render_template('content.html', | 407 return render_template('content.html', |
395 item_name=item.name, | 408 item_name=item.name, |
396 data_rendered=Markup(item._render_data()), | 409 data_rendered=Markup(item._render_data()), |
397 ) | 410 ) |
398 | 411 |
399 @frontend.route('/+get/+<rev>/<itemname:item_name>') | 412 @presenter('get') |
400 @frontend.route('/+get/<itemname:item_name>', defaults=dict(rev=CURRENT)) | 413 def get_item(item): |
401 def get_item(item_name, rev): | |
402 try: | |
403 item = Item.create(item_name, rev_id=rev) | |
404 except AccessDenied: | |
405 abort(403) | |
406 return item.do_get() | 414 return item.do_get() |
407 | 415 |
408 @frontend.route('/+download/+<rev>/<itemname:item_name>') | 416 @presenter('download') |
409 @frontend.route('/+download/<itemname:item_name>', defaults=dict(rev=CURRENT)) | 417 def download_item(item): |
410 def download_item(item_name, rev): | 418 mimetype = request.values.get("mimetype") |
411 try: | |
412 item = Item.create(item_name, rev_id=rev) | |
413 mimetype = request.values.get("mimetype") | |
414 except AccessDenied: | |
415 abort(403) | |
416 return item.do_get(force_attachment=True, mimetype=mimetype) | 419 return item.do_get(force_attachment=True, mimetype=mimetype) |
417 | 420 |
418 @frontend.route('/+convert/<itemname:item_name>') | 421 @frontend.route('/+convert/<itemname:item_name>') |
419 def convert_item(item_name): | 422 def convert_item(item_name): |
420 """ | 423 """ |
421 return a converted item. | 424 return a converted item. |
422 | 425 |
423 We create two items : the original one, and an empty | 426 We create two items : the original one, and an empty |
424 one with the expected mimetype for the converted item. | 427 one with the expected mimetype for the converted item. |
425 | 428 |
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1881 return render_template("item_link_list.html", | 1884 return render_template("item_link_list.html", |
1882 headline=_("Items tagged with %(tag)s", tag=tag), | 1885 headline=_("Items tagged with %(tag)s", tag=tag), |
1883 item_name=tag, | 1886 item_name=tag, |
1884 item_names=item_names) | 1887 item_names=item_names) |
1885 | 1888 |
1886 @frontend.errorhandler(404) | 1889 @frontend.errorhandler(404) |
1887 def page_not_found(e): | 1890 def page_not_found(e): |
1888 return render_template('404.html', | 1891 return render_template('404.html', |
1889 item_name=e.description), 404 | 1892 item_name=e.description), 404 |
1890 | 1893 |
OLD | NEW |