From 54a621625f0c26d04bce73eefb5ad48445ab8de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mart=C3=ADn?= Date: Mon, 16 Apr 2018 09:46:25 +0200 Subject: [PATCH] =?UTF-8?q?[FIX][mass=5Fediting]=20v10=20Fixing=20error=20?= =?UTF-8?q?when=20removing=20value=20for=20fields=20being=E2=80=A6=20(#849?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FIX][mass_editing] v9 Fixing error when removing value for fields being translatable, as their translations were not removed. * Fixing travis errors * Adding contribution --- mass_editing/README.rst | 1 + mass_editing/__manifest__.py | 6 +- mass_editing/models/mass_object.py | 1 + mass_editing/tests/test_mass_editing.py | 76 +++++++++++++++++++--- mass_editing/wizard/mass_editing_wizard.py | 17 +++++ 5 files changed, 91 insertions(+), 10 deletions(-) diff --git a/mass_editing/README.rst b/mass_editing/README.rst index 8e6608601..e95a31721 100644 --- a/mass_editing/README.rst +++ b/mass_editing/README.rst @@ -92,6 +92,7 @@ Contributors * Oihane Crucelaegui * Serpent Consulting Services Pvt. Ltd. * Jairo Llopis +* Raul Martin Maintainer ---------- diff --git a/mass_editing/__manifest__.py b/mass_editing/__manifest__.py index 949e127f8..5a8bbfe28 100644 --- a/mass_editing/__manifest__.py +++ b/mass_editing/__manifest__.py @@ -6,18 +6,20 @@ 'version': '10.0.1.1.0', 'author': 'Serpent Consulting Services Pvt. Ltd., ' 'Tecnativa, ' + 'brain-tec AG, ' 'Odoo Community Association (OCA)', 'contributors': [ 'Oihane Crucelaegui ', 'Serpent Consulting Services Pvt. Ltd. ', - 'Jay Vora ' + 'Jay Vora ', + 'Raul Martin ', ], 'category': 'Tools', 'website': 'http://www.serpentcs.com', 'license': 'GPL-3 or any later version', 'summary': 'Mass Editing', 'uninstall_hook': 'uninstall_hook', - 'depends': ['base'], + 'depends': ['base', 'mail'], 'data': [ 'security/ir.model.access.csv', 'views/mass_editing_view.xml', diff --git a/mass_editing/models/mass_object.py b/mass_editing/models/mass_object.py index ddeba4d9e..81a0b6a08 100644 --- a/mass_editing/models/mass_object.py +++ b/mass_editing/models/mass_object.py @@ -91,6 +91,7 @@ class MassObject(models.Model): self.unlink_action() return super(MassObject, self).unlink() + @api.multi @api.returns('self', lambda value: value.id) def copy(self, default=None): if default is None: diff --git a/mass_editing/tests/test_mass_editing.py b/mass_editing/tests/test_mass_editing.py index c3555dc32..0f3527c0c 100644 --- a/mass_editing/tests/test_mass_editing.py +++ b/mass_editing/tests/test_mass_editing.py @@ -6,7 +6,7 @@ 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 @common.at_install(False) @@ -19,6 +19,9 @@ class TestMassEditing(common.TransactionCase): 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'] + self.partner = self._create_partner() self.partner_model = model_obj.\ search([('model', '=', 'res.partner')]) @@ -29,10 +32,22 @@ 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.""" categ_ids = self.env['res.partner.category'].search([]).ids @@ -41,7 +56,23 @@ 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') + + 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({ @@ -50,24 +81,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': u'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) @@ -91,6 +122,35 @@ class TestMassEditing(common.TransactionCase): self.assertTrue(self.user_model.id in model_list, 'Onchange model list must contains model_id.') + 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.') + + 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.') + + 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 bee0ab207..19386b3bd 100644 --- a/mass_editing/wizard/mass_editing_wizard.py +++ b/mass_editing/wizard/mass_editing_wizard.py @@ -237,6 +237,8 @@ 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 +247,21 @@ 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': values.update({split_key: [(5, 0, [])]}) elif val == 'add':