如何一次从多个组中删除用户 Odoo 12

How remove user from multiple groups at once Odoo 12

当联系表的写入方法从 'individual' 更改为 'company' 时,我想一次从多个组中删除用户。

@api.multi
def write(self, values):
    user = self.env['res.users'].search([('partner_id', '=', self.id)])
    if 'company_type' in values:
        if values["company_type"] == "company":
            # want to add in below group
            """[(6, 0, [self.env.ref('base.group_user').id,
                                           self.env.ref('sales_team.group_sale_salesman_all_leads').id,
                                           self.env.ref('survey.group_survey_manager').id
                                           ])]"""

            # want to remove from below group
            """[(6, 0, [self.env.ref('base.group_portal').id,
                                           self.env.ref('survey.group_survey_user').id,
                                           ])]"""
    res = super(Contact, self).write(values)
    return res

提前致谢

实际上你想删除一些组并添加一些其他组,首先当你使用 api.multi 总是期望 self 包含多个记录,所以当你这样做时 self.id 你会大概有大名鼎鼎的singleton Error.

其次,不要仅在要对用户进行操作时才开始搜索用户,因此请将搜索移至 if statement

@api.multi
def write(self, values):
    if values.get('company_type', False) ==  "company":
        users = self.env['res.users'].search([('partner_id', 'in', self.ids)])
        # remove some groups: [(3, id_of_group), ....etc]
        to_remove = [(3, self.env.ref(group_xml_id).id) for group_xml_id in ['base.group_portal', 'survey.group_survey_user']]
        # add some groups [(4, id_of_group), ... ect]
        to_add =  [(4, self.env.ref(group_xml_id).id) for group_xml_id in ['base.group_user', 
                                                                           'sales_team.group_sale_salesman_all_leads',
                                                                           'survey.group_survey_manager']]
        # contatenate the list to call write only one time
        users.write({'groups_id': to_remove + to_add})

    return super(Contact, self).write(values)

当你想从many2many字段中删除记录时使用command (3, id_of_record),当你想添加一条记录(4, id_of_record):

Odoo ORM API 文档:

One2many and Many2many use a special “commands” format to manipulate the set of records stored in/associated with the field.

This format is a list of triplets executed sequentially, where each triplet is a command to execute on the set of records. Not all commands apply in all situations. Possible commands are:

(0, _, values): 添加根据提供的值字典创建的新记录。

(1, id, values): 使用 values 中的值更新 id id 的现有记录。不能在 create() 中使用。

(2, id, _):从集合中移除id为id的记录,然后删除(从数据库中)。能 不能在 create() 中使用。

(3, id, _):从集合中移除id为id的记录,但不删除。不能在 One2many 上使用。不能在 create() 中使用。

(4, id, _) : 将 id id 的现有记录添加到集合中。不能在 One2many 上使用。

(5, _, _): 从集合中删除所有记录,相当于在每条记录上显式使用命令 3。不能在 One2many 上使用。不能在 create() 中使用。

(6, _, ids): 用 ids 列表替换集合中的所有现有记录,相当于对 ids 中的每个 id 使用命令 5 后跟命令 4。