Skip to content

Commit 7232654

Browse files
committed
[REF] mail: replace ThreadSeenInfo by ChannelMember data
SeenInfo was a model heavily coupled with ChannelMember. There was no point to make another model when it could just be a field on ChannelMember. This commit simplifies the code by putting `lastSeen/FetchedMessage` in the ChannelMember model and formatter. closes odoo#145010 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
1 parent 97c3c46 commit 7232654

File tree

16 files changed

+91
-180
lines changed

16 files changed

+91
-180
lines changed

addons/im_livechat/models/discuss_channel_member.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def _get_partner_data(self, fields=None):
2626
data = {
2727
'active': self.partner_id.active,
2828
'id': self.partner_id.id,
29+
'type': "partner",
2930
'is_public': self.partner_id.is_public,
3031
'is_bot': self.partner_id.id in self.channel_id.livechat_channel_id.rule_ids.mapped('chatbot_script_id.operator_partner_id.id')
3132
}

addons/im_livechat/static/tests/helpers/mock_server/models/discuss_channel_member.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ patch(MockServer.prototype, {
1919
const data = {
2020
id: partner.id,
2121
is_public: partner.is_public,
22+
type: "partner",
2223
};
2324
if (partner.user_livechat_username) {
2425
data["user_livechat_username"] = partner.user_livechat_username;

addons/im_livechat/tests/test_get_discuss_channel.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def test_get_discuss_channel(self):
2222
self.assertTrue(all(partner_id in channel_operator_ids for partner_id in self.operators.mapped('partner_id').ids))
2323

2424
def test_channel_get_livechat_visitor_info(self):
25+
self.maxDiff = None
2526
belgium = self.env.ref('base.be')
2627
test_user = self.env['res.users'].create({'name': 'Roger', 'login': 'roger', 'password': self.password, 'country_id': belgium.id})
2728

@@ -81,6 +82,8 @@ def test_channel_get_livechat_visitor_info(self):
8182
'type': "partner",
8283
'user_livechat_username': 'Michel Operator',
8384
},
85+
'fetched_message_id': False,
86+
'seen_message_id': False,
8487
},
8588
{
8689
'thread': {'id': channel_info['id'], 'model': "discuss.channel"},
@@ -98,6 +101,8 @@ def test_channel_get_livechat_visitor_info(self):
98101
'name': 'Roger',
99102
'type': "partner",
100103
},
104+
'fetched_message_id': False,
105+
'seen_message_id': False,
101106
},
102107
]]])
103108

@@ -131,6 +136,8 @@ def test_channel_get_livechat_visitor_info(self):
131136
'type': "partner",
132137
'user_livechat_username': 'Michel Operator',
133138
},
139+
'fetched_message_id': False,
140+
'seen_message_id': False,
134141
},
135142
]]])
136143

