[WIP] mail_message.message_read(): WIP about having correct expandables. Will be updated next week.
bzr revid: tde@openerp.com-20120907160920-4ijs93y9ogp39xma
This commit is contained in:
+42
-17
@@ -167,7 +167,24 @@ class mail_message(osv.Model):
|
||||
'child_ids': [],
|
||||
}
|
||||
|
||||
def message_read_tree_flatten(self, cr, uid, messages, current_level, level, context=None):
|
||||
def message_read_tree_get_expandable(self, cr, uid, parent_message, last_message, domain=[], current_level=0, level=0, context=None):
|
||||
""" . """
|
||||
base_domain = [('id', '<', last_message['id'])]
|
||||
if parent_message and current_level < level:
|
||||
base_domain += [('parent_id', '=', parent_message['id'])]
|
||||
elif parent_message:
|
||||
base_domain += [('id', 'child_od', parent_message['id'])]
|
||||
if domain:
|
||||
base_domain += domain
|
||||
extension = { 'type': 'expandable',
|
||||
'domain': base_domain,
|
||||
'thread_level': current_level,
|
||||
'context': context,
|
||||
'id': -1,
|
||||
}
|
||||
return extension
|
||||
|
||||
def message_read_tree_flatten(self, cr, uid, parent_message, messages, current_level, level, domain=[], context=None):
|
||||
""" Given a tree with several roots of following structure :
|
||||
[ {'id': 1, 'child_ids': [
|
||||
{'id': 11, 'child_ids': [...] },],
|
||||
@@ -186,28 +203,36 @@ class mail_message(osv.Model):
|
||||
child_ids = msg_dict.pop('child_ids', [])
|
||||
msg_dict['child_ids'] = []
|
||||
return [msg_dict] + child_ids
|
||||
# return sorted([msg_dict] + child_ids, key=itemgetter('id'), reverse=True)
|
||||
context = context or {}
|
||||
# Depth-first flattening
|
||||
for message in messages:
|
||||
if message.get('type') == 'expandable':
|
||||
continue
|
||||
message['child_ids'] = self.message_read_tree_flatten(cr, uid, message['child_ids'], current_level + 1, level, context=context)
|
||||
message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], current_level + 1, level, domain, context=context)
|
||||
# Flatten if above maximum depth
|
||||
if current_level < level:
|
||||
return_list = messages
|
||||
else:
|
||||
return_list = []
|
||||
for message in messages:
|
||||
for flat_message in _flatten(message):
|
||||
return_list.append(flat_message)
|
||||
return sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True))
|
||||
return_list = [flat_message for message in messages for flat_message in _flatten(message)]
|
||||
# Add expandable
|
||||
return_list = sorted(return_list, key=itemgetter(context.get('sort_key', 'id')), reverse=context.get('sort_reverse', True))
|
||||
if current_level <= level:
|
||||
expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, [], current_level, level, context=context)
|
||||
print 'expandable', expandable
|
||||
return return_list
|
||||
|
||||
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 fetch the matching records.
|
||||
After having fetched the records provided by IDs, it will fetch the
|
||||
parents to have well-formed threads.
|
||||
def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, limit=None, tree_parent_id=False):
|
||||
""" Read messages from mail.message, and get back a structured tree
|
||||
of messages to be displayed as discussion threads. If IDs is set,
|
||||
fetch these records. Otherwise use the domain to fetch messages.
|
||||
After having fetch messages, their parents will be added to obtain
|
||||
well formed threads.
|
||||
|
||||
:param domain: optional domain for searching ids
|
||||
:param level: level of threads to display, 0 being flat
|
||||
:param limit: number of messages to fetch
|
||||
:param tree_parent_id: if parent_id reached, stop searching for
|
||||
further parents
|
||||
:return list: list of trees of messages
|
||||
"""
|
||||
limit = limit or self._message_read_limit
|
||||
@@ -221,8 +246,8 @@ class mail_message(osv.Model):
|
||||
for msg in messages:
|
||||
if len(result) < (limit - 1):
|
||||
record = self._message_dict_get(cr, uid, msg, context=context)
|
||||
if thread_level and msg.parent_id:
|
||||
while msg.parent_id:
|
||||
if level and msg.parent_id:
|
||||
while msg.parent_id != tree_parent_id:
|
||||
if msg.parent_id.id in tree:
|
||||
record_parent = tree[msg.parent_id.id]
|
||||
else:
|
||||
@@ -241,14 +266,14 @@ class mail_message(osv.Model):
|
||||
'type': 'expandable',
|
||||
'domain': [('id', '<=', msg.id)] + domain,
|
||||
'context': context,
|
||||
'thread_level': thread_level, # should be improve accodting to level of records
|
||||
'thread_level': level, # should be improve accodting to level of records
|
||||
'id': -1,
|
||||
})
|
||||
break
|
||||
|
||||
# Flatten the result
|
||||
if thread_level > 0:
|
||||
result = self.message_read_tree_flatten(cr, uid, result, 0, thread_level, context=context)
|
||||
result = self.message_read_tree_flatten(cr, uid, None, result, 0, thread_level, domain, context=context)
|
||||
return result
|
||||
|
||||
#------------------------------------------------------
|
||||
|
||||
@@ -41,5 +41,4 @@ class res_partner_mail(osv.Model):
|
||||
'notification_email_send': lambda *args: 'comment'
|
||||
}
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -459,13 +459,13 @@ class test_mail(common.TransactionCase):
|
||||
cr, uid = self.cr, self.uid
|
||||
group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
|
||||
def _compare_structures(struct1, struct2, n=0):
|
||||
# print '%scompare structure' % ('\t' * n)
|
||||
print '%scompare structure' % ('\t' * n)
|
||||
self.assertEqual(len(struct1), len(struct2), 'message_read structure number of childs incorrect')
|
||||
for x in range(len(struct1)):
|
||||
# print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or ''
|
||||
print '%s' % ('\t' * n), struct1[x]['id'], struct2[x]['id'], struct1[x].get('subject') or ''
|
||||
self.assertEqual(struct1[x]['id'], struct2[x]['id'], 'message_read failure %s' % struct1[x].get('subject'))
|
||||
_compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1)
|
||||
# print '%send compare' % ('\t' * n)
|
||||
print '%send compare' % ('\t' * n)
|
||||
|
||||
# ----------------------------------------
|
||||
# CASE1: Flattening test
|
||||
@@ -490,7 +490,8 @@ class test_mail(common.TransactionCase):
|
||||
]},
|
||||
]
|
||||
# Test: completely flat
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 0)
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 0, [('type', 'in', 'borderlands')])
|
||||
_compare_structures(new_tree, new_tree)
|
||||
self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat')
|
||||
# Test: 1 thread level
|
||||
tree_test = [{'id': 2, 'child_ids': [
|
||||
@@ -502,10 +503,10 @@ class test_mail(common.TransactionCase):
|
||||
{'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []},
|
||||
]},
|
||||
]
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 1)
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 1, [('type', 'in', 'borderlands')])
|
||||
_compare_structures(new_tree, tree_test)
|
||||
# Test: 2 thread levels
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, copy.deepcopy(tree), 0, 2)
|
||||
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), 0, 2, [('type', 'in', 'borderlands')])
|
||||
_compare_structures(new_tree, tree)
|
||||
|
||||
# ----------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user