From 3a5dc3644176f02ebf184447605313431d6e0fed Mon Sep 17 00:00:00 2001 From: Benoit Aimont Date: Thu, 12 Mar 2020 10:49:05 +0100 Subject: [PATCH] [IMP] purchase_request - unlinking of a pr or a prl is only possible if pr is draft --- purchase_request/models/purchase_request.py | 12 ++++++ .../models/purchase_request_line.py | 12 ++++++ .../tests/test_purchase_request.py | 42 +++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/purchase_request/models/purchase_request.py b/purchase_request/models/purchase_request.py index aaa025f026a..bc02d98cfe5 100644 --- a/purchase_request/models/purchase_request.py +++ b/purchase_request/models/purchase_request.py @@ -234,6 +234,18 @@ def write(self, vals): request.message_subscribe(partner_ids=[partner_id]) return res + def _can_be_deleted(self): + self.ensure_one() + return self.state == "draft" + + def unlink(self): + for request in self: + if not request._can_be_deleted(): + raise UserError( + _("You cannot delete a purchase request which is not draft.") + ) + return super(PurchaseRequest, self).unlink() + def button_draft(self): self.mapped("line_ids").do_uncancel() return self.write({"state": "draft"}) diff --git a/purchase_request/models/purchase_request_line.py b/purchase_request/models/purchase_request_line.py index e381c51c5b7..a1bd80700af 100644 --- a/purchase_request/models/purchase_request_line.py +++ b/purchase_request/models/purchase_request_line.py @@ -380,9 +380,21 @@ def _calc_new_qty(self, request_line, po_line=None, new_pr_line=False): qty = max(rl_qty, supplierinfo_min_qty) return qty + def _can_be_deleted(self): + self.ensure_one() + return self.request_state == "draft" + def unlink(self): if self.mapped("purchase_lines"): raise UserError( _("You cannot delete a record that refers to purchase " "lines!") ) + for line in self: + if not line._can_be_deleted(): + raise UserError( + _( + "You can only delete a purchase request line " + "if the purchase request is in draft state." + ) + ) return super(PurchaseRequestLine, self).unlink() diff --git a/purchase_request/tests/test_purchase_request.py b/purchase_request/tests/test_purchase_request.py index 6550960c271..efd02555141 100644 --- a/purchase_request/tests/test_purchase_request.py +++ b/purchase_request/tests/test_purchase_request.py @@ -1,6 +1,7 @@ # Copyright 2018-2019 ForgeFlow, S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0) +from odoo import exceptions from odoo.exceptions import UserError from odoo.tests.common import Form, TransactionCase from odoo.tools import SUPERUSER_ID @@ -31,10 +32,15 @@ def test_purchase_request_status(self): purchase_request = self.purchase_request purchase_request.write({"assigned_to": SUPERUSER_ID}) self.assertEqual(purchase_request.is_editable, True, "Should be editable") + self.assertEqual(purchase_request.state, "draft", "Should be in state draft") purchase_request.button_to_approve() self.assertEqual( purchase_request.state, "to_approve", "Should be in state to_approve" ) + with self.assertRaises(exceptions.UserError) as e: + purchase_request.unlink() + msg = "You cannot delete a purchase request which is not draft." + self.assertIn(msg, e.exception.name) self.assertEqual(purchase_request.is_editable, False, "Should not be editable") purchase_request.button_draft() self.assertEqual(purchase_request.is_editable, True, "Should be editable") @@ -42,6 +48,10 @@ def test_purchase_request_status(self): purchase_request.button_to_approve() purchase_request.button_done() self.assertEqual(purchase_request.is_editable, False, "Should not be editable") + with self.assertRaises(exceptions.UserError) as e: + purchase_request.unlink() + msg = "You cannot delete a purchase request which is not draft." + self.assertIn(msg, e.exception.name) purchase_request.button_rejected() self.assertEqual(purchase_request.is_editable, False, "Should not be editable") vals = { @@ -70,6 +80,12 @@ def test_purchase_request_status(self): purchase.button_cancel() self.assertEqual(purchase.state, "cancel") purchase_request_line._compute_purchase_state() + with self.assertRaises(exceptions.UserError) as e: + purchase_request.unlink() + msg = "You cannot delete a purchase request which is not draft." + self.assertIn(msg, e.exception.name) + purchase_request.button_draft() + purchase_request.unlink() def test_auto_reject(self): """Tests if a Purchase Request is autorejected when all lines are @@ -201,3 +217,29 @@ def test_raise_error(self): ).create(vals) with self.assertRaises(UserError): wiz_id.make_purchase_order() + + def test_purchase_request_unlink(self): + pr = self.purchase_request + pr_lines = pr.line_ids + + pr.button_to_approve() + self.assertEqual(pr.state, "to_approve", "Should be in state to_approve") + with self.assertRaises(exceptions.UserError) as e: + pr_lines.unlink() + msg = ( + "You can only delete a purchase request line " + "if the purchase request is in draft state." + ) + self.assertIn(msg, e.exception.name) + pr.button_done() + self.assertEqual(pr.state, "done", "Should be in state done") + with self.assertRaises(exceptions.UserError) as e: + pr_lines.unlink() + msg = ( + "You can only delete a purchase request line " + "if the purchase request is in draft state." + ) + self.assertIn(msg, e.exception.name) + pr.button_draft() + self.assertEqual(pr.state, "draft", "Should be in state draft") + pr_lines.unlink()