addons/mail/models/discuss/discuss_channel.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -819,12 +819,6 @@ def _channel_info(self):
819819
# exclude chat and other small channels from this optimization because they are
820820
# assumed to be smaller and it's important to know the member list for them
821821
info['channelMembers'] = [('ADD', list(members_by_channel[channel]._discuss_channel_member_format().values()))]
822-
info['seenInfos'] = sorted([{
823-
'id': cp.id,
824-
'partner': {'id': cp.partner_id.id, 'type': "partner"},
825-
'lastFetchedMessage': {'id': cp.fetched_message_id.id} if cp.fetched_message_id else False,
826-
'lastSeenMessage': {'id': cp.seen_message_id.id} if cp.seen_message_id else False,
827-
} for cp in members_by_channel[channel] if cp.partner_id], key=lambda p: p['partner']['id'])
828822
# add RTC sessions info
829823
info.update({
830824
'invitedMembers': [('ADD', list(invited_members_by_channel[channel]._discuss_channel_member_format(fields={'id': True, 'channel': {}, 'persona': {'partner': {'id': True, 'name': True, 'im_status': True}, 'guest': {'id': True, 'name': True, 'im_status': True}}}).values()))],

addons/mail/models/discuss/discuss_channel_member.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ def _unmute(self):
173173

174174
def _discuss_channel_member_format(self, fields=None):
175175
if not fields:
176-
fields = {'id': True, 'channel': {}, 'persona': {}}
176+
fields = {'id': True, 'channel': {}, 'persona': {}, 'fetched_message_id': True, 'seen_message_id': True}
177177
members_formatted_data = {}
178178
for member in self:
179179
data = {}
@@ -185,7 +185,6 @@ def _discuss_channel_member_format(self, fields=None):
185185
if member.partner_id:
186186
# sudo: res.partner - reading _get_partner_data related to a member is considered acceptable
187187
persona = member.sudo()._get_partner_data(fields=fields.get('persona', {}).get('partner'))
188-
persona['type'] = "partner"
189188
if member.guest_id:
190189
# sudo: mail.guest - reading _guest_format related to a member is considered acceptable
191190
persona = member.guest_id.sudo()._guest_format(fields=fields.get('persona', {}).get('guest')).get(member.guest_id)
@@ -194,6 +193,10 @@ def _discuss_channel_member_format(self, fields=None):
194193
data['custom_notifications'] = member.custom_notifications
195194
if 'mute_until_dt' in fields:
196195
data['mute_until_dt'] = member.mute_until_dt
196+
if 'fetched_message_id' in fields:
197+
data['fetched_message_id'] = {'id': member.fetched_message_id.id} if member.fetched_message_id else False
198+
if 'seen_message_id' in fields:
199+
data['seen_message_id'] = {'id': member.seen_message_id.id} if member.seen_message_id else False
197200
members_formatted_data[member] = data
198201
return members_formatted_data
199202

addons/mail/static/src/core/common/@types/models.d.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ declare module "models" {
1717
import { Settings as SettingsClass } from "@mail/core/common/settings_model";
1818
import { Store as StoreClass } from "@mail/core/common/store_service";
1919
import { Thread as ThreadClass } from "@mail/core/common/thread_model";
20-
import { ThreadSeenInfo as ThreadSeenInfoClass } from "@mail/core/common/thread_seen_info_model";
2120
import { Volume as VolumeClass } from "@mail/core/common/volume_model";
2221

2322
// define interfaces for jsdoc, including with patches
@@ -39,7 +38,6 @@ declare module "models" {
3938
export interface Settings extends SettingsClass {}
4039
export interface Store extends StoreClass {}
4140
export interface Thread extends ThreadClass {}
42-
export interface ThreadSeenInfo extends ThreadSeenInfoClass {}
4341
export interface Volume extends VolumeClass {}
4442

4543
// required to propagate types in relational fields
@@ -62,7 +60,6 @@ declare module "models" {
6260
"Settings": Settings,
6361
"Store": Store,
6462
"Thread": Thread,
65-
"ThreadSeenInfo": ThreadSeenInfo,
6663
"Volume": Volume,
6764
}
6865
}

addons/mail/static/src/core/common/channel_member_model.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@
22

33
import { Record } from "@mail/core/common/record";
44

5-
/**
6-
* @class ChannelMember
7-
* @typedef Data
8-
* @property {number} id
9-
* @property {import("models").Persona} persona
10-
* @property {import("models").Thread} thread
11-
*/
125
export class ChannelMember extends Record {
136
static id = "id";
147
/** @type {Object.<number, import("models").ChannelMember>} */
@@ -27,6 +20,8 @@ export class ChannelMember extends Record {
2720
persona = Record.one("Persona", { inverse: "channelMembers" });
2821
rtcSession = Record.one("RtcSession");
2922
thread = Record.one("Thread", { inverse: "channelMembers" });
23+
fetched_message_id = Record.one("Message");
24+
seen_message_id = Record.one("Message");
3025

3126
/**
3227
* @returns {string}

addons/mail/static/src/core/common/message_seen_indicator.js

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,20 @@ export class MessageSeenIndicator extends Component {
1818
}
1919

2020
get hasEveryoneSeen() {
21-
const otherDidNotSee = this.props.thread.seenInfos.filter((seenInfo) => {
21+
const otherDidNotSee = this.props.thread.channelMembers.filter((member) => {
2222
return (
23-
seenInfo.partner.notEq(this.props.message.author) &&
24-
(!seenInfo.lastSeenMessage || seenInfo.lastSeenMessage.id < this.props.message.id)
23+
member.persona.notEq(this.props.message.author) &&
24+
(!member.seen_message_id || member.seen_message_id.id < this.props.message.id)
2525
);
2626
});
2727
return otherDidNotSee.length === 0;
2828
}
2929

3030
get hasEveryoneReceived() {
31-
return !this.props.thread.seenInfos.some((seenInfo) => {
31+
return !this.props.thread.channelMembers.some((member) => {
3232
return (
33-
seenInfo.partner.notEq(this.props.message.author) &&
34-
(!seenInfo.lastFetchedMessage ||
35-
seenInfo.lastFetchedMessage.id < this.props.message.id)
33+
member.persona.notEq(this.props.message.author) &&
34+
(!member.fetched_message_id || member.fetched_message_id.id < this.props.message.id)
3635
);
3736
});
3837
}
@@ -45,19 +44,19 @@ export class MessageSeenIndicator extends Component {
4544
}
4645

4746
get hasSomeoneSeen() {
48-
const otherSeen = this.props.thread.seenInfos.filter(
49-
(seenInfo) =>
50-
seenInfo.partner.notEq(this.props.message.author) &&
51-
seenInfo.lastSeenMessage?.id >= this.props.message.id
47+
const otherSeen = this.props.thread.channelMembers.filter(
48+
(member) =>
49+
member.persona.notEq(this.props.message.author) &&
50+
member.seen_message_id?.id >= this.props.message.id
5251
);
5352
return otherSeen.length > 0;
5453
}
5554

5655
get hasSomeoneFetched() {
57-
const otherFetched = this.props.thread.seenInfos.filter(
58-
(seenInfo) =>
59-
seenInfo.partner.notEq(this.props.message.author) &&
60-
seenInfo.lastFetchedMessage?.id >= this.props.message.id
56+
const otherFetched = this.props.thread.channelMembers.filter(
57+
(member) =>
58+
member.persona.notEq(this.props.message.author) &&
59+
member.fetched_message_id?.id >= this.props.message.id
6160
);
6261
return otherFetched.length > 0;
6362
}

addons/mail/static/src/core/common/store_service.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ export class Store extends BaseStore {
4646
Settings;
4747
/** @type {typeof import("@mail/core/common/thread_model").Thread} */
4848
Thread;
49-
/** @type {typeof import("@mail/core/common/thread_seen_info_model").ThreadSeenInfo} */
50-
ThreadSeenInfo;
5149
/** @type {typeof import("@mail/core/common/volume_model").Volume} */
5250
Volume;
5351

addons/mail/static/src/core/common/thread_model.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ export class Thread extends Record {
243243
});
244244
/** @type {string} */
245245
defaultDisplayMode;
246-
seenInfos = Record.many("ThreadSeenInfo");
247246
/** @type {SuggestedRecipient[]} */
248247
suggestedRecipients = [];
249248
hasLoadingFailed = false;
@@ -444,15 +443,15 @@ export class Thread extends Record {
444443
}
445444

446445
get lastSelfMessageSeenByEveryone() {
447-
const otherSeenInfos = [...this.seenInfos].filter((seenInfo) =>
448-
seenInfo.partner.notEq(this._store.self)
446+
const otherMembers = this.channelMembers.filter((member) =>
447+
member.persona.notEq(this._store.self)
449448
);
450-
if (otherSeenInfos.length === 0) {
449+
if (otherMembers.length === 0) {
451450
return false;
452451
}
453-
const otherLastSeenMessageIds = otherSeenInfos
454-
.filter((seenInfo) => seenInfo.lastSeenMessage)
455-
.map((seenInfo) => seenInfo.lastSeenMessage.id);
452+
const otherLastSeenMessageIds = otherMembers
453+
.filter((member) => member.seen_message_id)
454+
.map((member) => member.seen_message_id.id);
456455
if (otherLastSeenMessageIds.length === 0) {
457456
return false;
458457
}

0 commit comments

Comments
 (0)