[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
This commit is contained in:
Xavier Morel
2017-04-25 15:41:31 +02:00
committed by Nicolas Martinelli
parent 79519ce400
commit 0550da4d88
3 changed files with 13 additions and 7 deletions
+4 -2
View File
@@ -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):
+1 -1
View File
@@ -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']
+8 -4
View File
@@ -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