odoo filter one2many список - PullRequest
       8

odoo filter one2many список

0 голосов
/ 04 июля 2018

У меня длинный список one2many, и я хочу показать пользователю только его часть, основываясь на фильтрах, которые пользователь может установить.

Мой текущий подход должен иметь исходное поле one2many со всеми записями и другое отфильтрованное поле one2many. Я вычисляю отфильтрованный список, выбирая подмножество, которое не отфильтровано из исходного списка. Далее я применяю изменения из отфильтрованного списка к исходному списку. Поэтому я ищу новые записи в списке и создаю их в исходном списке. Я ищу удаленные записи и удаляю их из исходного списка.

На самом деле этот подход работает, но он требует кучу кода и имитирует только то, что я ожидал бы от некоторых нативных функций Odoo или фильтруемого виджета one2many.

К сожалению, все другие подходы Я пытался не работает:

  • Поиск в списках one2many не работает (например, установка значений search_default_ в контексте). Я думаю, что это не поддерживается.
  • Использование домена для фильтрации второго списка one2many не работает (ни в xml, ни в коде python). Я думаю, что Odoo позволяет это только для многих.
  • Я хотел бы создать фильтруемый виджет one2many, расширяя обычный. Однако я не понимаю, где в коде JS список заполнен.

Итак, вопрос: существует ли более простое решение, чем мой нынешний подход, для фильтрации поля one2many с собственными функциями Odoo? Или вы можете помочь мне с js-кодом пользовательского виджета one2many, чтобы показывать только подмножество элементов? Например, какой метод вызывается при заполнении списка и в каком поле находятся идентификаторы элементов?

Пример * +1026 *

Я хочу в своей модели что-то вроде следующего:

# This is the original list, with all entries
schedule_entry_ids =
    fields.One2many('mymodule.schedule_entry', 'schedule_id', string="Entries")

# This is the filtered list, to be used in the view
# Note: Sadly using the domain here does not work. It always shows all entries. But I hope you get the idea what I want to accomplish.
filtered_schedule_entry_ids =
    fields.One2many('mymodule.schedule_entry', string="Filtered Entries", related='schedule_entry_ids', domain='[("phase_id", "=", filter_phase_id)]')

# This is the field that defines the filter
filter_phase_id =
    fields.Many2one('mymodule.phase', string="Phase Filter")

К сожалению, использование фильтра доменов не работает, поэтому мой подход на данный момент заключается в создании отфильтрованного поля как вычисляемого поля «вручную»:

filtered_schedule_entry_ids =
    fields.One2many('mymodule.schedule_entry', string="Filtered Entries", compute='_compute_filter', inverse='_inverse_filter')

@api.onchange('filter_phase_id', 'schedule_entry_ids')
def _compute_filter(self):
    # Populate the filtered list with the elements from the original list, for which the filter condition holds

def _inverse_filter(self):
    # Remove elements from the original list if they should be present in the filtered list but aren't anymore (elements have been deleted from the filtered list).
    # For all new elements in the filtered list, create a new element in the original list (elements have been created)

1 Ответ

0 голосов
/ 05 февраля 2019

Я попробовал все упомянутые трюки с тем же результатом ...

Единственные обходные пути (которые работают!), Которые я нашел, объяснены ниже:

1- Вы можете использовать compute в определении поля ..._ id и поместите все «фильтрующие вещи» в def но все строки «много» будут доступны только для чтения (это проблема для меня, потому что мне нужно отредактировать эти строки

2- Вы можете определить новое вычисленное логическое поле в таблице, которое на стороне «многие» (в вашем случае «mymodule.schedule_entry») и поставить «фильтрующий материал» в def. Он отлично работает и линии редактируются!

...