Skip to content

Commit 6c41c30

Browse files
committed
[UPD] edi_purchase_oca: Update for edi configuration
1 parent 450c902 commit 6c41c30

12 files changed

+164
-28
lines changed

edi_purchase_oca/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import models
2+
from . import components

edi_purchase_oca/__manifest__.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
"author": "ForgeFlow, Odoo Community Association (OCA)",
1111
"website": "https://github.com/OCA/edi",
1212
"depends": ["purchase", "edi_oca", "component_event"],
13-
"data": ["views/purchase_order_views.xml", "views/edi_exchange_record_views.xml"],
13+
"data": [
14+
"views/purchase_order_views.xml",
15+
"views/edi_exchange_record_views.xml",
16+
"views/res_partner_view.xml",
17+
"data/edi_configuration.xml",
18+
],
1419
"demo": [],
1520
}
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import listener_purchase_order
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Copyright 2024 Camptocamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
4+
from odoo.addons.component.core import Component
5+
6+
7+
class EDIConfigPurchaseListener(Component):
8+
_name = "edi.listener.config.purchase.order"
9+
_inherit = "base.event.listener"
10+
_apply_on = ["purchase.order"]
11+
12+
def on_button_confirm_purchase_order(self, record):
13+
trigger = "on_button_confirm_purchase_order"
14+
confs = record.partner_id.edi_purchase_conf_ids.edi_get_conf(trigger)
15+
for conf in confs:
16+
conf.edi_exec_snippet_do(record)

edi_purchase_oca/data/edi_configuration.xml

+2-14
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<odoo>
3-
<record id="edi_conf_button_confirm_purchase_order" model="edi.configuration">
4-
<field name="name">Purchase Confirmation Config</field>
5-
<field name="code">on_button_confirm_purchase_order</field>
6-
<field name="trigger">on_button_confirm_purchase_order</field>
7-
<field name="model" ref="purchase.model_purchase_order" />
8-
<field name="snippet_before_do">
9-
result={
10-
"snippet_var_do": {}
11-
}
12-
</field>
13-
<field name="snippet_do" />
14-
</record>
153
<record id="edi_conf_send_via_email" model="edi.configuration">
16-
<field name="name">Send EDI Quoctation Config</field>
4+
<field name="name">Send EDI Quotation Config</field>
175
<field name="code">send_via_email_rfq</field>
18-
<field name="trigger">send_via_email_rfq</field>
6+
<field name="trigger">on_send_via_email_rfq</field>
197
<field
208
name="snippet_do"
219
>record._edi_send_via_email(ir_action=record.action_rfq_send())</field>

edi_purchase_oca/models/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
from . import purchase_order
2+
from . import res_partner
3+
from . import edi_configuration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Copyright 2024 Camptocamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
4+
from odoo import fields, models
5+
6+
7+
class EdiConfiguration(models.Model):
8+
_inherit = "edi.configuration"
9+
10+
trigger = fields.Selection(
11+
selection_add=[
12+
("on_button_confirm_purchase_order", "On Button Confirm Purchase Order"),
13+
("on_send_via_email_rfq", "Send via Email RFQ"),
14+
],
15+
ondelete={
16+
"on_button_confirm_purchase_order": "set default",
17+
"on_send_via_email_rfq": "set default",
18+
},
19+
)

edi_purchase_oca/models/purchase_order.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
class PurchaseOrder(models.Model):
88
_name = "purchase.order"
9-
_inherit = ["purchase.order", "edi.exchange.consumer.mixin"]
9+
_inherit = [
10+
"purchase.order",
11+
"edi.exchange.consumer.mixin",
12+
]
1013

1114
def button_confirm(self):
12-
result = super().button_confirm()
13-
if self:
14-
self._event("on_button_confirm_purchase_order").notify(self)
15-
return result
15+
res = super().button_confirm()
16+
self._event("on_button_confirm_purchase_order").notify(self)
17+
return res
1618

1719
def button_cancel(self):
1820
result = super().button_cancel()

edi_purchase_oca/models/res_partner.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,5 @@ class ResPartner(models.Model):
1414
relation="res_partner_edi_configuration_rel",
1515
column1="partner_id",
1616
column2="conf_id",
17-
# TODO: Domain for Purchase model
18-
domain="[('model_name', '=', 'purchase.order')]"
17+
domain="[('model_name', '=', 'purchase.order')]",
1918
)

