[REM] mail: remove dead code since new chatter
* mail_message.message_read() method is not used anymore since the chatter refactoring in v9. message_format() is used instead. Tests for this method are also removed, as they have no use anymore. * mail_thread.message_set_read() is not used anymore. set_message_done is the only method used by the new chatter as there is no read state anymore. * removed an unused parameter in set_message_done, by the way
This commit is contained in:
@@ -200,7 +200,7 @@ class Message(models.Model):
|
||||
self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', self.env.user.partner_id.id), notification)
|
||||
|
||||
@api.multi
|
||||
def set_message_done(self, partner_ids=None):
|
||||
def set_message_done(self):
|
||||
""" Remove the needaction from messages for the current partner. """
|
||||
partner_id = self.env.user.partner_id
|
||||
messages = self.filtered(lambda msg: partner_id in msg.needaction_partner_ids)
|
||||
@@ -339,180 +339,6 @@ class Message(models.Model):
|
||||
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _message_read_dict(self, parent_id=False):
|
||||
""" Return a dict representation of the message. This representation is
|
||||
used in the JS client code, to display the messages. Partners and
|
||||
attachments related stuff will be done in post-processing in batch.
|
||||
|
||||
:param dict message: mail.message browse record
|
||||
"""
|
||||
self.ensure_one()
|
||||
# private message: no model, no res_id
|
||||
is_private = False
|
||||
if not self.model or not self.res_id:
|
||||
is_private = True
|
||||
|
||||
return {'id': self.id,
|
||||
'message_type': self.message_type,
|
||||
'subtype': self.subtype_id.name if self.subtype_id else False,
|
||||
'body': self.body,
|
||||
'model': self.model,
|
||||
'res_id': self.res_id,
|
||||
'record_name': self.record_name,
|
||||
'subject': self.subject,
|
||||
'date': self.date,
|
||||
#'needaction': self.needaction, JEM : not used.
|
||||
'needaction_partner_ids': self.needaction_partner_ids.ids,
|
||||
'parent_id': parent_id,
|
||||
'is_private': is_private,
|
||||
'author_id': False,
|
||||
'author_avatar': self.author_avatar,
|
||||
'is_author': False,
|
||||
'partner_ids': [],
|
||||
'is_favorite': self.starred,
|
||||
'attachment_ids': [],
|
||||
'tracking_value_ids': [],
|
||||
'channel_ids': self.channel_ids.ids,
|
||||
}
|
||||
|
||||
@api.cr_uid_context
|
||||
def message_read_wrapper(self, cr, uid, ids=None, domain=None, context=None,
|
||||
thread_level=0, parent_id=False, limit=None, child_limit=None):
|
||||
return self.message_read(cr, uid, ids, domain=domain, thread_level=thread_level, context=context,
|
||||
parent_id=parent_id, limit=limit, child_limit=child_limit)
|
||||
|
||||
@api.multi
|
||||
def message_read(self, domain=None, thread_level=0, context= None, parent_id=False, limit=None, child_limit=None):
|
||||
""" Read messages from mail.message, and get back a list of structured
|
||||
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 ancestors will be added to obtain
|
||||
well formed threads, if uid has access to them.
|
||||
|
||||
After reading the messages, expandable messages are added in the
|
||||
message list. It consists in messages holding the 'read more' data:
|
||||
number of messages to read, domain to apply.
|
||||
|
||||
:param list ids: optional IDs to fetch
|
||||
:param list domain: optional domain for searching ids if ids not set
|
||||
:param int parent_id: context of parent_id
|
||||
- if parent_id reached when adding ancestors, stop going further
|
||||
in the ancestor search
|
||||
- if set in flat mode, ancestor_id is set to parent_id
|
||||
:param int limit: number of messages to fetch, before adding the
|
||||
ancestors and expandables
|
||||
:param int child_limit: number of child messages to fetch
|
||||
:return dict:
|
||||
- int: number of messages read (status 'unread' to 'read')
|
||||
- list: list of threads [[messages_of_thread1], [messages_of_thread2]]
|
||||
"""
|
||||
# TDE note: seems deprecated, not used but however still kept - why ?
|
||||
assert thread_level in [0, 1], 'message_read() thread_level should be 0 (flat) or 1 (1 level of thread); given %s.' % thread_level
|
||||
|
||||
domain = domain if domain is not None else []
|
||||
limit = limit or self._message_read_limit
|
||||
child_limit = child_limit or self._message_read_limit
|
||||
|
||||
message_tree = {}
|
||||
parent_tree = {}
|
||||
child_ids = []
|
||||
parent_ids = []
|
||||
exp_domain = []
|
||||
|
||||
# no specific IDS given: fetch messages according to the domain, add their parents if uid has access to
|
||||
if not self.ids and domain:
|
||||
self = self.search(domain, limit=limit)
|
||||
|
||||
# fetch parent if threaded, sort messages
|
||||
for message in self:
|
||||
message_id = message.id
|
||||
if message_id in message_tree:
|
||||
continue
|
||||
message_tree[message_id] = message
|
||||
|
||||
# find parent_id
|
||||
if thread_level == 0:
|
||||
tree_parent_id = parent_id
|
||||
else:
|
||||
tree_parent_id = message_id
|
||||
parent = message
|
||||
while parent.parent_id and parent.parent_id.id != parent_id:
|
||||
parent = parent.parent_id
|
||||
tree_parent_id = parent.id
|
||||
if parent.id not in message_tree:
|
||||
message_tree[parent.id] = parent
|
||||
# newest messages first
|
||||
parent_tree.setdefault(tree_parent_id, [])
|
||||
|
||||
# build thread structure
|
||||
# for each parent_id: get child messages, add message expandable and parent message if needed [child1, child2, expandable, parent_message]
|
||||
# add thread expandable if it remains some uncaught parent_id
|
||||
if self.ids and len(self.ids) > 0:
|
||||
for parent in parent_tree:
|
||||
parent_ids.append(parent)
|
||||
|
||||
if not thread_level:
|
||||
child_ids = self.ids;
|
||||
exp_domain = domain + [('id', '<', min(child_ids))]
|
||||
else:
|
||||
child_ids = [msg.id for msg in self.browse(parent).child_ids][0:child_limit]
|
||||
exp_domain = [('parent_id', '=', parent), ('id', '>', parent)]
|
||||
if len(child_ids):
|
||||
exp_domain += [('id', '<', min(child_ids))]
|
||||
|
||||
for cid in child_ids:
|
||||
if cid not in message_tree:
|
||||
message_tree[cid] = self.browse(cid)
|
||||
parent_tree[parent].append(message_tree[cid]._message_read_dict(parent_id=parent))
|
||||
|
||||
if parent and thread_level:
|
||||
parent_tree[parent].sort(key=lambda item: item['id'])
|
||||
parent_tree[parent].reverse();
|
||||
parent_tree[parent].append(message_tree[parent]._message_read_dict())
|
||||
|
||||
self._message_read_dict_postprocess(parent_tree[parent], message_tree)
|
||||
|
||||
# add 'message' expandable (inside a thread)
|
||||
more_count = self.search_count(exp_domain)
|
||||
if more_count:
|
||||
exp = {'message_type':'expandable',
|
||||
'domain': exp_domain,
|
||||
'nb_messages': more_count,
|
||||
'parent_id': parent}
|
||||
|
||||
if parent and thread_level:
|
||||
#insert expandable before parent message
|
||||
parent_tree[parent].insert(len(parent_tree[parent])-1, exp)
|
||||
else:
|
||||
#insert expandable at the end of the message list
|
||||
parent_tree[parent].append(exp)
|
||||
|
||||
# create final ordered parent_list based on parent_tree
|
||||
parent_list = parent_tree.values()
|
||||
parent_list = sorted(parent_list, key=lambda item: max([msg.get('id') for msg in item]), reverse=True)
|
||||
|
||||
#add 'thread' expandable
|
||||
if thread_level:
|
||||
exp_domain = domain + [('id', '<', min(self.ids)), ('id', 'not in', parent_ids), ('parent_id', 'not in', parent_ids)]
|
||||
more_count = self.search_count(exp_domain)
|
||||
if more_count:
|
||||
parent_list.append([{'message_type':'expandable',
|
||||
'domain': exp_domain,
|
||||
'nb_messages': more_count,
|
||||
'parent_id': parent_id}])
|
||||
|
||||
nb_read = 0
|
||||
if context and 'mail_read_set_read' in context and context['mail_read_set_read']:
|
||||
nb_read = self.set_message_done()
|
||||
|
||||
else:
|
||||
nb_read = 0
|
||||
parent_list = []
|
||||
|
||||
return {'nb_read': nb_read, 'threads': parent_list}
|
||||
|
||||
|
||||
@api.model
|
||||
def message_fetch(self, domain, limit=20):
|
||||
return self.search(domain, limit=limit).message_format()
|
||||
|
||||
@@ -2083,12 +2083,6 @@ class MailThread(models.AbstractModel):
|
||||
# Thread management
|
||||
# ------------------------------------------------------
|
||||
|
||||
@api.multi
|
||||
def message_set_read(self):
|
||||
messages = self.env['mail.message'].search([('model', '=', self._name), ('res_id', 'in', self.ids), ('needaction', '=', True)])
|
||||
messages.write({'needaction_partner_ids': [(3, self.env.user.partner_id.id)]})
|
||||
return messages.ids
|
||||
|
||||
@api.multi
|
||||
def message_change_thread(self, new_thread):
|
||||
"""
|
||||
|
||||
@@ -25,148 +25,5 @@ class TestMessageRead(TestMail):
|
||||
self.msg_ids = [self.msg_10.id, self.msg_9.id, self.msg_8.id, self.msg_7.id, self.msg_6.id, self.msg_5.id, self.msg_4.id, self.msg_3.id, self.msg_2.id, self.msg_1.id, self.msg_0.id]
|
||||
self.ordered_msg_ids = [self.msg_10.id, self.msg_8.id, self.msg_6.id, self.msg_4.id, self.msg_2.id, self.msg_9.id, self.msg_7.id, self.msg_5.id, self.msg_3.id, self.msg_1.id, self.msg_0.id]
|
||||
|
||||
# TODO: with_context({'mail_read_set_read': True})
|
||||
|
||||
def test_message_read_ids(self):
|
||||
""" message_read: test reading specific ids """
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).browse(self.msg_ids[2:4]).message_read(domain=[('body', 'like', 'dummy')])
|
||||
read_msg_list = messages['threads'][0]
|
||||
msg_ids = [msg.get('id') for msg in read_msg_list]
|
||||
self.assertEqual(msg_ids, self.msg_ids[2:4], 'message_read with direct ids should read only the requested ids')
|
||||
|
||||
def test_message_read_domain(self):
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=[('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)], limit=200, child_limit=200)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list]
|
||||
self.assertEqual(read_msg_ids, self.msg_ids, 'message_read flat with domain on Pigs should equal all messages of Pigs')
|
||||
|
||||
def test_message_read_domain_thread(self):
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=[('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)], thread_level=1, limit=200, child_limit=200)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list]
|
||||
self.assertEqual(read_msg_ids, self.ordered_msg_ids, 'message_read threaded with domain on Pigs should equal all messages of Pigs, and sort them with newer thread first, last message last in thread')
|
||||
|
||||
def test_message_read_expandable(self):
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=[('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)], thread_level=1, limit=1, child_limit=1)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
read_ancestor_ids = [msg.get('parent_id') if msg.get('parent_id') != 0 else msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
type_list = [msg.get('message_type') for msg in read_msg_list]
|
||||
|
||||
# Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
|
||||
self.assertEqual(len(type_list), 4, 'message_read on last Pigs message should return 2 messages and 2 expandables')
|
||||
self.assertEqual(set([self.msg_2.id, self.msg_10.id]), set(read_msg_ids), 'message_read on the last Pigs message should also get its parent')
|
||||
self.assertEqual(read_ancestor_ids[0], read_ancestor_ids[1], 'message_read should set the ancestor to the thread header')
|
||||
# Data: get expandables
|
||||
new_threads_exp, new_msg_exp = None, None
|
||||
new_threads_exp = read_msg_list[-1]
|
||||
for msg in read_msg_list:
|
||||
if msg.get('parent_id') and msg.get('message_type') == 'expandable':
|
||||
new_msg_exp = msg
|
||||
# Do: fetch new messages in first thread, domain from expandable
|
||||
self.assertIsNotNone(new_msg_exp, 'message_read on last Pigs message should have returned a new messages expandable')
|
||||
domain = new_msg_exp.get('domain', [])
|
||||
# Test: expandable, conditions in domain
|
||||
self.assertIn(('parent_id', '=', self.msg_2.id), domain, 'new messages expandable domain should contain a child_of condition')
|
||||
self.assertIn(('id', '>', self.msg_2.id), domain, 'new messages expandable domain should contain an id greater than condition')
|
||||
self.assertIn(('id', '<', self.msg_10.id), domain, 'new messages expandable domain should contain an id less than condition')
|
||||
self.assertEqual(new_msg_exp.get('parent_id'), self.msg_2.id, '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
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=domain, thread_level=0, limit=2)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
new_msg_exp = [msg for msg in read_msg_list if msg.get('message_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([self.msg_6.id, self.msg_8.id]), set(read_msg_ids), 'message_read in Pigs thread should return 2 more previous messages in thread')
|
||||
# Do: read the last message
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=new_msg_exp.get('domain'), thread_level=0, limit=2)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list]
|
||||
# Test: structure content, 1 message
|
||||
self.assertEqual(len(read_msg_list), 1, 'message_read in Pigs thread should return 1 message')
|
||||
self.assertEqual(set([self.msg_4.id]), 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')
|
||||
domain = new_threads_exp.get('domain', [])
|
||||
# Test: expandable, conditions in domain
|
||||
for condition in [('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)]:
|
||||
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 parent_id')
|
||||
# Do: message_read with domain, thread_level=1 (should be imposed by JS)
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=domain, thread_level=1, limit=1, child_limit=1)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
read_ancestor_ids = [msg.get('parent_id') if msg.get('parent_id') != 0 else msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
type_list = [msg.get('message_type') for msg in read_msg_list]
|
||||
# Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
|
||||
self.assertEqual(len(type_list), 4, 'message_read on Pigs should return 2 messages and 2 expandables')
|
||||
self.assertEqual(set([self.msg_1.id, self.msg_9.id]), set(read_msg_ids), 'message_read on a Pigs message should also get its parent')
|
||||
self.assertEqual(read_ancestor_ids[0], read_ancestor_ids[1], 'message_read should set the ancestor to the thread header')
|
||||
# Data: get expandables
|
||||
new_threads_exp, new_msg_exp = None, None
|
||||
new_threads_exp = read_msg_list[-1]
|
||||
for msg in read_msg_list:
|
||||
if msg.get('parent_id') and msg.get('message_type') == 'expandable':
|
||||
new_msg_exp = msg
|
||||
# Do: fetch new messages in second thread, domain from expandable
|
||||
self.assertIsNotNone(new_msg_exp, 'message_read on Pigs message should have returned a new messages expandable')
|
||||
domain = new_msg_exp.get('domain', [])
|
||||
# Test: expandable, conditions in domain
|
||||
self.assertIn(('parent_id', '=', self.msg_1.id), domain, 'new messages expandable domain should contain a child_of condition')
|
||||
self.assertIn(('id', '>', self.msg_1.id), domain, 'new messages expandable domain should contain an id greater than condition')
|
||||
self.assertIn(('id', '<', self.msg_9.id), domain, 'new messages expandable domain should contain an id less than condition')
|
||||
self.assertEqual(new_msg_exp.get('parent_id'), self.msg_1.id, 'new messages expandable should have ancestor_id set to the thread header')
|
||||
# Do: message_read with domain, thread_level=0, parent_id=msg_id1 (should be imposed by JS)
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=domain, thread_level=0, limit=200)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
# Test: other message in thread have been fetch
|
||||
self.assertEqual(set([self.msg_3.id, self.msg_5.id, self.msg_7.id]), set(read_msg_ids), 'message_read on the last Pigs message should also get its parent')
|
||||
# Test: fetch a new thread, domain from expandable
|
||||
self.assertIsNotNone(new_threads_exp, 'message_read should have returned a new threads expandable')
|
||||
domain = new_threads_exp.get('domain', [])
|
||||
# Test: expandable, conditions in domain
|
||||
for condition in [('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)]:
|
||||
self.assertIn(condition, domain, 'general expandable domain should contain the message_read domain parameter')
|
||||
# Do: message_read with domain, thread_level=1 (should be imposed by JS)
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=domain, thread_level=1, limit=1, child_limit=1)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
type_list = [msg.get('message_type') for msg in read_msg_list]
|
||||
# Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
|
||||
self.assertEqual(len(type_list), 1, 'message_read on Pigs should return 1 message because everything else has been fetched')
|
||||
self.assertEqual([self.msg_0.id], read_msg_ids, 'message_read after 2 More should return only 1 last message')
|
||||
|
||||
# ----------------------------------------
|
||||
# CASE2: message_read with domain, flat
|
||||
# ----------------------------------------
|
||||
|
||||
# Do: read 2 lasts message, flat
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=[('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)], thread_level=0, limit=2)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
# Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is not set, 1 expandable
|
||||
self.assertEqual(len(read_msg_list), 3, 'message_read on last Pigs message should return 2 messages and 1 expandable')
|
||||
self.assertEqual(set([self.msg_9.id, self.msg_10.id]), set(read_msg_ids), 'message_read flat on Pigs last messages should only return those messages')
|
||||
self.assertFalse(read_msg_list[0].get('parent_id'), 'message_read flat should set the ancestor as False')
|
||||
self.assertFalse(read_msg_list[1].get('parent_id'), 'message_read flat should set the ancestor as False')
|
||||
# Data: get expandables
|
||||
new_msg_exp = None
|
||||
for msg in read_msg_list:
|
||||
if msg.get('message_type') == 'expandable':
|
||||
new_msg_exp = msg
|
||||
# Do: fetch new messages, domain from expandable
|
||||
self.assertIsNotNone(new_msg_exp, 'message_read flat on the 2 last Pigs messages should have returns a new threads expandable')
|
||||
domain = new_msg_exp.get('domain', [])
|
||||
# Test: expandable, conditions in domain
|
||||
for condition in [('model', '=', 'mail.channel'), ('res_id', '=', self.group_pigs.id)]:
|
||||
self.assertIn(condition, domain, 'new threads expandable domain should contain the message_read domain parameter')
|
||||
# Do: message_read with domain, thread_level=0 (should be imposed by JS)
|
||||
messages = self.env['mail.message'].sudo(self.user_employee).message_read(domain=domain, thread_level=0, limit=20)
|
||||
read_msg_list = [msg for thread in messages['threads'] for msg in thread]
|
||||
read_msg_ids = [msg.get('id') for msg in read_msg_list if msg.get('message_type') != 'expandable']
|
||||
# Test: structure content, ancestor is added to the read messages, ordered by id, ancestor is set, 2 expandables
|
||||
self.assertEqual(len(read_msg_list), 9, 'message_read on Pigs should return 9 messages and 0 expandable')
|
||||
self.assertEqual([self.msg_8.id, self.msg_7.id, self.msg_6.id, self.msg_5.id, self.msg_4.id, self.msg_3.id, self.msg_2.id, self.msg_1.id, self.msg_0.id], read_msg_ids,
|
||||
'message_read, More on flat, should return all remaning messages')
|
||||
# TODO: test message_fetch
|
||||
# TODO: test message_(un)read
|
||||
|
||||
Reference in New Issue
Block a user