[FIX] [TEST] mail_message: added a flattening method, to flatten the result structure of message according to a given number of thread level. Added some tests that go with that feature.

bzr revid: tde@openerp.com-20120828142634-gfsjjih4mr1n2lyt
This commit is contained in:
Thibault Delavallée
2012-08-28 16:26:34 +02:00
parent 720ddfd5c8
commit c791b22a8c
2 changed files with 94 additions and 24 deletions
+45
View File
@@ -173,6 +173,46 @@ class mail_message(osv.Model):
'child_ids': [],
}
def message_read_tree_flatten(self, cr, uid, messages, current_level, level, context=None):
""" Given a tree with several roots of following structure :
[
{'id': 1, 'child_ids':[
{'id': 11, 'child_ids': [...] },
] },
{...}
]
Flatten it to have a maximum number of level, with 0 being
completely flat.
Perform the flattening at leafs if above the maximum depth, then get
back in the tree.
"""
def _flatten(msg_dict):
""" from {'id': x, 'child_ids': [{child1}, {child2}]}
get [{'id': x, 'child_ids': []}, {child1}, {child2}]
"""
child_ids = msg_dict.pop('child_ids', [])
msg_dict['child_ids'] = []
return [msg_dict] + child_ids
# Depth-first flattening
for message in messages:
message['child_ids'] = self.message_read_tree_flatten(cr, uid, message['child_ids'], current_level+1, level, context=context)
# Flatten if above maximum depth
if current_level < level:
return messages
new_list = []
for x in range(0, len(messages)):
flatenned = _flatten(messages[x])
for flat in flatenned:
new_list.append(flat)
messages = new_list
return messages
def _debug_print_tree(self, tree, prefix=''):
for elem in tree:
print '%s%s (%s childs: %s)' % (prefix, elem['id'], len(elem['child_ids']), [xelem['id'] for xelem in elem['child_ids']])
if elem['child_ids']:
self._debug_print_tree(elem['child_ids'], prefix+'--')
def message_read(self, cr, uid, ids=False, domain=[], thread_level=0, limit=None, context=None):
"""
If IDS are provided, fetch these records, otherwise use the domain to
@@ -219,6 +259,11 @@ class mail_message(osv.Model):
'thread_level': thread_level # should be improve accodting to level of records
})
break
# Flatten the result
if thread_level > 0:
result = self.message_read_tree_flatten(cr, uid, result, 0, thread_level, context=context)
return result
+49 -24
View File
@@ -322,41 +322,66 @@ class test_mail(common.TransactionCase):
cr, uid = self.cr, self.uid
group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
# Test message_read_tree_flatten that flattens a thread according to a given thread_level
import copy
tree = [
{'id': 1, 'child_ids':[
{'id': 3, 'child_ids': [] },
{'id': 4, 'child_ids': [
{'id': 5, 'child_ids': []},
{'id': 12, 'child_ids': []},
] },
{'id': 8, 'child_ids': [
{'id': 10, 'child_ids': []},
] },
] },
{'id': 2, 'child_ids': [
{'id': 7, 'child_ids': [
{'id': 9, 'child_ids': []},
] },
] },
{'id': 6, 'child_ids': [
{'id': 11, 'child_ids': [] },
] },
]
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 0)
# self.mail_message._debug_print_tree(new_tree)
# print '-------------------'
self.assertTrue(len(new_tree) == 12, 'Flattening wrongly produced')
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 1)
# self.mail_message._debug_print_tree(new_tree)
# print '-------------------'
self.assertTrue(len(new_tree) == 3 and len(new_tree[0]['child_ids']) == 6 and len(new_tree[1]['child_ids']) == 2 and len(new_tree[2]['child_ids']) == 1,
'Flattening wrongly produced')
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 2)
# self.mail_message._debug_print_tree(new_tree)
# print '-------------------'
self.assertTrue(len(new_tree) == 3 and len(new_tree[0]['child_ids']) == 3 and len(new_tree[0]['child_ids'][1]) == 2,
'Flattening wrongly produced')
# Add a few messages to pigs group
msgid1 = group_pigs.message_post(body='My Body', subject='1', parent_id=False)
msgid2 = group_pigs.message_post(body='My Body', subject='1-1', parent_id=msgid1)
msgid3 = group_pigs.message_post(body='My Body', subject='1-2', parent_id=msgid1)
msgid4 = group_pigs.message_post(body='My Body', subject='2', parent_id=False)
msgid5 = group_pigs.message_post(body='My Body', subject='1-1-1', parent_id=msgid2)
# msgid6 = group_pigs.message_post(body='My Body', subject='2-1', parent_id=msgid4)
# msgid7 = group_pigs.message_post(body='My Body', subject='1-3', parent_id=msgid1)
# msgid8 = group_pigs.message_post(body='My Body', subject='1-3-1', parent_id=msgid7)
msgid6 = group_pigs.message_post(body='My Body', subject='2-1', parent_id=msgid4)
# First try: read flat
# first_try_ids = [msgid8, msgid7, msgid6, msgid5, msgid4, msgid3, msgid2, msgid1]
# res = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=0)
first_try_ids = [msgid6, msgid5, msgid4, msgid3, msgid2, msgid1]
tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=0)
self.assertTrue(all(elem['id'] in first_try_ids for elem in tree) and len(tree) == 6,
'Incorrect structure and/or number of childs in purely flat message_read')
# Second try: read with thread_level 1
res = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=1)
# print '----'
# self.mail_message._debug_print_tree(res)
# print '----'
tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=1)
# self.mail_message._debug_print_tree(tree)
self.assertTrue(len(tree) == 2 and len(tree[1]['child_ids']) == 3, 'Incorrect number of child in message_read')
self.assertTrue(len(res) == 2, 'Incorrect number of child in message_read')
self.assertTrue(len(res[0]['child_ids']) == 2, 'Incorrect number of child in message_read')
self.assertTrue(len(res[0]['child_ids'][0]['child_ids']) == 1, 'Incorrect number of child in message_read')
# trees = self.mail_message.message_read_tree_flatten_main(cr, uid, res, thread_level=0)
# print '----'
# self.mail_message._debug_print_tree(trees)
# print '----'
res = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=1)
# trees = self.mail_message.message_read_tree_flatten_main(cr, uid, res, thread_level=1)
# print '----'
# self.mail_message._debug_print_tree(trees)
# print '----'
self.assertTrue(len(res) == 3, 'Incorrect number of child in message_read')
# Third try: read with thread_level 2
tree = self.mail_message.message_read(cr, uid, ids=False, domain=[('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)], thread_level=2)
# self.mail_message._debug_print_tree(tree)
self.assertTrue(len(tree) == 2 and len(tree[1]['child_ids']) == 2 and len(tree[1]['child_ids'][0]['child_ids']) == 1, 'Incorrect number of child in message_read')
def test_40_needaction(self):
""" Tests for mail.message needaction. """