Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(1295)

Side by Side Diff: MoinMoin/apps/frontend/views.py

Issue 6296074: refactor on apps/frontend/views.py and items/__init__.py (Closed)
Patch Set: fix broken +meta view Created 12 years, 10 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | MoinMoin/items/__init__.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | MoinMoin/items/__init__.py » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b