[FIX] mail: fix model manager isDebug

Mix of proxy and non-proxy was causing issue in set of records.

closes odoo/odoo#99388

Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Sébastien Theys
2022-09-01 15:33:36 +02:00
parent ac5cf64c24
commit aad27c38ea
2 changed files with 15 additions and 12 deletions
+15 -11
View File
@@ -656,7 +656,7 @@ export class ModelManager {
const record = owl.markRaw(!this.isDebug ? nonProxyRecord : new Proxy(nonProxyRecord, {
get: function getFromProxy(record, prop) {
if (
!model.__fieldMap.has(prop) &&
(model.__fieldMap && !model.__fieldMap.has(prop)) &&
!['_super', 'then', 'localId'].includes(prop) &&
typeof prop !== 'symbol' &&
!(prop in record)
@@ -666,6 +666,9 @@ export class ModelManager {
return record[prop];
},
}));
if (this.isDebug) {
record.__proxifiedRecord = record;
}
// Ensure X2many relations are Set initially (other fields can stay undefined).
for (const field of model.__fieldList) {
if (field.fieldType === 'relation') {
@@ -1214,26 +1217,27 @@ export class ModelManager {
// Add field accessors.
Object.defineProperty(model.prototype, fieldName, {
get: function getFieldValue() { // this is bound to record
const record = this.modelManager.isDebug ? this.__proxifiedRecord : this;
if (this.modelManager._listeners.size) {
let entryRecord = this.__listenersObservingRecord;
const reason = this.modelManager.isDebug && `getField - ${field} of ${this}`;
let entryField = this.__listenersObservingFieldsOfRecord.get(field);
let entryRecord = record.__listenersObservingRecord;
const reason = record.modelManager.isDebug && `getField - ${field} of ${record}`;
let entryField = record.__listenersObservingFieldsOfRecord.get(field);
if (!entryField) {
entryField = new Map();
this.__listenersObservingFieldsOfRecord.set(field, entryField);
record.__listenersObservingFieldsOfRecord.set(field, entryField);
}
for (const listener of this.modelManager._listeners) {
listener.lastObservedRecords.add(this);
for (const listener of record.modelManager._listeners) {
listener.lastObservedRecords.add(record);
const info = { listener, reason };
if (entryRecord.has(listener)) {
entryRecord.get(listener).push(info);
} else {
entryRecord.set(listener, [info]);
}
if (!listener.lastObservedFieldsByRecord.has(this)) {
listener.lastObservedFieldsByRecord.set(this, new Set());
if (!listener.lastObservedFieldsByRecord.has(record)) {
listener.lastObservedFieldsByRecord.set(record, new Set());
}
listener.lastObservedFieldsByRecord.get(this).add(field);
listener.lastObservedFieldsByRecord.get(record).add(field);
if (entryField.has(listener)) {
entryField.get(listener).push(info);
} else {
@@ -1241,7 +1245,7 @@ export class ModelManager {
}
}
}
return field.get(this);
return field.get(record);
},
});
}
@@ -252,7 +252,6 @@ async function start(param0 = {}) {
param0.serverData.views = { ...pyEnv.getViews(), ...param0.serverData.views };
const webClient = await getWebClientReady({ ...param0, messagingBus, testSetupDoneDeferred });
webClient.env.services.messaging.modelManager;
registerCleanup(async () => {
await webClient.env.services.messaging.modelManager.messagingInitializedPromise;
webClient.env.services.messaging.modelManager.destroy();