[FIX] mail: fixed an order issue with expandables.

bzr revid: tde@openerp.com-20121102102248-juqo5b21wmn6ywl8
This commit is contained in:
Thibault Delavallée 2012-11-02 11:22:48 +01:00
parent 6bb8c0c940
commit 455a076050
2 changed files with 45 additions and 42 deletions

View File

@ -207,8 +207,6 @@ class mail_message(osv.Model):
:param list messages: list of message, as get_dict result
:param dict message_tree: {[msg.id]: msg browse record}
"""
# print '\n>>>>_message_read_dict_postprocess begin\n'
res_partner_obj = self.pool.get('res.partner')
ir_attachment_obj = self.pool.get('ir.attachment')
pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=None)['partner_id'][0]
@ -255,8 +253,6 @@ class mail_message(osv.Model):
'partner_ids': partner_ids,
'attachment_ids': attachment_ids,
})
# print '\n>>>>_message_read_dict_postprocess end\n'
return True
def _message_read_dict(self, cr, uid, message, parent_id=False, context=None):
@ -295,8 +291,8 @@ class mail_message(osv.Model):
'attachment_ids': [],
}
def _message_read_add_expandables(self, cr, uid, messages, message_tree, message_unload_ids=[],
thread_level=0, domain=[], parent_id=False, context=None):
def _message_read_add_expandables(self, cr, uid, messages, message_tree, parent_tree,
message_unload_ids=[], thread_level=0, domain=[], parent_id=False, context=None):
""" Create expandables for message_read, to load new messages.
1. get the expandable for new threads
if display is flat (thread_level == 0):
@ -314,6 +310,7 @@ class mail_message(osv.Model):
:param list messages: list of message structure for the Chatter
widget to which expandables are added
:param dict message_tree: dict [id]: browse record of this message
:param dict parent_tree: dict [parent_id]: [child_ids]
:param list message_unload_ids: list of message_ids we do not want
to load
:return bool: True
@ -335,10 +332,15 @@ class mail_message(osv.Model):
if thread_level == 0:
exp_domain = domain + [('id', '<', min(message_unload_ids + message_ids))]
else:
exp_domain = domain + ['!', ('id', 'child_of', message_unload_ids + message_ids)]
exp_domain = domain + ['!', ('id', 'child_of', message_unload_ids + parent_tree.keys())]
ids = self.search(cr, uid, exp_domain, context=context, limit=1)
if ids:
messages.append(_get_expandable(exp_domain, -1, parent_id, -1))
# inside a thread: prepend
if parent_id:
messages.insert(0, _get_expandable(exp_domain, -1, parent_id, -1))
# new threads: append
else:
messages.append(_get_expandable(exp_domain, -1, parent_id, -1))
# 2. get the expandables for new messages inside threads if display is not flat
if thread_level == 0:
@ -351,32 +353,31 @@ class mail_message(osv.Model):
continue
# check there are message for expandable
not_loaded_ids = set([child.id for child in message.child_ids]) - set(message_unload_ids + message_ids)
# not_loaded_ids = self.search(cr, uid, [
# ('id', 'child_of', message_id),
# ('id', 'not in', message_unload_ids + message_ids),
# ], context=context, limit=self._message_read_more_limit)
if not not_loaded_ids:
child_ids = set([child.id for child in message.child_ids]) - set(message_unload_ids)
child_ids = sorted(list(child_ids), reverse=True)
if not child_ids:
continue
# make groups of unread messages
id_min, id_max, nb = max(not_loaded_ids), 0, 0
for not_loaded_id in not_loaded_ids:
if not not_loaded_id in message_ids:
id_min, id_max, nb = max(child_ids), 0, 0
for child_id in child_ids:
if not child_id in message_ids:
nb += 1
if id_min > not_loaded_id:
id_min = not_loaded_id
if id_max < not_loaded_id:
id_max = not_loaded_id
if id_min > child_id:
id_min = child_id
if id_max < child_id:
id_max = child_id
elif nb > 0:
exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
messages.append(_get_expandable(exp_domain, nb, message_id, id_min))
id_min, id_max, nb = max(not_loaded_ids), 0, 0
id_min, id_max, nb = max(child_ids), 0, 0
else:
id_min, id_max, nb = max(not_loaded_ids), 0, 0
id_min, id_max, nb = max(child_ids), 0, 0
if nb > 0:
exp_domain = [('id', '>=', id_min), ('id', '<=', id_max), ('id', 'child_of', message_id)]
messages.append(_get_expandable(exp_domain, nb, message_id, id_min))
idx = [msg.get('id') for msg in messages].index(message_id) + 1
# messages.append(_get_expandable(exp_domain, nb, message_id, id_min))
messages.insert(idx, _get_expandable(exp_domain, nb, message_id, id_min))
return True
@ -454,13 +455,8 @@ class mail_message(osv.Model):
# get the child expandable messages for the tree
self._message_read_dict_postprocess(cr, uid, message_list, message_tree, context=context)
# print '\n>>>>before expandables'
self._message_read_add_expandables(cr, uid, message_list, message_tree, thread_level=thread_level,
message_unload_ids=message_unload_ids, domain=domain, parent_id=parent_id, context=context)
# print '\n>>>>after expandables'
# print '\n>>>>nmessage_read end\n'
self._message_read_add_expandables(cr, uid, message_list, message_tree, parent_tree,
thread_level=thread_level, message_unload_ids=message_unload_ids, domain=domain, parent_id=parent_id, context=context)
return message_list
# TDE Note: do we need this ?
@ -496,17 +492,14 @@ class mail_message(osv.Model):
# print '\n>>>>>_search on mail.message', uid, args, '\n'
# Rules do not apply to administrator
if uid == SUPERUSER_ID:
# print '\n>>>>>end _search on mail.message\n'
return super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
context=context, count=count, access_rights_uid=access_rights_uid)
# Perform a super with count as False, to have the ids, not a counter
ids = super(mail_message, self)._search(cr, uid, args, offset=offset, limit=limit, order=order,
context=context, count=False, access_rights_uid=access_rights_uid)
if not ids and count:
# print '\n>>>>>end _search on mail.message\n'
return 0
elif not ids:
# print '\n>>>>>end _search on mail.message\n'
return ids
pid = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'])['partner_id'][0]
@ -558,7 +551,6 @@ class mail_message(osv.Model):
"""
# print '\n>>>>>check_access_rule on mail.message', uid, ids, operation, '\n'
if uid == SUPERUSER_ID:
# print '\n>>>>>end check_access_rule on mail.message\n'
return
if isinstance(ids, (int, long)):
ids = [ids]

View File

@ -576,7 +576,7 @@ class test_mail(TestMailMockups):
cr, uid, user_admin, group_pigs = self.cr, self.uid, self.user_admin, self.group_pigs
pigs_domain = [('model', '=', 'mail.group'), ('res_id', '=', self.group_pigs_id)]
# Data: create a discussion in Pigs (2 messages, one with 2 and one with 3 answers)
# Data: create a discussion in Pigs (3 threads, with respectively 0, 4 and 4 answers)
msg_id0 = self.group_pigs.message_post(body='0', subtype='mt_comment')
msg_id1 = self.group_pigs.message_post(body='1', subtype='mt_comment')
msg_id2 = self.group_pigs.message_post(body='2', subtype='mt_comment')
@ -613,6 +613,8 @@ class test_mail(TestMailMockups):
# Do: read last message, threaded
read_msg_list = self.mail_message.message_read(cr, uid, domain=pigs_domain, limit=1, thread_level=1)
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
# TDE TODO: test expandables order
type_list = map(lambda item: item.get('type'), read_msg_list)
# Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
self.assertEqual(len(read_msg_list), 4, 'message_read on last Pigs message should return 2 messages and 2 expandables')
self.assertEqual(set([msg_id2, msg_id10]), set(read_msg_ids), 'message_read on the last Pigs message should also get its parent')
@ -632,12 +634,20 @@ class test_mail(TestMailMockups):
self.assertIn(('id', 'child_of', msg_id2), domain, 'new messages expandable domain should contain a child_of condition')
self.assertIn(('id', '>=', msg_id4), domain, 'new messages expandable domain should contain an id greater than condition')
self.assertIn(('id', '<=', msg_id8), domain, 'new messages expandable domain should contain an id less than condition')
self.assertEqual(new_msg_exp.get('parent_id'), msg_id2, 'new messages expandable should have ancestor_id set to the thread header')
# Do: message_read with domain, thread_level=0, parent_id=msg_id2 (should be imposed by JS)
read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=200, thread_level=0, parent_id=msg_id2)
self.assertEqual(new_msg_exp.get('parent_id'), msg_id2, 'new messages expandable should have parent_id set to the thread header')
# Do: message_read with domain, thread_level=0, parent_id=msg_id2 (should be imposed by JS), 2 messages
read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=2, thread_level=0, parent_id=msg_id2)
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
# Test: other message in thread have been fetch
self.assertEqual(set([msg_id4, msg_id6, msg_id8]), set(read_msg_ids), 'message_read in Pigs thread should return all the previous messages')
new_msg_exp = [msg for msg in read_msg_list if msg.get('type') == 'expandable'][0]
# Test: structure content, 2 messages and 1 thread expandable
self.assertEqual(len(read_msg_list), 3, 'message_read in Pigs thread should return 2 messages and 1 expandables')
self.assertEqual(set([msg_id6, msg_id8]), set(read_msg_ids), 'message_read in Pigs thread should return 2 more previous messages in thread')
# Do: read the last message
read_msg_list = self.mail_message.message_read(cr, uid, domain=new_msg_exp.get('domain'), limit=2, thread_level=0, parent_id=msg_id2)
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']
# Test: structure content, 1 message
self.assertEqual(len(read_msg_list), 1, 'message_read in Pigs thread should return 1 message')
self.assertEqual(set([msg_id4]), set(read_msg_ids), 'message_read in Pigs thread should return the last message in thread')
# Do: fetch a new thread, domain from expandable
self.assertIsNotNone(new_threads_exp, 'message_read on last Pigs message should have returned a new threads expandable')
@ -645,7 +655,8 @@ class test_mail(TestMailMockups):
# Test: expandable, conditions in domain
for condition in pigs_domain:
self.assertIn(condition, domain, 'new threads expandable domain should contain the message_read domain parameter')
self.assertFalse(new_threads_exp.get('parent_id'), 'new threads expandable should not have an ancestor_id')
print 'domain', domain
self.assertFalse(new_threads_exp.get('parent_id'), 'new threads expandable should not have an parent_id')
# Do: message_read with domain, thread_level=1 (should be imposed by JS)
read_msg_list = self.mail_message.message_read(cr, uid, domain=domain, limit=1, thread_level=1)
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('type') != 'expandable']