diff options
Diffstat (limited to 'addons/web/static/src/js/views/basic/basic_model.js')
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_model.js | 42 |
1 files changed, 30 insertions, 12 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 e02f51259ef..42eea2ccfd6 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -208,6 +208,8 @@ var BasicModel = AbstractModel.extend({ * assume main viewType from the record * @param {Array} [options.fieldNames] list of field names for which a * default value must be generated (used to complete the values dict) + * @param {record} [options.parentRecord] The parent record of the current one + * usefull to get all the fields from all the views the model can be displayed on. * @returns {Deferred} */ applyDefaultValues: function (recordID, values, options) { @@ -219,6 +221,20 @@ var BasicModel = AbstractModel.extend({ var fieldName; record._changes = record._changes || {}; + /* Get the field's definition in the parent record if it is + * not present in the current one. + * + * @param {string} fieldName The name of the field we try to get the definition for + * in the parent record + * @returns {Object} the field's definition + */ + function getFieldsFromOtherViews(fieldName) { + return options.parentRecord + && options.parentRecord.mergedViewsFields[viewType] + && options.parentRecord.mergedViewsFields[viewType][fieldName] + || {}; + } + // ignore values for non requested fields (for instance, fields that are // not in the view) values = _.pick(values, fieldNames); @@ -227,7 +243,7 @@ var BasicModel = AbstractModel.extend({ for (var i = 0; i < fieldNames.length; i++) { fieldName = fieldNames[i]; if (!(fieldName in values) && !(fieldName in record._changes)) { - field = record.fields[fieldName]; + field = record.fields[fieldName] || getFieldsFromOtherViews(fieldName); if (field.type === 'float' || field.type === 'integer' || field.type === 'monetary') { @@ -243,7 +259,7 @@ var BasicModel = AbstractModel.extend({ // parse each value and create dataPoints for relational fields var defs = []; for (fieldName in values) { - field = record.fields[fieldName]; + field = record.fields[fieldName] || getFieldsFromOtherViews(fieldName); record.data[fieldName] = null; var dp; if (field.type === 'many2one' && values[fieldName]) { @@ -2496,6 +2512,7 @@ var BasicModel = AbstractModel.extend({ var fieldNames = options && options.fieldNames || record.getFieldNames(); var viewType = options && options.viewType || record.viewType; _.each(fieldNames, function (fieldName) { + var mergedViewsFields = record.fieldsInfo[viewType] && record.fieldsInfo[viewType][fieldName].mergeViewsFields || {}; var field = record.fields[fieldName]; if (field.type === 'one2many' || field.type === 'many2many') { var fieldInfo = record.fieldsInfo[viewType][fieldName]; @@ -2518,6 +2535,7 @@ var BasicModel = AbstractModel.extend({ rawContext: rawContext, relationField: field.relation_field, viewType: view ? view.type : fieldInfo.viewType, + mergedViewsFields: mergedViewsFields, }); record.data[fieldName] = list.id; if (!fieldInfo.__no_fetch) { @@ -3222,6 +3240,8 @@ var BasicModel = AbstractModel.extend({ * @param {string} [params.type='record'|'list'] * @param {[type]} [params.value] * @param {string} [params.viewType] the type of the view, e.g. 'list' or 'form' + * @param {Object} [params.mergedViewsFields] Contains for each viewType + * all the other viewTypes' fields plus its own to allow switching views more smoothly * @returns {Object} the resource created */ _makeDataPoint: function (params) { @@ -3281,6 +3301,7 @@ var BasicModel = AbstractModel.extend({ type: type, // 'record' | 'list' value: value, viewType: params.viewType, + mergedViewsFields: params.mergedViewsFields || {}, }; // _editionViewType is a dict whose keys are field names and which is populated when a field @@ -3324,22 +3345,15 @@ var BasicModel = AbstractModel.extend({ */ _makeDefaultRecord: function (modelName, params) { var self = this; - + var parentRecord = self.localData[params.parentID]; var determineExtraFields = function() { // Fields that are present in the originating view, that need to be initialized // Hence preventing their value to crash when getting back to the originating view - var parentRecord = self.localData[params.parentID]; - var originView = parentRecord && parentRecord.fieldsInfo; if (!originView || !originView[parentRecord.viewType]) return []; - var fieldsFromOrigin = _.filter(Object.keys(originView[parentRecord.viewType]), - function(fieldname) { - return params.fields[fieldname] !== undefined; - }); - - return fieldsFromOrigin; + return Object.keys(originView[parentRecord.viewType]); } var fieldNames = Object.keys(params.fieldsInfo[params.viewType]); @@ -3364,7 +3378,7 @@ var BasicModel = AbstractModel.extend({ viewType: params.viewType, }); - return self.applyDefaultValues(record.id, result, {fieldNames: _.union(fieldNames, extraFields)}) + return self.applyDefaultValues(record.id, result, {fieldNames: _.union(fieldNames, extraFields), parentRecord: parentRecord}) .then(function () { var def = $.Deferred(); self._performOnChange(record, fields_key).always(function () { @@ -3847,6 +3861,10 @@ var BasicModel = AbstractModel.extend({ var emptyGroupsIDs = _.difference(_.pluck(previousGroups, 'id'), list.data); _.each(emptyGroupsIDs, function (groupID) { list.data.push(groupID); + var emptyGroup = self.localData[groupID]; + // this attribute hasn't been updated in the previous + // loop for empty groups + emptyGroup.aggregateValues = {}; }); } return $.when.apply($, defs).then(function () { |
