From a797b27865032daa5a4de0362ddcaf0ee3f695e2 Mon Sep 17 00:00:00 2001 From: Andrii Skrypka Date: Wed, 14 Aug 2019 17:07:34 +0300 Subject: [PATCH] [IMP] quality_control_stock: use read_group --- quality_control_stock/README.rst | 1 + quality_control_stock/models/stock_picking.py | 33 +++++++++++-------- .../models/stock_production_lot.py | 30 +++++++++-------- quality_control_stock/readme/CONTRIBUTORS.rst | 1 + 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/quality_control_stock/README.rst b/quality_control_stock/README.rst index 02f97945e3..31c972259a 100644 --- a/quality_control_stock/README.rst +++ b/quality_control_stock/README.rst @@ -66,6 +66,7 @@ Contributors * Pedro M. Baeza * Oihane Crucelaegui * Simone Rubino +* Andrii Skrypka Maintainers ~~~~~~~~~~~ diff --git a/quality_control_stock/models/stock_picking.py b/quality_control_stock/models/stock_picking.py index ecdc5db8c2..9fd97249a9 100644 --- a/quality_control_stock/models/stock_picking.py +++ b/quality_control_stock/models/stock_picking.py @@ -1,5 +1,6 @@ # Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza # Copyright 2018 Simone Rubino - Agile Business Group +# Copyright 2019 Andrii Skrypka # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, fields, models @@ -10,20 +11,6 @@ class StockPicking(models.Model): _inherit = 'stock.picking' - @api.multi - @api.depends('qc_inspections_ids', 'qc_inspections_ids.state') - def _compute_count_inspections(self): - for picking in self: - picking.created_inspections = len(picking.qc_inspections_ids) - picking.passed_inspections = \ - len([x for x in picking.qc_inspections_ids - if x.state == 'success']) - picking.failed_inspections = \ - len([x for x in picking.qc_inspections_ids - if x.state == 'failed']) - picking.done_inspections = \ - (picking.passed_inspections + picking.failed_inspections) - qc_inspections_ids = fields.One2many( comodel_name='qc.inspection', inverse_name='picking_id', copy=False, string='Inspections', help="Inspections related to this picking.") @@ -36,6 +23,24 @@ def _compute_count_inspections(self): failed_inspections = fields.Integer( compute="_compute_count_inspections", string="Inspections failed") + @api.depends('qc_inspections_ids', 'qc_inspections_ids.state') + def _compute_count_inspections(self): + data = self.env['qc.inspection'].read_group([ + ('id', 'in', self.mapped('qc_inspections_ids').ids), + ], ['picking_id', 'state'], ['picking_id', 'state'], lazy=False) + picking_data = {} + for d in data: + picking_data.setdefault(d['picking_id'][0], {})\ + .setdefault(d['state'], 0) + picking_data[d['picking_id'][0]][d['state']] += d['__count'] + for picking in self: + count_data = picking_data.get(picking.id, {}) + picking.created_inspections = sum(count_data.values()) + picking.passed_inspections = count_data.get('success', 0) + picking.failed_inspections = count_data.get('failed', 0) + picking.done_inspections = \ + (picking.passed_inspections + picking.failed_inspections) + @api.multi def action_done(self): res = super(StockPicking, self).action_done() diff --git a/quality_control_stock/models/stock_production_lot.py b/quality_control_stock/models/stock_production_lot.py index 1d74eb1e13..16aff56344 100644 --- a/quality_control_stock/models/stock_production_lot.py +++ b/quality_control_stock/models/stock_production_lot.py @@ -8,19 +8,6 @@ class StockProductionLot(models.Model): _inherit = 'stock.production.lot' - @api.multi - @api.depends('qc_inspections_ids', 'qc_inspections_ids.state') - def _compute_count_inspections(self): - for lot in self: - lot.created_inspections = len(lot.qc_inspections_ids) - lot.passed_inspections = \ - len([x for x in lot.qc_inspections_ids - if x.state == 'success']) - lot.failed_inspections = \ - len([x for x in lot.qc_inspections_ids if x.state == 'failed']) - lot.done_inspections = \ - (lot.passed_inspections + lot.failed_inspections) - qc_inspections_ids = fields.One2many( comodel_name='qc.inspection', inverse_name='lot_id', copy=False, string='Inspections', help="Inspections related to this lot.") @@ -32,3 +19,20 @@ def _compute_count_inspections(self): compute="_compute_count_inspections", string="Inspections OK") failed_inspections = fields.Integer( compute="_compute_count_inspections", string="Inspections failed") + + @api.depends('qc_inspections_ids', 'qc_inspections_ids.state') + def _compute_count_inspections(self): + data = self.env['qc.inspection'].read_group([ + ('id', 'in', self.mapped('qc_inspections_ids').ids), + ], ['lot_id', 'state'], ['lot_id', 'state'], lazy=False) + lot_data = {} + for d in data: + lot_data.setdefault(d['lot_id'][0], {}).setdefault(d['state'], 0) + lot_data[d['lot_id'][0]][d['state']] += d['__count'] + for lot in self: + count_data = lot_data.get(lot.id, {}) + lot.created_inspections = sum(count_data.values()) + lot.passed_inspections = count_data.get('success', 0) + lot.failed_inspections = count_data.get('failed', 0) + lot.done_inspections = \ + (lot.passed_inspections + lot.failed_inspections) diff --git a/quality_control_stock/readme/CONTRIBUTORS.rst b/quality_control_stock/readme/CONTRIBUTORS.rst index 8754a7d883..e021392628 100644 --- a/quality_control_stock/readme/CONTRIBUTORS.rst +++ b/quality_control_stock/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * Pedro M. Baeza * Oihane Crucelaegui * Simone Rubino +* Andrii Skrypka