From c28a29c44c638504f201a90107c7cc189c2ffda4 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Wed, 3 Oct 2012 09:28:45 +0200 Subject: [PATCH] [IMP]mail: expandable py bzr revid: chm@openerp.com-20121003072845-64bufx2dj3qdpjm2 --- addons/mail/mail_message.py | 167 +++++++++++---------------------- addons/mail/tests/test_mail.py | 42 --------- 2 files changed, 55 insertions(+), 154 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index bbf68509277..ff91a771cde 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -221,70 +221,64 @@ class mail_message(osv.Model): 'unread': msg.unread and msg.unread['unread'] or False } - 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_of', parent_message['id']), ('id', '!=', 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, domain=[], level=0, current_level=0, context=None, limit=None, add_expandable=True): - """ 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 levels, 0 being flat and - sort messages in a level according to a key of the messages. - Perform the flattening at leafs if above the maximum depth, then get - back in the tree. - :param context: ``sort_key``: key for sorting (id by default) - :param context: ``sort_reverse``: reverser order for sorting (True by default) + def message_read_expandable(self, cr, uid, tree, result, message_loaded, domain, context, parent_id, limit): + """ + create the expandable message for all parent message read """ - 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 - context = context or {} - limit = limit or self._message_read_limit + tree_not = [] + # expandable for not show message + for id_msg in tree: + # get all childs + not_loaded_ids = self.search(cr, SUPERUSER_ID, [['parent_id','=',id_msg],['id','not in',message_loaded]], None, limit=1000) + # group childs not read + id_min=None + id_max=None + nb=0 + for not_loaded_id in not_loaded_ids: + if not_loaded_id not in tree: + nb+=1 + if id_min==None or id_min>not_loaded_id: + id_min=not_loaded_id + if id_max==None or id_max0: + result.append({ + 'domain': [['id','>=',id_min],['id','<=',id_max],['parent_id','=',id_msg]], + 'nb_messages': nb, + 'type': 'expandable', + 'parent_id': id_msg, + 'id': id_min + }) + nb=0 + if nb>0: + result.append({ + 'domain': [['id','>=',id_min],['parent_id','=',id_msg]], + 'nb_messages': nb, + 'type': 'expandable', + 'parent_id': id_msg, + 'id': id_min + }) - # Depth-first flattening - for message in messages: - if message.get('type') == 'expandable': - continue - message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context, limit=limit) - for child in message['child_ids']: - if child.get('type') == 'expandable': - continue - message['child_nbr'] += child['child_nbr'] - # Flatten if above maximum depth - if current_level < level: - return_list = messages - else: - 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 return_list and current_level == 0 and add_expandable: - expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context) - return_list.append(expandable) - elif return_list and current_level <= level and add_expandable: - expandable = self.message_read_tree_get_expandable(cr, uid, parent_message, return_list and return_list[-1] or parent_message, domain, current_level, level, context=context) - return_list.append(expandable) - return return_list + # expandable for limit max + ids = self.search(cr, SUPERUSER_ID, domain+[['id','not in',message_loaded+tree+tree_not]], context=context, limit=1) + if len(ids) > 0: + result.append( + { + 'domain': domain, + 'nb_messages': 0, + 'type': 'expandable', + 'parent_id': parent_id, + 'id': -1 + }); + + + result = sorted(result, key=lambda k: k['id']) + + return result def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, parent_id=False, limit=None): """ Read messages from mail.message, and get back a structured tree @@ -341,58 +335,7 @@ class mail_message(osv.Model): result = sorted(result, key=lambda k: k['id']) - - tree_not = [] - # expandable for not show message - for id_msg in tree: - # get all childs - not_loaded_ids = self.search(cr, SUPERUSER_ID, [['parent_id','=',id_msg],['id','not in',message_loaded]], None, limit=1000) - # group childs not read - id_min=None - id_max=None - nb=0 - for not_loaded_id in not_loaded_ids: - if not_loaded_id not in tree: - nb+=1 - if id_min==None or id_min>not_loaded_id: - id_min=not_loaded_id - if id_max==None or id_max0: - result.append({ - 'domain': [['id','>=',id_min],['id','<=',id_max],['parent_id','=',id_msg]], - 'nb_messages': nb, - 'type': 'expandable', - 'parent_id': id_msg, - 'id': id_min - }) - nb=0 - if nb>0: - result.append({ - 'domain': [['id','>=',id_min],['parent_id','=',id_msg]], - 'nb_messages': nb, - 'type': 'expandable', - 'parent_id': id_msg, - 'id': id_min - }) - - - # expandable for limit max - ids = self.search(cr, SUPERUSER_ID, domain+[['id','not in',message_loaded+tree+tree_not]], context=context, limit=1) - if len(ids) > 0: - result.append( - { - 'domain': domain, - 'nb_messages': 0, - 'type': 'expandable', - 'parent_id': parent_id, - 'id': -1 - }); - - - result = sorted(result, key=lambda k: k['id']) + result = self.message_read_expandable(cr, uid, tree, result, message_loaded, domain, context, parent_id, limit) return result diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index 7ec37d952bc..1485c40570b 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -550,48 +550,6 @@ class test_mail(TestMailMockups): # _compare_structures(struct1[x]['child_ids'], struct2[x]['child_ids'], n + 1) # # print '%send compare' % ('\t' * n) - # # ---------------------------------------- - # # CASE1: Flattening test - # # ---------------------------------------- - - # # Create dummy message structure - # import copy - # tree = [{'id': 2, 'child_nbr': 1, 'child_ids': [ - # {'id': 6, 'child_nbr': 1, 'child_ids': [ - # {'id': 8, 'child_nbr': 0, 'child_ids': []}, - # ]}, - # ]}, - # {'id': 1, 'child_nbr': 3, 'child_ids':[ - # {'id': 7, 'child_nbr': 1, 'child_ids': [ - # {'id': 9, 'child_nbr': 0, 'child_ids': []}, - # ]}, - # {'id': 4, 'child_nbr': 2, 'child_ids': [ - # {'id': 10, 'child_nbr': 0, 'child_ids': []}, - # {'id': 5, 'child_nbr': 0, 'child_ids': []}, - # ]}, - # {'id': 3, 'child_nbr': 0, 'child_ids': []}, - # ]}, - # ] - # # Test: completely flat - # new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0, limit=15, add_expandable=False) - # _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': [ - # {'id': 8, 'child_ids': []}, {'id': 6, 'child_ids': []}, - # ]}, - # {'id': 1, 'child_ids': [ - # {'id': 10, 'child_ids': []}, {'id': 9, 'child_ids': []}, - # {'id': 7, 'child_ids': []}, {'id': 5, 'child_ids': []}, - # {'id': 4, 'child_ids': []}, {'id': 3, 'child_ids': []}, - # ]}, - # ] - # new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1, limit=15, add_expandable=False) - # _compare_structures(new_tree, tree_test) - # # Test: 2 thread levels - # new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2, limit=15, add_expandable=False) - # _compare_structures(new_tree, tree) - # # ---------------------------------------- # # CASE2: message_read test # # ----------------------------------------