Copy content between stream fields of different languages

This commit is contained in:
Eduardo 2015-08-12 11:15:04 +01:00
parent 7d938b6859
commit ff3ed3bd7d
2 changed files with 142 additions and 0 deletions

View file

@ -0,0 +1,62 @@
/* Creates the copy buttons in the header of each stream field */
$(document).ready(function(){
//All the stream fields with all his content
var allStreamFields = $('li.stream-field');
/* Iterate all stream fields, put the copy buttons in each one.*/
for (var i = 0; i < allStreamFields.length; i++) {
//Current Field with all content
var currentStreamField = allStreamFields[i];
//Current Field header
var header = $(currentStreamField).children('h2')[0];
//Search for the input field so that we can get is id to know the field's name.
var streamFieldDiv = $(currentStreamField).find('div.sequence-container.sequence-type-stream')[0];
var fieldInfos = $(streamFieldDiv).children('input')[0].id.split('-')[0]
var fieldName = fieldInfos.split('_')[0];
var fieldLang = fieldInfos.split('_')[1];
//The cycle to create the buttons for copy each language field
for (var j = 0; j < langs.length; j++) {
if (fieldLang != langs[j]) {
var currentFieldID = fieldName + '_' + fieldLang;
var targetFieldID = fieldName + '_' + langs [j];
header.innerHTML += '<button class="translation-field-copy" current-lang-code="'+ currentFieldID +'" data-lang-code="'+ targetFieldID +'">'+langs[j]+'</button>';
};
};
};
/* on click binding */
$('.translation-field-copy').click(function(event){
event.preventDefault();
var lang = $(this).attr('data-lang-code');
var currentLang = $(this).attr('current-lang-code');
requestCopyField(lang, currentLang);
});
});
/* Copy the content of originID field to the targetID field */
function requestCopyField(originID, targetID) {
/* Get the originID field and convert him to json string */
var serializedForm = $("#page-edit-form").serializeArray();
var serializedOriginField = $.grep(serializedForm, function(obj){return obj.name.indexOf(originID) >= 0;});
var jsonString = JSON.stringify(serializedOriginField);
/* AJAX request that returns the html content of originID field
with the id's changed to targetID */
$.ajax({
url: 'copy_translation_content',
type: 'GET',
dataType: 'json',
data: {'origin_field_name': originID, 'target_field_name': targetID, 'serializedOriginField': jsonString},
})
.done(function(data) {
/* Put the html data in the targetID field */
var wrapperDiv = $("#"+targetID+"-count").parents('.input')[0];
$(wrapperDiv).html(data);
})
.fail(function() {
console.log("error");
})
}

View file

@ -1,7 +1,11 @@
# coding: utf-8
import json
from django.utils.html import format_html, format_html_join
from django.conf import settings
from django.conf.urls import url
from django.http import QueryDict
from wagtail.wagtailcore import hooks
@ -23,3 +27,79 @@ def translated_slugs():
js_languages = "<script>var langs=[%s];</script>" % (", ".join(lang_codes))
return format_html(js_languages) + js_includes
###############################################################################
# Copy StreamFields content
###############################################################################
"""
Ajax view that allows to duplicate content
between translated streamfields
"""
from django.http import HttpResponse
def return_translation_target_field_rendered_html(request, page_id):
from wagtail.wagtailcore.models import Page
page = Page.objects.get(pk=page_id)
if request.is_ajax():
origin_field_name = request.GET.get('origin_field_name')
target_field_name = request.GET.get('target_field_name')
origin_field_serialized = json.loads(request.GET.get('serializedOriginField'))
# Patch field prefixes from origin field to target field
target_field_patched = []
for item in origin_field_serialized:
patched_item = None
for att in item.iteritems():
target_value = att[1]
if att[0] == 'name':
target_value = att[1].replace(origin_field_name, target_field_name)
patched_item = {"name": target_value}
else:
patched_item["value"] = att[1]
target_field_patched.append(patched_item)
# convert to QueryDict
q_data = QueryDict('', mutable=True)
for item in target_field_patched:
q_data.update({item['name']: item['value']})
# get render html
target_field = page.specific._meta.get_field(target_field_name)
value_data = target_field.stream_block.value_from_datadict(q_data, {}, target_field_name)
target_field_content_html = target_field.formfield().widget.render(target_field_name, value_data)
# return html json
return HttpResponse(json.dumps(target_field_content_html), content_type='application/json')
@hooks.register('register_admin_urls')
def copy_streamfields_content():
return [
url(r'(?P<page_id>\d+)/edit/copy_translation_content$', return_translation_target_field_rendered_html, name='' ),
]
@hooks.register('insert_editor_js')
def streamfields_translation_copy():
"""
Includes script in editor html file that creates
buttons to copy content between translated stream fields
and send a ajax request to copy the content.
"""
#includes the java script file in the html file
js_files = [
'modeltranslation/js/copy_stream_fields.js',
]
js_includes = format_html_join('\n', '<script src="{0}{1}"></script>',
((settings.STATIC_URL, filename) for filename in js_files)
)
return js_includes