Skip to content

purchase_request: "move_dest_ids": TypeError: 'bool' object is not iterable #2927

@mjdreher

Description

@mjdreher

Module

purchase_request

Describe the bug

In Odoo 18 "move_dest_ids" can also be false while a list is expected from code, see below error details:
RPC_ERROR

Odoo Server Error

Occured on staging.odoo-si.de on model sale.order on 2026-01-06 11:58:17 GMT

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 2166, in _transactioning
return service_model.retrying(func, env=self.env)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 156, in retrying
result = func()
^^^^^^
File "/usr/lib/python3/dist-packages/odoo/http.py", line 2133, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/http.py", line 2381, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/base/models/ir_http.py", line 333, in _dispatch
result = endpoint(**request.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/http.py", line 754, in route_wrapper
result = endpoint(self, *args, **params_ok)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/dataset.py", line 42, in call_button
action = call_kw(request.env[model], method, args, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/api.py", line 535, in call_kw
result = getattr(recs, name)(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons-extra/OCA/sale-workflow/sale_stock_line_sequence/models/sale_order.py", line 25, in action_confirm
res = super().action_confirm()
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/sale_management/models/sale_order.py", line 169, in action_confirm
res = super().action_confirm()
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/sale_crm/models/sale_order.py", line 15, in action_confirm
res = super(SaleOrder, self.with_context({k: v for k, v in self._context.items() if k != 'default_tag_ids'})).action_confirm()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/sale/models/sale_order.py", line 1174, in action_confirm
self.with_context(context)._action_confirm()
File "/usr/lib/python3/dist-packages/odoo/addons/sale_project/models/sale_order.py", line 134, in _action_confirm
return super()._action_confirm()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/repair/models/sale_order.py", line 27, in _action_confirm
res = super()._action_confirm()
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/sale_stock/models/sale_order.py", line 181, in _action_confirm
self.order_line._action_launch_stock_rule()
File "/usr/lib/python3/dist-packages/odoo/addons/repair/models/sale_order.py", line 85, in _action_launch_stock_rule
return super(SaleOrderLine, lines_without_repair_move)._action_launch_stock_rule(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/sale_stock/models/sale_order_line.py", line 423, in _action_launch_stock_rule
self.env['procurement.group'].run(procurements)
File "/usr/lib/python3/dist-packages/odoo/addons/purchase_stock/models/stock.py", line 293, in run
return super().run(procurements, raise_user_error=raise_user_error)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/mrp/models/stock_rule.py", line 285, in run
return super(ProcurementGroup, self).run(procurements_without_kit, raise_user_error=raise_user_error)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/stock/models/stock_rule.py", line 514, in run
getattr(self.env['stock.rule'], 'run%s' % action)(procurements)
File "/usr/lib/python3/dist-packages/odoo/addons/mrp/models/stock_rule.py", line 116, in _run_pull
return super()._run_pull(procurements)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/stock/models/stock_rule.py", line 310, in _run_pull
moves._action_confirm()
File "/usr/lib/python3/dist-packages/odoo/addons/mrp/models/stock_move.py", line 530, in _action_confirm
return super(StockMove, moves)._action_confirm(merge=merge, merge_into=merge_into)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/stock/models/stock_move.py", line 1543, in _action_confirm
self.env['procurement.group'].run(procurement_requests, raise_user_error=not self.env.context.get('from_orderpoint'))
File "/usr/lib/python3/dist-packages/odoo/addons/purchase_stock/models/stock.py", line 293, in run
return super().run(procurements, raise_user_error=raise_user_error)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/mrp/models/stock_rule.py", line 285, in run
return super(ProcurementGroup, self).run(procurements_without_kit, raise_user_error=raise_user_error)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons/stock/models/stock_rule.py", line 514, in run
getattr(self.env['stock.rule'], 'run%s' % action)(procurements)
File "/usr/lib/python3/dist-packages/odoo/addons-extra/OCA/purchase-workflow/purchase_request/models/stock_rule.py", line 86, in _run_buy
self.create_purchase_request(procurement)
File "/usr/lib/python3/dist-packages/odoo/addons-extra/OCA/purchase-workflow/purchase_request/models/stock_rule.py", line 130, in create_purchase_request
request_line_data = rule._prepare_purchase_request_line(pr, procurement)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/odoo/addons-extra/OCA/purchase-workflow/purchase_request/models/stock_rule.py", line 24, in _prepare_purchase_request_line
"move_dest_ids": [
^
TypeError: 'bool' object is not iterable

The above server error caused the following client error:
RPC_ERROR: Odoo Server Error
RPCError@https://odooxxx.de/web/assets/51c7907/web.assets_web.min.js:3165:343
makeErrorFromResponse@https://odooxxx.de/web/assets/51c7907/web.assets_web.min.js:3168:177
@https://odooxxx.de/web/assets/51c7907/web.assets_web.min.js:3173:34

To Reproduce

Affected versions: Odoo 18

Steps to reproduce the behavior:

  1. Create SO with product for which purchase request is enabled/required
  2. Click on "Confirm" SO

Expected behavior
SO should be confirmed and product added to purchase requests list

Additional context

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions