Librarian in regular requirements.
[redakcja.git] / apps / wiki_img / views.py
index 9e87f66..2b8dd67 100644 (file)
@@ -3,17 +3,21 @@ import functools
 import logging
 logger = logging.getLogger("fnp.wiki_img")
 
-from django.views.generic.simple import direct_to_template
 from django.core.urlresolvers import reverse
-from wiki.helpers import JSONResponse
-from django import http
-from django.shortcuts import get_object_or_404
-from django.views.decorators.http import require_GET
+from wiki.helpers import (JSONResponse, JSONFormInvalid, JSONServerError,
+                ajax_require_permission)
+
+from django.http import Http404, HttpResponse, HttpResponseForbidden
+from django.shortcuts import get_object_or_404, render
+from django.views.decorators.http import require_GET, require_POST
 from django.conf import settings
 from django.utils.formats import localize
+from django.utils.translation import ugettext as _
 
 from catalogue.models import Image
-from wiki_img.forms import DocumentTextSaveForm
+from wiki import forms
+from wiki import nice_diff
+from wiki_img.forms import ImageSaveForm
 
 #
 # Quick hack around caching problems, TODO: use ETags
@@ -25,11 +29,14 @@ from django.views.decorators.cache import never_cache
 def editor(request, slug, template_name='wiki_img/document_details.html'):
     doc = get_object_or_404(Image, slug=slug)
 
-    return direct_to_template(request, template_name, extra_context={
+    return render(request, template_name, {
         'document': doc,
         'forms': {
-            "text_save": DocumentTextSaveForm(user=request.user, prefix="textsave"),
+            "text_save": ImageSaveForm(user=request.user, prefix="textsave"),
+            "text_revert": forms.DocumentTextRevertForm(prefix="textrevert"),
+            "pubmark": forms.DocumentPubmarkForm(prefix="pubmark"),
         },
+        'can_pubmark': request.user.has_perm('catalogue.can_pubmark_image'),
         'REDMINE_URL': settings.REDMINE_URL,
     })
 
@@ -42,9 +49,7 @@ def editor_readonly(request, slug, template_name='wiki_img/document_details_read
     except (KeyError):
         raise Http404
 
-
-
-    return direct_to_template(request, template_name, extra_context={
+    return render(request, template_name, {
         'document': doc,
         'revision': revision,
         'readonly': True,
@@ -56,7 +61,7 @@ def editor_readonly(request, slug, template_name='wiki_img/document_details_read
 def text(request, image_id):
     doc = get_object_or_404(Image, pk=image_id)
     if request.method == 'POST':
-        form = DocumentTextSaveForm(request.POST, user=request.user, prefix="textsave")
+        form = ImageSaveForm(request.POST, user=request.user, prefix="textsave")
         if form.is_valid():
             if request.user.is_authenticated():
                 author = request.user
@@ -71,16 +76,16 @@ def text(request, image_id):
             stage = form.cleaned_data['stage_completed']
             tags = [stage] if stage else []
             publishable = (form.cleaned_data['publishable'] and
-                    request.user.has_perm('catalogue.can_pubmark'))
+                    request.user.has_perm('catalogue.can_pubmark_image'))
             doc.commit(author=author,
-                       text=text,
-                       parent=parent,
-                       description=form.cleaned_data['comment'],
-                       tags=tags,
-                       author_name=form.cleaned_data['author_name'],
-                       author_email=form.cleaned_data['author_email'],
-                       publishable=publishable,
-                       )
+                   text=text,
+                   parent=parent,
+                   description=form.cleaned_data['comment'],
+                   tags=tags,
+                   author_name=form.cleaned_data['author_name'],
+                   author_email=form.cleaned_data['author_email'],
+                   publishable=publishable,
+                )
             revision = doc.revision()
             return JSONResponse({
                 'text': doc.materialize() if parent_revision != revision else None,
@@ -110,9 +115,9 @@ def text(request, image_id):
 
 
 @never_cache
-def history(request, chunk_id):
+def history(request, object_id):
     # TODO: pagination
-    doc = get_object_or_404(Image, pk=chunk_id)
+    doc = get_object_or_404(Image, pk=object_id)
     if not doc.accessible(request):
         return HttpResponseForbidden("Not authorized.")
 
@@ -127,3 +132,82 @@ def history(request, chunk_id):
                 "tag": ',\n'.join(unicode(tag) for tag in change.tags.all()),
             })
     return JSONResponse(changes)
+
+
+@never_cache
+@require_POST
+def revert(request, object_id):
+    form = forms.DocumentTextRevertForm(request.POST, prefix="textrevert")
+    if form.is_valid():
+        doc = get_object_or_404(Image, pk=object_id)
+        if not doc.accessible(request):
+            return HttpResponseForbidden("Not authorized.")
+
+        revision = form.cleaned_data['revision']
+
+        comment = form.cleaned_data['comment']
+        comment += "\n#revert to %s" % revision
+
+        if request.user.is_authenticated():
+            author = request.user
+        else:
+            author = None
+
+        before = doc.revision()
+        logger.info("Reverting %s to %s", object_id, revision)
+        doc.at_revision(revision).revert(author=author, description=comment)
+
+        return JSONResponse({
+            'text': doc.materialize() if before != doc.revision() else None,
+            'meta': {},
+            'revision': doc.revision(),
+        })
+    else:
+        return JSONFormInvalid(form)
+
+
+@never_cache
+def diff(request, object_id):
+    revA = int(request.GET.get('from', 0))
+    revB = int(request.GET.get('to', 0))
+
+    if revA > revB:
+        revA, revB = revB, revA
+
+    if revB == 0:
+        revB = None
+
+    doc = get_object_or_404(Image, pk=object_id)
+    if not doc.accessible(request):
+        return HttpResponseForbidden("Not authorized.")
+
+    # allow diff from the beginning
+    if revA:
+        docA = doc.at_revision(revA).materialize()
+    else:
+        docA = ""
+    docB = doc.at_revision(revB).materialize()
+
+    return HttpResponse(nice_diff.html_diff_table(docA.splitlines(),
+                                         docB.splitlines(), context=3))
+
+
+@require_POST
+@ajax_require_permission('catalogue.can_pubmark_image')
+def pubmark(request, object_id):
+    form = forms.DocumentPubmarkForm(request.POST, prefix="pubmark")
+    if form.is_valid():
+        doc = get_object_or_404(Image, pk=object_id)
+        if not doc.accessible(request):
+            return HttpResponseForbidden("Not authorized.")
+
+        revision = form.cleaned_data['revision']
+        publishable = form.cleaned_data['publishable']
+        change = doc.at_revision(revision)
+        if publishable != change.publishable:
+            change.set_publishable(publishable)
+            return JSONResponse({"message": _("Revision marked")})
+        else:
+            return JSONResponse({"message": _("Nothing changed")})
+    else:
+        return JSONFormInvalid(form)