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 @@