From df557637d1010cad27029405925333e121ea58a2 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 30 Aug 2012 18:15:53 +0200 Subject: [PATCH 1/8] [ADD] ir.translation#translate() bzr revid: fme@openerp.com-20120830161553-hmf4fbsnqd2dhq7z --- openerp/addons/base/ir/ir_translation.py | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 61e40e807d4..78dda4ab5b5 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -318,6 +318,31 @@ class ir_translation(osv.osv): result = super(ir_translation, self).unlink(cursor, user, ids, context=context) return result + def translate(self, cr, uid, model, id, field=None, context=None): + trans_model = self.pool.get(model) + domain = ['&', ('res_id', '=', id), ('name', 'ilike', model + ',')] + for f, info in trans_model._all_columns.items(): + if info.parent_model and info.column.translate: + domain_id = trans_model.read(cr, uid, [id], [info.parent_column], context=context)[0][info.parent_column][0] + domain.insert(0, '|') + domain.extend(['&', ('res_id', '=', domain_id), ('name', '=', "%s,%s" % (info.parent_model, f))]) + + action = { + 'name': 'Translate', + 'view_type': 'list', + 'view_mode': 'list', + 'res_model': 'ir.translation', + 'type': 'ir.actions.act_window', + 'domain': domain, + 'views': [(False, 'list'), (False, 'form')], + } + if field: + info = trans_model._all_columns[field] + action['context'] = { + 'search_default_name': "%s,%s" % (info.parent_model or model, field) + } + return action + def _get_import_cursor(self, cr, uid, context=None): """ Return a cursor-like object for fast inserting translations """ From 8295b4f18192e97ce30cc75f7b41d0306a9e4b23 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Sep 2012 14:48:18 +0200 Subject: [PATCH 2/8] [IMP] ir.tranlsation#translate: create ir.translation entries for a particular record bzr revid: fme@openerp.com-20120903124818-myjy2616uv3blyki --- openerp/addons/base/ir/ir_translation.py | 28 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 231b9ba0e93..05f5071a2d7 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -331,11 +331,31 @@ class ir_translation(osv.osv): def translate(self, cr, uid, model, id, field=None, context=None): trans_model = self.pool.get(model) domain = ['&', ('res_id', '=', id), ('name', 'ilike', model + ',')] + langs_ids = self.pool.get('res.lang').search(cr, uid, [], context=context) + langs = [lg.get('code') for lg in self.pool.get('res.lang').read(cr, uid, langs_ids, ['code'], context=context)] + main_lang = langs.pop(0) + translatable_fields = [] for f, info in trans_model._all_columns.items(): - if info.parent_model and info.column.translate: - domain_id = trans_model.read(cr, uid, [id], [info.parent_column], context=context)[0][info.parent_column][0] - domain.insert(0, '|') - domain.extend(['&', ('res_id', '=', domain_id), ('name', '=', "%s,%s" % (info.parent_model, f))]) + if info.column.translate: + if info.parent_model: + domain_id = trans_model.read(cr, uid, [id], [info.parent_column], context=context)[0][info.parent_column][0] + translatable_fields.append({ 'name': f, 'id': domain_id, 'model': info.parent_model }) + domain.insert(0, '|') + domain.extend(['&', ('res_id', '=', domain_id), ('name', '=', "%s,%s" % (info.parent_model, f))]) + else: + translatable_fields.append({ 'name': f, 'id': id, 'model': model }) + if len(langs): + fields = [f.get('name') for f in translatable_fields] + record = trans_model.read(cr, uid, [id], fields, context={ 'lang': main_lang })[0] + for lg in langs: + for f in translatable_fields: + # Check if record exists, else create it (at once) + sql = """INSERT INTO ir_translation (lang, src, name, type, res_id, value) + SELECT %s, %s, %s, 'field', %s, %s WHERE NOT EXISTS + (SELECT 1 FROM ir_translation WHERE lang=%s AND name=%s AND res_id=%s); + """ + name = "%s,%s" % (f['model'], f['name']) + cr.execute(sql, (lg, record[f['name']], name, f['id'], record[f['name']], lg, name, f['id'])) action = { 'name': 'Translate', From 19ca7c3e4ed9201a75c9b26287ceb68f4ff3923f Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Sep 2012 15:04:27 +0200 Subject: [PATCH 3/8] [ADD] Add 'name' field to ir.translation search view bzr revid: fme@openerp.com-20120903130427-f2sriqp15c7ybuhx --- openerp/addons/base/ir/ir.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index fd4bb2f89b4..cecec8437c6 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1173,6 +1173,7 @@ + From e754257c0bd82ca8f301ba3617f7cf20bcf74b0a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Sep 2012 15:10:16 +0200 Subject: [PATCH 4/8] [IMP] Make the translation tree an editable list bzr revid: fme@openerp.com-20120903131016-a0ocg43lnnm2j9eg --- openerp/addons/base/ir/ir.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index cecec8437c6..09ff7c036f3 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1214,7 +1214,7 @@ Translations ir.translation - + From c1ec19eba9c8e44f96cfbd4cf462993cc399c921 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Sep 2012 17:21:49 +0200 Subject: [PATCH 5/8] [IMP] Put some translation editable list fields readonly bzr revid: fme@openerp.com-20120903152149-ss9j9e7xxcgv42f6 --- openerp/addons/base/ir/ir.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 09ff7c036f3..4fb3c82dd24 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1215,11 +1215,11 @@ ir.translation - + - - - + + + From 06e6bf71cc2effe244d5a392934a9b3abf93f35a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 3 Sep 2012 17:54:08 +0200 Subject: [PATCH 6/8] [IMP] Always update src to the last value bzr revid: fme@openerp.com-20120903155408-9agsj0y8y6g7ydsj --- openerp/addons/base/ir/ir_translation.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 05f5071a2d7..55902389ee4 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -328,7 +328,7 @@ class ir_translation(osv.osv): result = super(ir_translation, self).unlink(cursor, user, ids, context=context) return result - def translate(self, cr, uid, model, id, field=None, context=None): + def translate_fields(self, cr, uid, model, id, field=None, context=None): trans_model = self.pool.get(model) domain = ['&', ('res_id', '=', id), ('name', 'ilike', model + ',')] langs_ids = self.pool.get('res.lang').search(cr, uid, [], context=context) @@ -353,9 +353,11 @@ class ir_translation(osv.osv): sql = """INSERT INTO ir_translation (lang, src, name, type, res_id, value) SELECT %s, %s, %s, 'field', %s, %s WHERE NOT EXISTS (SELECT 1 FROM ir_translation WHERE lang=%s AND name=%s AND res_id=%s); + UPDATE ir_translation SET src = %s WHERE lang=%s AND name=%s AND res_id=%s; """ + src = record[f['name']] name = "%s,%s" % (f['model'], f['name']) - cr.execute(sql, (lg, record[f['name']], name, f['id'], record[f['name']], lg, name, f['id'])) + cr.execute(sql, (lg, src , name, f['id'], src, lg, name, f['id'], src, lg, name, id)) action = { 'name': 'Translate', From 6e5a9053e50f1b74ad53c9a644fe307ecc5c8348 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 4 Sep 2012 15:32:16 +0200 Subject: [PATCH 7/8] [FIX] Fixed remarks of merge proposal bzr revid: fme@openerp.com-20120904133216-7v82tmcqi1n21c3f --- openerp/addons/base/ir/ir_translation.py | 27 ++++++++++++------------ 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 55902389ee4..3650f28d3f5 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -330,18 +330,18 @@ class ir_translation(osv.osv): def translate_fields(self, cr, uid, model, id, field=None, context=None): trans_model = self.pool.get(model) - domain = ['&', ('res_id', '=', id), ('name', 'ilike', model + ',')] - langs_ids = self.pool.get('res.lang').search(cr, uid, [], context=context) - langs = [lg.get('code') for lg in self.pool.get('res.lang').read(cr, uid, langs_ids, ['code'], context=context)] - main_lang = langs.pop(0) + domain = ['&', ('res_id', '=', id), ('name', '=like', model + ',%')] + langs_ids = self.pool.get('res.lang').search(cr, uid, [('code', '!=', 'en_US')], context=context) + langs = [lg.code for lg in self.pool.get('res.lang').browse(cr, uid, langs_ids, context=context)] + main_lang = 'en_US' translatable_fields = [] for f, info in trans_model._all_columns.items(): if info.column.translate: if info.parent_model: - domain_id = trans_model.read(cr, uid, [id], [info.parent_column], context=context)[0][info.parent_column][0] - translatable_fields.append({ 'name': f, 'id': domain_id, 'model': info.parent_model }) + parent_id = trans_model.read(cr, uid, [id], [info.parent_column], context=context)[0][info.parent_column][0] + translatable_fields.append({ 'name': f, 'id': parent_id, 'model': info.parent_model }) domain.insert(0, '|') - domain.extend(['&', ('res_id', '=', domain_id), ('name', '=', "%s,%s" % (info.parent_model, f))]) + domain.extend(['&', ('res_id', '=', parent_id), ('name', '=', "%s,%s" % (info.parent_model, f))]) else: translatable_fields.append({ 'name': f, 'id': id, 'model': model }) if len(langs): @@ -351,22 +351,21 @@ class ir_translation(osv.osv): for f in translatable_fields: # Check if record exists, else create it (at once) sql = """INSERT INTO ir_translation (lang, src, name, type, res_id, value) - SELECT %s, %s, %s, 'field', %s, %s WHERE NOT EXISTS - (SELECT 1 FROM ir_translation WHERE lang=%s AND name=%s AND res_id=%s); - UPDATE ir_translation SET src = %s WHERE lang=%s AND name=%s AND res_id=%s; + SELECT %s, %s, %s, 'model', %s, %s WHERE NOT EXISTS + (SELECT 1 FROM ir_translation WHERE lang=%s AND name=%s AND res_id=%s AND type='model'); + UPDATE ir_translation SET src = %s WHERE lang=%s AND name=%s AND res_id=%s AND type='model'; """ - src = record[f['name']] + src = record[f['name']] or None name = "%s,%s" % (f['model'], f['name']) cr.execute(sql, (lg, src , name, f['id'], src, lg, name, f['id'], src, lg, name, id)) action = { 'name': 'Translate', - 'view_type': 'list', - 'view_mode': 'list', 'res_model': 'ir.translation', 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'tree,form', 'domain': domain, - 'views': [(False, 'list'), (False, 'form')], } if field: info = trans_model._all_columns[field] From e386d895ad1aab43d88b4241e24b8659314cfe3b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 4 Sep 2012 15:57:28 +0200 Subject: [PATCH 8/8] [FIX] Do not ilike on name for the translation search view bzr revid: fme@openerp.com-20120904135728-6i5nrwemsluexlx0 --- openerp/addons/base/ir/ir.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 4fb3c82dd24..bd98bb34c12 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1173,7 +1173,7 @@ - +