Skip to content

Commit fbd53ad

Browse files
committed
pattern_import_export: fix o2m purge option
1 parent e896fd6 commit fbd53ad

File tree

5 files changed

+102
-8
lines changed

5 files changed

+102
-8
lines changed

pattern_import_export/demo/demo.xml

+36
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@
3535
<field name="name">Partner with contact</field>
3636
<field name="resource">res.partner</field>
3737
</record>
38+
<record id="demo_export_currency" model="ir.exports">
39+
<field name="name">Currency</field>
40+
<field name="resource">res.currency</field>
41+
</record>
42+
<record id="demo_export_currency_rate" model="ir.exports">
43+
<field name="name">Currency Rate</field>
44+
<field name="resource">res.currency.rate</field>
45+
</record>
46+
3847
<record id="demo_pattern_config" model="pattern.config">
3948
<field name="export_id" ref="pattern_import_export.demo_export" />
4049
</record>
@@ -44,6 +53,15 @@
4453
<record id="demo_pattern_config_o2m" model="pattern.config">
4554
<field name="export_id" ref="pattern_import_export.demo_export_o2m" />
4655
</record>
56+
<record id="demo_pattern_config_currency" model="pattern.config">
57+
<field name="export_id" ref="pattern_import_export.demo_export_currency" />
58+
</record>
59+
<record id="demo_pattern_config_currency_rate" model="pattern.config">
60+
<field
61+
name="export_id"
62+
ref="pattern_import_export.demo_export_currency_rate"
63+
/>
64+
</record>
4765

4866
<!--Export lines-->
4967
<record id="demo_export_line_1" model="ir.exports.line">
@@ -104,5 +122,23 @@
104122
<field name="tab_filter_id" ref="demo_filter_countries_1" />
105123
<field name="add_select_tab" eval="True" />
106124
</record>
125+
<record id="demo_export_currency_rate_ids" model="ir.exports.line">
126+
<field name="name">rate_ids</field>
127+
<field name="export_id" ref="demo_export_currency" />
128+
<field name="number_occurence">3</field>
129+
<field
130+
name="sub_pattern_config_id"
131+
ref="demo_pattern_config_currency_rate"
132+
/>
133+
</record>
134+
<record id="demo_export_currency_rate_name" model="ir.exports.line">
135+
<field name="name">name</field>
136+
<field name="export_id" ref="demo_export_currency_rate" />
137+
</record>
138+
<record id="demo_export_currency_rate_rate" model="ir.exports.line">
139+
<field name="name">rate</field>
140+
<field name="export_id" ref="demo_export_currency_rate" />
141+
</record>
142+
107143
</data>
108144
</odoo>

