From 90754ab626ae2e9bfab6c622c40894731ad8b17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Mart=C3=ADn?= Date: Mon, 16 Apr 2018 13:47:43 +0200 Subject: [PATCH] =?UTF-8?q?[FIX][mass=5Fediting]=20v9=20Fixing=20error=20w?= =?UTF-8?q?hen=20removing=20value=20for=20fields=20being=E2=80=A6=20(#848)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mass_editing/README.rst | 1 + mass_editing/__openerp__.py | 2 + mass_editing/hooks.py | 2 +- mass_editing/tests/test_mass_editing.py | 76 +++++++++++++++++++--- mass_editing/wizard/mass_editing_wizard.py | 17 +++++ 5 files changed, 89 insertions(+), 9 deletions(-) diff --git a/mass_editing/README.rst b/mass_editing/README.rst index f498e3472..a5b4fd1b3 100644 --- a/mass_editing/README.rst +++ b/mass_editing/README.rst @@ -91,6 +91,7 @@ Contributors * Oihane Crucelaegui * Serpent Consulting Services Pvt. Ltd. +* Raul Martin Maintainer ---------- diff --git a/mass_editing/__openerp__.py b/mass_editing/__openerp__.py index 25676794b..87c6de509 100644 --- a/mass_editing/__openerp__.py +++ b/mass_editing/__openerp__.py @@ -5,10 +5,12 @@ 'name': 'Mass Editing', 'version': '9.0.1.0.0', 'author': 'Serpent Consulting Services Pvt. Ltd., ' + 'brain-tec AG, ' 'Odoo Community Association (OCA)', 'contributors': [ 'Oihane Crucelaegui ', 'Serpent Consulting Services Pvt. Ltd. ', + 'Raul Martin ', ], 'category': 'Tools', 'website': 'http://www.serpentcs.com', diff --git a/mass_editing/hooks.py b/mass_editing/hooks.py index 708c4e40e..86f2f953f 100644 --- a/mass_editing/hooks.py +++ b/mass_editing/hooks.py @@ -8,5 +8,5 @@ def uninstall_hook(cr, registry): WHERE res_model = 'mass.editing.wizard'""") for res in cr.dictfetchall(): value = 'ir.actions.act_window,%s' % res.get('id') - cr.execute("DELETE FROM ir_values WHERE value = '%s'" % value) + cr.execute("DELETE FROM ir_values WHERE value = %s", (value,)) return True diff --git a/mass_editing/tests/test_mass_editing.py b/mass_editing/tests/test_mass_editing.py index 7a737038f..766c80578 100644 --- a/mass_editing/tests/test_mass_editing.py +++ b/mass_editing/tests/test_mass_editing.py @@ -6,7 +6,7 @@ import ast from openerp.tests import common from openerp.modules import registry -from openerp.addons.mass_editing.hooks import uninstall_hook +from ..hooks import uninstall_hook class TestMassEditing(common.TransactionCase): @@ -17,6 +17,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')]) @@ -27,10 +30,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 @@ -39,7 +54,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({ @@ -48,24 +79,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) @@ -93,6 +124,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 c8bddcc91..61a20de0a 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':