From f814a950debbec616c2b11a0cf1036dd7928ae54 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Thu, 25 Jul 2019 12:26:03 +0200 Subject: [PATCH] Refactor to display only existing translations --- web_translate_dialog/__init__.py | 1 + web_translate_dialog/models.py | 34 ++++++ web_translate_dialog/readme/CONTRIBUTORS.rst | 1 + .../static/src/js/web_translate_dialog.js | 107 +++++++++--------- web_translate_dialog/static/src/xml/base.xml | 5 +- 5 files changed, 91 insertions(+), 57 deletions(-) create mode 100644 web_translate_dialog/models.py diff --git a/web_translate_dialog/__init__.py b/web_translate_dialog/__init__.py index cb13dd2d8..fc0fc4348 100644 --- a/web_translate_dialog/__init__.py +++ b/web_translate_dialog/__init__.py @@ -1,3 +1,4 @@ # Copyright 2012 Guewen Baconnier (Camptocamp SA) # Copyright 2016 Antonio Espinosa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import models diff --git a/web_translate_dialog/models.py b/web_translate_dialog/models.py new file mode 100644 index 000000000..d447b707e --- /dev/null +++ b/web_translate_dialog/models.py @@ -0,0 +1,34 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import models, api + + +class BaseModel(models.BaseModel): + + _inherit = 'base' + + @api.multi + def get_field_translations(self, field_name): + """Get only the existing translations for specified field + + :param field_name: Name of the field + :return: dict of + {self.id: {'lang_code': (ir.translation,id, ir.translation,value)}} + """ + read_res = self.with_context(lang='en_US').read(fields=[field_name]) + res = { + rec.get('id'): {'en_US': (0, rec.get(field_name))} + for rec in read_res + } + for rec_id, values in res.items(): + tr_read_res = self.env['ir.translation'].search_read([ + ('name', '=', '%s,%s' % (self._name, field_name)), + ('res_id', '=', rec_id) + ]) + for tr_res in tr_read_res: + if tr_res.get('lang') == 'en_US': + continue + values[tr_res.get('lang')] = ( + tr_res.get('id'), tr_res.get('value') + ) + return res diff --git a/web_translate_dialog/readme/CONTRIBUTORS.rst b/web_translate_dialog/readme/CONTRIBUTORS.rst index 0451fa147..fcd53c4e7 100644 --- a/web_translate_dialog/readme/CONTRIBUTORS.rst +++ b/web_translate_dialog/readme/CONTRIBUTORS.rst @@ -2,3 +2,4 @@ * Antonio Espinosa * Serpent Consulting Services Pvt. Ltd. * Timon Tschanz +* Akim Juillerat diff --git a/web_translate_dialog/static/src/js/web_translate_dialog.js b/web_translate_dialog/static/src/js/web_translate_dialog.js index 0d7138ef8..19dbf5fc3 100644 --- a/web_translate_dialog/static/src/js/web_translate_dialog.js +++ b/web_translate_dialog/static/src/js/web_translate_dialog.js @@ -34,7 +34,7 @@ var translateDialog = Dialog.extend({ this.view_type = parent.viewType || ''; this.$view_form = null; this.$sidebar_form = null; - this.translatable_fields = [event_data.fieldName]; + this.translatable_field = event_data.fieldName; this.res_id = res_id; this.languages = null; this.languages_loaded = $.Deferred(); @@ -68,46 +68,46 @@ var translateDialog = Dialog.extend({ }, initialize_html_fields: function(lang) { var self = this; - _.each(this.translatable_fields, function(f) { - // Initialize summernote if HTML field - self.$el.find('.oe_form_field_html .oe_translation_field[name="' + lang.code + '-' + f + '"]').each(function() { - var $parent = $(this).summernote({ - 'focus': false, - 'toolbar': [ - ['style', ['style']], - ['font', ['bold', 'italic', 'underline', 'clear']], - ['fontsize', ['fontsize']], - ['color', ['color']], - ['para', ['ul', 'ol', 'paragraph']], - ['table', ['table']], - ['insert', ['link', 'picture']], - ['misc', ['codeview']], - ['history', ['undo', 'redo']] - ], - 'prettifyHtml': false, - 'styleWithSpan': false, - 'inlinemedia': ['p'], - 'lang': "odoo", - 'onChange': function (value) { - $(this).toggleClass('touched', value !== $(this).attr('data-value')); - } - }).parent(); - // Triggers a mouseup to refresh the editor toolbar - $parent.find('.note-editable').trigger('mouseup'); - $parent.find('.note-editing-area').css({ - minHeight:'100px', - minWidth:'260px', - }); + + // Initialize summernote if HTML field + this.$el.find('.oe_form_field_html .oe_translation_field[name="' + lang + '-' + this.translatable_field + '"]').each(function() { + var $parent = $(this).summernote({ + 'focus': false, + 'toolbar': [ + ['style', ['style']], + ['font', ['bold', 'italic', 'underline', 'clear']], + ['fontsize', ['fontsize']], + ['color', ['color']], + ['para', ['ul', 'ol', 'paragraph']], + ['table', ['table']], + ['insert', ['link', 'picture']], + ['misc', ['codeview']], + ['history', ['undo', 'redo']] + ], + 'prettifyHtml': false, + 'styleWithSpan': false, + 'inlinemedia': ['p'], + 'lang': "odoo", + 'onChange': function (value) { + $(this).toggleClass('touched', value !== $(this).attr('data-value')); + } + }).parent(); + // Triggers a mouseup to refresh the editor toolbar + $parent.find('.note-editable').trigger('mouseup'); + $parent.find('.note-editing-area').css({ + minHeight:'100px', + minWidth:'260px', }); }); + }, - set_fields_values: function(lang, values) { + set_fields_values: function(lang, tr_value) { var self = this; - _.each(this.translatable_fields, function(f) { - self.$el.find('.oe_translation_field[name="' + lang.code + - '-' + f + '"]').val(values[f] || '').attr( - 'data-value', values[f] || ''); - }); + + this.$el.find('.oe_translation_field[name="' + lang + + '-' + this.translatable_field + '"]').val(tr_value || '').attr( + 'data-value', tr_value || ''); + var textarea = this.$el.find('textarea.oe_translation_field'); if (textarea !== undefined && textarea[0] !== undefined) { textarea.css({minHeight:'100px',}); @@ -121,29 +121,28 @@ var translateDialog = Dialog.extend({ deferred = []; this.$el.find('.oe_translation_field').val('').removeClass('touched'); - _.each(self.languages, function(lg) { - var context = new Context(session.user_context, {lang: lg.code}); - var deff = $.Deferred(); - deferred.push(deff); - rpc.query({ + + var deff = $.Deferred(); + deferred.push(deff); + rpc.query({ model: self.view.modelName, - method: 'read', + method: 'get_field_translations', args: [ [self.res_id], ], kwargs: { - fields: self.translatable_fields, - context: context.eval(), + field_name: self.translatable_field, }, - }).done( - function (rows) { - - if (rows[0]){ - self.set_fields_values(lg, rows[0]); - deff.resolve(); - } + }).done( + function (res) { + if (res[self.res_id]){ + _.each(res[self.res_id], function(translation, lang) { + self.set_fields_values(lang, translation[1]); }); - }); + deff.resolve(); + } + }); + return deferred; }, on_button_save: function() { @@ -193,7 +192,7 @@ FormView.include({ if (this.sidebar) { this.sidebar.add_items('other', _.compact([ this.is_action_enabled('edit') && - this.translatable_fields.length > 0 && { + this.translatable_field && { label: _t('Translate'), callback: this.on_button_translate }, diff --git a/web_translate_dialog/static/src/xml/base.xml b/web_translate_dialog/static/src/xml/base.xml index 0b1df50db..217120f65 100644 --- a/web_translate_dialog/static/src/xml/base.xml +++ b/web_translate_dialog/static/src/xml/base.xml @@ -6,7 +6,7 @@