[MOVE] datagroup to a private ListView API

bzr revid: xmo@openerp.com-20121017105213-sfosutg26zg0w2ax
This commit is contained in:
Xavier Morel 2012-10-17 12:52:13 +02:00
parent 8d3fd60178
commit 71bbb149fb
5 changed files with 69 additions and 93 deletions

View File

@ -1,5 +1,5 @@
Don't stop the world now: asynchronous development and Javascript Asynchronous Operations
================================================================= =======================
As a language (and runtime), javascript is fundamentally As a language (and runtime), javascript is fundamentally
single-threaded. This means any blocking request or computation will single-threaded. This means any blocking request or computation will

View File

@ -95,8 +95,8 @@ DataGroup -> also Model
----------------------- -----------------------
Alongside the deprecation of ``DataSet`` for Alongside the deprecation of ``DataSet`` for
:js:class:`~openerp.web.Model`, OpenERP Web 7.0 also deprecates :js:class:`~openerp.web.Model`, OpenERP Web 7.0 removes
``DataGroup`` and its subtypes in favor of a single method on ``DataGroup`` and its subtypes as public objects in favor of a single method on
:js:class:`~openerp.web.Query`: :js:class:`~openerp.web.Query`:
:js:func:`~openerp.web.Query.group_by`. :js:func:`~openerp.web.Query.group_by`.
@ -116,3 +116,8 @@ Because it is heavily related to ``DataSet`` (as it *yields*
``DataGroup`` (if we want to stay consistent), which is a good time to ``DataGroup`` (if we want to stay consistent), which is a good time to
make the API more imperative and look more like what most developers make the API more imperative and look more like what most developers
are used to. are used to.
But as ``DataGroup`` users in 6.1 were rare (and there really was little reason
to use it), it has been removed as a public API.

View File

@ -1,5 +1,5 @@
Outside the box: network interactions RPC Calls
===================================== =========
Building static displays is all nice and good and allows for neat Building static displays is all nice and good and allows for neat
effects (and sometimes you're given data to display from third parties effects (and sometimes you're given data to display from third parties

View File

@ -350,89 +350,6 @@ instance.web.Model = instance.web.Class.extend({
}, },
}); });
instance.web.DataGroup = instance.web.CallbackEnabled.extend({
/**
* Management interface between views and grouped collections of OpenERP
* records.
*
* The root DataGroup is instantiated with the relevant information
* (a session, a model, a domain, a context and a group_by sequence), the
* domain and context may be empty. It is then interacted with via
* :js:func:`~instance.web.DataGroup.list`, which is used to read the
* content of the current grouping level.
*
* @constructs instance.web.DataGroup
* @extends instance.web.CallbackEnabled
*
* @param {instance.web.CallbackEnabled} parent widget
* @param {String} model name of the model managed by this DataGroup
* @param {Array} domain search domain for this DataGroup
* @param {Object} context context of the DataGroup's searches
* @param {Array} group_by sequence of fields by which to group
* @param {Number} [level=0] nesting level of the group
*/
init: function(parent, model, domain, context, group_by, level) {
this._super(parent, null);
this.model = new instance.web.Model(model, context, domain);
this.group_by = group_by;
this.context = context;
this.domain = domain;
this.level = level || 0;
},
list: function (fields, ifGroups, ifRecords) {
var self = this;
var query = this.model.query(fields).order_by(this.sort).group_by(this.group_by);
$.when(query).then(function (querygroups) {
// leaf node
if (!querygroups) {
var ds = new instance.web.DataSetSearch(self, self.model.name, self.model.context(), self.model.domain());
ds._sort = self.sort;
ifRecords(ds);
return;
}
// internal node
var child_datagroups = _(querygroups).map(function (group) {
var child_context = _.extend(
{}, self.model.context(), group.model.context());
var child_dg = new instance.web.DataGroup(
self, self.model.name, group.model.domain(),
child_context, group.model._context.group_by,
self.level + 1);
child_dg.sort = self.sort;
// copy querygroup properties
child_dg.__context = child_context;
child_dg.__domain = group.model.domain();
child_dg.folded = group.get('folded');
child_dg.grouped_on = group.get('grouped_on');
child_dg.length = group.get('length');
child_dg.value = group.get('value');
child_dg.openable = group.get('has_children');
child_dg.aggregates = group.get('aggregates');
return child_dg;
});
ifGroups(child_datagroups);
});
}
});
instance.web.StaticDataGroup = instance.web.DataGroup.extend({
/**
* A specialization of data groups, relying on a single static
* dataset as its records provider.
*
* @constructs instance.web.StaticDataGroup
* @extends instance.web.DataGroup
* @param {openep.web.DataSetStatic} dataset a static dataset backing the groups
*/
init: function (dataset) {
this.dataset = dataset;
},
list: function (fields, ifGroups, ifRecords) {
ifRecords(this.dataset);
}
});
instance.web.DataSet = instance.web.CallbackEnabled.extend({ instance.web.DataSet = instance.web.CallbackEnabled.extend({
/** /**
* Collection of OpenERP records, used to share records and the current selection between views. * Collection of OpenERP records, used to share records and the current selection between views.

View File

@ -64,9 +64,9 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
this.set_groups(new (this.options.GroupsType)(this)); this.set_groups(new (this.options.GroupsType)(this));
if (this.dataset instanceof instance.web.DataSetStatic) { if (this.dataset instanceof instance.web.DataSetStatic) {
this.groups.datagroup = new instance.web.StaticDataGroup(this.dataset); this.groups.datagroup = new StaticDataGroup(this.dataset);
} else { } else {
this.groups.datagroup = new instance.web.DataGroup( this.groups.datagroup = new DataGroup(
this, this.model, this, this.model,
dataset.get_domain(), dataset.get_domain(),
dataset.get_context()); dataset.get_context());
@ -554,7 +554,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
*/ */
do_search: function (domain, context, group_by) { do_search: function (domain, context, group_by) {
this.page = 0; this.page = 0;
this.groups.datagroup = new instance.web.DataGroup( this.groups.datagroup = new DataGroup(
this, this.model, domain, context, group_by); this, this.model, domain, context, group_by);
this.groups.datagroup.sort = this.dataset._sort; this.groups.datagroup.sort = this.dataset._sort;
@ -1150,7 +1150,7 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
passtrough_events: 'action deleted row_link', passtrough_events: 'action deleted row_link',
/** /**
* Grouped display for the ListView. Handles basic DOM events and interacts * Grouped display for the ListView. Handles basic DOM events and interacts
* with the :js:class:`~instance.web.DataGroup` bound to it. * with the :js:class:`~DataGroup` bound to it.
* *
* Provides events similar to those of * Provides events similar to those of
* :js:class:`~instance.web.ListView.List` * :js:class:`~instance.web.ListView.List`
@ -1555,6 +1555,60 @@ instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.we
} }
}); });
var DataGroup = instance.web.Class.extend({
init: function(parent, model, domain, context, group_by, level) {
this._super(parent, null);
this.model = new instance.web.Model(model, context, domain);
this.group_by = group_by;
this.context = context;
this.domain = domain;
this.level = level || 0;
},
list: function (fields, ifGroups, ifRecords) {
var self = this;
var query = this.model.query(fields).order_by(this.sort).group_by(this.group_by);
$.when(query).then(function (querygroups) {
// leaf node
if (!querygroups) {
var ds = new instance.web.DataSetSearch(self, self.model.name, self.model.context(), self.model.domain());
ds._sort = self.sort;
ifRecords(ds);
return;
}
// internal node
var child_datagroups = _(querygroups).map(function (group) {
var child_context = _.extend(
{}, self.model.context(), group.model.context());
var child_dg = new instance.web.DataGroup(
self, self.model.name, group.model.domain(),
child_context, group.model._context.group_by,
self.level + 1);
child_dg.sort = self.sort;
// copy querygroup properties
child_dg.__context = child_context;
child_dg.__domain = group.model.domain();
child_dg.folded = group.get('folded');
child_dg.grouped_on = group.get('grouped_on');
child_dg.length = group.get('length');
child_dg.value = group.get('value');
child_dg.openable = group.get('has_children');
child_dg.aggregates = group.get('aggregates');
return child_dg;
});
ifGroups(child_datagroups);
});
}
});
var StaticDataGroup = DataGroup.extend({
init: function (dataset) {
this.dataset = dataset;
},
list: function (fields, ifGroups, ifRecords) {
ifRecords(this.dataset);
}
});
/** /**
* @mixin Events * @mixin Events
*/ */