From aad27c38ead082f2546fbbabdce4d9fb8b195313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Theys?= Date: Thu, 1 Sep 2022 11:11:48 +0000 Subject: [PATCH] [FIX] mail: fix model manager isDebug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mix of proxy and non-proxy was causing issue in set of records. closes odoo/odoo#99388 Signed-off-by: Alexandre Kühn (aku) --- addons/mail/static/src/model/model_manager.js | 26 +++++++++++-------- .../mail/static/tests/helpers/test_utils.js | 1 - 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/addons/mail/static/src/model/model_manager.js b/addons/mail/static/src/model/model_manager.js index 71eab44ed75..5bf49b8801c 100644 --- a/addons/mail/static/src/model/model_manager.js +++ b/addons/mail/static/src/model/model_manager.js @@ -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); }, }); } diff --git a/addons/mail/static/tests/helpers/test_utils.js b/addons/mail/static/tests/helpers/test_utils.js index d5a17b171f6..eb5ea0efb5b 100644 --- a/addons/mail/static/tests/helpers/test_utils.js +++ b/addons/mail/static/tests/helpers/test_utils.js @@ -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();