integration wip: showing + saving document, debug mode only, editor via symlink
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Thu, 12 Dec 2013 21:27:58 +0000 (22:27 +0100)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Thu, 12 Dec 2013 21:27:58 +0000 (22:27 +0100)
apps/wiki/templates/wiki/bootstrap.html [new file with mode: 0644]
apps/wiki/views.py
redakcja/context_processors.py
redakcja/urls.py

diff --git a/apps/wiki/templates/wiki/bootstrap.html b/apps/wiki/templates/wiki/bootstrap.html
new file mode 100644 (file)
index 0000000..5d59d78
--- /dev/null
@@ -0,0 +1,67 @@
+{% load staticfiles %}
+{% load i18n %}
+
+<!DOCTYPE html>
+<html>
+    <head>
+
+        <script src="{% url 'django.views.i18n.javascript_catalog' %}"></script>
+        <script src="http://cdnjs.cloudflare.com/ajax/libs/ace/1.1.01/ace.js" type="text/javascript" charset="utf-8"></script>
+        
+        {% if DEBUG %}
+            <link rel="stylesheet/less" type="text/css" href="{% static 'wiki/rng/src/editor/styles/main.less' %}"/>
+            <script type="text/javascript">less = {relativeUrls: true};</script>
+            <script src="{% static 'wiki/rng/libs/less-1.3.3.min.js' %}"></script>
+            <script src="{% static 'wiki/rng/libs/require.js' %}" data-main="{% static 'wiki/rng/src/editor/entrypoint.js' %}" ></script>
+        {% else %}
+            <link href="{% static 'wiki/build/rng.css' %}" rel="stylesheet">
+            <script src="{% static 'wiki/build/rng.js' %}"></script>
+        {% endif %}
+    </head>
+    <body>
+        <script type="text/javascript">
+
+            var config = {
+                rootSelector: '#editor_root',
+                jsonifySentPayload: false,
+                
+                documentSaveUrl: function(id) { return '/editor/text/' + id + '/'; },
+                documentHistoryUrl: function(id) { return '/editor/history/' + id + '/'},
+
+                documentSaveForm: {
+                    fields: [
+                        {label: '{{forms.text_save.comment.label}}', name: '{{forms.text_save.comment.html_name}}', type: 'textarea'},
+                        {label: '{{forms.text_save.stage_completed.label}}', name: '{{forms.text_save.stage_completed.html_name}}', type: 'select', options: [
+                            {% for value,text in tags %}
+                                {value:'{{value|default:''}}', text:'{{text}}'} {% if not forloop.last %}, {% endif %}
+                            {% endfor %}
+                        ], description: '{{forms.text_save.stage_completed.help_text}}'},
+                    ],
+                    content_field_name: '{{forms.text_save.text.html_name}}',
+                    version_field_name: '{{forms.text_save.parent_revision.html_name}}'
+                }
+            };
+
+            {% if can_pubmark %}
+                config.documentSaveForm.fields.push(
+                    {label: '{{forms.text_save.publishable.label}}', name: '{{forms.text_save.publishable.html_name}}', type: 'checkbox', description: '{{forms.text_save.publishable.help_text}}'}
+                );
+            {% endif %}
+
+            {% if not request.user.is_authenticated %}
+                config.documentSaveForm.fields.push(
+                    {label: '{{forms.text_save.author_name.label}}', name: '{{forms.text_save.author_name.html_name}}', type: 'input', description: '{{forms.text_save.author_name.help_text}}'},
+                    {label: '{{forms.text_save.author_email.label}}', name: '{{forms.text_save.author_email.html_name}}', type: 'input', description: '{{forms.text_save.author_email.help_text}}'}
+                );
+            {% endif %}
+
+            var data = {% autoescape off%}{{serialized_document_data}}{%endautoescape%};
+
+            var editor_init = function(Editor) {            
+                Editor.setBootstrappedData('data', data);
+                Editor.start(config);
+            };
+        </script>
+        <div id="editor_root"></div>
+    </body>
+</html>
index f959426..2bb168f 100644 (file)
@@ -14,6 +14,7 @@ from django.utils.formats import localize
 from django.utils.translation import ugettext as _
 from django.views.decorators.http import require_POST, require_GET
 from django.shortcuts import get_object_or_404, render
 from django.utils.translation import ugettext as _
 from django.views.decorators.http import require_POST, require_GET
 from django.shortcuts import get_object_or_404, render
+from django.utils import simplejson
 
 from catalogue.models import Book, Chunk
 import nice_diff
 
 from catalogue.models import Book, Chunk
 import nice_diff
