From 741bbaa9f457577b25d8f6007b6aae34aedf2840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 7 Sep 2012 18:09:20 +0200 Subject: [PATCH] [WIP] mail_message.message_read(): WIP about having correct expandables. Will be updated next week. bzr revid: tde@openerp.com-20120907160920-4ijs93y9ogp39xma --- addons/mail/mail_message.py | 59 ++++++++++++++++++++++++---------- addons/mail/res_partner.py | 1 - addons/mail/tests/test_mail.py | 13 ++++---- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 18a88bb0b61..90ccc8a2f24 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -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 #------------------------------------------------------ diff --git a/addons/mail/res_partner.py b/addons/mail/res_partner.py index 2988cee3d9c..4a6f98fa31d 100644 --- a/addons/mail/res_partner.py +++ b/addons/mail/res_partner.py @@ -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: diff --git a/addons/mail/tests/test_mail.py b/addons/mail/tests/test_mail.py index f45745f31dc..1f65c38f755 100644 --- a/addons/mail/tests/test_mail.py +++ b/addons/mail/tests/test_mail.py @@ -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) # ----------------------------------------