Added export to XML for re-import (nb. without attachements).
authorgibus
Tue, 31 Jul 2012 16:37:23 +0200
changeset 453 1d314f629611
parent 452 8f1d6a6cd7f6
child 454 b7a092a52eae
Added export to XML for re-import (nb. without attachements).
src/cm/media/js/client/f_printDialog.js
src/cm/templates/site/export.xml
src/cm/templatetags/com.py
src/cm/views/export.py
src/cm/views/texts.py
--- a/src/cm/media/js/client/f_printDialog.js	Mon Jun 25 21:15:03 2012 +0200
+++ b/src/cm/media/js/client/f_printDialog.js	Tue Jul 31 16:37:23 2012 +0200
@@ -4,16 +4,18 @@
 // extension : label 
 gFormats = [{'actions':['print'], 'extension':'html', 'label': gettext('print from the browser')},
             {'actions':['export'], 'extension':'html', 'label': gettext('download html file (.html)')},
-            {'actions':['print', 'export'], 'extension':'markdown', 'label': gettext('download markdown file (.mkd)')},
-            {'actions':['print', 'export'], 'extension':'pdf', 'label': gettext('download portable object format file (.pdf)')},
-            {'actions':['print', 'export'], 'extension':'latex', 'label': gettext('download latex file (.tex)')},
-            {'actions':['print', 'export'], 'extension':'odt', 'label': gettext('download open document file (.odt)')},
-            {'actions':['print', 'export'], 'extension':'doc', 'label': gettext('download microsoft word file (.doc)')},
-            {'actions':['print', 'export'], 'extension':'docx', 'label': gettext('download microsoft word 2007 file (.docx)')}];
+            {'actions':['export'], 'extension':'markdown', 'label': gettext('download markdown file (.mkd)')},
+            {'actions':['print'], 'extension':'pdf', 'label': gettext('print in PDF format')},
+            {'actions':['export'], 'extension':'pdf', 'label': gettext('download portable object format file (.pdf)')},
+            {'actions':['export'], 'extension':'latex', 'label': gettext('download latex file (.tex)')},
+            {'actions':['export'], 'extension':'odt', 'label': gettext('download open document file (.odt)')},
+            {'actions':['export'], 'extension':'doc', 'label': gettext('download microsoft word file (.doc)')},
+            {'actions':['export'], 'extension':'docx', 'label': gettext('download microsoft word 2007 file (.docx)')},
+            {'actions':['export'], 'extension':'xml', 'label': gettext('download XML file for re-import')}];
 
 var pandoc_version_ary = sv_pandoc_version.split('.');
 if (parseInt(pandoc_version_ary[0]) > 1 || (parseInt(pandoc_version_ary[0]) == 1 && parseInt(pandoc_version_ary[1]) > 8)) {
-  gFormats.push({'actions':['print', 'export'], 'extension':'epub', 'label': gettext('download ebook (.epub)')});
+  gFormats.push({'actions':['export'], 'extension':'epub', 'label': gettext('download ebook (.epub)')});
 }
 
 gActions = {'print':{'dialogTitle':gettext('Print text'), 'chooseFormatLabel':gettext('How do you want to print?'), 'defaultMethod':'pdf', 'defaultWithColors':"no", 'defaultWhichComments':'all'}, 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/templates/site/export.xml	Tue Jul 31 16:37:23 2012 +0200
@@ -0,0 +1,40 @@
+{% load com %}
+{% autoescape off %}
+<?xml version="1.0" encoding="UTF-8"?>
+<co_ment_text>
+  <title>{{ title }}</title>
+  <date>{{ date|date:"c" }}+{{ tz|leading_zeros:"2" }}</date>
+  <name>{{ name }}</name>
+  <email>{{ email }}</email>
+  <format>{{ format }}</format>
+  <content><![CDATA[{{ content }}]]></content>
+  {% if tags %}
+  <tags>{{ tags }}</tags>
+  {% endif %}
+  {% if comments %}
+  <comments>
+    {% for c in comments %}
+    <comment>
+      <id>{{ c.id }}</id>
+      {% if c.reply_to_id %}
+      <parent>{{ c.reply_to_id }}</parent>
+      {% endif %}
+      <title>{{ c.title }}</title>
+      <date>{{ c.modified|date:"c" }}+{{ tz|leading_zeros:"2" }}</date>
+      <name>{{ c.name }}</name>
+      <email>{{ c.email }}</email>
+      <format>{{ c.format }}</format>
+      <content>{{ c.content }}</content>
+      {% if c.tags %}
+      <tags>{{ c.tags }}</tags>
+      {% endif %}
+      <start_wrapper>{{ c.start_wrapper }}</start_wrapper>
+      <end_wrapper>{{ c.end_wrapper }}</end_wrapper>
+      <start_offset>{{ c.start_offset }}</start_offset>
+      <end_offset>{{ c.end_offset }}</end_offset>
+    </comment>
+    {% endfor %}
+  </comments>
+  {% endif %}
+</co_ment_text>
+{% endautoescape %}
--- a/src/cm/templatetags/com.py	Mon Jun 25 21:15:03 2012 +0200
+++ b/src/cm/templatetags/com.py	Tue Jul 31 16:37:23 2012 +0200
@@ -316,3 +316,16 @@
         return '&'
     else:
         return '?'
+
+@register.filter
+def leading_zeros(value, desired_digits):
+  """
+  Given an integer, returns a string representation, padded with [desired_digits] zeros.
+  """
+  num_zeros = int(desired_digits) - len(str(value))
+  padded_value = []
+  while num_zeros >= 1:
+    padded_value.append("0") 
+    num_zeros = num_zeros - 1
+  padded_value.append(str(value))
+  return "".join(padded_value)
--- a/src/cm/views/export.py	Mon Jun 25 21:15:03 2012 +0200
+++ b/src/cm/views/export.py	Tue Jul 31 16:37:23 2012 +0200
@@ -2,10 +2,13 @@
 from django.core.urlresolvers import reverse
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.shortcuts import render_to_response
+from django.template.loader import render_to_string
 from django.template import RequestContext
 from django.utils.translation import ugettext as _, ugettext_lazy
+from django.contrib.auth.models import User
 from cm.converters.pandoc_converters import pandoc_convert, do_tidy
 from cm.models import Text, TextVersion, Attachment, Comment
+from cm.security import get_viewable_comments
 import mimetypes
 import simplejson
 from cm.cm_settings import USE_ABI
@@ -20,8 +23,8 @@
 'latex' :{'mimetype': 'text/x-tex', 'extension':'tex'},
 'html' :{'mimetype': 'text/html', 'extension':'html'},
 'epub' :{'mimetype': 'application/epub+zip', 'extension':'epub'},
-# raw export
-'raw' : {'mimetype': 'text/plain', 'extension':'txt'}
+'raw' : {'mimetype': 'text/plain', 'extension':'txt'},
+'xml' : {'mimetype': 'text/xml', 'extension':'xml'},
 }
 def content_export2(request, content, title, content_format, format, use_pandoc, download_response):
     # TODO : formats must be imported from converters