pattern_import_export/models/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
from . import pattern_file
99
from . import pattern_chunk
1010
from . import ir_attachment
11+
from . import fields
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Copyright 2023 Akretion (https://www.akretion.com).
2+
# @author Sébastien BEAU <[email protected]>
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
5+
6+
from odoo import fields
7+
8+
ori_write_real = fields.One2many.write_real
9+
10+
11+
def write_real(self, records_commands_list, create=False):
12+
if not create:
13+
for recs, commands in records_commands_list:
14+
if recs.env.context.get("pattern_config", {}).get("purge_one2many"):
15+
update_ids = [cmd[1] for cmd in commands if cmd[0] == 1]
16+
for item in recs[self.name]:
17+
if item.id not in update_ids:
18+
commands.append((3, item.id, 0))
19+
return ori_write_real(self, records_commands_list, create=create)
20+
21+
22+
fields.One2many.write_real = write_real

pattern_import_export/models/ir_fields.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,4 @@ def _str_to_one2many(self, model, field, records):
155155
# raising an error with the split
156156
# see original method called by super
157157
records[0][".id"] = str(records[0][".id"])
158-
commands, warnings = super()._str_to_one2many(model, field, records)
159-
if self._context.get("pattern_config", {}).get("purge_one2many"):
160-
commands.insert(0, (5, 0, 0))
161-
return commands, warnings
158+
return super()._str_to_one2many(model, field, records)

pattern_import_export/tests/test_pattern_import.py

+42-4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ def setUpClass(cls):
1414
super().setUpClass()
1515
cls.pattern_config_m2m.export_format = "json"
1616
cls.pattern_config.export_format = "json"
17+
cls.pattern_config_currency = cls.env.ref(
18+
"pattern_import_export.demo_pattern_config_currency"
19+
)
20+
cls.pattern_config_currency.export_format = "json"
1721

1822
def run_pattern_file(self, pattern_file):
1923
model = self.env[pattern_file.pattern_config_id.model_id.model].with_context(
@@ -331,7 +335,7 @@ def test_o2m_with_empty_value(self):
331335
self.assertEqual(partners[0].name, unique_name)
332336
self.assertEqual(partners[0].child_ids, partners[1])
333337

334-
def _helper_o2m_update(self):
338+
def _case_o2m_update_no_delete_cascade(self):
335339
unique_name = str(uuid4())
336340
partner = self.env["res.partner"].create(
337341
{
@@ -359,20 +363,54 @@ def _helper_o2m_update(self):
359363
self.assertPatternDone(pattern_file)
360364
return partner, child_1, child_2
361365

362-
def test_o2m_update_with_purge(self):
366+
def _case_o2m_update_with_delete_cascade(self):
367+
currency = self.env.ref("base.EUR")
368+
currency.write(
369+
{
370+
"rate_ids": [
371+
(5, 0, 0),
372+
(0, 0, {"name": "1999-12-02", "rate": 1}),
373+
(0, 0, {"name": "2000-01-30", "rate": 2}),
374+
]
375+
}
376+
)
377+
data = [
378+
{
379+
".id": currency.id,
380+
"rate_ids|1|name#key": "1999-12-02",
381+
"rate_ids|1|rate": 1.5,
382+
"rate_ids|2|name#key": "2022-01-01",
383+
"rate_ids|2|rate": 3,
384+
}
385+
]
386+
pattern_file = self.create_pattern(self.pattern_config_currency, "import", data)
387+
self.run_pattern_file(pattern_file)
388+
self.assertPatternDone(pattern_file)
389+
return currency
390+
391+
def test_o2m_update_with_purge_no_delete_cascade(self):
363392
self.pattern_config.purge_one2many = True
364-
partner, child_1, child_2 = self._helper_o2m_update()
393+
partner, child_1, child_2 = self._case_o2m_update_no_delete_cascade()
365394
self.assertEqual(len(partner.child_ids), 3)
366395
self.assertIn(child_1, partner.child_ids)
367396
self.assertNotIn(child_2, partner.child_ids)
368397

369398
def test_o2m_update_without_purge(self):
370399
self.pattern_config.purge_one2many = False
371-
partner, child_1, child_2 = self._helper_o2m_update()
400+
partner, child_1, child_2 = self._case_o2m_update_no_delete_cascade()
372401
self.assertEqual(len(partner.child_ids), 4)
373402
self.assertIn(child_1, partner.child_ids)
374403
self.assertIn(child_2, partner.child_ids)
375404

405+
def test_o2m_update_with_purge_with_delete_cascade(self):
406+
self.pattern_config_currency.purge_one2many = True
407+
currency = self._case_o2m_update_with_delete_cascade()
408+
self.assertEqual(len(currency.rate_ids), 2)
409+
410+
def test_o2m_update_without_purge_with_delete_cascade(self):
411+
currency = self._case_o2m_update_with_delete_cascade()
412+
self.assertEqual(len(currency.rate_ids), 3)
413+
376414
def test_empty_m2m_with_o2m(self):
377415
unique_name = str(uuid4())
378416
partner2_name = str(uuid4())

0 commit comments

Comments
 (0)