@@ -32,8 +33,25 @@ logger = logging.getLogger("fnp.wiki")
 MAX_LAST_DOCS = 10
 
 
 MAX_LAST_DOCS = 10
 
 
+def get_history(chunk):
+    changes = []
+    for change in chunk.history():
+        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()),
+                "published": _("Published") + ": " + \
+                    localize(change.publish_log.order_by('-book_record__timestamp')[0].book_record.timestamp) \
+                    if change.publish_log.exists() else "",
+            })
+    return changes
+
+
 @never_cache
 @never_cache
-def editor(request, slug, chunk=None, template_name='wiki/document_details.html'):
+def editor(request, slug, chunk=None, template_name='wiki/bootstrap.html'):
     try:
         chunk = Chunk.get(slug, chunk)
     except Chunk.MultipleObjectsReturned:
     try:
         chunk = Chunk.get(slug, chunk)
     except Chunk.MultipleObjectsReturned:
@@ -62,15 +80,21 @@ def editor(request, slug, chunk=None, template_name='wiki/document_details.html'
         del last_books[oldest_key]
     request.session['wiki_last_books'] = last_books
 
         del last_books[oldest_key]
     request.session['wiki_last_books'] = last_books
 
+    save_form = forms.DocumentTextSaveForm(user=request.user, prefix="textsave")
     return render(request, template_name, {
     return render(request, template_name, {
-        'chunk': chunk,
+        'serialized_document_data': simplejson.dumps({
+            'document': chunk.materialize(),
+            'document_id': chunk.id,
+            'title': chunk.book.title,
+            'history': get_history(chunk),
+            'version': chunk.revision()
+        }),
         'forms': {
         'forms': {
-            "text_save": forms.DocumentTextSaveForm(user=request.user, prefix="textsave"),
-            "text_revert": forms.DocumentTextRevertForm(prefix="textrevert"),
-            "pubmark": forms.DocumentPubmarkForm(prefix="pubmark"),
+            "text_save": save_form,
+            "text_revert": forms.DocumentTextRevertForm(prefix="textrevert")
         },
         },
+        'tags': list(save_form.fields['stage_completed'].choices),
         'can_pubmark': request.user.has_perm('catalogue.can_pubmark'),
         'can_pubmark': request.user.has_perm('catalogue.can_pubmark'),
-        'REDMINE_URL': settings.REDMINE_URL,
     })
 
 
     })
 
 
@@ -141,7 +165,7 @@ def text(request, chunk_id):
             return JSONResponse({
                 'text': doc.materialize() if parent_revision != revision else None,
                 'meta': {},
             return JSONResponse({
                 'text': doc.materialize() if parent_revision != revision else None,
                 'meta': {},
-                'revision': revision,
+                'version': revision,
             })
         else:
             return JSONFormInvalid(form)
             })
         else:
             return JSONFormInvalid(form)
@@ -269,20 +293,7 @@ def history(request, chunk_id):
     if not doc.book.accessible(request):
         return HttpResponseForbidden("Not authorized.")
 
     if not doc.book.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()),
-                "published": _("Published") + ": " + \
-                    localize(change.publish_log.order_by('-book_record__timestamp')[0].book_record.timestamp) \
-                    if change.publish_log.exists() else "",
-            })
-    return JSONResponse(changes)
+    return JSONResponse(get_history(doc))
 
 
 @require_POST
 
 
 @require_POST
index 5e3372e..2724f83 100644 (file)
@@ -15,5 +15,6 @@ def settings(request):
     return {
         'MEDIA_URL': settings.MEDIA_URL,
         'STATIC_URL': settings.STATIC_URL,
     return {
         'MEDIA_URL': settings.MEDIA_URL,
         'STATIC_URL': settings.STATIC_URL,
+        'DEBUG': settings.DEBUG,
         'APP_VERSION': VERSION,
     }
         'APP_VERSION': VERSION,
     }
index b3da1ee..1163d16 100644 (file)
@@ -28,6 +28,8 @@ urlpatterns = patterns('',
     url(r'^apiclient/', include('apiclient.urls')),
     url(r'^editor/', include('wiki.urls')),
     url(r'^cover/', include('cover.urls')),
     url(r'^apiclient/', include('apiclient.urls')),
     url(r'^editor/', include('wiki.urls')),
     url(r'^cover/', include('cover.urls')),
+    (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', dict(packages=['apps.wiki'])),
+
 )
 
 if settings.DEBUG:
 )
 
 if settings.DEBUG: