[WIP] mail_message: continued work on message_read and expandables.

bzr revid: tde@openerp.com-20120911120117-xeeercvglfwq3c9e
This commit is contained in:
Thibault Delavallée
2012-09-11 14:01:17 +02:00
parent 6a5246be05
commit dfa14420d2
3 changed files with 54 additions and 54 deletions
+34 -35
View File
@@ -147,6 +147,7 @@ class mail_message(osv.Model):
def _message_dict_get(self, cr, uid, msg, context=None):
""" Return a dict representation of the message browse record. """
child_nbr = len(msg.child_ids)
attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in 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]
@@ -165,6 +166,7 @@ class mail_message(osv.Model):
'author_user_id': author_user_id,
'partner_ids': partner_ids,
'child_ids': [],
'child_nbr': child_nbr,
}
def message_read_tree_get_expandable(self, cr, uid, parent_message, last_message, domain=[], current_level=0, level=0, context=None):
@@ -173,7 +175,7 @@ class mail_message(osv.Model):
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'])]
base_domain += [('id', 'child_of', parent_message['id'])]
if domain:
base_domain += domain
extension = { 'type': 'expandable',
@@ -184,7 +186,7 @@ class mail_message(osv.Model):
}
return extension
def message_read_tree_flatten(self, cr, uid, parent_message, messages, current_level, level, domain=[], context=None):
def message_read_tree_flatten(self, cr, uid, parent_message, messages, domain=[], level=0, current_level=0, context=None, limit=None):
""" Given a tree with several roots of following structure :
[ {'id': 1, 'child_ids': [
{'id': 11, 'child_ids': [...] },],
@@ -204,11 +206,14 @@ class mail_message(osv.Model):
msg_dict['child_ids'] = []
return [msg_dict] + child_ids
context = context or {}
limit = limit or self._message_read_limit
# 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'], current_level + 1, level, domain, context=context)
message['child_ids'] = self.message_read_tree_flatten(cr, uid, message, message['child_ids'], domain, level, current_level + 1, context=context)
for child in message['child_ids']:
message['child_nbr'] += child['child_nbr']
# Flatten if above maximum depth
if current_level < level:
return_list = messages
@@ -216,12 +221,17 @@ class mail_message(osv.Model):
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:
if current_level == 0:
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)
if len(return_list) >= limit:
print 'we need an expandable here'
print 'expandable', expandable
elif 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=[], level=0, context=None, limit=None, tree_parent_id=False):
def message_read(self, cr, uid, ids=False, domain=[], level=0, context=None, limit=None, 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.
@@ -231,7 +241,7 @@ class mail_message(osv.Model):
: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
:param parent_id: if parent_id reached, stop searching for
further parents
:return list: list of trees of messages
"""
@@ -241,39 +251,28 @@ class mail_message(osv.Model):
ids = self.search(cr, uid, domain, context=context, limit=limit)
messages = self.browse(cr, uid, ids, context=context)
# key: ID, value: record
tree = {}
result = []
tree = {} # key: ID, value: record
for msg in messages:
if len(result) < (limit - 1):
record = self._message_dict_get(cr, uid, msg, context=context)
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:
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
if record['id'] not in [x['id'] for x in record_parent['child_ids']]:
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': level, # should be improve accodting to level of records
'id': -1,
})
break
record = self._message_dict_get(cr, uid, msg, context=context)
while msg.parent_id and msg.parent_id.id != 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
if record['id'] not in [x['id'] for x in record_parent['child_ids']]:
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
# Flatten the result
if thread_level > 0:
result = self.message_read_tree_flatten(cr, uid, None, result, 0, thread_level, domain, context=context)
result = self.message_read_tree_flatten(cr, uid, None, result, domain, level, context=context)
return result
#------------------------------------------------------
+1 -1
View File
@@ -455,7 +455,7 @@ openerp.mail = function(session) {
return this.message_display(this.options.message_data);
}
return this.ds_message.call('message_read',
[(initial_mode && this.options.message_ids) || false, fetch_domain, this.options.thread_level, undefined, fetch_context]
[(initial_mode && this.options.message_ids) || false, fetch_domain, this.options.thread_level, fetch_context]
).then(this.proxy('message_display'));
},
+19 -18
View File
@@ -29,7 +29,7 @@ Received: by mail1.openerp.com (Postfix, from userid 10002)
From: Sylvie Lelitre <sylvie.lelitre@agrolait.com>
Subject: {subject}
MIME-Version: 1.0
Content-Type: multipart/alternative;
Content-Type: multipart/alternative;
boundary="----=_Part_4200734_24778174.1344608186754"
Date: Fri, 10 Aug 2012 14:16:26 +0000
Message-ID: <1198923581.41972151344608186760.JavaMail@agrolait.com>
@@ -52,9 +52,9 @@ Content-Transfer-Encoding: quoted-printable
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8" />
</head>=20
<body style=3D"margin: 0; padding: 0; background: #ffffff;-webkit-text-size-adjust: 100%;">=20
<p>Please call me as soon as possible this afternoon!</p>
<p>--<br/>
Sylvie
<p>
@@ -153,7 +153,7 @@ class test_mail(common.TransactionCase):
test_msg_id = '<deadcafe.1337@smtp.agrolait.com>'
mail_text = MAIL_TEMPLATE_PLAINTEXT.format(to='groups@example.com', subject='frogs', extra='', msg_id=test_msg_id)
self.mail_thread.message_process(cr, uid, None, mail_text)
new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id','=',test_msg_id)])[0])
new_mail = self.mail_message.browse(cr, uid, self.mail_message.search(cr, uid, [('message_id', '=', test_msg_id)])[0])
self.assertEqual(new_mail.body, '\n<pre>\nPlease call me as soon as possible this afternoon!\n\n--\nSylvie\n</pre>\n',
'plaintext mail incorrectly parsed')
@@ -458,11 +458,12 @@ class test_mail(common.TransactionCase):
# It will 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)
def _compare_structures(struct1, struct2, n=0):
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'], struct1[x]['child_nbr'], struct2[x]['id'], struct2[x]['child_nbr'], 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)
@@ -473,24 +474,24 @@ class test_mail(common.TransactionCase):
# Create dummy message structure
import copy
tree = [{'id': 2, 'child_ids': [
{'id': 6, 'child_ids': [
{'id': 8, 'child_ids': []},
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_ids':[
{'id': 7, 'child_ids': [
{'id': 9, '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_ids': [
{'id': 10, 'child_ids': []},
{'id': 5, '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_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), 0, 0, [('type', 'in', 'borderlands')])
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 0)
_compare_structures(new_tree, new_tree)
self.assertEqual(len(new_tree), 10, 'message_read_tree_flatten wrong in flat')
# Test: 1 thread level
@@ -503,10 +504,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, None, copy.deepcopy(tree), 0, 1, [('type', 'in', 'borderlands')])
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 1)
_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), 0, 2, [('type', 'in', 'borderlands')])
new_tree = self.mail_message.message_read_tree_flatten(cr, uid, None, copy.deepcopy(tree), [('type', 'in', 'borderlands')], 2)
_compare_structures(new_tree, tree)
# ----------------------------------------