[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:
Thibault Delavallée
2016-08-02 12:32:43 +02:00
parent a32b3b220d
commit 912223e49d
3 changed files with 3 additions and 326 deletions
+1 -175
View File
@@ -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()
-6
View File
@@ -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):
"""
+2 -145
View File
@@ -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