Git based wiki inspired by Gollum
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
5.5KB

  1. from flask import abort, g, render_template, request, redirect, Blueprint, flash, url_for, current_app
  2. from flask.ext.login import login_required, current_user
  3. from realms.lib.util import to_canonical, remove_ext
  4. from .models import PageNotFound
  5. blueprint = Blueprint('wiki', __name__)
  6. @blueprint.route("/_commit/<sha>/<name>")
  7. def commit(name, sha):
  8. cname = to_canonical(name)
  9. data = g.current_wiki.get_page(cname, sha=sha)
  10. if not data:
  11. abort(404)
  12. return render_template('wiki/page.html', name=name, page=data, commit=sha)
  13. @blueprint.route("/_compare/<name>/<regex('[^.]+'):fsha><regex('\.{2,3}'):dots><regex('.+'):lsha>")
  14. def compare(name, fsha, dots, lsha):
  15. diff = g.current_wiki.compare(name, fsha, lsha)
  16. return render_template('wiki/compare.html',
  17. name=name, diff=diff, old=fsha, new=lsha)
  18. @blueprint.route("/_revert", methods=['POST'])
  19. @login_required
  20. def revert():
  21. cname = to_canonical(request.form.get('name'))
  22. commit = request.form.get('commit')
  23. message = request.form.get('message', "Reverting %s" % cname)
  24. if not current_app.config.get('ALLOW_ANON') and current_user.is_anonymous():
  25. return dict(error=True, message="Anonymous posting not allowed"), 403
  26. if cname in current_app.config.get('WIKI_LOCKED_PAGES'):
  27. return dict(error=True, message="Page is locked"), 403
  28. try:
  29. sha = g.current_wiki.revert_page(cname,
  30. commit,
  31. message=message,
  32. username=current_user.username,
  33. email=current_user.email)
  34. except PageNotFound as e:
  35. return dict(error=True, message=e.message), 404
  36. if sha:
  37. flash("Page reverted")
  38. return dict(sha=sha)
  39. @blueprint.route("/_history/<name>")
  40. def history(name):
  41. return render_template('wiki/history.html', name=name, history=g.current_wiki.get_history(name))
  42. @blueprint.route("/_edit/<name>")
  43. @login_required
  44. def edit(name):
  45. cname = to_canonical(name)
  46. page = g.current_wiki.get_page(name)
  47. if not page:
  48. # Page doesn't exist
  49. return redirect(url_for('wiki.create', name=cname))
  50. name = remove_ext(page['name'])
  51. g.assets['js'].append('editor.js')
  52. return render_template('wiki/edit.html',
  53. name=name,
  54. content=page.get('data'),
  55. info=page.get('info'),
  56. sha=page.get('sha'),
  57. partials=page.get('partials'))
  58. @blueprint.route("/_create/", defaults={'name': None})
  59. @blueprint.route("/_create/<name>")
  60. @login_required
  61. def create(name):
  62. cname = to_canonical(name) if name else ""
  63. if cname and g.current_wiki.get_page(cname):
  64. # Page exists, edit instead
  65. return redirect(url_for('wiki.edit', name=cname))
  66. g.assets['js'].append('editor.js')
  67. return render_template('wiki/edit.html',
  68. name=cname,
  69. content="",
  70. info={})
  71. @blueprint.route("/_index")
  72. def index():
  73. return render_template('wiki/index.html', index=g.current_wiki.get_index())
  74. @blueprint.route("/<name>", methods=['POST', 'PUT', 'DELETE'])
  75. @login_required
  76. def page_write(name):
  77. cname = to_canonical(name)
  78. if not cname:
  79. return dict(error=True, message="Invalid name")
  80. if not current_app.config.get('ALLOW_ANON') and current_user.is_anonymous():
  81. return dict(error=True, message="Anonymous posting not allowed"), 403
  82. if request.method == 'POST':
  83. # Create
  84. if cname in current_app.config.get('WIKI_LOCKED_PAGES'):
  85. return dict(error=True, message="Page is locked"), 403
  86. sha = g.current_wiki.write_page(cname,
  87. request.form['content'],
  88. message=request.form['message'],
  89. create=True,
  90. username=current_user.username,
  91. email=current_user.email)
  92. elif request.method == 'PUT':
  93. edit_cname = to_canonical(request.form['name'])
  94. if edit_cname in current_app.config.get('WIKI_LOCKED_PAGES'):
  95. return dict(error=True, message="Page is locked"), 403
  96. if edit_cname != cname.lower():
  97. g.current_wiki.rename_page(cname, edit_cname)
  98. sha = g.current_wiki.write_page(edit_cname,
  99. request.form['content'],
  100. message=request.form['message'],
  101. username=current_user.username,
  102. email=current_user.email)
  103. return dict(sha=sha)
  104. else:
  105. # DELETE
  106. if cname in current_app.config.get('WIKI_LOCKED_PAGES'):
  107. return dict(error=True, message="Page is locked"), 403
  108. sha = g.current_wiki.delete_page(name,
  109. username=current_user.username,
  110. email=current_user.email)
  111. return dict(sha=sha)
  112. @blueprint.route("/", defaults={'name': 'home'})
  113. @blueprint.route("/<name>")
  114. def page(name):
  115. cname = to_canonical(name)
  116. if cname != name:
  117. return redirect(url_for('wiki.page', name=cname))
  118. data = g.current_wiki.get_page(cname)
  119. if data:
  120. return render_template('wiki/page.html', name=cname, page=data, partials=data.get('partials'))
  121. else:
  122. return redirect(url_for('wiki.create', name=cname))