@@ -229,3 +232,46 @@
 
 def text_feed(request, key):
     return ""
+
+def xml_export(request, text_version, whichcomments):
+  # Text version infos
+  template_dict = { 'title': text_version.title, 'date': text_version.modified, 'format': text_version.format, 'content': text_version.get_content(), 'tags': text_version.tags, }
+  
+  # Comments
+  comments = [] # whichcomments=="none"
+  if whichcomments == "filtered" or whichcomments == "all":
+    _comments = text_version.comment_set.all()
+    if whichcomments == "filtered" :
+      filteredIds = []
+      if request.method == 'POST' :
+        ll = request.POST.get('filteredIds',[]).split(",")
+        filteredIds = [ int(l) for l in ll if l]
+      _comments = text_version.comment_set.filter(id__in=filteredIds)
+    comments = get_viewable_comments(request, _comments, text_version, order_by=('start_wrapper','start_offset','end_wrapper','end_offset'))
+    # Add user name/email if missing comment name/email
+    for comment in comments:
+      users = User.objects.filter(id=comment.user_id)
+      if not(comment.name):
+        comment.name = users[0].username
+      if not(comment.email):
+        comment.email = users[0].email
+      
+    template_dict['comments'] = comments
+
+  # Author
+  users = User.objects.filter(id=text_version.user_id)
+  if text_version.name:
+    template_dict['name'] = text_version.name
+  else:
+    template_dict['name'] = users[0].username
+  if text_version.email:
+    template_dict['email'] = text_version.email
+  else:
+    template_dict['email'] = users[0].email
+
+  # Renders template
+  export_content = render_to_string('site/export.xml', template_dict, context_instance=RequestContext(request))
+
+  # Returns HTTP response
+  export_infos = EXPORT2_INFOS['xml']
+  return _response_download(export_content, text_version.title, export_infos['mimetype'], export_infos['extension']) ;
--- a/src/cm/views/texts.py	Mon Jun 25 21:15:03 2012 +0200
+++ b/src/cm/views/texts.py	Tue Jul 31 16:37:23 2012 +0200
@@ -16,7 +16,7 @@
     insert_comment_markers
 from cm.utils.spannifier import spannify
 from cm.views import get_keys_from_dict, get_textversion_by_keys_or_404, get_text_by_keys_or_404, redirect
-from cm.views.export import content_export2, content_export
+from cm.views.export import content_export2, content_export, xml_export
 from cm.views.user import AnonUserRoleForm, cm_login
 from difflib import unified_diff
 from django import forms
@@ -311,12 +311,16 @@
 def text_export(request, key, format, download, whichcomments, withcolor, adminkey=None):
     text, admin = get_text_and_admin(key, adminkey)
     text_version = text.get_latest_version()
+
+    if format == 'xml':
+      return xml_export(request, text_version, whichcomments) 
+    
     original_content = text_version.content
     original_format = text_version.format # BD : html or markdown for  now ...
 
     download_response = download == "1"
     with_color = withcolor == "1"
-    
+
     comments = [] # whichcomments=="none"
     
     if whichcomments == "filtered" or whichcomments == "all":
@@ -341,7 +345,7 @@
             use_pandoc = True
         elif format in ('pdf', 'odt') : 
             use_pandoc = (original_format == "markdown")
-        elif format in ('docx', 'doc', 'html') :
+        elif format in ('docx', 'doc', 'html', 'xml') :
             use_pandoc = False
 
     # correct attach path => real path