# HG changeset patch # User gibus # Date 1343745443 -7200 # Node ID 1d314f629611723db0af0c659fa0b0d5e92d5e10 # Parent 8f1d6a6cd7f6721c811eb6d193612ef977ff4e94 Added export to XML for re-import (nb. without attachements). diff -r 8f1d6a6cd7f6 -r 1d314f629611 src/cm/media/js/client/f_printDialog.js --- 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'}, diff -r 8f1d6a6cd7f6 -r 1d314f629611 src/cm/templates/site/export.xml --- /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 %} + + + {{ title }} + {{ date|date:"c" }}+{{ tz|leading_zeros:"2" }} + {{ name }} + {{ email }} + {{ format }} + + {% if tags %} + {{ tags }} + {% endif %} + {% if comments %} + + {% for c in comments %} + + {{ c.id }} + {% if c.reply_to_id %} + {{ c.reply_to_id }} + {% endif %} + {{ c.title }} + {{ c.modified|date:"c" }}+{{ tz|leading_zeros:"2" }} + {{ c.name }} + {{ c.email }} + {{ c.format }} + {{ c.content }} + {% if c.tags %} + {{ c.tags }} + {% endif %} + {{ c.start_wrapper }} + {{ c.end_wrapper }} + {{ c.start_offset }} + {{ c.end_offset }} + + {% endfor %} + + {% endif %} + +{% endautoescape %} diff -r 8f1d6a6cd7f6 -r 1d314f629611 src/cm/templatetags/com.py --- 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) diff -r 8f1d6a6cd7f6 -r 1d314f629611 src/cm/views/export.py --- 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']) ; diff -r 8f1d6a6cd7f6 -r 1d314f629611 src/cm/views/texts.py --- 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