В Odoo 13, когда я дублирую заказ на продажу, к которому привязаны счета-фактуры, с новым заказом на продажу не связаны никакие счета, и это нормально.
Проблема в том, что в моем случае в моей базе данных установлено много сторонних приложений, и здесь, когда я дублирую заказ на продажу, к новому привязаны те же счета, что и к исходному, что, очевидно, является неправильное поведение.
Я пытаюсь это исправить. Поэтому сначала я проверил даже через интерфейс, что есть следующие поля copy=False:
invoice_lines из модели sale.order.line.sale_line_ids из модели
account.move.line.Кажется, с обоими все в порядке, с copy=False. Почему же тогда это происходит? Я также изменил код, чтобы сломать программу, если они изменены в методах create или write ORM обеих моделей, но это не так.
Есть идеи, как найти виновный код?





Возможно, у вас есть шанс найти унаследованный метод copy в одном из ваших сторонних пользовательских модулей. Это должно быть на модели sale.order, потому что именно здесь произошло дублирование. Попробуйте провести расследование оттуда.
+1, потому что это хороший ответ, и я забыл написать, что уже проверял модификации метода копирования SO. Самый странный факт заключается в том, что с одним и тем же кодом на моем компьютере (и на компьютере моего коллеги) поведение нормальное, но на других поведение неправильное, что расстраивает.
sale.order связан с account.move с помощью поля счета_ids.
Возможно, исходное поле bill_ids (официальные дополнения) было переопределено в одном из ваших сторонних модулей с помощью copy=true ?
Оригинал находится в addons/sale/models/sale_order.py:
class SaleOrder(models.Model):
_name = 'sale.order'
#...
invoice_ids = fields.Many2many(
comodel_name='account.move',
string = "Invoices",
compute='_get_invoiced',
search='_search_invoice_ids',
copy=False)
Чтобы исследовать унаследованные модели, вы можете наследовать sale.order в одном из ваших пользовательских модулей и переопределить копию def. А затем используйте команду «Шаг в» отладчика (Pycharm-) для отслеживания другой возможной переопределенной копии определения в других пользовательских модулях:
class SaleOrder(models.Model):
_inherit = 'sale.order'
def copy(self, default=None):
# put a DEBUG break point before the following line:
res_super = super(SaleOrder,self).copy(default=default)
return res_super
+1 спасибо за ваш ответ, в нем есть правильная логика, но, наконец, я нашел решение, которое было немного сложнее найти для человека, у которого не установлены эти конкретные приложения.
Наконец я обнаружил проблему: одно из нескольких сторонних приложений, установленных в базе данных, добавляет новое поле Many2many в sale.order, указывающее на account.move. В этом поле нет copy=False. Это не должно влиять на ссылку на счета-фактуры заказа на продажу, но влияет, потому что приложение также перезаписывает метод _get_invoiced() из sale.order, чтобы добавить значение этого поля M2M к исходному invoice_ids. Сочетание обоих действий является проблемой.
Мне удалось это исправить, просто добавив copy=False в новое поле стороннего приложения. Проблема также была исправлена, если я прокомментировал перезапись _get_invoiced(), но я выбрал первый вариант, чтобы сохранить то, что делает это приложение.
Это причины, по которым проверка метода sale.ordercopy() или проверка атрибута copy в исходных полях не дали никаких подсказок.
sale.order связан с account.move с помощью поля счета_ids. Вы проверили, что в этом поле «voice_ids» тоже указано значение copy=false?