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

Unified Diff: MoinMoin/apps/frontend/views.py

Issue 6296074: refactor on apps/frontend/views.py and items/__init__.py (Closed)
Patch Set: renamed ModifyForm.populate to _load; fix broken anywikidraw (+ operator on dict is not supported..… Created 12 years, 10 months ago
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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | MoinMoin/items/__init__.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: MoinMoin/apps/frontend/views.py
===================================================================
--- a/MoinMoin/apps/frontend/views.py
+++ b/MoinMoin/apps/frontend/views.py
@@ -1,3 +1,4 @@
+# Copyright: 2012 MoinMoin:CheerXiao
# Copyright: 2003-2010 MoinMoin:ThomasWaldmann
# Copyright: 2011 MoinMoin:AkashSinha
# Copyright: 2011 MoinMoin:ReimarBauer
@@ -20,6 +21,8 @@
from datetime import datetime
from itertools import chain
from collections import namedtuple
+from functools import wraps
+
try:
import json
except ImportError:
@@ -263,6 +266,36 @@
return html
+def presenter(view, add_trail=False, abort404=True):
+ """
+ Decorator to create new "presenter" views.
+
+ Presenter views handle GET requests to locations like
+ +{view}/+<rev>/<item_name> and +{view}/<item_name>, and always try to
+ look up the item before processing.
+
+ :param view: name of view
+ :param add_trail: whether to call flaskg.user.add_trail
+ :param abort404: whether to abort(404) for nonexistent items
+ """
+ def decorator(wrapped):
+ @frontend.route('/+{view}/+<rev>/<itemname:item_name>'.format(view=view))
+ @frontend.route('/+{view}/<itemname:item_name>'.format(view=view), defaults=dict(rev=CURRENT))
+ @wraps(wrapped)
+ def wrapper(item_name, rev):
+ if add_trail:
+ flaskg.user.add_trail(item_name)
+ try:
+ item = Item.create(item_name, rev_id=rev)
+ except AccessDenied:
+ abort(403)
+ if abort404 and isinstance(item, NonExistent):
+ abort(404, item_name)
+ return wrapped(item)
+ return wrapper
+ return decorator
+
+
@frontend.route('/<itemname:item_name>', defaults=dict(rev=CURRENT), methods=['GET'])
@frontend.route('/+show/+<rev>/<itemname:item_name>', methods=['GET'])
def show_item(item_name, rev):
@@ -298,13 +331,8 @@
return redirect(url_for_item(item_name))
-@frontend.route('/+dom/+<rev>/<itemname:item_name>')
-@frontend.route('/+dom/<itemname:item_name>', defaults=dict(rev=CURRENT))
-def show_dom(item_name, rev):
- try:
- item = Item.create(item_name, rev_id=rev)
- except AccessDenied:
- abort(403)
+@presenter('dom', abort404=False)
+def show_dom(item):
if isinstance(item, NonExistent):
status = 404
else:
@@ -329,32 +357,17 @@
return Response(content, 200, mimetype='text/plain')
-@frontend.route('/+highlight/+<rev>/<itemname:item_name>')
-@frontend.route('/+highlight/<itemname:item_name>', defaults=dict(rev=CURRENT))
-def highlight_item(item_name, rev):
- try:
- item = Item.create(item_name, rev_id=rev)
- except AccessDenied:
- abort(403)
- if isinstance(item, NonExistent):
- abort(404, item_name)
+@presenter('highlight')
+def highlight_item(item):
return render_template('highlight.html',
item=item, item_name=item.name,
data_text=Markup(item._render_data_highlight()),
)
-@frontend.route('/+meta/<itemname:item_name>', defaults=dict(rev=CURRENT))
-@frontend.route('/+meta/+<rev>/<itemname:item_name>')
-def show_item_meta(item_name, rev):
- flaskg.user.add_trail(item_name)
- try:
- item = Item.create(item_name, rev_id=rev)
- except AccessDenied:
- abort(403)
- if isinstance(item, NonExistent):
- abort(404, item_name)
- show_revision = rev != CURRENT
+@presenter('meta', add_trail=True)
+def show_item_meta(item):
+ show_revision = request.view_args['rev'] != CURRENT
show_navigation = False # TODO
first_rev = None
last_rev = None
@@ -396,23 +409,13 @@
data_rendered=Markup(item._render_data()),
)
-@frontend.route('/+get/+<rev>/<itemname:item_name>')
-@frontend.route('/+get/<itemname:item_name>', defaults=dict(rev=CURRENT))
-def get_item(item_name, rev):
- try:
- item = Item.create(item_name, rev_id=rev)
- except AccessDenied:
- abort(403)
+@presenter('get')
+def get_item(item):
return item.do_get()
-@frontend.route('/+download/+<rev>/<itemname:item_name>')
-@frontend.route('/+download/<itemname:item_name>', defaults=dict(rev=CURRENT))
-def download_item(item_name, rev):
- try:
- item = Item.create(item_name, rev_id=rev)
- mimetype = request.values.get("mimetype")
- except AccessDenied:
- abort(403)
+@presenter('download')
+def download_item(item):
+ mimetype = request.values.get("mimetype")
return item.do_get(force_attachment=True, mimetype=mimetype)
@frontend.route('/+convert/<itemname:item_name>')
« 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