[IMP]mail: expandable py
bzr revid: chm@openerp.com-20121003072845-64bufx2dj3qdpjm2
This commit is contained in:
parent
09763017a5
commit
c28a29c44c
|
@ -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_max<not_loaded_id:
|
||||
id_max=not_loaded_id
|
||||
tree_not.append(not_loaded_id)
|
||||
else:
|
||||
if nb>0:
|
||||
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_max<not_loaded_id:
|
||||
id_max=not_loaded_id
|
||||
tree_not.append(not_loaded_id)
|
||||
else:
|
||||
if nb>0:
|
||||
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
|
||||
|
||||
|
|
|
@ -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
|
||||
# # ----------------------------------------
|
||||
|
|
Loading…
Reference in New Issue