From 0550da4d880ad2cd387bf17577de4776d10da867 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 20 Apr 2017 13:19:26 +0200 Subject: [PATCH] [FIX] mrp: public/rpc methods not returning any value XML-RPC can't serialize None, as a result methods callable over RPC must return something (True, False, an actual value) otherwise an error is generated when their result is serialized and sent back to the client. It happens that JSON-RPC has different limitations and can serialize None, so MRP had multiple button/action methods which could be called over JSON-RPC but would break when called in XML-RPC for no reason. Fix them by returning `True` or result of `write`. OPW-728844 --- addons/mrp/models/mrp_production.py | 6 ++++-- addons/mrp/models/mrp_unbuild.py | 2 +- addons/mrp/models/mrp_workorder.py | 12 ++++++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py index 6cbaf4c6629..8a637080c3b 100644 --- a/addons/mrp/models/mrp_production.py +++ b/addons/mrp/models/mrp_production.py @@ -410,7 +410,7 @@ class MrpProduction(models.Model): quantity = order.product_uom_id._compute_quantity(order.product_qty, order.bom_id.product_uom_id) / order.bom_id.product_qty boms, lines = order.bom_id.explode(order.product_id, quantity, picking_type=order.bom_id.picking_type_id) order._generate_workorders(boms) - orders_to_plan.write({'state': 'planned'}) + return orders_to_plan.write({'state': 'planned'}) @api.multi def _generate_workorders(self, exploded_boms): @@ -539,17 +539,19 @@ class MrpProduction(models.Model): moves_to_cancel.action_cancel() self.write({'state': 'done', 'date_finished': fields.Datetime.now()}) self.env["procurement.order"].search([('production_id', 'in', self.ids)]).check() - self.write({'state': 'done'}) + return self.write({'state': 'done'}) @api.multi def do_unreserve(self): for production in self: production.move_raw_ids.filtered(lambda x: x.state not in ('done', 'cancel')).do_unreserve() + return True @api.multi def button_unreserve(self): self.ensure_one() self.do_unreserve() + return True @api.multi def button_scrap(self): diff --git a/addons/mrp/models/mrp_unbuild.py b/addons/mrp/models/mrp_unbuild.py index 5b426901256..dc22a8e87f1 100644 --- a/addons/mrp/models/mrp_unbuild.py +++ b/addons/mrp/models/mrp_unbuild.py @@ -131,7 +131,7 @@ class MrpUnbuild(models.Model): produced_quant_ids = produce_moves.mapped('quant_ids').filtered(lambda quant: quant.qty > 0) consume_move.quant_ids.sudo().write({'produced_quant_ids': [(6, 0, produced_quant_ids.ids)]}) - self.write({'state': 'done'}) + return self.write({'state': 'done'}) def _generate_consume_moves(self): moves = self.env['stock.move'] diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py index 23cd851b780..86107856873 100644 --- a/addons/mrp/models/mrp_workorder.py +++ b/addons/mrp/models/mrp_workorder.py @@ -342,6 +342,7 @@ class MrpWorkorder(models.Model): self.final_lot_id = False if self.qty_produced >= self.production_id.product_qty: self.button_finish() + return True @api.multi def button_start(self): @@ -369,7 +370,7 @@ class MrpWorkorder(models.Model): 'date_start': datetime.now(), 'user_id': self.env.user.id }) - self.write({'state': 'progress', + return self.write({'state': 'progress', 'date_start': datetime.now(), }) @@ -377,7 +378,7 @@ class MrpWorkorder(models.Model): def button_finish(self): self.ensure_one() self.end_all() - self.write({'state': 'done', 'date_finished': fields.Datetime.now()}) + return self.write({'state': 'done', 'date_finished': fields.Datetime.now()}) @api.multi def end_previous(self, doall=False): @@ -405,6 +406,7 @@ class MrpWorkorder(models.Model): if not len(loss_id): raise UserError(_("You need to define at least one unactive productivity loss in the category 'Performance'. Create one from the Manufacturing app, menu: Configuration / Productivity Losses.")) timeline.copy({'date_start': maxdate, 'date_end': enddate, 'loss_id': loss_id.id}) + return True @api.multi def end_all(self): @@ -413,22 +415,24 @@ class MrpWorkorder(models.Model): @api.multi def button_pending(self): self.end_previous() + return True @api.multi def button_unblock(self): for order in self: order.workcenter_id.unblock() + return True @api.multi def action_cancel(self): - self.write({'state': 'cancel'}) + return self.write({'state': 'cancel'}) @api.multi def button_done(self): if any([x.state in ('done', 'cancel') for x in self]): raise UserError(_('A Manufacturing Order is already done or cancelled!')) self.end_all() - self.write({'state': 'done', + return self.write({'state': 'done', 'date_finished': datetime.now()}) @api.multi