diff --git a/odoo/addons/base/data/ir_demo_failure_data.xml b/odoo/addons/base/data/ir_demo_failure_data.xml index c3afb3f1f9a..7059ad6310c 100644 --- a/odoo/addons/base/data/ir_demo_failure_data.xml +++ b/odoo/addons/base/data/ir_demo_failure_data.xml @@ -8,7 +8,7 @@ failures = env['ir.demo_failure'].search([ ('wizard_id', '=', False), ]) record = model.create({ - 'failure_ids': [(6, 0, failures.ids)], + 'failure_ids': [Command.set(failures.ids)], }) action = { 'type': 'ir.actions.act_window', diff --git a/odoo/addons/base/data/res_country_data.xml b/odoo/addons/base/data/res_country_data.xml index 44bb42a51b3..dcb988affe4 100644 --- a/odoo/addons/base/data/res_country_data.xml +++ b/odoo/addons/base/data/res_country_data.xml @@ -1590,7 +1590,7 @@ Europe - South America - @@ -1609,7 +1609,7 @@ SEPA Countries - Wood Corner - + 1 1839 Arbor Way Turlock @@ -58,7 +58,7 @@ Deco Addict - + 1 77 Santa Barbara Rd Pleasant Hill @@ -72,7 +72,7 @@ Gemini Furniture - + 1 317 Fairchild Dr Fairfield @@ -87,7 +87,7 @@ Ready Mat - + 1 7500 W Linne Road Tracy @@ -115,7 +115,7 @@ Azure Interior - + 1 4557 De Silva St Fremont diff --git a/odoo/addons/base/data/res_users_data.xml b/odoo/addons/base/data/res_users_data.xml index dd1b504ff32..88e595e6f88 100644 --- a/odoo/addons/base/data/res_users_data.xml +++ b/odoo/addons/base/data/res_users_data.xml @@ -5,7 +5,7 @@ - + root@example.com --
System]]>
@@ -17,8 +17,8 @@ System]]>
admin - - + + --
Administrator]]>
@@ -36,7 +36,7 @@ Administrator]]>
public - + diff --git a/odoo/addons/base/data/res_users_demo.xml b/odoo/addons/base/data/res_users_demo.xml index 4d3a65721de..e94bd206fce 100644 --- a/odoo/addons/base/data/res_users_demo.xml +++ b/odoo/addons/base/data/res_users_demo.xml @@ -35,7 +35,7 @@ demo --
+Mr Demo
- +
@@ -77,11 +77,11 @@ portal portal --
Mr Demo Portal]]>
- +
- + diff --git a/odoo/addons/base/models/ir_actions.py b/odoo/addons/base/models/ir_actions.py index 170ff2f374b..8b53937b43d 100644 --- a/odoo/addons/base/models/ir_actions.py +++ b/odoo/addons/base/models/ir_actions.py @@ -524,7 +524,7 @@ class IrActionsServer(models.Model): if self.link_field_id: record = self.env[self.model_id.model].browse(self._context.get('active_id')) if self.link_field_id.ttype in ['one2many', 'many2many']: - record.write({self.link_field_id.name: [(4, res.id)]}) + record.write({self.link_field_id.name: [Command.link(res.id)]}) else: record.write({self.link_field_id.name: res.id}) diff --git a/odoo/addons/base/models/ir_fields.py b/odoo/addons/base/models/ir_fields.py index ad0b00fe2cf..7c34828de29 100644 --- a/odoo/addons/base/models/ir_fields.py +++ b/odoo/addons/base/models/ir_fields.py @@ -7,7 +7,7 @@ import itertools import psycopg2 import pytz -from odoo import api, fields, models, _ +from odoo import api, Command, fields, models, _ from odoo.tools import ustr REFERENCING_FIELDS = {None, 'id', '.id'} @@ -16,13 +16,6 @@ def only_ref_fields(record): def exclude_ref_fields(record): return {k: v for k, v in record.items() if k not in REFERENCING_FIELDS} -CREATE = lambda values: (0, False, values) -UPDATE = lambda id, values: (1, id, values) -DELETE = lambda id: (2, id, False) -FORGET = lambda id: (3, id, False) -LINK_TO = lambda id: (4, id, False) -DELETE_ALL = lambda: (5, False, False) -REPLACE_WITH = lambda ids: (6, False, ids) class ImportWarning(Warning): """ Used to send warnings upwards the stack during the import process """ @@ -433,9 +426,9 @@ class IrFieldsConverter(models.AbstractModel): warnings.extend(ws) if self._context.get('update_many2many'): - return [LINK_TO(id) for id in ids], warnings + return [Command.link(id) for id in ids], warnings else: - return [REPLACE_WITH(ids)], warnings + return [Command.set(ids)], warnings @api.model def _str_to_one2many(self, model, field, records): @@ -485,10 +478,10 @@ class IrFieldsConverter(models.AbstractModel): writable['id'] = record['id'] if id: - commands.append(LINK_TO(id)) - commands.append(UPDATE(id, writable)) + commands.append(Command.link(id)) + commands.append(Command.update(id, writable)) else: - commands.append(CREATE(writable)) + commands.append(Command.create(writable)) return commands, warnings diff --git a/odoo/addons/base/models/ir_model.py b/odoo/addons/base/models/ir_model.py index 1b5ea5e7794..7f22c8bf439 100644 --- a/odoo/addons/base/models/ir_model.py +++ b/odoo/addons/base/models/ir_model.py @@ -10,7 +10,7 @@ from operator import itemgetter from psycopg2 import sql -from odoo import api, fields, models, tools, _ +from odoo import api, fields, models, tools, _, Command from odoo.exceptions import AccessError, UserError, ValidationError from odoo.osv import expression from odoo.tools import pycompat, unique @@ -150,7 +150,7 @@ class IrModel(models.Model): def _default_field_id(self): if self.env.context.get('install_mode'): return [] # no default field when importing - return [(0, 0, {'name': 'x_name', 'field_description': 'Name', 'ttype': 'char', 'copied': True})] + return [Command.create({'name': 'x_name', 'field_description': 'Name', 'ttype': 'char', 'copied': True})] name = fields.Char(string='Model Description', translate=True, required=True) model = fields.Char(default='x_', required=True, index=True) diff --git a/odoo/addons/base/models/res_company.py b/odoo/addons/base/models/res_company.py index 9c3677c53ed..a63458508b8 100644 --- a/odoo/addons/base/models/res_company.py +++ b/odoo/addons/base/models/res_company.py @@ -7,7 +7,7 @@ import logging import os import re -from odoo import api, fields, models, tools, _ +from odoo import api, fields, models, tools, _, Command from odoo.exceptions import ValidationError, UserError from odoo.modules.module import get_resource_path @@ -213,7 +213,7 @@ class Company(models.Model): self.clear_caches() company = super(Company, self).create(vals) # The write is made on the user to set it automatically in the multi company group. - self.env.user.write({'company_ids': [(4, company.id)]}) + self.env.user.write({'company_ids': [Command.link(company.id)]}) # Make sure that the selected currency is enabled if vals.get('currency_id'): diff --git a/odoo/addons/base/models/res_config.py b/odoo/addons/base/models/res_config.py index fd9ddec2693..d0443942ed3 100644 --- a/odoo/addons/base/models/res_config.py +++ b/odoo/addons/base/models/res_config.py @@ -6,7 +6,7 @@ import re from lxml import etree -from odoo import api, models, _ +from odoo import api, models, _, Command from odoo.exceptions import AccessError, RedirectWarning, UserError from odoo.tools import ustr @@ -577,10 +577,10 @@ class ResConfigSettings(models.TransientModel, ResConfigModuleInstallationMixin) if self[name] == current_settings[name]: continue if int(self[name]): - groups.write({'implied_ids': [(4, implied_group.id)]}) + groups.write({'implied_ids': [Command.link(implied_group.id)]}) else: - groups.write({'implied_ids': [(3, implied_group.id)]}) - implied_group.write({'users': [(3, user.id) for user in groups.users]}) + groups.write({'implied_ids': [Command.unlink(implied_group.id)]}) + implied_group.write({'users': [Command.unlink(user.id) for user in groups.users]}) # config fields: store ir.config_parameters IrConfigParameter = self.env['ir.config_parameter'].sudo() diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index b93bca5426b..c1cc1d04570 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -14,7 +14,7 @@ from lxml import etree from random import randint from werkzeug import urls -from odoo import api, fields, models, tools, SUPERUSER_ID, _ +from odoo import api, fields, models, tools, SUPERUSER_ID, _, Command from odoo.modules import get_module_resource from odoo.osv.expression import get_unaccent_wrapper from odoo.exceptions import UserError, ValidationError @@ -404,7 +404,7 @@ class Partner(models.Model): elif field.type == 'one2many': raise AssertionError(_('One2Many fields cannot be synchronized as part of `commercial_fields` or `address fields`')) elif field.type == 'many2many': - values[fname] = [(6, 0, self[fname].ids)] + values[fname] = [Command.set(self[fname].ids)] else: values[fname] = self[fname] return values @@ -616,7 +616,7 @@ class Partner(models.Model): # Set new company as my parent self.write({ 'parent_id': new_company.id, - 'child_ids': [(1, partner_id, dict(parent_id=new_company.id)) for partner_id in self.child_ids.ids] + 'child_ids': [Command.update(partner_id, dict(parent_id=new_company.id)) for partner_id in self.child_ids.ids] }) return True diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index a3baf47c615..32a591b6c77 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -22,7 +22,7 @@ import pytz from lxml import etree from lxml.builder import E -from odoo import api, fields, models, tools, SUPERUSER_ID, _ +from odoo import api, fields, models, tools, SUPERUSER_ID, _, Command from odoo.addons.base.models.ir_model import MODULE_UNINSTALL_FLAG from odoo.exceptions import AccessDenied, AccessError, UserError, ValidationError from odoo.http import request @@ -78,11 +78,11 @@ def parse_m2m(commands): ids = [] for command in commands: if isinstance(command, (tuple, list)): - if command[0] in (1, 4): + if command[0] in (Command.UPDATE, Command.LINK): ids.append(command[1]) - elif command[0] == 5: + elif command[0] == Command.CLEAR: ids = [] - elif command[0] == 6: + elif command[0] == Command.SET: ids = list(command[2]) else: ids.append(command) @@ -1086,10 +1086,10 @@ class UsersImplied(models.Model): if not user.has_group('base.group_user') and user in users_before: # if we demoted a user, we strip him of all its previous privileges # (but we should not do it if we are simply adding a technical group to a portal user) - vals = {'groups_id': [(5, 0, 0)] + values['groups_id']} + vals = {'groups_id': [Command.clear()] + values['groups_id']} super(UsersImplied, user).write(vals) gs = set(concat(g.trans_implied_ids for g in user.groups_id)) - vals = {'groups_id': [(4, g.id) for g in gs]} + vals = {'groups_id': [Command.link(g.id) for g in gs]} super(UsersImplied, user).write(vals) return res @@ -1324,9 +1324,9 @@ class UsersView(models.Model): if group_multi_company_id: for user in users: if len(user.company_ids) <= 1 and group_multi_company_id in user.groups_id.ids: - user.write({'groups_id': [(3, group_multi_company_id)]}) + user.write({'groups_id': [Command.unlink(group_multi_company_id)]}) elif len(user.company_ids) > 1 and group_multi_company_id not in user.groups_id.ids: - user.write({'groups_id': [(4, group_multi_company_id)]}) + user.write({'groups_id': [Command.link(group_multi_company_id)]}) return users def write(self, values): @@ -1338,9 +1338,9 @@ class UsersView(models.Model): if group_multi_company: for user in self: if len(user.company_ids) <= 1 and user.id in group_multi_company.users.ids: - user.write({'groups_id': [(3, group_multi_company.id)]}) + user.write({'groups_id': [Command.unlink(group_multi_company.id)]}) elif len(user.company_ids) > 1 and user.id not in group_multi_company.users.ids: - user.write({'groups_id': [(4, group_multi_company.id)]}) + user.write({'groups_id': [Command.link(group_multi_company.id)]}) return res @api.model @@ -1350,9 +1350,9 @@ class UsersView(models.Model): group_multi_company = self.env.ref('base.group_multi_company', False) if group_multi_company and 'company_ids' in values: if len(user.company_ids) <= 1 and user.id in group_multi_company.users.ids: - user.update({'groups_id': [(3, group_multi_company.id)]}) + user.update({'groups_id': [Command.unlink(group_multi_company.id)]}) elif len(user.company_ids) > 1 and user.id not in group_multi_company.users.ids: - user.update({'groups_id': [(4, group_multi_company.id)]}) + user.update({'groups_id': [Command.link(group_multi_company.id)]}) return user def _remove_reified_groups(self, values): @@ -1509,7 +1509,7 @@ class ChangePasswordWizard(models.TransientModel): def _default_user_ids(self): user_ids = self._context.get('active_model') == 'res.users' and self._context.get('active_ids') or [] return [ - (0, 0, {'user_id': user.id, 'user_login': user.login}) + Command.create({'user_id': user.id, 'user_login': user.login}) for user in self.env['res.users'].browse(user_ids) ] diff --git a/odoo/addons/base/populate/res_company.py b/odoo/addons/base/populate/res_company.py index b32588f5681..675e3e89f42 100644 --- a/odoo/addons/base/populate/res_company.py +++ b/odoo/addons/base/populate/res_company.py @@ -1,7 +1,7 @@ import collections import logging -from odoo import models +from odoo import models, Command from odoo.tools import populate _logger = logging.getLogger(__name__) @@ -35,5 +35,5 @@ class Partner(models.Model): def _populate(self, size): records = super()._populate(size) - self.env.ref('base.user_admin').write({'company_ids': [(4, rec.id) for rec in records]}) # add all created companies on user admin + self.env.ref('base.user_admin').write({'company_ids': [Command.link(rec.id) for rec in records]}) # add all created companies on user admin return records diff --git a/odoo/addons/base/security/base_groups.xml b/odoo/addons/base/security/base_groups.xml index 5d184c0564d..73b2580a54b 100644 --- a/odoo/addons/base/security/base_groups.xml +++ b/odoo/addons/base/security/base_groups.xml @@ -13,8 +13,8 @@ Settings - - + + @@ -22,7 +22,7 @@ - + @@ -39,20 +39,20 @@ Access to export feature - + - - + + Contact Creation - + - + @@ -83,7 +83,7 @@ Portal User Template portaltemplate - + diff --git a/odoo/addons/base/security/base_security.xml b/odoo/addons/base/security/base_security.xml index 3f36e7b17ee..cadeb34bec6 100644 --- a/odoo/addons/base/security/base_security.xml +++ b/odoo/addons/base/security/base_security.xml @@ -27,7 +27,7 @@ res_partner: portal/public: read access on my commercial partner [('id', 'child_of', user.commercial_partner_id.id)] - + @@ -37,7 +37,7 @@ Defaults: alter personal defaults [('user_id','=',user.id)] - + @@ -45,7 +45,7 @@ Defaults: alter all defaults [(1,'=',1)] - +
@@ -82,7 +82,7 @@ ['|', ('type', '!=', 'private'), ('type', '=', False)]
@@ -97,7 +97,7 @@ [('type', '=', 'private')] @@ -110,7 +110,7 @@ ir.filters.admin.all.rights [(1, '=', 1)] - + @@ -121,7 +121,7 @@ ir.filters.owner [('user_id','in',[False,user.id])] - +
@@ -129,7 +129,7 @@ ir.filters.own.rule.delete [('user_id', '=', user.id)] - + @@ -139,7 +139,7 @@ ir.filter: portal/public [('user_id', '=', user.id)] - +
@@ -147,28 +147,28 @@ company rule portal - + [('id','in', company_ids)] company rule employee - + [('id','in', company_ids)] company rule public - + [('id','in', company_ids)] company rule erp manager - + [(1,'=',1)] @@ -191,22 +191,22 @@ Public users can't interact with keys at all [(0, '=', 1)] - + Users can read and delete their own keys [('user_id', '=', user.id)] Administrators can view user keys to revoke them [(1, '=', 1)] - + diff --git a/odoo/addons/base/tests/common.py b/odoo/addons/base/tests/common.py index 36ab987d8bd..0cc292ae59a 100644 --- a/odoo/addons/base/tests/common.py +++ b/odoo/addons/base/tests/common.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.tests.common import TransactionCase, HttpCase +from odoo import Command class TransactionCaseWithUserDemo(TransactionCase): @@ -24,7 +25,7 @@ class TransactionCaseWithUserDemo(TransactionCase): 'login': 'demo', 'password': 'demo', 'partner_id': self.partner_demo.id, - 'groups_id': [(6, 0, [self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], + 'groups_id': [Command.set([self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], }) @@ -48,7 +49,7 @@ class HttpCaseWithUserDemo(HttpCase): 'login': 'demo', 'password': 'demo', 'partner_id': self.partner_demo.id, - 'groups_id': [(6, 0, [self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], + 'groups_id': [Command.set([self.env.ref('base.group_user').id, self.env.ref('base.group_partner_manager').id])], }) @@ -71,7 +72,7 @@ class SavepointCaseWithUserDemo(TransactionCase): 'login': 'demo', 'password': 'demo', 'partner_id': cls.partner_demo.id, - 'groups_id': [(6, 0, [cls.env.ref('base.group_user').id, cls.env.ref('base.group_partner_manager').id])], + 'groups_id': [Command.set([cls.env.ref('base.group_user').id, cls.env.ref('base.group_partner_manager').id])], }) @classmethod @@ -94,78 +95,78 @@ class SavepointCaseWithUserDemo(TransactionCase): { 'name': 'Inner Works', # Wood Corner 'state_id': cls.env.ref('base.state_us_1').id, - 'category_id': [(6, 0, [cls.partner_category_child_1.id, cls.partner_category_child_2.id,])], - 'child_ids': [(0, 0, { + 'category_id': [Command.set([cls.partner_category_child_1.id, cls.partner_category_child_2.id,])], + 'child_ids': [Command.create({ 'name': 'Sheila Ruiz', # 'Willie Burke', - }), (0, 0, { + }), Command.create({ 'name': 'Wyatt Howard', # 'Ron Gibson', - }), (0, 0, { + }), Command.create({ 'name': 'Austin Kennedy', # Tom Ruiz })], }, { 'name': 'Pepper Street', # 'Deco Addict', 'state_id': cls.env.ref('base.state_us_2').id, - 'child_ids': [(0, 0, { + 'child_ids': [Command.create({ 'name': 'Liam King', # 'Douglas Fletcher', - }), (0, 0, { + }), Command.create({ 'name': 'Craig Richardson', # 'Floyd Steward', - }), (0, 0, { + }), Command.create({ 'name': 'Adam Cox', # 'Addison Olson', })], }, { 'name': 'AnalytIQ', #'Gemini Furniture', 'state_id': cls.env.ref('base.state_us_3').id, - 'child_ids': [(0, 0, { + 'child_ids': [Command.create({ 'name': 'Pedro Boyd', # Edwin Hansen - }), (0, 0, { + }), Command.create({ 'name': 'Landon Roberts', # 'Jesse Brown', 'company_id': cls.env.ref('base.main_company').id, - }), (0, 0, { + }), Command.create({ 'name': 'Leona Shelton', # 'Soham Palmer', - }), (0, 0, { + }), Command.create({ 'name': 'Scott Kim', # 'Oscar Morgan', })], }, { 'name': 'Urban Trends', # 'Ready Mat', 'state_id': cls.env.ref('base.state_us_4').id, - 'category_id': [(6, 0, [cls.partner_category_child_1.id, cls.partner_category_child_2.id,])], - 'child_ids': [(0, 0, { + 'category_id': [Command.set([cls.partner_category_child_1.id, cls.partner_category_child_2.id,])], + 'child_ids': [Command.create({ 'name': 'Louella Jacobs', # 'Billy Fox', - }), (0, 0, { + }), Command.create({ 'name': 'Albert Alexander', # 'Kim Snyder', - }), (0, 0, { + }), Command.create({ 'name': 'Brad Castillo', # 'Edith Sanchez', - }), (0, 0, { + }), Command.create({ 'name': 'Sophie Montgomery', # 'Sandra Neal', - }), (0, 0, { + }), Command.create({ 'name': 'Chloe Bates', # 'Julie Richards', - }), (0, 0, { + }), Command.create({ 'name': 'Mason Crawford', # 'Travis Mendoza', - }), (0, 0, { + }), Command.create({ 'name': 'Elsie Kennedy', # 'Theodore Gardner', })], }, { 'name': 'Ctrl-Alt-Fix', # 'The Jackson Group', 'state_id': cls.env.ref('base.state_us_5').id, - 'child_ids': [(0, 0, { + 'child_ids': [Command.create({ 'name': 'carole miller', # 'Toni Rhodes', - }), (0, 0, { + }), Command.create({ 'name': 'Cecil Holmes', # 'Gordon Owens', })], }, { 'name': 'Ignitive Labs', # 'Azure Interior', 'state_id': cls.env.ref('base.state_us_6').id, - 'child_ids': [(0, 0, { + 'child_ids': [Command.create({ 'name': 'Jonathan Webb', # 'Brandon Freeman', - }), (0, 0, { + }), Command.create({ 'name': 'Clinton Clark', # 'Nicole Ford', - }), (0, 0, { + }), Command.create({ 'name': 'Howard Bryant', # 'Colleen Diaz', })], }, { 'name': 'Amber & Forge', # 'Lumber Inc', 'state_id': cls.env.ref('base.state_us_7').id, - 'child_ids': [(0, 0, { + 'child_ids': [Command.create({ 'name': 'Mark Webb', # 'Lorraine Douglas', })], }, { @@ -194,5 +195,5 @@ class HttpCaseWithUserPortal(HttpCase): 'login': 'portal', 'password': 'portal', 'partner_id': self.partner_portal.id, - 'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])], + 'groups_id': [Command.set([self.env.ref('base.group_portal').id])], }) diff --git a/odoo/addons/base/tests/test_acl.py b/odoo/addons/base/tests/test_acl.py index fec7fda8ed5..0f7f38f1c5e 100644 --- a/odoo/addons/base/tests/test_acl.py +++ b/odoo/addons/base/tests/test_acl.py @@ -7,6 +7,7 @@ from odoo.exceptions import AccessError from odoo.addons.base.tests.common import TransactionCaseWithUserDemo from odoo.tests.common import TransactionCase from odoo.tools.misc import mute_logger +from odoo import Command # test group that demo user should not have GROUP_SYSTEM = 'base.group_system' @@ -179,7 +180,7 @@ class TestIrRule(TransactionCaseWithUserDemo): 'name': 'test_rule1', 'model_id': model_res_partner.id, 'domain_force': False, - 'groups': [(6, 0, group_user.ids)], + 'groups': [Command.set(group_user.ids)], }) # read as demo user the partners (one blank domain) @@ -202,7 +203,7 @@ class TestIrRule(TransactionCaseWithUserDemo): 'name': 'test_rule2', 'model_id': model_res_partner.id, 'domain_force': False, - 'groups': [(6, 0, group_user.ids)], + 'groups': [Command.set(group_user.ids)], }) # read as demo user with domains [] and blank @@ -224,7 +225,7 @@ class TestIrRule(TransactionCaseWithUserDemo): 'name': 'test_rule3', 'model_id': model_res_partner.id, 'domain_force': False, - 'groups': [(6, 0, group_user.ids)], + 'groups': [Command.set(group_user.ids)], }) # read the partners as demo user @@ -257,7 +258,7 @@ class TestIrRule(TransactionCaseWithUserDemo): # create a new group with demo user in it, and a complex rule group_test = self.env['res.groups'].create({ 'name': 'Test Group', - 'users': [(6, 0, self.user_demo.ids)], + 'users': [Command.set(self.user_demo.ids)], }) # add the rule to the new group, with a domain containing an implicit @@ -265,7 +266,7 @@ class TestIrRule(TransactionCaseWithUserDemo): # normalized before combining it rule3.write({ 'domain_force': "[('name','!=',False),('id','!=',False)]", - 'groups': [(6, 0, group_test.ids)], + 'groups': [Command.set(group_test.ids)], }) # read the partners again as demo user, which should give results diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py index 149e7b3a261..ea8b614cdfd 100644 --- a/odoo/addons/base/tests/test_api.py +++ b/odoo/addons/base/tests/test_api.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import models +from odoo import models, Command from odoo.addons.base.tests.common import SavepointCaseWithUserDemo from odoo.tools import mute_logger from odoo.exceptions import AccessError @@ -205,7 +205,7 @@ class TestAPI(SavepointCaseWithUserDemo): demo_partner.company_id.write({'name': 'Pricks'}) # remove demo user from all groups - demo.write({'groups_id': [(5,)]}) + demo.write({'groups_id': [Command.clear()]}) # demo user can no longer access partner data with self.assertRaises(AccessError): @@ -224,7 +224,7 @@ class TestAPI(SavepointCaseWithUserDemo): for p in data: pids.append(Partners.create({ 'name': p, - 'child_ids': [(0, 0, {'name': c}) for c in data[p]], + 'child_ids': [Command.create({'name': c}) for c in data[p]], }).id) partners = Partners.search([('id', 'in', pids)]) @@ -270,7 +270,7 @@ class TestAPI(SavepointCaseWithUserDemo): partner.country_id, partner.child_ids data = partner._convert_to_write(partner._cache) self.assertEqual(data['country_id'], partner.country_id.id) - self.assertEqual(data['child_ids'], [(6, 0, partner.child_ids.ids)]) + self.assertEqual(data['child_ids'], [Command.set(partner.child_ids.ids)]) @mute_logger('odoo.models') def test_60_prefetch(self): @@ -344,8 +344,8 @@ class TestAPI(SavepointCaseWithUserDemo): vals1 = { 'name': 'Non-empty relational fields', 'country_id': self.ref('base.be'), - 'bank_ids': [(0, 0, {'acc_number': 'FOO42'})], - 'category_id': [(4, self.partner_category.id)], + 'bank_ids': [Command.create({'acc_number': 'FOO42'})], + 'category_id': [Command.link(self.partner_category.id)], } partners = partners.create(vals0) + partners.create(vals1) for partner in partners: diff --git a/odoo/addons/base/tests/test_base.py b/odoo/addons/base/tests/test_base.py index eef6c749095..c1b7883df1b 100644 --- a/odoo/addons/base/tests/test_base.py +++ b/odoo/addons/base/tests/test_base.py @@ -3,7 +3,7 @@ import ast -from odoo import SUPERUSER_ID +from odoo import SUPERUSER_ID, Command from odoo.exceptions import UserError, ValidationError from odoo.tests.common import TransactionCase, BaseCase from odoo.tools import mute_logger @@ -366,8 +366,8 @@ class TestBase(TransactionCase): 'phone': '1122334455', 'email': 'info@sunhelm.com', 'vat': 'BE0477472701', - 'child_ids': [(4, p0.id), - (0, 0, {'name': 'Alrik Greenthorn', + 'child_ids': [Command.link(p0.id), + Command.create({'name': 'Alrik Greenthorn', 'email': 'agr@sunhelm.com'})]}) p1 = res_partner.create({'name': 'Otto Blackwood', 'email': 'otto.blackwood@sunhelm.com', @@ -376,7 +376,7 @@ class TestBase(TransactionCase): 'email': 'ggr@sunhelm.com', 'parent_id': p1.id}) p2 = res_partner.search([('email', '=', 'agr@sunhelm.com')], limit=1) - sunhelm.write({'child_ids': [(0, 0, {'name': 'Ulrik Greenthorn', + sunhelm.write({'child_ids': [Command.create({'name': 'Ulrik Greenthorn', 'email': 'ugr@sunhelm.com'})]}) p3 = res_partner.search([('email', '=', 'ugr@sunhelm.com')], limit=1) @@ -554,8 +554,8 @@ class TestPartnerRecursion(TransactionCase): """ Indirect hacky write to create cycle in children """ p3b = self.p1.create({'name': 'Elmtree Grand-Child 1.2', 'parent_id': self.p2.id}) with self.assertRaises(ValidationError): - self.p2.write({'child_ids': [(1, self.p3.id, {'parent_id': p3b.id}), - (1, p3b.id, {'parent_id': self.p3.id})]}) + self.p2.write({'child_ids': [Command.update(self.p3.id, {'parent_id': p3b.id}), + Command.update(p3b.id, {'parent_id': self.p3.id})]}) def test_110_res_partner_recursion_multi_update(self): """ multi-write on several partners in same hierarchy must not trigger a false cycle detection """ @@ -605,7 +605,7 @@ class TestParentStore(TransactionCase): """ Duplicate the children then reassign them to the new parent (2nd method). """ new_cat1 = self.cat1.copy() new_cat2 = self.cat2.copy() - new_cat0 = self.cat0.copy({'child_ids': [(6, 0, (new_cat1 + new_cat2).ids)]}) + new_cat0 = self.cat0.copy({'child_ids': [Command.set((new_cat1 + new_cat2).ids)]}) new_struct = new_cat0.search([('parent_id', 'child_of', new_cat0.id)]) self.assertEqual(len(new_struct), 4, "After duplication, the new object must have the childs records") old_struct = new_cat0.search([('parent_id', 'child_of', self.cat0.id)]) @@ -617,7 +617,7 @@ class TestParentStore(TransactionCase): new_cat1 = self.cat1.copy() new_cat2 = self.cat2.copy() new_cat0 = self.cat0.copy({'child_ids': []}) - new_cat0.write({'child_ids': [(4, new_cat1.id), (4, new_cat2.id)]}) + new_cat0.write({'child_ids': [Command.link(new_cat1.id), Command.link(new_cat2.id)]}) new_struct = new_cat0.search([('parent_id', 'child_of', new_cat0.id)]) self.assertEqual(len(new_struct), 4, "After duplication, the new object must have the childs records") old_struct = new_cat0.search([('parent_id', 'child_of', self.cat0.id)]) @@ -649,8 +649,8 @@ class TestGroups(TransactionCase): # four groups with no cycle, check them all together a = self.env['res.groups'].create({'name': 'A'}) b = self.env['res.groups'].create({'name': 'B'}) - c = self.env['res.groups'].create({'name': 'G', 'implied_ids': [(6, 0, (a + b).ids)]}) - d = self.env['res.groups'].create({'name': 'D', 'implied_ids': [(6, 0, c.ids)]}) + c = self.env['res.groups'].create({'name': 'G', 'implied_ids': [Command.set((a + b).ids)]}) + d = self.env['res.groups'].create({'name': 'D', 'implied_ids': [Command.set(c.ids)]}) self.assertTrue((a + b + c + d)._check_m2m_recursion('implied_ids')) # create a cycle and check diff --git a/odoo/addons/base/tests/test_expression.py b/odoo/addons/base/tests/test_expression.py index c42b9bffddc..1caccc27401 100644 --- a/odoo/addons/base/tests/test_expression.py +++ b/odoo/addons/base/tests/test_expression.py @@ -9,6 +9,7 @@ from odoo.models import BaseModel from odoo.tests.common import TransactionCase from odoo.tools import mute_logger from odoo.osv import expression +from odoo import Command class TestExpression(SavepointCaseWithUserDemo): @@ -32,9 +33,9 @@ class TestExpression(SavepointCaseWithUserDemo): cat_b = categories.create({'name': 'test_expression_category_B'}) partners = self.env['res.partner'] - a = partners.create({'name': 'test_expression_partner_A', 'category_id': [(6, 0, [cat_a.id])]}) - b = partners.create({'name': 'test_expression_partner_B', 'category_id': [(6, 0, [cat_b.id])]}) - ab = partners.create({'name': 'test_expression_partner_AB', 'category_id': [(6, 0, [cat_a.id, cat_b.id])]}) + a = partners.create({'name': 'test_expression_partner_A', 'category_id': [Command.set([cat_a.id])]}) + b = partners.create({'name': 'test_expression_partner_B', 'category_id': [Command.set([cat_b.id])]}) + ab = partners.create({'name': 'test_expression_partner_AB', 'category_id': [Command.set([cat_a.id, cat_b.id])]}) c = partners.create({'name': 'test_expression_partner_C'}) # The tests. @@ -99,7 +100,7 @@ class TestExpression(SavepointCaseWithUserDemo): } pids = {} for name, cat_ids in partners_config.items(): - pids[name] = partners.create({'name': name, 'category_id': [(6, 0, cat_ids)]}).id + pids[name] = partners.create({'name': name, 'category_id': [Command.set(cat_ids)]}).id base_domain = [('id', 'in', list(pids.values()))] @@ -707,8 +708,8 @@ class TestExpression(SavepointCaseWithUserDemo): vals = { 'name': 'OpenERP Test', 'active': False, - 'category_id': [(6, 0, [self.partner_category.id])], - 'child_ids': [(0, 0, {'name': 'address of OpenERP Test', 'country_id': self.ref("base.be")})], + 'category_id': [Command.set([self.partner_category.id])], + 'child_ids': [Command.create({'name': 'address of OpenERP Test', 'country_id': self.ref("base.be")})], } Partner.create(vals) partner = self._search(Partner, [('category_id', 'ilike', 'sellers'), ('active', '=', False)], [('active', '=', False)]) @@ -1317,9 +1318,9 @@ class TestOne2many(TransactionCase): self.partner = self.Partner.create({ 'name': 'Foo', 'bank_ids': [ - (0, 0, {'acc_number': '123', 'acc_type': 'bank'}), - (0, 0, {'acc_number': '456', 'acc_type': 'bank'}), - (0, 0, {'acc_number': '789', 'acc_type': 'bank'}), + Command.create({'acc_number': '123', 'acc_type': 'bank'}), + Command.create({'acc_number': '456', 'acc_type': 'bank'}), + Command.create({'acc_number': '789', 'acc_type': 'bank'}), ], }) diff --git a/odoo/addons/base/tests/test_func.py b/odoo/addons/base/tests/test_func.py index 833653fffe7..1c0bc5233f7 100644 --- a/odoo/addons/base/tests/test_func.py +++ b/odoo/addons/base/tests/test_func.py @@ -6,6 +6,7 @@ import functools from odoo.tests.common import BaseCase from odoo.tools import frozendict from odoo.tools.func import compose +from odoo import Command class TestCompose(BaseCase): @@ -61,5 +62,5 @@ class TestFrozendict(BaseCase): # dict with tuples, lists, and embedded dicts hash(frozendict({ 'user_id': (42, 'Joe'), - 'line_ids': [(0, 0, {'values': [42]})], + 'line_ids': [Command.create({'values': [42]})], })) diff --git a/odoo/addons/base/tests/test_ir_actions.py b/odoo/addons/base/tests/test_ir_actions.py index 920a87b1357..b19b3b1cec1 100644 --- a/odoo/addons/base/tests/test_ir_actions.py +++ b/odoo/addons/base/tests/test_ir_actions.py @@ -8,6 +8,7 @@ import odoo from odoo.exceptions import UserError, ValidationError, AccessError from odoo.tools import mute_logger from odoo.tests import common +from odoo import Command class TestServerActionsBase(common.TransactionCase): @@ -90,9 +91,9 @@ class TestServerActions(TestServerActionsBase): 'state': 'object_create', 'crud_model_id': self.res_country_model.id, 'link_field_id': False, - 'fields_lines': [(5,), - (0, 0, {'col1': self.res_country_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'}), - (0, 0, {'col1': self.res_country_code_field.id, 'value': 'record.name[0:2]', 'evaluation_type': 'equation'})], + 'fields_lines': [Command.clear(), + Command.create({'col1': self.res_country_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'}), + Command.create({'col1': self.res_country_code_field.id, 'value': 'record.name[0:2]', 'evaluation_type': 'equation'})], }) run_res = self.action.with_context(self.context).run() self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') @@ -110,8 +111,8 @@ class TestServerActions(TestServerActionsBase): 'state': 'object_create', 'crud_model_id': self.action.model_id.id, 'link_field_id': self.res_partner_parent_field.id, - 'fields_lines': [(0, 0, {'col1': self.res_partner_name_field.id, 'value': _name}), - (0, 0, {'col1': self.res_partner_city_field.id, 'value': _city})], + 'fields_lines': [Command.create({'col1': self.res_partner_name_field.id, 'value': _name}), + Command.create({'col1': self.res_partner_city_field.id, 'value': _city})], }) run_res = self.action.with_context(self.context).run() self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') @@ -130,7 +131,7 @@ class TestServerActions(TestServerActionsBase): 'state': 'object_create', 'crud_model_id': self.action.model_id.id, 'link_field_id': self.res_partner_children_field.id, - 'fields_lines': [(0, 0, {'col1': self.res_partner_name_field.id, 'value': _name})], + 'fields_lines': [Command.create({'col1': self.res_partner_name_field.id, 'value': _name})], }) run_res = self.action.with_context(self.context).run() self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') @@ -147,7 +148,7 @@ class TestServerActions(TestServerActionsBase): 'state': 'object_create', 'crud_model_id': self.res_partner_category_model.id, 'link_field_id': self.res_partner_category_field.id, - 'fields_lines': [(0, 0, {'col1': self.res_partner_category_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'})], + 'fields_lines': [Command.create({'col1': self.res_partner_category_name_field.id, 'value': 'record.name', 'evaluation_type': 'equation'})], }) run_res = self.action.with_context(self.context).run() self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') @@ -162,7 +163,7 @@ class TestServerActions(TestServerActionsBase): # Do: update partner name self.action.write({ 'state': 'object_write', - 'fields_lines': [(0, 0, {'col1': self.res_partner_name_field.id, 'value': _name})], + 'fields_lines': [Command.create({'col1': self.res_partner_name_field.id, 'value': _name})], }) run_res = self.action.with_context(self.context).run() self.assertFalse(run_res, 'ir_actions_server: create record action correctly finished should return False') @@ -187,8 +188,8 @@ class TestServerActions(TestServerActionsBase): 'model_id': self.res_partner_model.id, 'crud_model_id': self.res_partner_model.id, 'state': 'object_create', - 'fields_lines': [(0, 0, {'col1': self.res_partner_name_field.id, 'value': 'RaoulettePoiluchette'}), - (0, 0, {'col1': self.res_partner_city_field.id, 'value': 'TestingCity'})], + 'fields_lines': [Command.create({'col1': self.res_partner_name_field.id, 'value': 'RaoulettePoiluchette'}), + Command.create({'col1': self.res_partner_city_field.id, 'value': 'TestingCity'})], }) action3 = self.action.create({ 'name': 'Subaction3', @@ -199,7 +200,7 @@ class TestServerActions(TestServerActionsBase): }) self.action.write({ 'state': 'multi', - 'child_ids': [(6, 0, [action1.id, action2.id, action3.id])], + 'child_ids': [Command.set([action1.id, action2.id, action3.id])], }) # Do: run the action @@ -215,7 +216,7 @@ class TestServerActions(TestServerActionsBase): # Test loops with self.assertRaises(ValidationError): self.action.write({ - 'child_ids': [(6, 0, [self.action.id])] + 'child_ids': [Command.set([self.action.id])] }) def test_50_groups(self): @@ -233,7 +234,7 @@ class TestServerActions(TestServerActionsBase): self.action.write({ 'model_id': self.res_country_model.id, 'binding_model_id': self.res_country_model.id, - 'groups_id': [(4, group0.id, 0)], + 'groups_id': [Command.link(group0.id)], 'code': 'record.write({"vat_label": "VatFromTest"})', }) @@ -246,7 +247,7 @@ class TestServerActions(TestServerActionsBase): self.assertFalse(self.test_country.vat_label) # add group to the user, and test again - self.env.user.write({'groups_id': [(4, group0.id)]}) + self.env.user.write({'groups_id': [Command.link(group0.id)]}) bindings = Actions.get_bindings('res.country') self.assertItemsEqual(bindings.get('action'), self.action.read()) @@ -489,8 +490,8 @@ class TestCustomFields(common.TransactionCase): 'field_description': "Custom Selection", 'ttype': 'selection', 'selection_ids': [ - (0, 0, {'value': 'foo', 'name': 'Foo', 'sequence': 0}), - (0, 0, {'value': 'bar', 'name': 'Bar', 'sequence': 1}), + Command.create({'value': 'foo', 'name': 'Foo', 'sequence': 0}), + Command.create({'value': 'bar', 'name': 'Bar', 'sequence': 1}), ], }) diff --git a/odoo/addons/base/tests/test_ir_model.py b/odoo/addons/base/tests/test_ir_model.py index c05c6971135..385bca0284e 100644 --- a/odoo/addons/base/tests/test_ir_model.py +++ b/odoo/addons/base/tests/test_ir_model.py @@ -6,6 +6,7 @@ from psycopg2 import IntegrityError from odoo.exceptions import ValidationError from odoo.tests.common import TransactionCase, tagged from odoo.tools import mute_logger +from odoo import Command class TestXMLID(TransactionCase): @@ -192,7 +193,7 @@ class TestIrModel(TransactionCase): 'name': 'Banana Ripeness', 'model': 'x_banana_ripeness', 'field_id': [ - (0, 0, {'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}), + Command.create({'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}), ] }) # stage values are pairs (id, display_name) @@ -205,10 +206,10 @@ class TestIrModel(TransactionCase): 'name': 'Bananas', 'model': 'x_bananas', 'field_id': [ - (0, 0, {'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}), - (0, 0, {'name': 'x_length', 'ttype': 'float', 'field_description': 'Length'}), - (0, 0, {'name': 'x_color', 'ttype': 'integer', 'field_description': 'Color'}), - (0, 0, {'name': 'x_ripeness_id', 'ttype': 'many2one', + Command.create({'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}), + Command.create({'name': 'x_length', 'ttype': 'float', 'field_description': 'Length'}), + Command.create({'name': 'x_color', 'ttype': 'integer', 'field_description': 'Color'}), + Command.create({'name': 'x_ripeness_id', 'ttype': 'many2one', 'field_description': 'Ripeness','relation': 'x_banana_ripeness', 'group_expand': True}) ] @@ -257,9 +258,9 @@ class TestIrModel(TransactionCase): # check that the constraint is checked at model creation fields_value = [ - (0, 0, {'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}), - (0, 0, {'name': 'x_length', 'ttype': 'float', 'field_description': 'Length'}), - (0, 0, {'name': 'x_color', 'ttype': 'integer', 'field_description': 'Color'}), + Command.create({'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}), + Command.create({'name': 'x_length', 'ttype': 'float', 'field_description': 'Length'}), + Command.create({'name': 'x_color', 'ttype': 'integer', 'field_description': 'Color'}), ] self.env['ir.model'].create({ 'name': 'MegaBananas', diff --git a/odoo/addons/base/tests/test_orm.py b/odoo/addons/base/tests/test_orm.py index 285e4b67290..7e17e6351e2 100644 --- a/odoo/addons/base/tests/test_orm.py +++ b/odoo/addons/base/tests/test_orm.py @@ -6,6 +6,7 @@ from collections import defaultdict from odoo.exceptions import AccessError, MissingError from odoo.tests.common import TransactionCase from odoo.tools import mute_logger +from odoo import Command class TestORM(TransactionCase): @@ -26,7 +27,7 @@ class TestORM(TransactionCase): user = self.env['res.users'].create({ 'name': 'test user', 'login': 'test2', - 'groups_id': [(6, 0, [self.ref('base.group_user')])], + 'groups_id': [Command.set([self.ref('base.group_user')])], }) ps = (p1 + p2).with_user(user) self.assertEqual([{'id': p2.id, 'name': 'Y'}], ps.read(['name']), "read() should skip deleted records") @@ -61,7 +62,7 @@ class TestORM(TransactionCase): user = self.env['res.users'].create({ 'name': 'test user', 'login': 'test2', - 'groups_id': [(6, 0, [self.ref('base.group_user')])], + 'groups_id': [Command.set([self.ref('base.group_user')])], }) partner_model = self.env['ir.model'].search([('model','=','res.partner')]) @@ -216,14 +217,14 @@ class TestORM(TransactionCase): user = self.env['res.users'].create({ 'name': 'test', 'login': 'test_m2m_store_trigger', - 'groups_id': [(6, 0, [])], + 'groups_id': [Command.set([])], }) self.assertTrue(user.share) - group_user.write({'users': [(4, user.id)]}) + group_user.write({'users': [Command.link(user.id)]}) self.assertFalse(user.share) - group_user.write({'users': [(3, user.id)]}) + group_user.write({'users': [Command.unlink(user.id)]}) self.assertTrue(user.share) @mute_logger('odoo.models') @@ -232,7 +233,7 @@ class TestORM(TransactionCase): user = self.env['res.users'].create({ 'name': 'Justine Bridou', 'login': 'saucisson', - 'groups_id': [(6, 0, [self.ref('base.group_partner_manager')])], + 'groups_id': [Command.set([self.ref('base.group_partner_manager')])], }) p1 = self.env['res.partner'].with_user(user).create({'name': 'Zorro'}) self.env['ir.property'].with_user(user)._set_multi("ref", "res.partner", {p1.id: "Nain poilu"}) @@ -272,16 +273,16 @@ class TestORM(TransactionCase): vals_list = [{ 'name': 'Foo', 'state_ids': [ - (0, 0, {'name': 'North Foo', 'code': 'NF'}), - (0, 0, {'name': 'South Foo', 'code': 'SF'}), - (0, 0, {'name': 'West Foo', 'code': 'WF'}), - (0, 0, {'name': 'East Foo', 'code': 'EF'}), + Command.create({'name': 'North Foo', 'code': 'NF'}), + Command.create({'name': 'South Foo', 'code': 'SF'}), + Command.create({'name': 'West Foo', 'code': 'WF'}), + Command.create({'name': 'East Foo', 'code': 'EF'}), ], }, { 'name': 'Bar', 'state_ids': [ - (0, 0, {'name': 'North Bar', 'code': 'NB'}), - (0, 0, {'name': 'South Bar', 'code': 'SB'}), + Command.create({'name': 'North Bar', 'code': 'NB'}), + Command.create({'name': 'South Bar', 'code': 'SB'}), ], }] foo, bar = self.env['res.country'].create(vals_list) diff --git a/odoo/addons/base/tests/test_search.py b/odoo/addons/base/tests/test_search.py index 4444e38032e..c7937111fcd 100644 --- a/odoo/addons/base/tests/test_search.py +++ b/odoo/addons/base/tests/test_search.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.tests.common import TransactionCase +from odoo import Command class test_search(TransactionCase): @@ -71,7 +72,7 @@ class test_search(TransactionCase): states_us = country_us.state_ids[:2] # Create test users - u = Users.create({'name': '__search', 'login': '__search', 'groups_id': [(6, 0, [group_employee.id])]}) + u = Users.create({'name': '__search', 'login': '__search', 'groups_id': [Command.set([group_employee.id])]}) a = Users.create({'name': '__test_A', 'login': '__test_A', 'country_id': country_be.id, 'state_id': country_be.id}) b = Users.create({'name': '__test_B', 'login': '__a_test_B', 'country_id': country_us.id, 'state_id': states_us[1].id}) c = Users.create({'name': '__test_B', 'login': '__z_test_B', 'country_id': country_us.id, 'state_id': states_us[0].id}) @@ -140,7 +141,7 @@ class test_search(TransactionCase): self.patch_order('res.partner', 'create_uid, name') self.patch_order('res.users', 'partner_id, login desc') - kw = dict(groups_id=[(6, 0, [self.ref('base.group_system'), + kw = dict(groups_id=[Command.set([self.ref('base.group_system'), self.ref('base.group_partner_manager')])]) u1 = Users.create(dict(name='Q', login='m', **kw)).id diff --git a/odoo/addons/base/tests/test_user_has_group.py b/odoo/addons/base/tests/test_user_has_group.py index f5ea69ea711..27bec76e73c 100644 --- a/odoo/addons/base/tests/test_user_has_group.py +++ b/odoo/addons/base/tests/test_user_has_group.py @@ -3,6 +3,7 @@ from odoo.tests.common import TransactionCase from odoo.exceptions import ValidationError +from odoo import Command class TestHasGroup(TransactionCase): @@ -21,7 +22,7 @@ class TestHasGroup(TransactionCase): 'partner_id': self.env['res.partner'].create({ 'name': "Strawman Test User" }).id, - 'groups_id': [(6, 0, [group0.id])] + 'groups_id': [Command.set([group0.id])] }) self.grp_internal_xml_id = 'base.group_user' @@ -121,7 +122,7 @@ class TestHasGroup(TransactionCase): portal_user = self.env['res.users'].create({ 'login': 'portalTest2', 'name': 'Portal test 2', - 'groups_id': [(6, 0, [self.grp_portal.id])], + 'groups_id': [Command.set([self.grp_portal.id])], }) self.assertEqual( @@ -130,10 +131,10 @@ class TestHasGroup(TransactionCase): ) grp_fail = self.env["res.groups"].create( - {"name": "fail", "implied_ids": [(6, 0, [self.grp_internal.id])]}) + {"name": "fail", "implied_ids": [Command.set([self.grp_internal.id])]}) with self.assertRaises(ValidationError): - portal_user.write({'groups_id': [(4, grp_fail.id)]}) + portal_user.write({'groups_id': [Command.link(grp_fail.id)]}) def test_two_user_types(self): #Create a user with two groups of user types kind (Internal and Portal) @@ -147,17 +148,17 @@ class TestHasGroup(TransactionCase): self.env['res.users'].create({ 'login': 'test_two_user_types', 'name': "Test User with two user types", - 'groups_id': [(6, 0, [grp_test.id])] + 'groups_id': [Command.set([grp_test.id])] }) #Add a user with portal to the group Internal test_user = self.env['res.users'].create({ 'login': 'test_user_portal', 'name': "Test User with two user types", - 'groups_id': [(6, 0, [self.grp_portal.id])] + 'groups_id': [Command.set([self.grp_portal.id])] }) with self.assertRaises(ValidationError): - self.grp_internal.users = [(4, test_user.id)] + self.grp_internal.users = [Command.link(test_user.id)] def test_two_user_types_implied_groups(self): """Contrarily to test_two_user_types, we simply add an implied_id to a group. @@ -166,26 +167,26 @@ class TestHasGroup(TransactionCase): and thus give us a case uncovered by the aforementioned test. """ grp_test = self.env["res.groups"].create( - {"name": "test", "implied_ids": [(6, 0, [self.grp_internal.id])]}) + {"name": "test", "implied_ids": [Command.set([self.grp_internal.id])]}) test_user = self.env['res.users'].create({ 'login': 'test_user_portal', 'name': "Test User with one user types", - 'groups_id': [(6, 0, [grp_test.id])] + 'groups_id': [Command.set([grp_test.id])] }) with self.assertRaises(ValidationError): - grp_test.write({'implied_ids': [(4, self.grp_portal.id)]}) + grp_test.write({'implied_ids': [Command.link(self.grp_portal.id)]}) def test_demote_user(self): """When a user is demoted to the status of portal/public, we should strip him of all his (previous) rights """ group_0 = self.env.ref(self.group0) # the group to which test_user already belongs - group_U = self.env["res.groups"].create({"name": "U", "implied_ids": [(6, 0, [self.grp_internal.id])]}) + group_U = self.env["res.groups"].create({"name": "U", "implied_ids": [Command.set([self.grp_internal.id])]}) self.grp_internal.implied_ids = False # only there to simplify the test by not having to care about its trans_implied_ids - self.test_user.write({'groups_id': [(4, group_U.id)]}) + self.test_user.write({'groups_id': [Command.link(group_U.id)]}) self.assertEqual( self.test_user.groups_id, (group_0 + group_U + self.grp_internal), "We should have our 2 groups and the implied user group", @@ -194,9 +195,9 @@ class TestHasGroup(TransactionCase): # Now we demote him. The JS framework sends 3 and 4 commands, # which is what we write here, but it should work even with a 5 command or whatever. self.test_user.write({'groups_id': [ - (3, self.grp_internal.id), - (3, self.grp_public.id), - (4, self.grp_portal.id), + Command.unlink(self.grp_internal.id), + Command.unlink(self.grp_public.id), + Command.link(self.grp_portal.id), ]}) # if we screw up the removing groups/adding the implied ids, we could end up in two situations: @@ -221,31 +222,31 @@ class TestHasGroup(TransactionCase): group_no_one = self.env.ref('base.group_no_one') group_A = G.create({"name": "A"}) - group_AA = G.create({"name": "AA", "implied_ids": [(6, 0, [group_A.id])]}) + group_AA = G.create({"name": "AA", "implied_ids": [Command.set([group_A.id])]}) group_B = G.create({"name": "B"}) - group_BB = G.create({"name": "BB", "implied_ids": [(6, 0, [group_B.id])]}) + group_BB = G.create({"name": "BB", "implied_ids": [Command.set([group_B.id])]}) # user_a is a normal user, so we expect groups to be added when we add them, # as well as 'implied_groups'; otherwise nothing else should happen. # By contrast, for a portal user we want implied groups not to be added # if and only if it would not give group_user (or group_public) privileges - user_a = U.create({"name": "a", "login": "a", "groups_id": [(6, 0, [group_AA.id, group_user.id])]}) + user_a = U.create({"name": "a", "login": "a", "groups_id": [Command.set([group_AA.id, group_user.id])]}) self.assertEqual(user_a.groups_id, (group_AA + group_A + group_user + group_no_one)) - user_b = U.create({"name": "b", "login": "b", "groups_id": [(6, 0, [group_portal.id, group_AA.id])]}) + user_b = U.create({"name": "b", "login": "b", "groups_id": [Command.set([group_portal.id, group_AA.id])]}) self.assertEqual(user_b.groups_id, (group_AA + group_A + group_portal)) # user_b is not an internal user, but giving it a new group just added a new group - (user_a + user_b).write({"groups_id": [(4, group_BB.id)]}) + (user_a + user_b).write({"groups_id": [Command.link(group_BB.id)]}) self.assertEqual(user_a.groups_id, (group_AA + group_A + group_BB + group_B + group_user + group_no_one)) self.assertEqual(user_b.groups_id, (group_AA + group_A + group_BB + group_B + group_portal)) # now we create a group that implies the group_user # adding it to a user should work normally, whereas adding it to a portal user should raise - group_C = G.create({"name": "C", "implied_ids": [(6, 0, [group_user.id])]}) + group_C = G.create({"name": "C", "implied_ids": [Command.set([group_user.id])]}) - user_a.write({"groups_id": [(4, group_C.id)]}) + user_a.write({"groups_id": [Command.link(group_C.id)]}) self.assertEqual(user_a.groups_id, (group_AA + group_A + group_BB + group_B + group_C + group_user + group_no_one)) with self.assertRaises(ValidationError): - user_b.write({"groups_id": [(4, group_C.id)]}) + user_b.write({"groups_id": [Command.link(group_C.id)]}) diff --git a/odoo/addons/base/views/base_menus.xml b/odoo/addons/base/views/base_menus.xml index a2ed6b88f73..7e7f3003538 100644 --- a/odoo/addons/base/views/base_menus.xml +++ b/odoo/addons/base/views/base_menus.xml @@ -31,7 +31,7 @@ - + diff --git a/odoo/addons/base/views/res_users_views.xml b/odoo/addons/base/views/res_users_views.xml index 3212d32ccfb..fb2209348bf 100644 --- a/odoo/addons/base/views/res_users_views.xml +++ b/odoo/addons/base/views/res_users_views.xml @@ -512,7 +512,7 @@ API Keys Listing res.users.apikeys - + @@ -527,7 +527,7 @@ API Keys Listing res.users.apikeys tree - + diff --git a/odoo/addons/base/wizard/base_partner_merge.py b/odoo/addons/base/wizard/base_partner_merge.py index 484964e3558..8979664eaa5 100644 --- a/odoo/addons/base/wizard/base_partner_merge.py +++ b/odoo/addons/base/wizard/base_partner_merge.py @@ -8,7 +8,7 @@ import logging import psycopg2 import datetime -from odoo import api, fields, models +from odoo import api, fields, models, Command from odoo import SUPERUSER_ID, _ from odoo.exceptions import ValidationError, UserError from odoo.tools import mute_logger @@ -44,7 +44,7 @@ class MergePartnerAutomatic(models.TransientModel): if 'state' in fields: res['state'] = 'selection' if 'partner_ids' in fields: - res['partner_ids'] = [(6, 0, active_ids)] + res['partner_ids'] = [Command.set(active_ids)] if 'dst_partner_id' in fields: res['dst_partner_id'] = self._get_ordered_partner(active_ids)[-1].id return res @@ -315,7 +315,7 @@ class MergePartnerAutomatic(models.TransientModel): # Make the company of all related users consistent with destination partner company if dst_partner.company_id: partner_ids.mapped('user_ids').sudo().write({ - 'company_ids': [(4, dst_partner.company_id.id)], + 'company_ids': [Command.link(dst_partner.company_id.id)], 'company_id': dst_partner.company_id.id }) @@ -451,7 +451,7 @@ class MergePartnerAutomatic(models.TransientModel): current_partner_ids = literal_eval(current_line.aggr_ids) values.update({ 'current_line_id': current_line.id, - 'partner_ids': [(6, 0, current_partner_ids)], + 'partner_ids': [Command.set(current_partner_ids)], 'dst_partner_id': self._get_ordered_partner(current_partner_ids)[-1].id, 'state': 'selection', })