[REF] adds DataLoader class to graph view (addon web_graph)

bzr revid: ged@openerp.com-20131216142757-anqt11ccrwswdify
This commit is contained in:
Gery Debongnie 2013-12-16 15:27:57 +01:00
parent e0ee9a58c5
commit a22648c083
1 changed files with 73 additions and 60 deletions

View File

@ -9,10 +9,11 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
this.rows = { groupby: [], main: null, headers: null };
this.cols = { groupby: [], main: null, headers: null };
this.cells = [];
this.model = model;
this.domain = domain;
this.measure = null;
this.data_loader = new openerp.web_graph.DataLoader(model);
this.id_seed = 0;
this.no_data = true;
this.stale_data = true;
@ -157,7 +158,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
}
var otherDim = (header.root === this.cols) ? this.rows : this.cols;
return query_groups_data(this.model, this.visible_fields(), header.domain, otherDim.groupby, field_id)
return this.data_loader.get_groups(this.visible_fields(), header.domain, otherDim.groupby, {first_groupby:field_id, add_path:true})
.then(function (groups) {
_.each(groups.reverse(), function (group) {
var new_header_id = self.make_header(group, header);
@ -183,7 +184,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
},
make_header: function (groups, parent) {
var name = get_attribute_value(groups[0]),
var name = groups[0].attributes.value,
new_header = {
id: _.uniqueId(),
path: parent.path.concat(name),
@ -195,7 +196,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
root: parent.root,
};
parent.children.splice(0,0, new_header);
insertAfter(parent.root.headers, parent, new_header);
parent.root.headers.splice(parent.root.headers.indexOf(parent) + 1, 0, new_header);
return new_header.id;
},
@ -270,7 +271,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
_.each(corresponding_header.children, function (c) {
c.is_expanded = false;
});
}
}
if (corresponding_header && (!header.is_expanded)) {
corresponding_header.is_expanded = false;
}
@ -318,7 +319,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
groupbys = [rows, []];
}
def_array = _.map(groupbys, function (groupby) {
return query_groups(self.model, self.visible_fields(), self.domain, groupby);
return self.data_loader.get_groups(self.visible_fields(), self.domain, groupby);
});
return $.when.apply(null, def_array).then(function () {
@ -387,7 +388,7 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
}
function make_tree_headers (data_pt, parent, max_depth) {
var value = get_attribute_value(data_pt),
var value = data_pt.attributes.value, //get_attribute_value(data_pt),
node = {
id: _.uniqueId(),
path: parent.path.concat(value),
@ -435,7 +436,6 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
}
}
console.log('attr', attr);
var rowpath = path.slice(0, index),
colpath = path.slice(index);
@ -458,61 +458,74 @@ openerp.web_graph.PivotTable = openerp.web.Class.extend({
});
function insertAfter(array, after, elem) {
array.splice(array.indexOf(after) + 1, 0, elem);
}
openerp.web_graph.DataLoader = openerp.web.Class.extend({
init: function (model) {
this.model = model;
},
/**
* Query the server and return a deferred which will return the data
* with all the groupbys applied (this is done for now, but the goal
* is to modify read_group in order to allow eager and lazy groupbys
*/
function query_groups (model, fields, domain, groupbys) {
return model.query(fields)
.filter(domain)
.group_by(groupbys)
.then(function (results) {
var non_empty_results = _.filter(results, function (group) {
return group.attributes.length > 0;
});
if (groupbys.length <= 1) {
return non_empty_results;
} else {
var get_subgroups = $.when.apply(null, _.map(non_empty_results, function (result) {
var new_domain = result.model._domain;
var new_groupings = groupbys.slice(1);
return query_groups(model, fields,new_domain, new_groupings).then(function (subgroups) {
result.subgroups_data = subgroups;
});
}));
return get_subgroups.then(function () {
return non_empty_results;
});
}
});
}
get_groups: function (fields, domain, groupbys, options) {
var self = this,
options = (options) ? options : {},
groupings = (options.first_groupby) ? [options.first_groupby].concat(groupbys) : groupbys;
function query_groups_data (model, fields, domain, row_groupbys, col_groupby) {
return query_groups(model, fields, domain, [col_groupby].concat(row_groupbys)).then(function (groups) {
return _.map(groups, function (group) {
return format_group(group, []);
});
});
}
return this._query_db(fields, domain, groupings).then(function (groups) {
return _.map(groups, function (group) {
return (options.add_path) ?self._add_path(group, []) : group;
});
});
function format_group (group, path) {
group.path = path.concat(get_attribute_value(group));
var result = [group];
_.each(group.subgroups_data, function (subgroup) {
result = result.concat(format_group (subgroup, group.path));
});
return result;
}
},
_query_db: function (fields, domain, groupbys) {
var self = this;
return this.model.query(fields)
.filter(domain)
.group_by(groupbys)
.then(function (results) {
var non_empty_results = _.filter(results, function (group) {
return group.attributes.length > 0;
});
_.each(non_empty_results, self._sanitize_value);
if (groupbys.length <= 1) {
return non_empty_results;
} else {
var get_subgroups = $.when.apply(null, _.map(non_empty_results, function (result) {
var new_domain = result.model._domain;
var new_groupings = groupbys.slice(1);
return self._query_db(fields,new_domain, new_groupings).then(function (subgroups) {
result.subgroups_data = subgroups;
});
}));
return get_subgroups.then(function () {
return non_empty_results;
});
}
});
},
_sanitize_value: function (group) {
var value = group.attributes.value;
if (value === false) {
group.attributes.value = 'undefined';
} else if (value instanceof Array) {
group.attributes.value = value[1];
} else {
group.attributes.value = value;
}
},
_add_path: function (group, current_path) {
var self = this;
group.path = current_path.concat(group.attributes.value);
var result = [group];
_.each(group.subgroups_data, function (subgroup) {
result = result.concat(self._add_path(subgroup, group.path));
});
return result;
},
});
function get_attribute_value (group) {
var value = group.attributes.value;
if (value === false) return 'undefined';
return (value instanceof Array) ? value[1] : value;
}
})();