Skip to content

Commit b95a32c

Browse files
[MIG] sale_cancel_reason: Migration to 19.0
1 parent 2006788 commit b95a32c

File tree

9 files changed

+101
-43
lines changed

9 files changed

+101
-43
lines changed

sale_cancel_reason/__manifest__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55

66
{
77
"name": "Sale Cancel Reason",
8-
"version": "18.0.1.0.0",
8+
"version": "19.0.1.0.0",
99
"author": "Camptocamp,Odoo Community Association (OCA)",
1010
"category": "Sale",
1111
"license": "AGPL-3",
1212
"complexity": "normal",
1313
"website": "https://github.com/OCA/sale-workflow",
1414
"depends": ["sale"],
1515
"data": [
16-
"wizard/cancel_reason_view.xml",
17-
"wizard/mass_cancel_orders_view.xml",
18-
"view/sale_view.xml",
19-
"security/ir.model.access.csv",
2016
"data/sale_order_cancel_reason.xml",
17+
"security/ir.model.access.csv",
18+
"view/sale_view.xml",
19+
"wizard/sale_order_cancel_wizard_views.xml",
20+
"wizard/mass_cancel_orders_view.xml",
2121
],
2222
"auto_install": False,
2323
"installable": True,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# Copyright 2013 Guewen Baconnier, Camptocamp SA
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
33

4-
from . import sale
4+
from . import sale_order
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ class SaleOrder(models.Model):
1616
copy=False,
1717
)
1818

19-
def _show_cancel_wizard(self):
20-
for order in self:
21-
if not order._context.get("disable_cancel_warning"):
22-
return True
23-
return False
24-
2519
def action_draft(self):
2620
res = super().action_draft()
2721
self.write({"cancel_reason_id": False})
2822
return res
2923

24+
def action_cancel_wizard(self):
25+
self.ensure_one()
26+
return self.env["sale.order.cancel.wizard"]._get_records_action(
27+
target="new", context={"default_order_id": self.id}
28+
)
29+
3030

3131
class SaleOrderCancelReason(models.Model):
3232
_name = "sale.order.cancel.reason"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
22
access_sale_order_cancel_reason_user,access_sale_order_cancel_reason user,model_sale_order_cancel_reason,sales_team.group_sale_salesman,1,0,0,0
33
access_sale_order_cancel_reason_manager,access_sale_order_cancel_reason manager,model_sale_order_cancel_reason,sales_team.group_sale_manager,1,1,1,1
4+
access_sale_order_cancel_wizard,access.sale.order.cancel.wizard,model_sale_order_cancel_wizard,sales_team.group_sale_salesman,1,1,1,1

sale_cancel_reason/tests/test_sale_cancel_reason.py

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,41 @@
11
# Copyright 2013 Guewen Baconnier, Camptocamp SA
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
33

4-
from odoo.tests.common import TransactionCase
4+
from odoo import Command
5+
from odoo.tests import Form, TransactionCase
56

67

78
class TestSaleCancelReason(TransactionCase):
89
@classmethod
910
def setUpClass(cls):
1011
super().setUpClass()
12+
1113
SaleOrder = cls.env["sale.order"]
1214
CancelReason = cls.env["sale.order.cancel.reason"]
15+
1316
cls.reason = CancelReason.create({"name": "Canceled for tests"})
14-
cls.partner = cls.env.ref("base.res_partner_2")
15-
cls.product = cls.env.ref("product.product_product_7")
17+
cls.partner = cls.env["res.partner"].create(
18+
{
19+
"name": "Test Customer",
20+
}
21+
)
22+
cls.product = cls.env["product.product"].create(
23+
{
24+
"name": "Test Product",
25+
"type": "consu",
26+
"sale_ok": True,
27+
"standard_price": 99.9,
28+
}
29+
)
1630
cls.sale_order_1 = SaleOrder.create(
1731
{
1832
"partner_id": cls.partner.id,
1933
"order_line": [
20-
(0, 0, {"product_id": cls.product.id, "product_uom_qty": 8})
34+
Command.create({"product_id": cls.product.id, "product_uom_qty": 8})
2135
],
2236
}
2337
)
38+
2439
cls.sale_order_2 = cls.sale_order_1.copy()
2540
cls.sale_orders = cls.sale_order_1 + cls.sale_order_2
2641

