Как удалить пользователя из нескольких групп одновременно Odoo 12 - PullRequest
1 голос
/ 03 октября 2019

Я хочу удалить пользователя из нескольких групп одновременно при переходе от «отдельного» к «компании» в методе записи контактной формы.

@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

Заранее спасибо

1 Ответ

1 голос
/ 03 октября 2019

На самом деле вы хотите удалить некоторые группы и добавить некоторые другие группы, во-первых, когда вы используете 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):

Документация по API Odoo ORM:

One2many и Many2many используют специальный формат «команд» для управления набором записей, хранящихся в / связанных с полем.

Этот формат представляет собой список триплетов, выполняемых последовательно, где каждый триплеткоманда для выполнения на множестве записейНе все команды применяются во всех ситуациях. Возможные команды:

(0, _, values): добавляет новую запись, созданную из предоставленного значения dict.

(1, id, 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): заменяет все существующие записи в наборе на список идентификаторов, что эквивалентно использованию команды 5, за которой следует команда 4 для каждого идентификатора в идентификаторах.

...