This branch is the combination of several optimizations in the ORM: * store field values once in the cache: the cache reflects more faithfully the database, only fields that explicitly depend on the context have an extra indirection in the cache; * delay recomputations by default: use method `recompute` to explicitly flush out pending recomputations; * delay updates in method `write`: updates are stored in a data structure that can be flushed efficiently to the database with method `flush` (which also flush out recomputations); * make method `modified` take advantage of inverse fields to inverse dependencies; * filter records by evaluating a domain on records in Python; * a computed field with `readonly=False` behaves like a normal field with an onchange method; * computed fields are computed in superuser mode by default. Work done by Toufik Ben Jaa, Raphael Collet, Denis Ledoux and Fabien Pinckaers. closes odoo/odoo#35659 Signed-off-by: Denis Ledoux <beledouxdenis@users.noreply.github.com>
71 lines
3.1 KiB
Python
71 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import fields, models
|
|
|
|
|
|
class StockPickingType(models.Model):
|
|
_inherit = 'stock.picking.type'
|
|
|
|
code = fields.Selection(selection_add=[('mrp_operation', 'Manufacturing')])
|
|
count_mo_todo = fields.Integer(string="Number of Manufacturing Orders to Process",
|
|
compute='_get_mo_count')
|
|
count_mo_waiting = fields.Integer(string="Number of Manufacturing Orders Waiting",
|
|
compute='_get_mo_count')
|
|
count_mo_late = fields.Integer(string="Number of Manufacturing Orders Late",
|
|
compute='_get_mo_count')
|
|
use_create_components_lots = fields.Boolean(
|
|
string="Create New Lots/Serial Numbers for Components",
|
|
help="Allow to create new lot/serial numbers for the components",
|
|
default=False,
|
|
)
|
|
|
|
def _get_mo_count(self):
|
|
mrp_picking_types = self.filtered(lambda picking: picking.code == 'mrp_operation')
|
|
if not mrp_picking_types:
|
|
self.count_mo_waiting = False
|
|
self.count_mo_todo = False
|
|
self.count_mo_late = False
|
|
return
|
|
domains = {
|
|
'count_mo_waiting': [('reservation_state', '=', 'waiting')],
|
|
'count_mo_todo': ['|', ('state', 'in', ('confirmed', 'draft', 'planned', 'progress'))],
|
|
'count_mo_late': [('date_planned_start', '<', fields.Date.today()), ('state', '=', 'confirmed')],
|
|
}
|
|
for field in domains:
|
|
data = self.env['mrp.production'].read_group(domains[field] +
|
|
[('state', 'not in', ('done', 'cancel')), ('picking_type_id', 'in', self.ids)],
|
|
['picking_type_id'], ['picking_type_id'])
|
|
count = {x['picking_type_id'] and x['picking_type_id'][0]: x['picking_type_id_count'] for x in data}
|
|
for record in mrp_picking_types:
|
|
record[field] = count.get(record.id, 0)
|
|
remaining = (self - mrp_picking_types)
|
|
if remaining:
|
|
remaining.count_mo_waiting = False
|
|
remaining.count_mo_todo = False
|
|
remaining.count_mo_late = False
|
|
|
|
def get_mrp_stock_picking_action_picking_type(self):
|
|
return self._get_action('mrp.mrp_production_action_picking_deshboard')
|
|
|
|
class StockPicking(models.Model):
|
|
_inherit = 'stock.picking'
|
|
|
|
def _less_quantities_than_expected_add_documents(self, moves, documents):
|
|
documents = super(StockPicking, self)._less_quantities_than_expected_add_documents(moves, documents)
|
|
|
|
def _keys_in_sorted(move):
|
|
""" sort by picking and the responsible for the product the
|
|
move.
|
|
"""
|
|
return (move.raw_material_production_id.id, move.product_id.responsible_id.id)
|
|
|
|
def _keys_in_groupby(move):
|
|
""" group by picking and the responsible for the product the
|
|
move.
|
|
"""
|
|
return (move.raw_material_production_id, move.product_id.responsible_id)
|
|
|
|
production_documents = self._log_activity_get_documents(moves, 'move_dest_ids', 'DOWN', _keys_in_sorted, _keys_in_groupby)
|
|
return {**documents, **production_documents}
|