+@normalized_name
+def text(request, name):
+ storage = getstorage()
+
+ if request.method == 'POST':
+ form = DocumentTextSaveForm(request.POST, prefix="textsave")
+
+ if form.is_valid():
+ revision = form.cleaned_data['parent_revision']
+
+ document = storage.get_or_404(name, revision)
+ document.text = form.cleaned_data['text']
+
+ comment = form.cleaned_data['comment']
+
+ if form.cleaned_data['stage_completed']:
+ comment += '\n#stage-finished: %s\n' % form.cleaned_data['stage_completed']
+
+ author = "%s <%s>" % (form.cleaned_data['author_name'], form.cleaned_data['author_email'])
+
+ storage.put(document, author=author, comment=comment, parent=revision)
+ document = storage.get(name)
+
+ return JSONResponse({
+ 'text': document.plain_text if revision != document.revision else None,
+ 'meta': document.meta(),
+ 'revision': document.revision,
+ })
+ else:
+ return JSONFormInvalid(form)
+ else:
+ revision = request.GET.get("revision", None)
+
+ try:
+ try:
+ revision = revision and int(revision)
+ logger.info("Fetching %s", revision)
+ document = storage.get(name, revision)
+ except ValueError:
+ # treat as a tag
+ logger.info("Fetching tag %s", revision)
+ document = storage.get_by_tag(name, revision)
+ except DocumentNotFound:
+ raise http.Http404
+
+ return JSONResponse({
+ 'text': document.plain_text,
+ 'meta': document.meta(),
+ 'revision': document.revision,
+ })
+
+
+@never_cache
+@normalized_name
+@require_POST
+def revert(request, name):
+ storage = getstorage()
+ revision = request.POST['target_revision']
+
+ try:
+ document = storage.revert(name, revision)
+
+ return JSONResponse({
+ 'text': document.plain_text if revision != document.revision else None,
+ 'meta': document.meta(),
+ 'revision': document.revision,
+ })
+ except DocumentNotFound:
+ raise http.Http404
+
+@never_cache
+def gallery(request, directory):