From 3969db1ec8c1b5acf2225185c628bfcce75e488b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mart=C3=ADn?= Date: Tue, 15 May 2018 21:28:39 +0200 Subject: [PATCH] [FIX] mass_editing: Fixing error when removing value for fields being translatable, as their translations were not removed. (#12) --- mass_editing/README.rst | 1 + mass_editing/tests/test_mass_editing.py | 74 +++++++++++++++++++--- mass_editing/wizard/mass_editing_wizard.py | 19 ++++++ 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/mass_editing/README.rst b/mass_editing/README.rst index f143176..559b736 100644 --- a/mass_editing/README.rst +++ b/mass_editing/README.rst @@ -84,6 +84,7 @@ Contributors * Jay Vora * Jairo Llopis * Juan Negrete +* Raul Martin Maintainer ---------- diff --git a/mass_editing/tests/test_mass_editing.py b/mass_editing/tests/test_mass_editing.py index 66f64d4..1528b78 100644 --- a/mass_editing/tests/test_mass_editing.py +++ b/mass_editing/tests/test_mass_editing.py @@ -5,17 +5,21 @@ import ast from odoo.tests import common from odoo.modules import registry -from odoo.addons.mass_editing.hooks import uninstall_hook +from ..hooks import uninstall_hook class TestMassEditing(common.TransactionCase): def setUp(self): super(TestMassEditing, self).setUp() + # Model connections model_obj = self.env['ir.model'] self.mass_wiz_obj = self.env['mass.editing.wizard'] self.mass_object_model = self.env['mass.object'] self.res_partner_model = self.env['res.partner'] + self.ir_translation_model = self.env['ir.translation'] + self.lang_model = self.env['res.lang'] + # Shared data for test methods self.partner = self._create_partner() self.partner_model = model_obj.\ search([('model', '=', 'res.partner')]) @@ -26,9 +30,21 @@ class TestMassEditing(common.TransactionCase): 'country_id', 'customer', 'child_ids', 'title'])]) self.mass = self._create_mass_editing(self.partner_model, - self.fields_model) + self.fields_model, + 'Partner') self.copy_mass = self.mass.copy() self.user = self._create_user() + self.res_partner_title_model = self.env['res.partner.title'] + self.partner_title = self._create_partner_title() + self.partner_title_model = model_obj.search( + [('model', '=', 'res.partner.title')]) + self.fields_partner_title_model = self.env['ir.model.fields'].search( + [('model_id', '=', self.partner_title_model.id), + ('name', 'in', ['abbreviation'])]) + self.mass_partner_title = self._create_mass_editing( + self.partner_title_model, + self.fields_partner_title_model, + 'Partner Title') def _create_partner(self): """Create a Partner.""" @@ -38,8 +54,25 @@ class TestMassEditing(common.TransactionCase): 'email': 'example@yourcompany.com', 'phone': 123456, 'category_id': [(6, 0, categ_ids)], + 'notify_email': 'always' }) + def _create_partner_title(self): + """Create a Partner Title.""" + # Loads German to work with translations + self.lang_model.load_lang('de_DE') + # Creating the title in English + partner_title = self.res_partner_title_model.create({ + 'name': 'Ambassador', + 'shortcut': 'Amb.', + }) + # Adding translated terms + ctx = {'lang': 'de_DE'} + partner_title.with_context(ctx).write({ + 'name': 'Botschafter', + 'shortcut': 'Bots.'}) + return partner_title + def _create_user(self): return self.env['res.users'].create({ 'name': 'Test User', @@ -47,24 +80,24 @@ class TestMassEditing(common.TransactionCase): 'email': 'test@test.com', }) - def _create_mass_editing(self, model, fields): + def _create_mass_editing(self, model, fields, model_name): """Create a Mass Editing with Partner as model and email field of partner.""" mass = self.mass_object_model.create({ - 'name': 'Mass Editing for Partner', + 'name': 'Mass Editing for {0}'.format(model_name), 'model_id': model.id, 'field_ids': [(6, 0, fields.ids)] }) mass.create_action() return mass - def _apply_action(self, partner, vals): + def _apply_action(self, obj, vals): """Create Wizard object to perform mass editing to REMOVE field's value.""" ctx = { - 'active_id': partner.id, - 'active_ids': partner.ids, - 'active_model': 'res.partner', + 'active_id': obj.id, + 'active_ids': obj.ids, + 'active_model': obj._name, } return self.mass_wiz_obj.with_context(ctx).create(vals) @@ -109,6 +142,31 @@ class TestMassEditing(common.TransactionCase): self.assertTrue(all([field in result for field in fields]), 'Read must return all fields.') + def test_mass_edit_partner_title(self): + """Test Case for MASS EDITING which will check if translation + was loaded for new partner title, and if they are removed + as well as the value for the abbreviation for the partner title.""" + search_domain = [('res_id', '=', self.partner_title.id), + ('type', '=', 'model'), + ('name', '=', 'res.partner.title,shortcut'), + ('lang', '=', 'de_DE')] + translation_ids = self.ir_translation_model.search(search_domain) + self.assertEqual(len(translation_ids), 1, + 'Translation for Partner Title\'s Abbreviation ' + 'was not loaded properly.') + # Removing partner title with mass edit action + vals = { + 'selection__shortcut': 'remove', + } + self._apply_action(self.partner_title, vals) + self.assertEqual(self.partner_title.shortcut, False, + 'Partner Title\'s Abbreviation should be removed.') + # Checking if translations were also removed + translation_ids = self.ir_translation_model.search(search_domain) + self.assertEqual(len(translation_ids), 0, + 'Translation for Partner Title\'s Abbreviation ' + 'was not removed properly.') + def test_mass_edit_email(self): """Test Case for MASS EDITING which will remove and after add Partner's email and will assert the same.""" diff --git a/mass_editing/wizard/mass_editing_wizard.py b/mass_editing/wizard/mass_editing_wizard.py index 7b95c39..991fe91 100644 --- a/mass_editing/wizard/mass_editing_wizard.py +++ b/mass_editing/wizard/mass_editing_wizard.py @@ -237,6 +237,9 @@ class MassEditingWizard(models.TransientModel): if (self._context.get('active_model') and self._context.get('active_ids')): model_obj = self.env[self._context.get('active_model')] + model_field_obj = self.env['ir.model.fields'] + translation_obj = self.env['ir.translation'] + values = {} for key, val in vals.items(): if key.startswith('selection_'): @@ -245,6 +248,22 @@ class MassEditingWizard(models.TransientModel): values.update({split_key: vals.get(split_key, False)}) elif val == 'remove': values.update({split_key: False}) + + # If field to remove is translatable, + # its translations have to be removed + model_field = model_field_obj.search([ + ('model', '=', self._context.get('active_model')), + ('name', '=', split_key)]) + if model_field and model_field.translate: + translation_ids = translation_obj.search([ + ('res_id', 'in', self._context.get( + 'active_ids')), + ('type', '=', 'model'), + ('name', '=', u"{0},{1}".format( + self._context.get('active_model'), + split_key))]) + translation_ids.unlink() + elif val == 'remove_m2m': m2m_list = [] if vals.get(split_key):