Merge master into img-playground. Image support with new management features. Missing...
[redakcja.git] / apps / wiki_img / views.py
index c4d32b7..9e87f66 100644 (file)
@@ -1,16 +1,18 @@
 import os
 import functools
 import logging
-logger = logging.getLogger("fnp.wiki")
+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 django.conf import settings
+from django.utils.formats import localize
 
-from wiki_img.models import ImageDocument
+from catalogue.models import Image
 from wiki_img.forms import DocumentTextSaveForm
 
 #
@@ -21,50 +23,107 @@ from django.views.decorators.cache import never_cache
 
 @never_cache
 def editor(request, slug, template_name='wiki_img/document_details.html'):
-    doc = get_object_or_404(ImageDocument, slug=slug)
+    doc = get_object_or_404(Image, slug=slug)
 
     return direct_to_template(request, template_name, extra_context={
         'document': doc,
         'forms': {
-            "text_save": DocumentTextSaveForm(prefix="textsave"),
+            "text_save": DocumentTextSaveForm(user=request.user, prefix="textsave"),
         },
         'REDMINE_URL': settings.REDMINE_URL,
     })
 
 
+@require_GET
+def editor_readonly(request, slug, template_name='wiki_img/document_details_readonly.html'):
+    doc = get_object_or_404(Image, slug=slug)
+    try:
+        revision = request.GET['revision']
+    except (KeyError):
+        raise Http404
+
+
+
+    return direct_to_template(request, template_name, extra_context={
+        'document': doc,
+        'revision': revision,
+        'readonly': True,
+        'REDMINE_URL': settings.REDMINE_URL,
+    })
+
+
 @never_cache
-def text(request, slug):
+def text(request, image_id):
+    doc = get_object_or_404(Image, pk=image_id)
     if request.method == 'POST':
-        form = DocumentTextSaveForm(request.POST, prefix="textsave")
+        form = DocumentTextSaveForm(request.POST, user=request.user, prefix="textsave")
         if form.is_valid():
-            document = get_object_or_404(ImageDocument, slug=slug)
-            commit = form.cleaned_data['parent_commit']
-
-            comment = form.cleaned_data['comment']
-
             if request.user.is_authenticated():
-                user = request.user
+                author = request.user
             else:
-                user = None
-
-            document.doc.commit(
-                parent=commit,
-                text=form.cleaned_data['text'],
-                author=user,
-                description=comment
-            )
-
+                author = None
+            text = form.cleaned_data['text']
+            parent_revision = form.cleaned_data['parent_revision']
+            if parent_revision is not None:
+                parent = doc.at_revision(parent_revision)
+            else:
+                parent = None
+            stage = form.cleaned_data['stage_completed']
+            tags = [stage] if stage else []
+            publishable = (form.cleaned_data['publishable'] and
+                    request.user.has_perm('catalogue.can_pubmark'))
+            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,
+                       )
+            revision = doc.revision()
             return JSONResponse({
-                'text': document.doc.materialize(),
-                'revision': document.doc.change_set.count(),
+                'text': doc.materialize() if parent_revision != revision else None,
+                'meta': {},
+                'revision': revision,
             })
         else:
             return JSONFormInvalid(form)
     else:
-        doc = get_object_or_404(ImageDocument, slug=slug).doc
+        revision = request.GET.get("revision", None)
+        
+        try:
+            revision = int(revision)
+        except (ValueError, TypeError):
+            revision = doc.revision()
+
+        if revision is not None:
+            text = doc.at_revision(revision).materialize()
+        else:
+            text = ''
+
         return JSONResponse({
-            'text': doc.materialize(),
-            'revision': doc.change_set.count(),
-            'commit': doc.head.id,
+            'text': text,
+            'meta': {},
+            'revision': revision,
         })
 
+
+@never_cache
+def history(request, chunk_id):
+    # TODO: pagination
+    doc = get_object_or_404(Image, pk=chunk_id)
+    if not doc.accessible(request):
+        return HttpResponseForbidden("Not authorized.")
+
+    changes = []
+    for change in doc.history().reverse():
+        changes.append({
+                "version": change.revision,
+                "description": change.description,
+                "author": change.author_str(),
+                "date": localize(change.created_at),
+                "publishable": _("Publishable") + "\n" if change.publishable else "",
+                "tag": ',\n'.join(unicode(tag) for tag in change.tags.all()),
+            })
+    return JSONResponse(changes)