Как избежать дублирования Many2many в Odoo 13?

В Odoo 13, когда я дублирую заказ на продажу, к которому привязаны счета-фактуры, с новым заказом на продажу не связаны никакие счета, и это нормально.

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

Я пытаюсь это исправить. Поэтому сначала я проверил даже через интерфейс, что есть следующие поля copy=False:

  • Поле Many2many invoice_lines из модели sale.order.line.
  • Поле Many2many sale_line_ids из модели account.move.line.

Кажется, с обоими все в порядке, с copy=False. Почему же тогда это происходит? Я также изменил код, чтобы сломать программу, если они изменены в методах create или write ORM обеих моделей, но это не так.

Есть идеи, как найти виновный код?

sale.order связан с account.move с помощью поля счета_ids. Вы проверили, что в этом поле «voice_ids» тоже указано значение copy=false?

Ahrimann Steiner 07.03.2024 22:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможно, у вас есть шанс найти унаследованный метод copy в одном из ваших сторонних пользовательских модулей. Это должно быть на модели sale.order, потому что именно здесь произошло дублирование. Попробуйте провести расследование оттуда.

+1, потому что это хороший ответ, и я забыл написать, что уже проверял модификации метода копирования SO. Самый странный факт заключается в том, что с одним и тем же кодом на моем компьютере (и на компьютере моего коллеги) поведение нормальное, но на других поведение неправильное, что расстраивает.

forvas 07.03.2024 18:28

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 спасибо за ваш ответ, в нем есть правильная логика, но, наконец, я нашел решение, которое было немного сложнее найти для человека, у которого не установлены эти конкретные приложения.

forvas 15.03.2024 10:31
Ответ принят как подходящий

Наконец я обнаружил проблему: одно из нескольких сторонних приложений, установленных в базе данных, добавляет новое поле Many2many в sale.order, указывающее на account.move. В этом поле нет copy=False. Это не должно влиять на ссылку на счета-фактуры заказа на продажу, но влияет, потому что приложение также перезаписывает метод _get_invoiced() из sale.order, чтобы добавить значение этого поля M2M к исходному invoice_ids. Сочетание обоих действий является проблемой.

Мне удалось это исправить, просто добавив copy=False в новое поле стороннего приложения. Проблема также была исправлена, если я прокомментировал перезапись _get_invoiced(), но я выбрал первый вариант, чтобы сохранить то, что делает это приложение.

Это причины, по которым проверка метода sale.ordercopy() или проверка атрибута copy в исходных полях не дали никаких подсказок.

Другие вопросы по теме