Skip to content

Commit

Permalink
pattern_import_export: fix o2m purge option
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastienbeau committed Mar 12, 2023
1 parent e896fd6 commit fbd53ad
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 8 deletions.
36 changes: 36 additions & 0 deletions pattern_import_export/demo/demo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,15 @@
<field name="name">Partner with contact</field>
<field name="resource">res.partner</field>
</record>
<record id="demo_export_currency" model="ir.exports">
<field name="name">Currency</field>
<field name="resource">res.currency</field>
</record>
<record id="demo_export_currency_rate" model="ir.exports">
<field name="name">Currency Rate</field>
<field name="resource">res.currency.rate</field>
</record>

<record id="demo_pattern_config" model="pattern.config">
<field name="export_id" ref="pattern_import_export.demo_export" />
</record>
Expand All @@ -44,6 +53,15 @@
<record id="demo_pattern_config_o2m" model="pattern.config">
<field name="export_id" ref="pattern_import_export.demo_export_o2m" />
</record>
<record id="demo_pattern_config_currency" model="pattern.config">
<field name="export_id" ref="pattern_import_export.demo_export_currency" />
</record>
<record id="demo_pattern_config_currency_rate" model="pattern.config">
<field
name="export_id"
ref="pattern_import_export.demo_export_currency_rate"
/>
</record>

<!--Export lines-->
<record id="demo_export_line_1" model="ir.exports.line">
Expand Down Expand Up @@ -104,5 +122,23 @@
<field name="tab_filter_id" ref="demo_filter_countries_1" />
<field name="add_select_tab" eval="True" />
</record>
<record id="demo_export_currency_rate_ids" model="ir.exports.line">
<field name="name">rate_ids</field>
<field name="export_id" ref="demo_export_currency" />
<field name="number_occurence">3</field>
<field
name="sub_pattern_config_id"
ref="demo_pattern_config_currency_rate"
/>
</record>
<record id="demo_export_currency_rate_name" model="ir.exports.line">
<field name="name">name</field>
<field name="export_id" ref="demo_export_currency_rate" />
</record>
<record id="demo_export_currency_rate_rate" model="ir.exports.line">
<field name="name">rate</field>
<field name="export_id" ref="demo_export_currency_rate" />
</record>

</data>
</odoo>
1 change: 1 addition & 0 deletions pattern_import_export/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@
from . import pattern_file
from . import pattern_chunk
from . import ir_attachment
from . import fields
22 changes: 22 additions & 0 deletions pattern_import_export/models/fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2023 Akretion (https://www.akretion.com).
# @author Sébastien BEAU <[email protected]>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).


from odoo import fields

ori_write_real = fields.One2many.write_real


def write_real(self, records_commands_list, create=False):
if not create:
for recs, commands in records_commands_list:
if recs.env.context.get("pattern_config", {}).get("purge_one2many"):
update_ids = [cmd[1] for cmd in commands if cmd[0] == 1]
for item in recs[self.name]:
if item.id not in update_ids:
commands.append((3, item.id, 0))
return ori_write_real(self, records_commands_list, create=create)


fields.One2many.write_real = write_real
5 changes: 1 addition & 4 deletions pattern_import_export/models/ir_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,4 @@ def _str_to_one2many(self, model, field, records):
# raising an error with the split
# see original method called by super
records[0][".id"] = str(records[0][".id"])
commands, warnings = super()._str_to_one2many(model, field, records)
if self._context.get("pattern_config", {}).get("purge_one2many"):
commands.insert(0, (5, 0, 0))
return commands, warnings
return super()._str_to_one2many(model, field, records)
46 changes: 42 additions & 4 deletions pattern_import_export/tests/test_pattern_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ def setUpClass(cls):
super().setUpClass()
cls.pattern_config_m2m.export_format = "json"
cls.pattern_config.export_format = "json"
cls.pattern_config_currency = cls.env.ref(
"pattern_import_export.demo_pattern_config_currency"
)
cls.pattern_config_currency.export_format = "json"

def run_pattern_file(self, pattern_file):
model = self.env[pattern_file.pattern_config_id.model_id.model].with_context(
Expand Down Expand Up @@ -331,7 +335,7 @@ def test_o2m_with_empty_value(self):
self.assertEqual(partners[0].name, unique_name)
self.assertEqual(partners[0].child_ids, partners[1])

def _helper_o2m_update(self):
def _case_o2m_update_no_delete_cascade(self):
unique_name = str(uuid4())
partner = self.env["res.partner"].create(
{
Expand Down Expand Up @@ -359,20 +363,54 @@ def _helper_o2m_update(self):
self.assertPatternDone(pattern_file)
return partner, child_1, child_2

def test_o2m_update_with_purge(self):
def _case_o2m_update_with_delete_cascade(self):
currency = self.env.ref("base.EUR")
currency.write(
{
"rate_ids": [
(5, 0, 0),
(0, 0, {"name": "1999-12-02", "rate": 1}),
(0, 0, {"name": "2000-01-30", "rate": 2}),
]
}
)
data = [
{
".id": currency.id,
"rate_ids|1|name#key": "1999-12-02",
"rate_ids|1|rate": 1.5,
"rate_ids|2|name#key": "2022-01-01",
"rate_ids|2|rate": 3,
}
]
pattern_file = self.create_pattern(self.pattern_config_currency, "import", data)
self.run_pattern_file(pattern_file)
self.assertPatternDone(pattern_file)
return currency

def test_o2m_update_with_purge_no_delete_cascade(self):
self.pattern_config.purge_one2many = True
partner, child_1, child_2 = self._helper_o2m_update()
partner, child_1, child_2 = self._case_o2m_update_no_delete_cascade()
self.assertEqual(len(partner.child_ids), 3)
self.assertIn(child_1, partner.child_ids)
self.assertNotIn(child_2, partner.child_ids)

def test_o2m_update_without_purge(self):
self.pattern_config.purge_one2many = False
partner, child_1, child_2 = self._helper_o2m_update()
partner, child_1, child_2 = self._case_o2m_update_no_delete_cascade()
self.assertEqual(len(partner.child_ids), 4)
self.assertIn(child_1, partner.child_ids)
self.assertIn(child_2, partner.child_ids)

def test_o2m_update_with_purge_with_delete_cascade(self):
self.pattern_config_currency.purge_one2many = True
currency = self._case_o2m_update_with_delete_cascade()
self.assertEqual(len(currency.rate_ids), 2)

def test_o2m_update_without_purge_with_delete_cascade(self):
currency = self._case_o2m_update_with_delete_cascade()
self.assertEqual(len(currency.rate_ids), 3)

def test_empty_m2m_with_o2m(self):
unique_name = str(uuid4())
partner2_name = str(uuid4())
Expand Down

0 comments on commit fbd53ad

Please sign in to comment.