@@ -29,7 +44,7 @@ def test_sale_order_cancel_reason(self):
2944
- Cancel a sales order with the wizard asking for the reason.
3045
- Then the sale order should be canceled and the reason stored.
3146
"""
32-
SaleOrderCancel = self.env["sale.order.cancel"]
47+
SaleOrderCancel = self.env["sale.order.cancel.wizard"]
3348
wizard = SaleOrderCancel.create(
3449
{"reason_id": self.reason.id, "order_id": self.sale_order_1.id}
3550
)
@@ -55,3 +70,24 @@ def test_sale_order_cancel_reason_mass_cancel(self):
5570
{"cancel_reason_id": self.reason.id},
5671
],
5772
)
73+
74+
def test_sale_order_cancel_draft(self):
75+
"""
76+
When the order is canceled and then turned back to "draft", the cancellation
77+
reason should be removed.
78+
"""
79+
with Form.from_action(
80+
self.env, self.sale_order_1.action_cancel_wizard()
81+
) as form:
82+
form.reason_id = self.reason
83+
wizard = form.save()
84+
85+
wizard.action_cancel()
86+
87+
self.assertEqual(self.sale_order_1.state, "cancel")
88+
self.assertEqual(self.sale_order_1.cancel_reason_id, self.reason)
89+
90+
self.sale_order_1.action_draft()
91+
92+
self.assertEqual(self.sale_order_1.state, "draft")
93+
self.assertFalse(self.sale_order_1.cancel_reason_id)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# © 2013 Guewen Baconnier, Camptocamp SA
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
33

4-
from . import cancel_reason, mass_cancel_orders
4+
from . import mass_cancel_orders
5+
from . import sale_order_cancel_wizard

sale_cancel_reason/wizard/cancel_reason_view.xml

Lines changed: 0 additions & 23 deletions
This file was deleted.

sale_cancel_reason/wizard/cancel_reason.py renamed to sale_cancel_reason/wizard/sale_order_cancel_wizard.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,20 @@
77
class SaleOrderCancel(models.TransientModel):
88
"""Ask a reason for the sale order cancellation."""
99

10-
_inherit = "sale.order.cancel"
10+
_name = "sale.order.cancel.wizard"
11+
_description = "Sale Order Cancel Wizard"
1112

13+
order_id = fields.Many2one(
14+
comodel_name="sale.order",
15+
string="Order",
16+
required=True,
17+
ondelete="cascade",
18+
)
1219
reason_id = fields.Many2one(
1320
"sale.order.cancel.reason", string="Reason", required=True
1421
)
1522

1623
def action_cancel(self):
24+
self.ensure_one()
1725
self.order_id.cancel_reason_id = self.reason_id
18-
return super().action_cancel()
26+
return self.order_id.action_cancel()
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="sale_order_cancel_wizard_view_form" model="ir.ui.view">
4+
<field name="name">sale.order.cancel.wizard.view.form</field>
5+
<field name="model">sale.order.cancel.wizard</field>
6+
<field name="arch" type="xml">
7+
<form>
8+
<sheet>
9+
<p>
10+
Are you sure you want to cancel this order? This may affect related documents or processes.
11+
</p>
12+
<p>
13+
Choose the reason for the cancellation of the
14+
sale order.
15+
</p>
16+
<group>
17+
<field
18+
name="reason_id"
19+
options="{'no_create': True, 'no_open': True}"
20+
/>
21+
</group>
22+
</sheet>
23+
<footer>
24+
<button
25+
name="action_cancel"
26+
type="object"
27+
string="Cancel"
28+
class="btn-primary"
29+
/>
30+
<button special="cancel" string="Discard" class="btn-secondary" />
31+
</footer>
32+
</form>
33+
</field>
34+
</record>
35+
</odoo>

0 commit comments

Comments
 (0)