Openerp 7 передает текст в идентификаторы БД - PullRequest
0 голосов
/ 09 июня 2018

У меня есть текущая проблема, которую я не понимаю.Проблема возникает при создании заказа поставщика.Пользователь передает продукты, которые вызывают "onchange_product_id" в классе openerp-server / addons / purchase / purchase.py.В этом методе он вызывает метод name_get класса product.product (файл openerp-server / addons / product / product.py), чтобы получить имя продукта, установленное поставщиком.

Метод onchange выглядит следующим образом

def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id,
        partner_id, date_order=False, fiscal_position_id=False, date_planned=False,
        name=False, price_unit=False, context=None):
    ....
    dummy, name = self.pool.get('product.product').name_get(cr, uid, product_id, context=context_partner)[0]

После нескольких строк в name_get (в модели product.product) исполняется следующий код

for product in self.browse(cr, user, ids, context=context):
    sellers = partner_ids and filter(lambda x: x.name.id in partner_ids, product.seller_ids) or []

, и это вызывает необработанное исключение как следующее

openerp.sql_db: bad query: SELECT product_product."product_tmpl_id",product_product.id FROM "product_product" WHERE product_product.id IN ('Allzweckreiniger', 13484) ORDER BY default_code,name_template
Traceback (most recent call last):
  File "/opt/openerp/openerp-server/openerp/sql_db.py", line 226, in execute
    res = self._obj.execute(query, params)
DataError: invalid input syntax for integer: "Allzweckreiniger"
LINE 1: ...OM "product_product" WHERE product_product.id IN ('All...

Я не фанат Python, но я к этому привык, поэтому, пожалуйста, не начинайте с руководств для начинающих, если это не определяет мою проблему.

У меня есть четыре вопроса относительно вышеупомянутого:

  • Как openerp удалось передать product_product.name "Allzweckreiniger" в поле идентификатора базы данных?13484 является правильным соответствующим идентификатором набора данных, поэтому оба значения передаются
  • Неисследованное исключение происходит в строке продавца, а не в просмотре.Что вызывает выбор для product_product в строке продавца?
  • Почему это происходит там, а не в просмотре, как я понимал до сих пор, что просмотр уже разрешает все многие отношения напрямую
  • И последнее: у данного продукта нет поставщика, указанного в таблице product.supplierinfo, почему он вообще обращается к этой базе данных?

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

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

for product in self.browse(cr, user, ids, context=context):
    sellers = self.pool['product.supplierinfo'].search(cr, user, [('product_id', '=', product.product_tmpl_id.id), ('name', 'in', partner_ids)], context=context)
    for seller in sellers:
        s = self.pool['product.supplierinfo'].browse(cr, user, seller, context=context)

Моя главная задача - понять, что вызывает неправильный выбор.

Спасибо за любую помощь


обновление 10.06.2018:

Я копал немного дальше, но это все еще странно.Следующий журнал написан при возникновении неисследованного исключения, и это произошло с еще несколькими продуктами.Для всех продуктов не заданы seller_ids.

  File "/opt/openerp/openerp-server/addons/purchase/purchase.py", line 1011, in onchange_product_id
  dummy, name = product_product.name_get(cr, uid, product_id, context=context_partner)[0]
  File "/opt/openerp/openerp-server/addons/product/product.py", line 671, in name_get
  sellers = partner_ids and filter(lambda x: x.name.id in partner_ids, product.seller_ids) or []
  File "/opt/openerp/openerp-server/openerp/osv/orm.py", line 503, in __getattr__
  return self[name]

, поэтому проблема с функцией фильтра уменьшается.Но почему он выполняет левую лямбда-часть?Разве правильные product.seller_ids не должны быть просто пустым списком?

И почему тогда происходит демпинг на модель product_product при доступе к product_supplierinfo?

...