forked from Mapan/odoo17e
143 lines
6.5 KiB
Python
143 lines
6.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import Command
|
|
from odoo.tests.common import new_test_user
|
|
|
|
from unittest.mock import patch
|
|
|
|
from . import test_common
|
|
|
|
class TestMerge(test_common.TestCommon):
|
|
def test_generic_merge(self):
|
|
self._create_rule('x_name', 'exact')
|
|
|
|
rec = self._create_record('x_dm_test_model', x_name='toto')
|
|
rec2 = self._create_record('x_dm_test_model', x_name='toto')
|
|
ref = self._create_record('x_dm_test_model_ref', x_name='ref toto', x_test_id=rec2.id)
|
|
self.MyModel.find_duplicates()
|
|
|
|
groups = self.env['data_merge.group'].search([('model_id', '=', self.MyModel.id)])
|
|
self.assertEqual(len(groups), 1, 'Should have found 1 group')
|
|
|
|
group = groups[0]
|
|
records = group.record_ids
|
|
master_record = records.filtered('is_master')
|
|
other_record = records - master_record
|
|
|
|
self.assertEqual(master_record._original_records(), rec, "the 1st record created should be the master")
|
|
self.assertEqual(ref.x_test_id, rec2, "The reference should be to rec2")
|
|
|
|
group.merge_records()
|
|
self.assertFalse(other_record.exists(), "record should be unlinked")
|
|
self.assertEqual(ref.x_test_id, rec, "The reference should be to rec")
|
|
|
|
def test_generic_insensitive_rule(self):
|
|
self._create_rule('x_name', 'accent')
|
|
for name in ('accentuée', 'accentuee', 'Accentuée', 'Accentué'):
|
|
self._create_record('x_dm_test_model', x_name=name)
|
|
self.MyModel.find_duplicates()
|
|
|
|
groups = self.env['data_merge.group'].search([('model_id', '=', self.MyModel.id)])
|
|
self.assertEqual(len(groups), 1, 'Should have found 1 group')
|
|
self.assertEqual(len(groups.record_ids), 3, 'First group must contains three records: ("accentuée", "accentue", "Accentuée")')
|
|
self.assertNotIn('Accentué', groups[0].record_ids.mapped('display_name'), 'Group must not contains "Accentué"')
|
|
|
|
def test_mixed_case_fields(self):
|
|
'''
|
|
Tests mixed case fields query on _update_foreign_keys
|
|
'''
|
|
self.DMTestModel3 = self.env['ir.model'].create({
|
|
'name': 'Test Model 3',
|
|
'model': 'x_dm_test_model3',
|
|
'field_id': [
|
|
(0, 0, {'name': 'x_name', 'ttype': 'char', 'field_description': 'Name'}),
|
|
(
|
|
0, 0, {'name': 'x_studio_many2one_field_nKSEu', 'ttype': 'many2one', 'field_description': 'studio test',
|
|
'relation': 'x_dm_test_model', 'index': True}),
|
|
]
|
|
})
|
|
self.test_generic_merge()
|
|
|
|
def test_cleanup_deleted_records(self):
|
|
self._create_rule('x_name', 'exact')
|
|
|
|
self._create_record('x_dm_test_model', x_name='toto')
|
|
rec2 = self._create_record('x_dm_test_model', x_name='toto')
|
|
rec3 = self._create_record('x_dm_test_model', x_name='toto')
|
|
|
|
self.MyModel.find_duplicates()
|
|
|
|
group = self.env['data_merge.group'].search([('model_id', '=', self.MyModel.id)])
|
|
|
|
rec2.unlink()
|
|
self.assertEqual(len(group.record_ids), 3, 'The group must contains 3 records')
|
|
|
|
group._cleanup()
|
|
self.assertEqual(len(group.record_ids), 2, 'The group must contains 2 records')
|
|
|
|
rec3.unlink()
|
|
group._cleanup()
|
|
self.assertFalse(group.record_ids, 'The group should not contains any records')
|
|
|
|
def test_delete_merge_model(self):
|
|
self._create_rule("x_name", "exact")
|
|
|
|
self._create_record("x_dm_test_model", x_name="toto")
|
|
self._create_record("x_dm_test_model", x_name="toto")
|
|
|
|
# Update the model to notify a user
|
|
user = new_test_user(self.env, login="merge_user", groups="base.group_system")
|
|
self.MyModel.write({
|
|
"merge_mode": "manual",
|
|
"notify_user_ids": [Command.link(user.id)],
|
|
})
|
|
|
|
# Call the cron so it creates the notification messages
|
|
self.MyModel._cron_find_duplicates()
|
|
|
|
group = self.env["data_merge.group"].search(
|
|
[("model_id", "=", self.MyModel.id)]
|
|
)
|
|
messages = self.env["mail.message"].search(
|
|
[("model", "=", "data_merge.model"), ("res_id", "=", self.MyModel.id)]
|
|
)
|
|
self.assertEqual(len(group.record_ids), 2, "The group must contains 2 records")
|
|
self.assertTrue(messages, "Notification messages should have been created")
|
|
|
|
self.MyModel.unlink()
|
|
|
|
self.assertFalse(group.record_ids, "The group should not contains any records")
|
|
self.assertFalse(messages.exists(), "The messages should have been deleted")
|
|
|
|
def test_merge_company_dependent(self):
|
|
company1 = self.env['res.company'].create({'name': "CompanyA"})
|
|
company2 = self.env['res.company'].create({'name': "CompanyB"})
|
|
|
|
rec = self._create_record('x_dm_test_model_cd', x_name='toto')
|
|
rec2 = self._create_record('x_dm_test_model_cd', x_name='toto')
|
|
|
|
field = self.env['ir.model.fields']._get('x_dm_test_model_cd', 'x_cd')
|
|
fid = field.id
|
|
# rec.with_company(self.company1).write({'x_cd': 'one'})
|
|
self.env['ir.property'].create({'res_id': f'x_dm_test_model_cd,{rec.id}', 'fields_id': fid, 'company_id': company1.id, 'value_text': 'one'})
|
|
# rec2.with_company(self.company1).write({'x_cd': 'twoA'})
|
|
self.env['ir.property'].create({'res_id': f'x_dm_test_model_cd,{rec2.id}', 'fields_id': fid, 'company_id': company1.id, 'value_text': 'twoA'})
|
|
# rec2.with_company(self.company2).write({'x_cd': 'twoB'})
|
|
self.env['ir.property'].create({'res_id': f'x_dm_test_model_cd,{rec2.id}', 'fields_id': fid, 'company_id': company2.id, 'value_text': 'twoB'})
|
|
|
|
model = self.DMModel.create({
|
|
'name': 'Test Model',
|
|
'res_model_id': self.DMTestModelCompanyDependent.id,
|
|
'merge_mode': 'automatic'
|
|
})
|
|
|
|
self.DMRule.create({
|
|
'model_id': model.id,
|
|
'field_id': self.env['ir.model.fields']._get('x_dm_test_model_cd', 'x_name').id,
|
|
'match_mode': 'exact'
|
|
})
|
|
|
|
model.find_duplicates()
|
|
self.assertEqual(self.env['ir.property'].search([('fields_id', '=', fid), ('company_id', '=', company1.id), ('res_id', '=', f'x_dm_test_model_cd,{rec.id}')]).value_text, 'one', 'The original field value should stay')
|
|
self.assertEqual(self.env['ir.property'].search([('fields_id', '=', fid), ('company_id', '=', company2.id), ('res_id', '=', f'x_dm_test_model_cd,{rec.id}')]).value_text, 'twoB', 'The new field value should be available on the master record')
|