realms-wiki/realms/modules/wiki/views.py

152 lines
4.7 KiB
Python
Raw Normal View History

from flask import abort, g, render_template, request, redirect, Blueprint, flash, url_for, current_app
2014-08-30 18:06:12 +03:00
from flask.ext.login import login_required
2013-12-03 22:09:57 +02:00
from realms.lib.util import to_canonical, remove_ext
2014-08-30 18:06:12 +03:00
from realms.modules.wiki.models import Wiki
from realms import current_user, app
2013-12-03 22:09:57 +02:00
blueprint = Blueprint('wiki', __name__, url_prefix=app.config['RELATIVE_PATH'])
2013-12-03 22:09:57 +02:00
@app.before_request
def init_wiki():
g.current_wiki = Wiki(app.config['WIKI_PATH'])
2014-08-30 18:06:12 +03:00
2013-12-03 22:09:57 +02:00
2014-08-20 18:28:25 +03:00
@blueprint.route("/_commit/<sha>/<name>")
2013-12-04 00:28:16 +02:00
def commit(name, sha):
2013-12-03 22:09:57 +02:00
cname = to_canonical(name)
data = g.current_wiki.get_page(cname, sha=sha)
if not data:
abort(404)
return render_template('wiki/page.html', name=name, page=data, commit=sha)
2013-12-03 22:09:57 +02:00
2014-08-20 18:28:25 +03:00
@blueprint.route("/_compare/<name>/<regex('[^.]+'):fsha><regex('\.{2,3}'):dots><regex('.+'):lsha>")
2013-12-03 22:09:57 +02:00
def compare(name, fsha, dots, lsha):
diff = g.current_wiki.compare(name, fsha, lsha)
2013-12-03 22:09:57 +02:00
return render_template('wiki/compare.html', name=name, diff=diff, old=fsha, new=lsha)
2014-08-20 18:28:25 +03:00
@blueprint.route("/_revert", methods=['POST'])
2014-08-30 18:06:12 +03:00
@login_required
2013-12-03 22:09:57 +02:00
def revert():
2014-08-30 18:06:12 +03:00
name = request.form.get('name')
commit = request.form.get('commit')
cname = to_canonical(name)
message = request.form.get('message', "Reverting %s" % cname)
2014-09-11 00:08:19 +03:00
if cname in app.config.get('WIKI_LOCKED_PAGES'):
return dict(error=True, message="Page is locked")
2014-09-11 00:08:19 +03:00
sha = g.current_wiki.revert_page(name, commit, message=message,
username=current_user.username)
if sha:
flash("Page reverted")
return dict(sha=sha)
2014-08-20 18:28:25 +03:00
@blueprint.route("/_history/<name>")
2013-12-03 22:09:57 +02:00
def history(name):
return render_template('wiki/history.html', name=name, history=g.current_wiki.get_history(name))
2013-12-03 22:09:57 +02:00
@blueprint.route("/_edit/<name>")
2014-08-30 18:06:12 +03:00
@login_required
2013-12-03 22:09:57 +02:00
def edit(name):
cname = to_canonical(name)
page = g.current_wiki.get_page(name)
if not page:
# Page doesn't exist
return redirect(url_for('wiki.create', name=cname))
name = remove_ext(page['name'])
g.assets['js'].append('editor.js')
return render_template('wiki/edit.html',
name=name,
content=page.get('data'),
info=page.get('info'),
sha=page.get('sha'),
partials=page.get('partials'))
2014-01-17 01:37:55 +02:00
@blueprint.route("/_create/", defaults={'name': None})
@blueprint.route("/_create/<name>")
2014-08-30 18:06:12 +03:00
@login_required
def create(name):
cname = to_canonical(name) if name else ""
if cname and g.current_wiki.get_page(cname):
# Page exists, edit instead
return redirect(url_for('wiki.edit', name=cname))
2013-12-03 22:09:57 +02:00
g.assets['js'].append('editor.js')
return render_template('wiki/edit.html',
name=cname,
content="",
info={})
2013-12-03 22:09:57 +02:00
@blueprint.route("/_index")
def index():
return render_template('wiki/index.html', index=g.current_wiki.get_index())
@blueprint.route("/<name>", methods=['POST', 'PUT', 'DELETE'])
2014-08-30 18:06:12 +03:00
@login_required
def page_write(name):
cname = to_canonical(name)
if not cname:
return dict(error=True, message="Invalid name")
2013-12-03 22:09:57 +02:00
if request.method == 'POST':
# Create
if cname in app.config.get('WIKI_LOCKED_PAGES'):
return dict(error=True, message="Page is locked")
sha = g.current_wiki.write_page(cname,
request.form['content'],
message=request.form['message'],
create=True,
username=current_user.username)
elif request.method == 'PUT':
edit_cname = to_canonical(request.form['name'])
if edit_cname in app.config.get('WIKI_LOCKED_PAGES'):
return dict(error=True, message="Page is locked")
2014-01-17 01:37:55 +02:00
if edit_cname != cname.lower():
g.current_wiki.rename_page(cname, edit_cname)
2013-12-03 22:09:57 +02:00
sha = g.current_wiki.write_page(edit_cname,
request.form['content'],
message=request.form['message'],
username=current_user.username)
2013-12-03 22:09:57 +02:00
return dict(sha=sha)
else:
# DELETE
sha = g.current_wiki.delete_page(name, user=current_user)
return dict(sha=sha)
2014-10-09 23:47:12 +03:00
2014-08-20 18:28:25 +03:00
@blueprint.route("/", defaults={'name': 'home'})
@blueprint.route("/<name>")
2013-12-03 22:09:57 +02:00
def page(name):
cname = to_canonical(name)
if cname != name:
2014-01-17 01:12:21 +02:00
return redirect(url_for('wiki.page', name=cname))
2013-12-03 22:09:57 +02:00
data = g.current_wiki.get_page(cname)
2013-12-03 22:09:57 +02:00
if data:
return render_template('wiki/page.html', name=cname, page=data, partials=data.get('partials'))
2013-12-03 22:09:57 +02:00
else:
2014-01-17 01:12:21 +02:00
return redirect(url_for('wiki.create', name=cname))