edi_purchase_oca/tests/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_edi_configuration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Copyright 2024 CamptoCamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
4+
import mock
5+
6+
from odoo.exceptions import UserError
7+
8+
from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentRegistryTestCase
9+
10+
11+
class TestsPurchaseEDIConfiguration(EDIBackendCommonComponentRegistryTestCase):
12+
@classmethod
13+
def setUpClass(cls):
14+
super().setUpClass()
15+
cls._load_module_components(cls, "edi_purchase_oca")
16+
cls.edi_configuration = cls.env["edi.configuration"]
17+
cls.purchase_order = cls.env["purchase.order"]
18+
cls.product = cls.env["product.product"].create(
19+
{
20+
"name": "Product 1",
21+
"default_code": "1234567",
22+
}
23+
)
24+
25+
def setUp(self):
26+
super().setUp()
27+
self.confirm_conf = self.env["edi.configuration"].create(
28+
{
29+
"name": "Purchase Confirmation Config",
30+
"active": True,
31+
"code": "on_button_confirm_purchase_order",
32+
"trigger": "on_button_confirm_purchase_order",
33+
"model_id": self.env["ir.model"]._get_id("purchase.order"),
34+
}
35+
)
36+
self.partner.write({"edi_purchase_conf_ids": [(4, self.confirm_conf.id)]})
37+
38+
def test_edi_configuration_snippet_before_do(self):
39+
order = self.purchase_order.create(
40+
{
41+
"partner_id": self.partner.id,
42+
"order_line": [
43+
(
44+
0,
45+
0,
46+
{
47+
"product_id": self.product.id,
48+
"product_qty": 10,
49+
"price_unit": 100.0,
50+
},
51+
)
52+
],
53+
}
54+
)
55+
self.assertTrue(order)
56+
self.assertEqual(order.state, "draft")
57+
58+
# Replace snippet_before_do for test
59+
self.confirm_conf.snippet_before_do = "record.button_cancel()"
60+
order.button_confirm()
61+
# After purchase order is confirmed
62+
# it will be automatically canceled due to edi_configuration execution.
63+
self.assertEqual(order.state, "cancel")
64+
65+
def test_edi_configuration_snippet_do(self):
66+
self.confirm_conf.write(
67+
{
68+
"backend_id": self.backend.id,
69+
"type_id": self.exchange_type_out.id,
70+
"snippet_do": "record._edi_send_via_edi(conf.type_id)",
71+
}
72+
)
73+
with mock.patch.object(
74+
type(self.backend), "exchange_generate", return_value=True
75+
):
76+
77+
with self.assertRaises(UserError) as err:
78+
order = self.purchase_order.create(
79+
{
80+
"partner_id": self.partner.id,
81+
"order_line": [
82+
(
83+
0,
84+
0,
85+
{
86+
"product_id": self.product.id,
87+
"product_qty": 10,
88+
"price_unit": 100.0,
89+
},
90+
)
91+
],
92+
}
93+
)
94+
order.button_confirm()
95+
self.assertRegex(
96+
err.exception.args[0], r"Record ID=\d+ has no file to send!"
97+
)

edi_purchase_oca/views/res_partner_view.xml

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8" ?>
22
<odoo>
33
<record id="view_partner_form_inherit" model="ir.ui.view">
44
<field name="name">res.partner.form.inherit.sales_purchases</field>
55
<field name="model">res.partner</field>
66
<field name="inherit_id" ref="base.view_partner_form" />
77
<field name="arch" type="xml">
8-
<xpath expr="//page[@name='sales_purchases']" position="inside">
9-
<group string="Edi Configuration">
10-
<field name="edi_purchase_conf_ids"
11-
context="{'default_model_name': 'purchase.order', 'default_partner_ids': active_ids}" />
12-
</group>
8+
<xpath expr="//notebook" position="inside">
9+
<page name="edi_configuration" string="Edi Configurations">
10+
<group string="EDI Purchase Configurations">
11+
<field
12+
name="edi_purchase_conf_ids"
13+
widget="one2many_list"
14+
nolabel="1"
15+
/>
16+
</group>
17+
</page>
1318
</xpath>
1419
</field>
1520
</record>

0 commit comments

Comments
 (0)