[IMP] mail: moved tree formation in message_read in a dedicated method; added / fixed some tests. Note that tests for message_read will have to be added.

bzr revid: tde@openerp.com-20120827144753-csoho4iz34f6zpy1
This commit is contained in:
Thibault Delavallée
2012-08-27 16:47:53 +02:00
parent 5ae69cb1ac
commit dc5b8efdf7
2 changed files with 81 additions and 57 deletions
+45 -52
View File
@@ -119,74 +119,67 @@ class mail_message(osv.Model):
# Message loading for web interface
#------------------------------------------------------
_limit = 3
def _message_dict_get(self, cr, uid, msg, context={}):
attachs = self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)
author = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0]
# TDE: need user to show 'delete' link -> necessary ?
author_user = self.pool.get('res.users').name_get(cr, uid, [x.id for x in msg.author_id.user_ids], context=context)[0]
def _message_dict_get(self, cr, uid, msg, context=None):
""" Return a dict representation of the message browse record. """
attachment_ids = self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)
author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0]
author_user_id = self.pool.get('res.users').name_get(cr, uid, [msg.author_id.user_ids[0].id], context=context)[0]
partner_ids = self.pool.get('res.partner').name_get(cr, uid, [x.id for x in msg.partner_ids], context=context)
return {
'id': msg.id,
'type': msg.type,
'attachment_ids': attachs,
'attachment_ids': attachment_ids,
'body': msg.body,
'model': msg.model,
'res_id': msg.res_id,
'record_name': msg.record_name,
'subject': msg.subject,
'date': msg.date,
'author_id': author,
'author_user_id': author_user,
'author_id': author_id,
'author_user_id': author_user_id,
'partner_ids': partner_ids,
'child_ids': []
'child_ids': [],
}
def message_read(self, cr, uid, ids=False, domain=[], thread_level=0, 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 children (according to thread_level).
Return [
]
def message_read_tree_get(self, cr, uid, messages, flat=True, context=None):
""" Get a tree representation of the browse records.
:param messages: mail.message browse record list
"""
context = context or {}
if ids is False:
ids = self.search(cr, uid, domain, context=context, limit=10)
# FP Todo: flatten to max X level of mail_thread
messages = self.browse(cr, uid, ids, context=context)
result = []
roots = []
tree = {} # key: ID, value: record
for msg in messages:
if len(result)<(self._limit-1):
record = self._message_dict_get(cr, uid, msg, context=context)
if thread_level and msg.parent_id:
while msg.parent_id:
if msg.parent_id.id in tree:
record_parent = tree[msg.parent_id.id]
else:
record_parent = self._message_dict_get(cr, uid, msg.parent_id, context=context)
if msg.parent_id.parent_id:
tree[msg.parent_id.id] = record_parent
record_parent['child_ids'].append(record)
record = record_parent
msg = msg.parent_id
if msg.id not in tree:
result.append(record)
tree[msg.id] = record
else:
result.append({
'type': 'expandable',
'domain': [('id','<=', msg.id)]+domain,
'context': context,
'thread_level': thread_level # should be improve accodting to level of records
})
break
return result
record = self._message_dict_get(cr, uid, msg, context=context)
if not flat and msg.parent_id:
while msg.parent_id:
if msg.parent_id.id in tree:
record_parent = tree[msg.parent_id.id]
else:
record_parent = self._message_dict_get(cr, uid, msg.parent_id, context=context)
if msg.parent_id.parent_id:
tree[msg.parent_id.id] = record_parent
record_parent['child_ids'].append(record)
record = record_parent
msg = msg.parent_id
if msg.id not in tree:
roots.append(record)
tree[msg.id] = record
return roots
def message_read(self, cr, uid, ids=False, domain=[], thread_level=0, limit=None, context=None):
""" Fetch and read messages. 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 children
according to thread_level.
:return result: A tree structure: list of msg_dict, with child_ids
being also msg_dict.
"""
limit = limit or self._message_read_limit
if ids is False:
ids = self.search(cr, uid, domain, context=context, limit=limit)
messages = self.browse(cr, uid, ids, context=context)
# FP note - TDE note: TODO: flatten - order
return self.message_read_tree_get(cr, uid, messages, thread_level>0, context=context)
#------------------------------------------------------
+36 -5
View File
@@ -234,6 +234,39 @@ class test_mail(common.TransactionCase):
self.assertTrue(all(id in follower_ids for id in [user_admin.partner_id.id]),
'Admin the only Pigs group followers')
def test_03_message_read(self):
""" Tests designed for message_read. """
def _flatten(read_dict):
res = []
for val in read_dict:
current = {'_id': val['id']}
if val.get('child_ids'):
current['child_ids'] = _flatten(val.get('child_ids'))
res.append(current)
return res
# TDE NOTE: this test is not finished, as the message_read method is not fully specified.
# It wil be updated as soon as we have fixed specs !
cr, uid = self.cr, self.uid
group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
# 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)
# 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)
# 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)
def test_10_mail_composer(self):
""" Tests designed for the mail.compose.message wizard. """
cr, uid = self.cr, self.uid
@@ -296,14 +329,12 @@ class test_mail(common.TransactionCase):
self.assertTrue(all(email in mail_emails for email in expected_emails) and len(mail_emails) == 2,
'Send email emails are %s; should be %s' % (mail_emails, expected_emails))
# Create a reply to the last comment, with default partners
# Create a reply to the last comment
compose_id = mail_compose.create(cr, uid,
{}, {'mail.compose.message.mode': 'reply', 'default_model': 'mail.thread', 'default_res_id': self.group_pigs_id,
'active_id': first_com.id})
compose = mail_compose.browse(cr, uid, compose_id)
self.assertTrue(compose.model == 'mail.group' and compose.res_id == self.group_pigs_id,
'Wizard message has model: %s and res_id:%s; should be mail.group and %s' % (compose.model, compose.res_id, self.group_pigs_id))
self.assertTrue(compose.parent_id.id == first_com.id and len(compose.partner_ids) == 5,
'Wizard parent_id is %d; should be %d; or wrong partner_ids (TO BE CONTINUED)' % (compose.parent_id.id, first_com.id))
self.assertTrue(compose.parent_id.id == first_com.id,
'Wizard parent_id is %d; should be %d' % (compose.parent_id.id, first_com.id))