Files
odoo_source/addons/mrp/__init__.py
T
Richard Mathot e666694e2a [FIX] mrp: more Voodoo magic
It appears that if you update a record more than once in the same
PostgreSQL transaction, PostgreSQL is going to re-check all the
constraints on the table.

** THIS IS THE PART WHERE THE BLACK MAGIC HAPPENS **

We combine the setting of the default value of stock.move.unit_factor in
the same UPDATE query to avoid the constraint re-check; it saves
approximately 60% of the SQL running time in my case.

** ... AND NOW YOU CAN SAY: WHAT THE F...?! **

Thanks to @rco-odoo for the tip; he knows it from the wise @nseinlet.

X-original-commit: 8e47e2f605309c8ed0d5509f7bb070528d8f32c4
2020-09-23 11:50:42 +00:00

42 lines
1.5 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizard
from . import report
from . import controller
from odoo import api, SUPERUSER_ID
def _pre_init_mrp(cr):
""" Allow installing MRP in databases with large stock.move table (>1M records)
- Creating the computed+stored field stock_move.is_done is terribly slow with the ORM and
leads to "Out of Memory" crashes
"""
cr.execute("""ALTER TABLE "stock_move" ADD COLUMN "is_done" bool;""")
cr.execute("""UPDATE stock_move
SET is_done=COALESCE(state in ('done', 'cancel'), FALSE);""")
def _create_warehouse_data(cr, registry):
""" This hook is used to add a default manufacture_pull_id, manufacture
picking_type on every warehouse. It is necessary if the mrp module is
installed after some warehouses were already created.
"""
env = api.Environment(cr, SUPERUSER_ID, {})
warehouse_ids = env['stock.warehouse'].search([('manufacture_pull_id', '=', False)])
warehouse_ids.write({'manufacture_to_resupply': True})
def uninstall_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
warehouses = env["stock.warehouse"].search([])
subcontracting_routes = warehouses.mapped("pbm_route_id")
warehouses.write({"pbm_route_id": False})
# Fail unlink means that the route is used somewhere (e.g. route_id on stock.rule). In this case
# we don't try to do anything.
try:
subcontracting_routes.unlink()
except:
pass