Skip to content

Commit 09d18f5

Browse files
committed
[IMP] util.delete_unused
Allow to include (some) m2m tables in the search of usage of records. It can be useful to include m2m when removing records that are expected to be used as m2m, like tags. closes #354 Related: odoo/upgrade#8869 Signed-off-by: Christophe Simonis (chs) <chs@odoo.com>
1 parent 1ddb691 commit 09d18f5

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/base/tests/test_util.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,6 +1942,24 @@ def test_delete_unused_multi_cascade_fk(self):
19421942
self.assertTrue(cat_2.exists())
19431943
self.assertTrue(cat_3.exists())
19441944

1945+
def test_delete_unused_include_m2m(self):
1946+
cat_1, cat_2, cat_3 = self._prepare_test_delete_unused()
1947+
1948+
cr = self.env.cr
1949+
cr.execute(
1950+
"INSERT INTO res_partner_res_partner_category_rel(partner_id, category_id) VALUES(%s, %s)",
1951+
[util.ref(cr, "base.partner_root"), cat_2.id],
1952+
)
1953+
1954+
deleted = util.delete_unused(
1955+
self.env.cr, f"base.{cat_1.name}", f"base.{cat_2.name}", f"base.{cat_3.name}", include_m2m="*"
1956+
)
1957+
1958+
self.assertEqual(deleted, [f"base.{cat_3.name}"])
1959+
self.assertTrue(cat_1.exists())
1960+
self.assertTrue(cat_2.exists())
1961+
self.assertFalse(cat_3.exists())
1962+
19451963

19461964
class TestEditView(UnitTestCase):
19471965
@parametrize(

src/util/records.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
format_query,
5050
get_columns,
5151
get_fk,
52+
get_m2m_tables,
5253
get_value_or_en_translation,
5354
parallel_execute,
5455
table_exists,
@@ -1282,11 +1283,14 @@ def delete_unused(cr, *xmlids, **kwargs):
12821283
:param bool keep_xmlids: whether to keep the xml_ids of records that cannot be
12831284
removed. By default `True` for versions up to 18.0,
12841285
`False` from `saas~18.1` on.
1286+
:param list(str) or str include_m2m: list of m2m tables to include in the search.
1287+
`"*"` for all.
12851288
:return: list of ids of removed records, if any
12861289
:rtype: list(int)
12871290
"""
12881291
deactivate = kwargs.pop("deactivate", False)
12891292
keep_xmlids = kwargs.pop("keep_xmlids", not version_gte("saas~18.1"))
1293+
include_m2m = kwargs.pop("include_m2m", ())
12901294
if kwargs:
12911295
raise TypeError("delete_unused() got an unexpected keyword argument %r" % kwargs.popitem()[0])
12921296

@@ -1358,12 +1362,14 @@ def delete_unused(cr, *xmlids, **kwargs):
13581362
else:
13591363
kids_query = format_query(cr, "SELECT id, ARRAY[id] AS children FROM {0} WHERE id = ANY(%(ids)s)", table)
13601364

1365+
m2m_tables = include_m2m if include_m2m != "*" else get_m2m_tables(cr, table)
1366+
13611367
sub = " UNION ALL ".join(
13621368
[
13631369
format_query(cr, "SELECT 1 FROM {} x WHERE x.{} = ANY(s.children)", fk_tbl, fk_col)
13641370
for fk_tbl, fk_col, _, fk_act in get_fk(cr, table, quote_ident=False)
13651371
# ignore "on delete cascade" fk (they are indirect dependencies (lines or m2m))
1366-
if fk_act != "c"
1372+
if (fk_act != "c" or fk_tbl in m2m_tables)
13671373
# ignore children records unless the deletion is restricted
13681374
if not (fk_tbl == table and fk_act != "r")
13691375
]

0 commit comments

Comments
 (0)