From 91cf53228b0ba7c998dd8c4950671e74bcea0183 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 4 Nov 2013 15:34:08 +0100 Subject: [PATCH 1/4] [FIX] orm: when duplicating a record, if duplicates translations on a field from _inherits model, use the id of the parent record instead. Avoid getting old value by removing 'source' value from read result. lp bug: https://launchpad.net/bugs/1237878 fixed bzr revid: mat@openerp.com-20131104143408-o71lyws8uba679hd --- openerp/osv/orm.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 3ec2f69ec3e..4f5cf8946dd 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -4985,7 +4985,6 @@ class BaseModel(object): # TODO it seems fields_get can be replaced by _all_columns (no need for translation) fields = self.fields_get(cr, uid, context=context) - translation_records = [] for field_name, field_def in fields.items(): # we must recursively copy the translations for o2o and o2m if field_def['type'] == 'one2many': @@ -4999,22 +4998,30 @@ class BaseModel(object): target_obj.copy_translations(cr, uid, old_child, new_child, context=context) # and for translatable fields we keep them for copy elif field_def.get('translate'): - trans_name = '' + if field_name in self._columns: trans_name = self._name + "," + field_name + res_id = new_id + elif field_name in self._inherit_fields: trans_name = self._inherit_fields[field_name][0] + "," + field_name - if trans_name: - trans_ids = trans_obj.search(cr, uid, [ - ('name', '=', trans_name), - ('res_id', '=', old_id) - ]) - translation_records.extend(trans_obj.read(cr, uid, trans_ids, context=context)) + # get the id of the inherit record + inherit_field_name = self._inherit_fields[field_name][1] + res_id = self.read(cr, uid, [new_id], [inherit_field_name], context=context)[0][inherit_field_name][0] - for record in translation_records: - del record['id'] - record['res_id'] = new_id - trans_obj.create(cr, uid, record, context=context) + else: + continue + + trans_ids = trans_obj.search(cr, uid, [ + ('name', '=', trans_name), + ('res_id', '=', old_id) + ]) + records = trans_obj.read(cr, uid, trans_ids, context=context) + for record in records: + del record['id'] + del record['source'] + record.update({'res_id': res_id}) + trans_obj.create(cr, uid, record, context=context) def copy(self, cr, uid, id, default=None, context=None): From 4d9e140b8cc065d7f54ae16c5b6300905d05729c Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 4 Nov 2013 15:44:27 +0100 Subject: [PATCH 2/4] [IMP] comments bzr revid: mat@openerp.com-20131104144427-oyca1g1ti583sq3c --- openerp/osv/orm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 4f5cf8946dd..d250588cede 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -5005,7 +5005,7 @@ class BaseModel(object): elif field_name in self._inherit_fields: trans_name = self._inherit_fields[field_name][0] + "," + field_name - # get the id of the inherit record + # get the id of the parent record to set the translation inherit_field_name = self._inherit_fields[field_name][1] res_id = self.read(cr, uid, [new_id], [inherit_field_name], context=context)[0][inherit_field_name][0] @@ -5019,6 +5019,7 @@ class BaseModel(object): records = trans_obj.read(cr, uid, trans_ids, context=context) for record in records: del record['id'] + # remove source to avoid triggering _set_src del record['source'] record.update({'res_id': res_id}) trans_obj.create(cr, uid, record, context=context) From 7e83c238444de4ab12ee1a2b785a0d2448f8cf03 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 4 Nov 2013 16:39:46 +0100 Subject: [PATCH 3/4] [ADD] base: tests for translations and duplication bzr revid: mat@openerp.com-20131104153946-vhpnbn8t1oxfaep1 --- openerp/addons/base/tests/test_base.py | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 345973526c5..d566ba9d1be 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -304,5 +304,47 @@ class test_partner_recursion(common.TransactionCase): cr, uid, p1, p2, p3 = self.cr, self.uid, self.p1, self.p2, self.p3 self.assertTrue(self.res_partner.write(cr, uid, [p1,p2,p3], {'phone': '123456'})) +class test_translation(common.TransactionCase): + + def setUp(self): + super(test_translation, self).setUp() + self.res_category = self.registry('res.partner.category') + self.ir_translation = self.registry('ir.translation') + cr, uid = self.cr, self.uid + self.registry('ir.translation').load(cr, ['base'], ['fr_BE']) + self.cat_id = self.res_category.create(cr, uid, {'name': 'Customers'}) + self.ir_translation.create(cr, uid, {'name': 'res.partner.category,name', 'module':'base', + 'value': 'Clients', 'res_id': self.cat_id, 'lang':'fr_BE', 'state':'translated', 'type': 'model'}) + + def test_101_create_translated_record(self): + cr, uid = self.cr, self.uid + + no_context_cat = self.res_category.browse(cr, uid, self.cat_id) + self.assertTrue(no_context_cat.name == 'Customers', "Error in basic name_get") + + fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_BE'}) + self.assertTrue(fr_context_cat.name == 'Clients', "Translation not found") + + def test_102_duplicate_record(self): + cr, uid = self.cr, self.uid + self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_BE'}) + + no_context_cat = self.res_category.browse(cr, uid, self.new_cat_id) + self.assertTrue(no_context_cat.name == 'Customers', "Duplication did not set untranslated value") + + fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_BE'}) + self.assertTrue(fr_context_cat.name == 'Clients', "Did not found translation for initial value") + + def test_103_duplicate_record_fr(self): + cr, uid = self.cr, self.uid + self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_BE'}) + + no_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id) + self.assertTrue(no_context_cat.name == 'Clients (copie)', "Duplication with default value not applied") + + fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_BE'}) + self.assertTrue(fr_context_cat.name == 'Clients', "Did not found translation for initial value") + + if __name__ == '__main__': unittest2.main() From 861fcbcd5092b9f862c3b9431ca910c42472bbc3 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Mon, 4 Nov 2013 17:17:20 +0100 Subject: [PATCH 4/4] [IMP] use assertEqual instead of assertTrue for better logging bzr revid: mat@openerp.com-20131104161720-2ofur11haask32ni --- openerp/addons/base/tests/test_base.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index d566ba9d1be..3a0131c2a05 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -320,30 +320,30 @@ class test_translation(common.TransactionCase): cr, uid = self.cr, self.uid no_context_cat = self.res_category.browse(cr, uid, self.cat_id) - self.assertTrue(no_context_cat.name == 'Customers', "Error in basic name_get") + self.assertEqual(no_context_cat.name, 'Customers', "Error in basic name_get") fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_BE'}) - self.assertTrue(fr_context_cat.name == 'Clients', "Translation not found") + self.assertEqual(fr_context_cat.name, 'Clients', "Translation not found") def test_102_duplicate_record(self): cr, uid = self.cr, self.uid self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_BE'}) no_context_cat = self.res_category.browse(cr, uid, self.new_cat_id) - self.assertTrue(no_context_cat.name == 'Customers', "Duplication did not set untranslated value") + self.assertEqual(no_context_cat.name, 'Customers', "Duplication did not set untranslated value") fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_BE'}) - self.assertTrue(fr_context_cat.name == 'Clients', "Did not found translation for initial value") + self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") def test_103_duplicate_record_fr(self): cr, uid = self.cr, self.uid self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_BE'}) no_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id) - self.assertTrue(no_context_cat.name == 'Clients (copie)', "Duplication with default value not applied") + self.assertEqual(no_context_cat.name, 'Clients (copie)', "Duplication with default value not applied") fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_BE'}) - self.assertTrue(fr_context_cat.name == 'Clients', "Did not found translation for initial value") + self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") if __name__ == '__main__':