Skip to content

Commit 23c1523

Browse files
committed
[FIX] mail: Sort mail.message by date instead of id.
1 parent 0b0887e commit 23c1523

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

addons/mail/controllers/thread.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def mail_thread_messages(self, thread_model, thread_id, search_term=None, before
3131
("model", "=", thread_model),
3232
("message_type", "!=", "user_notification"),
3333
]
34-
res = request.env["mail.message"]._message_fetch(domain, search_term=search_term, before=before, after=after, around=around, limit=limit)
34+
res = request.env["mail.message"].with_context(is_chatter_view=True)._message_fetch(domain, search_term=search_term, before=before, after=after, around=around, limit=limit)
3535
messages = res.pop("messages")
3636
if not request.env.user._is_public():
3737
messages.set_message_done()

addons/mail/models/mail_message.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,17 +1102,25 @@ def _message_fetch(self, domain, search_term=None, before=None, after=None, arou
11021102
[("subtype_id.description", "ilike", search_term)],
11031103
])])
11041104
res["count"] = self.search_count(domain)
1105-
if around is not None:
1106-
messages_before = self.search(domain=[*domain, ('id', '<=', around)], limit=limit // 2, order="id DESC")
1107-
messages_after = self.search(domain=[*domain, ('id', '>', around)], limit=limit // 2, order='id ASC')
1108-
return {**res, "messages": (messages_after + messages_before).sorted('id', reverse=True)}
1109-
if before:
1110-
domain = expression.AND([domain, [('id', '<', before)]])
1111-
if after:
1112-
domain = expression.AND([domain, [('id', '>', after)]])
1113-
res["messages"] = self.search(domain, limit=limit, order='id ASC' if after else 'id DESC')
1105+
1106+
def _domain(message, date_oper, id_oper):
1107+
return expression.OR([
1108+
[('date', date_oper, message.date)],
1109+
expression.AND([
1110+
[('date', '=', message.date)],
1111+
[('id', id_oper, message.id)]])])
1112+
1113+
if around and (around := self.browse(around)):
1114+
messages_before = self.search(expression.AND([domain, _domain(around, '<', '<=')]), limit=limit // 2, order='date DESC, id DESC')
1115+
messages_after = self.search(expression.AND([domain, _domain(around, '>', '>')]), limit=limit // 2, order='date ASC, id ASC').sorted(lambda m: (m.date, m.id), reverse=True)
1116+
return {**res, "messages": (messages_after + messages_before)}
1117+
if before and (before := self.browse(before)):
1118+
domain = expression.AND([domain, _domain(before, '<', '<')])
1119+
if after and (after := self.browse(after)):
1120+
domain = expression.AND([domain, _domain(after, '>', '>')])
1121+
res["messages"] = self.search(domain, limit=limit, order='date ASC, id ASC' if after else 'date DESC, id DESC')
11141122
if after:
1115-
res["messages"] = res["messages"].sorted('id', reverse=True)
1123+
res["messages"] = res["messages"].sorted(lambda m: (m.date, m.id), reverse=True)
11161124
return res
11171125

11181126
def _message_notifications_to_store(self, store: Store):

0 commit comments

Comments
 (0)