Odoo 8: Фильтр доменов Many2many

У меня есть несколько типов организации с отношением many2many, описывающим типы, которые могут быть родительскими для других типов (например, отдел может быть родительским подразделением и рабочей группой). Это НЕ строгая иерархия (рабочая группа может быть родительской для других рабочих групп), следовательно, отношение many2many.

У меня есть два поля для объекта organization_type: allowed_parent_type_ids и обратный allowed_children_type_ids.

Теперь я хочу ограничить поле типа организации на моем объекте организации в зависимости от его родительского элемента, поэтому дочерний элемент "отдела" может выбирать только типы организации, разрешенные для работы с дочерними подразделениями и т.д.

В моем представлении формы я попытался:

<field
    name="organization_type_id"
    domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids)]"
    />

Я также попытался связать связанное поле с разрешенными типами в объекте организации, но всегда получаю сообщение об ошибке. Моя последняя попытка:

domain=[('id', 'in', allowed_type_ids)]

Это дает сообщение об ошибке:

TypeError: not all arguments converted during string formatting

Клиент на самом деле извлекает объект JSON, например "allowed_type_ids" = [0,1,2], и если я заменю allow_type_ids в выражении домена с помощью [0,1,2], ошибок нет, и я получаю три типа организации в моем выборе...

Ответ 1

Попробуйте следующее:

<field
    name="organization_type_id"
    domain="[('id', 'in', parent_id.organization_type_id.allowed_children_ids.ids)]"
    />

Пока allowed_children_ids - это набор записей, allowed_children_ids.ids - это список идентификаторов этих записей.

Вы также можете приблизиться к этому с другой стороны. Это должно работать и быть быстрее:

<field
    name="organization_type_id"
    domain="[('allowed_parent_type_ids', '=', parent_id.organization_type_id)]"
    />

Ответ 2

EDIT: этот трюк больше не работает в 9.0 и 10.0 даже в то время, когда я отправил сообщение, если ваша кодовая база Odoo была обновлена. https://github.com/odoo/odoo/issues/16072 для более подробной информации.

Для альтернативы вы можете попробовать использовать модуль web_domain_field. Он находится здесь: https://github.com/OCA/web/pull/567


Бывший ответ:

Чтобы иметь домен на Many2many, вы найдете хороший ответ от Olivier Dony по FAQ Odoo: https://www.odoo.com/fr_FR/forum/aide-1/question/complex-many2many-domains-in-views-41777#answer_41784

Короче говоря, вам нужно указать правильные значения, так как значение Many2many представляет собой список кортежей типа [(6, 0, ids)].

Таким образом, вам нужно создать такой домен, чтобы сравнить идентификаторы:

domain=[('id', 'in', allowed_type_ids[0][2])]

Предупреждение. Возможно, это не сработает на Odoo 9.0 в случае, если поле many2many пусто.