diff options
Diffstat (limited to 'addons/web/static/src/js/views/basic')
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_model.js | 76 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_view.js | 23 |
2 files changed, 69 insertions, 30 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index b3777a05efb..4b39025b35d 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1619,40 +1619,50 @@ var BasicModel = AbstractModel.extend({ if (!ids.length || fieldInfo.__no_fetch) { return $.when(); } - + var def; + var fieldNames = _.keys(fieldInfo.relatedFields); // step 2: fetch data from server - return this._rpc({ + // if we want specific fields + // if not we return an array of objects with the id + // to avoid fetching all the relation fields and an useless rpc + if (fieldNames.length) { + def = this._rpc({ model: field.relation, method: 'read', - args: [ids, _.keys(fieldInfo.relatedFields)], + args: [ids, fieldNames], context: {}, // FIXME - }) - .then(function (results) { - // step 3: assign values to correct datapoints - var dataPoints = _.map(results, function (result) { - return self._makeDataPoint({ - modelName: field.relation, - data: result, - fields: fields, - fieldsInfo: fieldsInfo, - viewType: viewType, - }); + }); + } else { + def = $.when(_.map(ids, function (id) { + return {id:id}; + })); + } + return def.then(function (results) { + // step 3: assign values to correct datapoints + var dataPoints = _.map(results, function (result) { + return self._makeDataPoint({ + modelName: field.relation, + data: result, + fields: fields, + fieldsInfo: fieldsInfo, + viewType: viewType, }); + }); - _.each(list.data, function (dataPoint) { - var record = self.localData[dataPoint]; - var m2mList = self.localData[record.data[fieldName]]; + _.each(list.data, function (dataPoint) { + var record = self.localData[dataPoint]; + var m2mList = self.localData[record.data[fieldName]]; - m2mList.data = []; - _.each(m2mList.res_ids, function (res_id) { - var dataPoint = _.find(dataPoints, function (d) { - return d.res_id === res_id; - }); - m2mList.data.push(dataPoint.id); - m2mList.count++; + m2mList.data = []; + _.each(m2mList.res_ids, function (res_id) { + var dataPoint = _.find(dataPoints, function (d) { + return d.res_id === res_id; }); + m2mList.data.push(dataPoint.id); + m2mList.count++; }); }); + }); }, /** * batch request for x2ms for datapoint of type list @@ -2444,12 +2454,18 @@ var BasicModel = AbstractModel.extend({ } } if (missingIds.length) { - def = this._rpc({ - model: list.model, - method: 'read', - args: [missingIds, fieldNames], - context: {} // FIXME - }); + if (fieldNames.length) { + def = this._rpc({ + model: list.model, + method: 'read', + args: [missingIds, fieldNames], + context: {} // FIXME + }); + } else { + def = $.when(_.map(missingIds, function (id) { + return {id:id}; + })); + } } else { def = $.when(); } diff --git a/addons/web/static/src/js/views/basic/basic_view.js b/addons/web/static/src/js/views/basic/basic_view.js index 2604dcf0aa1..17dc4b97125 100644 --- a/addons/web/static/src/js/views/basic/basic_view.js +++ b/addons/web/static/src/js/views/basic/basic_view.js @@ -66,6 +66,29 @@ var BasicView = AbstractView.extend({ var viewType = this.viewType; var viewFields = Object.keys(record.fieldsInfo[viewType]); var fieldNames = _.difference(viewFields, Object.keys(record.data)); + // Suppose that in a form view, there is an x2many list view with + // an x2many field F of the related record, and that F is also + // displayed in the x2many form view (e.g. as a list or a kanban). + // In this case, F is represented in record.data + // (as it is known by the x2many list view), but its related fields + // (those displayed in the list or kanban) still need to be fetched. + // So when this happens, F is added to the list of fieldNames to fetch. + _.each(viewFields, function (name) { + if (!_.contains(fieldNames, name)) { + var fieldType = record.fields[name].type; + if ((fieldType === 'one2many' || fieldType === 'many2many')) { + if (!('fieldsInfo' in record.data[name])) { + fieldNames.push(name); + } else { + var recordViewTypes = Object.keys(record.data[name].fieldsInfo); + var fieldViewTypes = Object.keys(record.fieldsInfo[viewType][name].views); + if (_.difference(fieldViewTypes, recordViewTypes).length) { + fieldNames.push(name); + } + } + } + } + }); if (fieldNames.length && !this.model.isNew(record.id)) { return this.model.reload(this.recordID, { fieldNames: fieldNames, |
