From 35e0e853aaf9d1b97b1afba39953267690299897 Mon Sep 17 00:00:00 2001 From: "Jay Vora(SerpentCS)" Date: Wed, 15 Feb 2017 13:07:48 +0530 Subject: [PATCH 1/5] [MIG] Migrated the v10 for mass_editing --- mass_editing/README.rst | 6 +--- mass_editing/__init__.py | 2 +- mass_editing/__manifest__.py | 8 +++-- mass_editing/hooks.py | 6 ++-- mass_editing/models/__init__.py | 3 +- mass_editing/models/ir_model_fields.py | 23 ------------- mass_editing/models/mass_object.py | 39 +++++++++++----------- mass_editing/tests/__init__.py | 2 +- mass_editing/tests/test_mass_editing.py | 15 ++++----- mass_editing/views/mass_editing_view.xml | 38 +++++++++++---------- mass_editing/wizard/__init__.py | 2 +- mass_editing/wizard/mass_editing_wizard.py | 4 +-- 12 files changed, 61 insertions(+), 87 deletions(-) delete mode 100644 mass_editing/models/ir_model_fields.py diff --git a/mass_editing/README.rst b/mass_editing/README.rst index f498e3472d1..8ad27d91014 100644 --- a/mass_editing/README.rst +++ b/mass_editing/README.rst @@ -72,11 +72,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, -help us smashing it by providing a detailed and welcomed `feedback -`_. +help us smashing it by providing a detailed and welcomed feedback. Credits ======= diff --git a/mass_editing/__init__.py b/mass_editing/__init__.py index f232425491d..02cc62889d9 100644 --- a/mass_editing/__init__.py +++ b/mass_editing/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import models diff --git a/mass_editing/__manifest__.py b/mass_editing/__manifest__.py index 4cb5586a656..a32598cda82 100644 --- a/mass_editing/__manifest__.py +++ b/mass_editing/__manifest__.py @@ -1,14 +1,16 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + { 'name': 'Mass Editing', - 'version': '9.0.1.0.0', + 'version': '10.0.1.0.0', 'author': 'Serpent Consulting Services Pvt. Ltd., ' 'Odoo Community Association (OCA)', 'contributors': [ 'Oihane Crucelaegui ', 'Serpent Consulting Services Pvt. Ltd. ', + 'Jay Vora ' ], 'category': 'Tools', 'website': 'http://www.serpentcs.com', @@ -20,7 +22,7 @@ 'security/ir.model.access.csv', 'views/mass_editing_view.xml', ], - 'installable': False, + 'installable': True, 'application': False, 'auto_install': False, } diff --git a/mass_editing/hooks.py b/mass_editing/hooks.py index 708c4e40ea4..2460df7e529 100644 --- a/mass_editing/hooks.py +++ b/mass_editing/hooks.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). def uninstall_hook(cr, registry): @@ -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/models/__init__.py b/mass_editing/models/__init__.py index 28f986c917c..7bd9dc75c3a 100644 --- a/mass_editing/models/__init__.py +++ b/mass_editing/models/__init__.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from . import ir_model_fields from . import mass_object diff --git a/mass_editing/models/ir_model_fields.py b/mass_editing/models/ir_model_fields.py deleted file mode 100644 index fd4f1f24820..00000000000 --- a/mass_editing/models/ir_model_fields.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from openerp import api, models - - -class IrModelFields(models.Model): - _inherit = 'ir.model.fields' - - @api.model - def search(self, args, offset=0, limit=0, order=None, count=False): - model_domain = [] - for domain in args: - if (len(domain) > 2 and domain[0] == 'model_id' and - isinstance(domain[2], basestring)): - model_domain += [('model_id', 'in', - map(int, domain[2][1:-1].split(',')))] - else: - model_domain.append(domain) - return super(IrModelFields, self).search(model_domain, offset=offset, - limit=limit, order=order, - count=count) diff --git a/mass_editing/models/mass_object.py b/mass_editing/models/mass_object.py index 880702bf2ea..0318a06918d 100644 --- a/mass_editing/models/mass_object.py +++ b/mass_editing/models/mass_object.py @@ -1,16 +1,15 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp.exceptions import UserError -from openerp import api, fields, models, _ +from odoo import api, fields, models, _ class MassObject(models.Model): _name = "mass.object" _description = "Mass Editing Object" - name = fields.Char('Name', required=True, select=1) + name = fields.Char('Name', required=True, index=1) model_id = fields.Many2one('ir.model', 'Model', required=True, help="Model is used for Selecting Fields. " "This is editable until Sidebar menu " @@ -28,7 +27,8 @@ class MassObject(models.Model): readonly=True, help="Sidebar button to open " "the sidebar action.") - model_list = fields.Char('Model List') + model_ids = fields.Many2many('ir.model', 'mass_model_rel', + 'mass_id', 'model_id', 'Model List') _sql_constraints = [ ('name_uniq', 'unique (name)', _('Name must be unique!')), @@ -37,17 +37,17 @@ class MassObject(models.Model): @api.onchange('model_id') def _onchange_model_id(self): self.field_ids = [(6, 0, [])] - model_list = [] + model_ids = [] if self.model_id: model_obj = self.env['ir.model'] - model_list = [self.model_id.id] + model_ids = [self.model_id.id] active_model_obj = self.env[self.model_id.model] if active_model_obj._inherits: keys = active_model_obj._inherits.keys() - inherits_model_list = model_obj.search([('model', 'in', keys)]) - model_list.extend((inherits_model_list and - inherits_model_list.ids or [])) - self.model_list = model_list + inherits_model_ids = model_obj.search([('model', 'in', keys)]) + model_ids.extend((inherits_model_ids and + inherits_model_ids.ids or [])) + self.model_ids = [(6, 0, model_ids)] @api.multi def create_action(self): @@ -67,7 +67,9 @@ def create_action(self): 'target': 'new', 'auto_refresh': 1, }).id - vals['ref_ir_value_id'] = self.env['ir.values'].create({ + # We make sudo as any user with rights in this model should be able + # to create the action, not only admin + vals['ref_ir_value_id'] = self.env['ir.values'].sudo().create({ 'name': button_name, 'model': src_obj, 'key2': 'client_action_multi', @@ -79,14 +81,10 @@ def create_action(self): @api.multi def unlink_action(self): - for mass in self: - try: - if mass.ref_ir_act_window_id: - mass.ref_ir_act_window_id.unlink() - if mass.ref_ir_value_id: - mass.ref_ir_value_id.unlink() - except: - raise UserError(_("Deletion of the action record failed.")) + # We make sudo as any user with rights in this model should be able + # to delete the action, not only admin + self.mapped('ref_ir_act_window_id').sudo().unlink() + self.mapped('ref_ir_value_id').sudo().unlink() return True @api.multi @@ -94,6 +92,7 @@ def unlink(self): 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/__init__.py b/mass_editing/tests/__init__.py index 15099e10852..de6c4ce7cf1 100644 --- a/mass_editing/tests/__init__.py +++ b/mass_editing/tests/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import test_mass_editing diff --git a/mass_editing/tests/test_mass_editing.py b/mass_editing/tests/test_mass_editing.py index 518d6e2ecd8..0077b27a25f 100644 --- a/mass_editing/tests/test_mass_editing.py +++ b/mass_editing/tests/test_mass_editing.py @@ -1,12 +1,10 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import ast - -from openerp.tests import common -from openerp.modules import registry -from openerp.addons.mass_editing.hooks import uninstall_hook +from odoo.tests import common +from odoo.modules import registry +from odoo.addons.mass_editing.hooks import uninstall_hook class TestMassEditing(common.TransactionCase): @@ -85,9 +83,8 @@ def test_onchange_model(self): """Test whether onchange model_id returns model_id in list""" new_mass = self.mass_object_model.new({'model_id': self.user_model.id}) new_mass._onchange_model_id() - model_list = ast.literal_eval(new_mass.model_list) - self.assertTrue(self.user_model.id in model_list, - 'Onchange model list must contains model_id.') + self.assertTrue(self.user_model.id in new_mass.model_ids.ids, + 'Onchange model ids must contains model_id.') def test_mass_edit_email(self): """Test Case for MASS EDITING which will remove and after add diff --git a/mass_editing/views/mass_editing_view.xml b/mass_editing/views/mass_editing_view.xml index 119ca5af8a7..af9e1065629 100644 --- a/mass_editing/views/mass_editing_view.xml +++ b/mass_editing/views/mass_editing_view.xml @@ -6,6 +6,23 @@ mass.object
+
+
- -
+ domain="[('ttype', 'not in', ['refenrence', 'function']), ('model_id', 'in', model_ids)]"/> diff --git a/mass_editing/wizard/__init__.py b/mass_editing/wizard/__init__.py index ecfaa57ed5e..2429cbd9a36 100644 --- a/mass_editing/wizard/__init__.py +++ b/mass_editing/wizard/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import mass_editing_wizard diff --git a/mass_editing/wizard/mass_editing_wizard.py b/mass_editing/wizard/mass_editing_wizard.py index 845630708cf..4062701fc88 100644 --- a/mass_editing/wizard/mass_editing_wizard.py +++ b/mass_editing/wizard/mass_editing_wizard.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- -# © 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) +# Copyright 2016 Serpent Consulting Services Pvt. Ltd. (support@serpentcs.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from lxml import etree import openerp.tools as tools -from openerp import api, models +from odoo import api, models class MassEditingWizard(models.TransientModel): From 294bb409251de8c961f478d1743a7bf89b4520ad Mon Sep 17 00:00:00 2001 From: HNR Date: Wed, 6 Jan 2016 14:49:36 -0500 Subject: [PATCH 2/5] [8.0] [REM] mass_editing: Removes hack around ir.model.fields search. As commented by @StefanRijnhart, this is no longer needed after 4442424: > This hack in the model's search method allowed for a domain containing a stringified list of ids. It has been obsolete since 4442424, and can safely be removed (i.e. remove the whole file). Closes #638. From 6c00dc29ed989cbcce43f8cb7fbaffb8bede86ea Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Wed, 8 May 2013 08:41:12 -0400 Subject: [PATCH 3/5] [ENH] Transformed mass.object's model_list char field into a proper m2m field. From a41374f75e35a6756b93c370d9bd3cb0f46ff7be Mon Sep 17 00:00:00 2001 From: "Jay Vora(SerpentCS)" Date: Thu, 16 Feb 2017 11:46:05 +0530 Subject: [PATCH 4/5] [FIX] Domain fixture --- mass_editing/models/mass_object.py | 10 ++++++++++ mass_editing/views/mass_editing_view.xml | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mass_editing/models/mass_object.py b/mass_editing/models/mass_object.py index 0318a06918d..1117e198db8 100644 --- a/mass_editing/models/mass_object.py +++ b/mass_editing/models/mass_object.py @@ -5,6 +5,16 @@ from odoo import api, fields, models, _ +class Fields(models.Model): + _inherit = 'ir.model.fields' + + @api.model + def search(self, args, offset=0, limit=0, order=None, count=False): + print args + return super(Fields, self).search(args, offset=offset, + limit=limit, order=order, + count=count) + class MassObject(models.Model): _name = "mass.object" _description = "Mass Editing Object" diff --git a/mass_editing/views/mass_editing_view.xml b/mass_editing/views/mass_editing_view.xml index af9e1065629..fcb61c1e943 100644 --- a/mass_editing/views/mass_editing_view.xml +++ b/mass_editing/views/mass_editing_view.xml @@ -45,7 +45,7 @@ + domain="[('ttype', 'not in', ['reference', 'function']), ('model_id', 'in', model_ids and model_ids[0][2] or [])]"/> From 1ca2d422209800761d1bc8d4574feeb18556a92d Mon Sep 17 00:00:00 2001 From: Serpent Consulting Services Pvt Ltd Date: Thu, 16 Feb 2017 15:34:41 +0530 Subject: [PATCH 5/5] Update mass_object.py --- mass_editing/models/mass_object.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/mass_editing/models/mass_object.py b/mass_editing/models/mass_object.py index 1117e198db8..0318a06918d 100644 --- a/mass_editing/models/mass_object.py +++ b/mass_editing/models/mass_object.py @@ -5,16 +5,6 @@ from odoo import api, fields, models, _ -class Fields(models.Model): - _inherit = 'ir.model.fields' - - @api.model - def search(self, args, offset=0, limit=0, order=None, count=False): - print args - return super(Fields, self).search(args, offset=offset, - limit=limit, order=order, - count=count) - class MassObject(models.Model): _name = "mass.object" _description = "Mass Editing Object"