[REF] base: Use Command helper for x2many
Task: 2366606
This commit is contained in:
committed by
Raphael Collet
parent
eded14b4c4
commit
90b52d144a
@@ -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',
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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})
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'):
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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])],
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'}),
|
||||
],
|
||||
})
|
||||
|
||||
|
||||
@@ -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]})],
|
||||
}))
|
||||
|
||||
@@ -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}),
|
||||
],
|
||||
})
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)]})
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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',
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user