diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index be2803261e7..4688b752578 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -679,12 +679,11 @@ class purchase_order(osv.osv):
def action_cancel(self, cr, uid, ids, context=None):
for purchase in self.browse(cr, uid, ids, context=context):
for pick in purchase.picking_ids:
- if pick.state not in ('draft', 'cancel'):
+ if pick.state not in ('draft', 'cancel', 'confirmed'):
raise osv.except_osv(
_('Unable to cancel the purchase order %s.') % (purchase.name),
_('First cancel all receipts related to this purchase order.'))
- self.pool.get('stock.picking') \
- .signal_workflow(cr, uid, map(attrgetter('id'), purchase.picking_ids), 'button_cancel')
+ self.pool.get('stock.picking').action_cancel(cr, uid, map(attrgetter('id'), purchase.picking_ids), context=context)
for inv in purchase.invoice_ids:
if inv and inv.state not in ('cancel', 'draft'):
raise osv.except_osv(
@@ -692,9 +691,6 @@ class purchase_order(osv.osv):
_('You must first cancel all invoices related to this purchase order.'))
self.pool.get('account.invoice') \
.signal_workflow(cr, uid, map(attrgetter('id'), purchase.invoice_ids), 'invoice_cancel')
- self.pool['purchase.order.line'].write(cr, uid, [l.id for l in purchase.order_line],
- {'state': 'cancel'})
- self.write(cr, uid, ids, {'state': 'cancel'})
self.set_order_line_status(cr, uid, ids, 'cancel', context=context)
self.signal_workflow(cr, uid, ids, 'purchase_cancel')
return True
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 239bc990ff2..1ccd8af6011 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -202,8 +202,7 @@
-
-
+