[REF] base: Use Command helper for x2many

Task: 2366606
This commit is contained in:
Julien Castiaux
2020-11-30 10:16:09 +00:00
committed by Raphael Collet
parent eded14b4c4
commit 90b52d144a
29 changed files with 213 additions and 211 deletions
@@ -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',
+3 -3
View File
@@ -1590,7 +1590,7 @@
<record id="europe" model="res.country.group">
<field name="name">Europe</field>
<field name="country_ids" eval="[(6,0,[
<field name="country_ids" eval="[Command.set([
ref('at'),ref('be'),ref('bg'),ref('hr'),ref('cy'),
ref('cz'),ref('dk'),ref('ee'),ref('fi'),ref('fr'),
ref('de'),ref('gr'),ref('hu'),ref('ie'),ref('it'),
@@ -1601,7 +1601,7 @@
<record id="south_america" model="res.country.group">
<field name="name">South America</field>
<field name="country_ids" eval="[(6,0,[
<field name="country_ids" eval="[Command.set([
ref('ar'),ref('bo'),ref('br'),ref('cl'),ref('co'),
ref('ec'),ref('fk'),ref('gs'),ref('gf'),ref('gy'),
ref('py'),ref('pe'),ref('sr'),ref('uy'),ref('ve')])]"/>
@@ -1609,7 +1609,7 @@
<record id="sepa_zone" model="res.country.group">
<field name="name">SEPA Countries</field>
<field name="country_ids" eval="[(6,0,[
<field name="country_ids" eval="[Command.set([
ref('ad'),ref('at'),ref('ax'),ref('be'),ref('bg'),
ref('bl'),ref('ch'),ref('cy'),ref('cz'),ref('de'),
ref('dk'),ref('ee'),ref('es'),ref('fi'),ref('fr'),
+5 -5
View File
@@ -44,7 +44,7 @@
</record>
<record id="res_partner_1" model="res.partner">
<field name="name">Wood Corner</field>
<field eval="[(6, 0, [ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
<field eval="[Command.set([ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">1839 Arbor Way</field>
<field name="city">Turlock</field>
@@ -58,7 +58,7 @@
</record>
<record id="res_partner_2" model="res.partner">
<field name="name">Deco Addict</field>
<field eval="[(6, 0, [ref('base.res_partner_category_14')])]" name="category_id"/>
<field eval="[Command.set([ref('base.res_partner_category_14')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">77 Santa Barbara Rd</field>
<field name="city">Pleasant Hill</field>
@@ -72,7 +72,7 @@
</record>
<record id="res_partner_3" model="res.partner">
<field name="name">Gemini Furniture</field>
<field eval="[(6, 0, [ref('res_partner_category_8'), ref('res_partner_category_14')])]" name="category_id"/>
<field eval="[Command.set([ref('res_partner_category_8'), ref('res_partner_category_14')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">317 Fairchild Dr</field>
<field name="city">Fairfield</field>
@@ -87,7 +87,7 @@
<record id="res_partner_4" model="res.partner">
<field name="name">Ready Mat</field>
<field eval="[(6, 0, [ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
<field eval="[Command.set([ref('res_partner_category_14'), ref('res_partner_category_12')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">7500 W Linne Road</field>
<field name="city">Tracy</field>
@@ -115,7 +115,7 @@
<record id="res_partner_12" model="res.partner">
<field name="name">Azure Interior</field>
<field eval="[(6, 0, [ref('res_partner_category_11')])]" name="category_id"/>
<field eval="[Command.set([ref('res_partner_category_11')])]" name="category_id"/>
<field name="is_company">1</field>
<field name="street">4557 De Silva St</field>
<field name="city">Fremont</field>
+4 -4
View File
@@ -5,7 +5,7 @@
<record model="res.users" id="base.user_root">
<field name="partner_id" ref="base.partner_root"/>
<field name="company_id" ref="main_company"/>
<field name="company_ids" eval="[(4, ref('main_company'))]"/>
<field name="company_ids" eval="[Command.link(ref('main_company'))]"/>
<field name="email">root@example.com</field>
<field name="signature"><![CDATA[<span>-- <br/>
System</span>]]></field>
@@ -17,8 +17,8 @@ System</span>]]></field>
<field name="password">admin</field>
<field name="partner_id" ref="base.partner_admin"/>
<field name="company_id" ref="main_company"/>
<field name="company_ids" eval="[(4, ref('main_company'))]"/>
<field name="groups_id" eval="[(6,0,[])]"/>
<field name="company_ids" eval="[Command.link(ref('main_company'))]"/>
<field name="groups_id" eval="[Command.set([])]"/>
<field name="image_1920" type="base64" file="base/static/img/avatar_grey.png"/>
<field name="signature"><![CDATA[<span>-- <br/>
Administrator</span>]]></field>
@@ -36,7 +36,7 @@ Administrator</span>]]></field>
<field name="login">public</field>
<field name="password"></field>
<!-- Avoid auto-including this demo user in any default group -->
<field name="groups_id" eval="[(6,0,[])]"/>
<field name="groups_id" eval="[Command.set([])]"/>
<field name="image_1920" type="base64" file="base/static/img/public_user-image.png"/>
<field name="partner_id" ref="public_partner"/>
<field name="active" eval="False"/>
+3 -3
View File
@@ -35,7 +35,7 @@
<field name="password">demo</field>
<field name="signature" type="xml"><span>-- <br/>+Mr Demo</span></field>
<field name="company_id" ref="main_company"/>
<field name="groups_id" eval="[(6,0,[ref('base.group_user'), ref('base.group_partner_manager'), ref('base.group_allow_export')])]"/>
<field name="groups_id" eval="[Command.set([ref('base.group_user'), ref('base.group_partner_manager'), ref('base.group_allow_export')])]"/>
<field name="image_1920" type="base64" file="base/static/img/user_demo-image.jpg"/>
</record>
@@ -77,11 +77,11 @@
<field name="login">portal</field>
<field name="password">portal</field>
<field name="signature"><![CDATA[<span>-- <br/>Mr Demo Portal</span>]]></field>
<field name="groups_id" eval="[(5,)]"/><!-- Avoid auto-including this user in any default group -->
<field name="groups_id" eval="[Command.clear()]"/><!-- Avoid auto-including this user in any default group -->
</record>
<record id="base.group_portal" model="res.groups"><!-- Add the demo user to the portal (and therefore to the portal member group) -->
<field name="users" eval="[(4,ref('demo_user0'))]"/>
<field name="users" eval="[Command.link(ref('demo_user0'))]"/>
</record>
</data>
</odoo>
+1 -1
View File
@@ -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})
+6 -13
View File
@@ -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
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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'):
+4 -4
View File
@@ -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()
+3 -3
View File
@@ -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
+13 -13
View File
@@ -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)
]
+2 -2
View File
@@ -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
+10 -10
View File
@@ -13,8 +13,8 @@
<record model="res.groups" id="group_system">
<field name="name">Settings</field>
<field name="implied_ids" eval="[(4, ref('group_erp_manager'))]"/>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
<field name="implied_ids" eval="[Command.link(ref('group_erp_manager'))]"/>
<field name="users" eval="[Command.link(ref('base.user_root')), Command.link(ref('base.user_admin'))]"/>
</record>
<record model="res.groups" id="group_user">
@@ -22,7 +22,7 @@
</record>
<record id="default_user" model="res.users">
<field name="groups_id" eval="[(4,ref('base.group_user'))]"/>
<field name="groups_id" eval="[Command.link(ref('base.group_user'))]"/>
</record>
<record model="res.groups" id="group_multi_company">
@@ -39,20 +39,20 @@
<record id="group_allow_export" model="res.groups">
<field name="name">Access to export feature</field>
<field name="category_id" ref="base.module_category_hidden"/>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
<field name="users" eval="[Command.link(ref('base.user_root')), Command.link(ref('base.user_admin'))]"/>
</record>
<record model="res.groups" id="group_user">
<field name="implied_ids" eval="[(4, ref('group_no_one'))]"/>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
<field name="implied_ids" eval="[Command.link(ref('group_no_one'))]"/>
<field name="users" eval="[Command.link(ref('base.user_root')), Command.link(ref('base.user_admin'))]"/>
</record>
<record model="res.groups" id="group_partner_manager">
<field name="name">Contact Creation</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
<field name="users" eval="[Command.link(ref('base.user_root')), Command.link(ref('base.user_admin'))]"/>
</record>
<record id="default_user" model="res.users">
<field name="groups_id" eval="[(4, ref('base.group_partner_manager')), (4, ref('base.group_allow_export'))]"/>
<field name="groups_id" eval="[Command.link(ref('base.group_partner_manager')), Command.link(ref('base.group_allow_export'))]"/>
</record>
<!--
@@ -75,7 +75,7 @@
</record>
<record id="public_user" model="res.users">
<field name="groups_id" eval="[(4, ref('base.group_public'))]"/>
<field name="groups_id" eval="[Command.link(ref('base.group_public'))]"/>
</record>
<!-- Default template user for new users signing in -->
@@ -83,7 +83,7 @@
<field name="name">Portal User Template</field>
<field name="login">portaltemplate</field>
<field name="active" eval="False"/>
<field name="groups_id" eval="[(6, 0, [ref('base.group_portal')])]"/>
<field name="groups_id" eval="[Command.set([ref('base.group_portal')])]"/>
</record>
<record id="default_template_user_config" model="ir.config_parameter">
+17 -17
View File
@@ -27,7 +27,7 @@
<field name="name">res_partner: portal/public: read access on my commercial partner</field>
<field name="model_id" ref="base.model_res_partner"/>
<field name="domain_force">[('id', 'child_of', user.commercial_partner_id.id)]</field>
<field name="groups" eval="[(4, ref('base.group_portal')), (4, ref('base.group_public'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_portal')), Command.link(ref('base.group_public'))]"/>
<field name="perm_create" eval="False"/>
<field name="perm_unlink" eval="False"/>
<field name="perm_write" eval="False"/>
@@ -37,7 +37,7 @@
<field name="name">Defaults: alter personal defaults</field>
<field name="model_id" ref="model_ir_default"/>
<field name="domain_force">[('user_id','=',user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_user'))]"/>
<field name="perm_read" eval="False"/>
</record>
@@ -45,7 +45,7 @@
<field name="name">Defaults: alter all defaults</field>
<field name="model_id" ref="model_ir_default"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4, ref('base.group_system'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_system'))]"/>
<field name="perm_read" eval="False"/>
</record>
@@ -82,7 +82,7 @@
['|', ('type', '!=', 'private'), ('type', '=', False)]
</field>
<field name="groups" eval="[
(4, ref('base.group_user')),
Command.link(ref('base.group_user')),
]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
@@ -97,7 +97,7 @@
[('type', '=', 'private')]
</field>
<field name="groups" eval="[
(4, ref('base.group_private_addresses'))
Command.link(ref('base.group_private_addresses'))
]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
@@ -110,7 +110,7 @@
<field name="name">ir.filters.admin.all.rights</field>
<field name="model_id" ref="model_ir_filters"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_erp_manager'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_erp_manager'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
@@ -121,7 +121,7 @@
<field name="name">ir.filters.owner</field>
<field name="model_id" ref="model_ir_filters"/>
<field name="domain_force">[('user_id','in',[False,user.id])]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_user'))]"/>
<field name="perm_unlink" eval="False"/>
</record>
@@ -129,7 +129,7 @@
<field name="name">ir.filters.own.rule.delete</field>
<field name="model_id" ref="model_ir_filters"/>
<field name="domain_force">[('user_id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_user'))]"/>
<field name="perm_read" eval="False"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
@@ -139,7 +139,7 @@
<field name="name">ir.filter: portal/public</field>
<field name="model_id" ref="model_ir_filters"/>
<field name="domain_force">[('user_id', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_portal')), (4, ref('base.group_public'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_portal')), Command.link(ref('base.group_public'))]"/>
</record>
<!-- Record Rules For Company -->
@@ -147,28 +147,28 @@
<field name="name">company rule portal</field>
<field name="model_id" ref="model_res_company"/>
<field eval="False" name="global"/>
<field name="groups" eval="[(6, 0, [ref('base.group_portal')])]"/>
<field name="groups" eval="[Command.set([ref('base.group_portal')])]"/>
<field name="domain_force">[('id','in', company_ids)]</field>
</record>
<record id="res_company_rule_employee" model="ir.rule">
<field name="name">company rule employee</field>
<field name="model_id" ref="model_res_company"/>
<field eval="False" name="global"/>
<field name="groups" eval="[(6, 0, [ref('base.group_user')])]"/>
<field name="groups" eval="[Command.set([ref('base.group_user')])]"/>
<field name="domain_force">[('id','in', company_ids)]</field>
</record>
<record id="res_company_rule_public" model="ir.rule">
<field name="name">company rule public</field>
<field name="model_id" ref="model_res_company"/>
<field eval="False" name="global"/>
<field name="groups" eval="[(6, 0, [ref('base.group_public')])]"/>
<field name="groups" eval="[Command.set([ref('base.group_public')])]"/>
<field name="domain_force">[('id','in', company_ids)]</field>
</record>
<record id="res_company_rule_erp_manager" model="ir.rule">
<field name="name">company rule erp manager</field>
<field name="model_id" ref="model_res_company"/>
<field eval="False" name="global"/>
<field name="groups" eval="[(6, 0, [ref('base.group_erp_manager')])]"/>
<field name="groups" eval="[Command.set([ref('base.group_erp_manager')])]"/>
<field name="domain_force">[(1,'=',1)]</field>
</record>
@@ -191,22 +191,22 @@
<field name="name">Public users can't interact with keys at all</field>
<field name="model_id" ref="model_res_users_apikeys"/>
<field name="domain_force">[(0, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_public'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_public'))]"/>
</record>
<record id="api_key_user" model="ir.rule">
<field name="name">Users can read and delete their own keys</field>
<field name="model_id" ref="model_res_users_apikeys"/>
<field name="domain_force">[('user_id', '=', user.id)]</field>
<field name="groups" eval="[
(4, ref('base.group_portal')),
(4, ref('base.group_user')),
Command.link(ref('base.group_portal')),
Command.link(ref('base.group_user')),
]"/>
</record>
<record id="api_key_admin" model="ir.rule">
<field name="name">Administrators can view user keys to revoke them</field>
<field name="model_id" ref="model_res_users_apikeys"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4, ref('base.group_system'))]"/>
<field name="groups" eval="[Command.link(ref('base.group_system'))]"/>
</record>
</data>
</odoo>
+30 -29
View File
@@ -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])],
})
+6 -5
View File
@@ -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
+6 -6
View File
@@ -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:
+10 -10
View File
@@ -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
+10 -9
View File
@@ -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'}),
],
})
+2 -1
View File
@@ -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]})],
}))
+17 -16
View File
@@ -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}),
],
})
+9 -8
View File
@@ -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',
+13 -12
View File
@@ -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)
+3 -2
View File
@@ -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
+24 -23
View File
@@ -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)]})
+1 -1
View File
@@ -31,7 +31,7 @@
<menuitem id="base.menu_tests" name="Tests" sequence="1000000" web_icon="test_exceptions,static/description/icon.png"/>
<record model="ir.ui.menu" id="base.menu_administration">
<field name="groups_id" eval="[(6,0, [ref('group_system'), ref('group_erp_manager')])]"/>
<field name="groups_id" eval="[Command.set([ref('group_system'), ref('group_erp_manager')])]"/>
</record>
<record id="action_client_base_menu" model="ir.actions.client">
+2 -2
View File
@@ -512,7 +512,7 @@
<record model="ir.ui.view" id="view_apikeys">
<field name="name">API Keys Listing</field>
<field name="model">res.users.apikeys</field>
<field name="groups_id" eval="[(4, ref('base.group_system'))]"/>
<field name="groups_id" eval="[Command.link(ref('base.group_system'))]"/>
<field name="arch" type="xml">
<tree create="false" edit="false" delete="false" editable="bottom">
<field name="user_id"/>
@@ -527,7 +527,7 @@
<field name="name">API Keys Listing</field>
<field name="res_model">res.users.apikeys</field>
<field name="view_mode">tree</field>
<field name="groups_id" eval="[(4, ref('base.group_system'))]"/>
<field name="groups_id" eval="[Command.link(ref('base.group_system'))]"/>
<field name="view_id" ref="base.view_apikeys"/>
</record>
@@ -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',
})