(Автоматическое действие) Odoo Проблема с write () и сделать для цикла - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь обновить значение 'sequence' в модели 'product.supplierinfo' с помощью автоматического действия, чтобы при обновлении цены поставщика из заказа на поставку этот поставщик получал приоритет для расчета стоимости пополнения. Для этого новая / обновленная запись должна получить наименьшее значение «последовательности» для этого продукта.

Скриншот автоматического действия

Параметры автоматического действия: Модель: продукт. supplierinfo Действие: Выполнить Python код Условие: Создать и обновить

Эта часть py успешно сбрасывает последовательности, начинающиеся с 2:

val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
  val = val + 1
  reg['sequence'] = val

А эта другая дает обновленный / новый Выровняйте значение последовательности 1 успешно:

record.write({'sequence': 1})

Однако, если сложить все вместе, все строки получат последовательность 1:

val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
  val = val + 1
  reg['sequence'] = val
record.write({'sequence': 1})

Поскольку я довольно нуб, я даже предположил, что возможно, l oop не закончится с отступом и попробует этот другой, чтобы доказать, что я что-то упустил (сначала установите последовательность 1 для целевой записи, а затем отбросьте эту запись из метода поиска). Он по-прежнему получает 1 для всех значений последовательности регистра:

record.write({'sequence': 1})
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
for reg in registers:
  val = val + 1
  reg['sequence'] = val

Есть идеи, почему он не устанавливает последовательность записи триггера 1, а затем остаток от 2 и далее?

1 Ответ

0 голосов
/ 07 мая 2020

С помощью @CZoellner мы обнаружили, что мой код создает al oop, проходящий через все записи, при редактировании значения последовательности это снова вызывает автоматическое действие. По какой-то причине он не выдал бы бесконечную ошибку l oop.

Однако решение, использовавшее трюк, заключалось в проверке максимальной write.date группы записей, чтобы проверить, было ли действие Automated уже прошел через это.

Окончательный рабочий код:

val = 1
fmt = '%Y-%m-%d  %H:%M:%S'
now = datetime.datetime.now().strftime("%Y-%m-%d  %H:%M:%S")
d2 = datetime.datetime.strptime(now, fmt)

registers = env['product.supplierinfo'].search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
maxi = max(reg.write_date for reg in registers)

d1 = datetime.datetime.strptime(maxi, fmt) 
diff = (d2-d1).seconds

if diff > 1:
  for reg in registers:
    val = val + 1
    reg['sequence'] = val
  record.write({'sequence': 1})

Спасибо @CZoellner за сотрудничество

...