Неожиданное поведение inverse_name в Odoo 11 - PullRequest
2 голосов
/ 30 апреля 2019

Вы знаете о параметре inverse_name, доступном для полей One2many.Он просто сообщает Odoo, которое является обязательным полем Many2one в соответствующем комоделе, чтобы знать записи для показа.

В стандартном модуле account , в модели account.invoice есть поле Many2one с именемmove_id.Она относится к модели account.move и ее целью является отображение записи журнала, созданной для счета-фактуры, когда проверяется этот счет.

Единственное, что я хочу сделать, это показать в форме записей журнала (account.move) счет (account.invoice), проверка которого сгенерировала эту запись журнала.Для меня это выглядело легко, я только что создал другую часть отношений в account.move модели:

invoice_ids = fields.One2many(
    comodel_name='account.invoice',
    inverse_name='move_id',
    string='Invoices whose validation generated this journal entry',
)

Логический между account.invoice и account.move должен быть1: 1, но для этого случая я могу использовать 1: N, поскольку One2many просто информативен и доступен только для пользователей.Так что этот, похоже, работал хорошо, я смог увидеть счет в записи журнала, но через некоторое время я понял, что уничтожил рабочий процесс с этим кодом.

Это то, что происходит сейчас, я опишуэто с примерами:

  1. Я создаю и проверяю счет SALE / INV / 00001 .

  2. В результате проверки создаетсязапись в журнале 2019/00001 .Я вижу эту запись журнала в форме счета-фактуры, и я могу видеть счет-фактуру в форме записи журнала (в One2many, который я создал).Верно.

  3. Я оплачиваю счет, и вот тут все ломается.В результате платежа создается запись журнала 2019/00002 , которая в порядке, но теперь в счете-фактуре SALE / INV / 00001 вместо этой записи отображается 2019 /00001 , что неверно, и если я перейду к форме записи журнала 2019/00001 , то поле One2many, которое я создал, чтобы показать связанный счет, будет пустым, тогда как поле в журналезапись, сгенерированная платежом, показывает SALE / INV / 00001 , когда она должна быть пустой.

Я ожидал, что в поле записи журнала invoice_ids отобразятся только счета, чьипроверка сгенерировала эту запись журнала, поскольку move_id в счетах-фактурах показывает только записи журнала, созданные с помощью проверок.

Чтобы исправить это, я заменил One2many invoice_ids на Many2one invoice_id в записи журнала, изаполните это автоматически в account.move ORM метод создания.Но это решение не связывает старые записи в базе данных, и я до сих пор не понимаю поведение кода, описанного выше.

Итак, у кого-нибудь есть объяснение этому?Я хотел бы знать, почему inverse_name ведет себя так.

1 Ответ

2 голосов
/ 30 апреля 2019

Потратив много времени, заполняя ядро ​​сообщениями журнала, я обнаружил свою досадную проблему.

Когда вы оплачиваете счет стандартным способом (нажимая кнопку Зарегистрировать платеж ), открывается всплывающее окно модели account.payment. Эта модель уже имеет поле с именем invoice_ids, и Odoo использует контекст действия, которое открывает всплывающее окно, чтобы автоматически заполнить его текущим счетом:

<field name="context">{'default_invoice_ids': [(4, active_id, None)]}</field>

Когда платеж принят, вызывается метод account.move create для создания записи журнала платежей. Проблема в том, что контекст действия все еще остается в этом вызове, что означает, что Odoo думает, что я хочу заполнить свое настраиваемое поле invoice_ids из account.move этим значением (которое всегда является активным идентификатором, счетом, который мы держать открытым) ... и это не правда.

Полагаю, это очень плохо.

Наконец-то я исправил это, просто изменив техническое имя моего поля One2many, чтобы избежать путаницы в Odoo:

validated_invoice_ids = fields.One2many(
    comodel_name='account.invoice',
    inverse_name='move_id',
    string='Invoices whose validation generated this journal entry',
)
...