summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/corelib.js
diff options
context:
space:
mode:
authorXavier Morel <xmo@openerp.com>2012-08-06 11:46:27 +0200
committerXavier Morel <xmo@openerp.com>2012-08-06 11:46:27 +0200
commit6f4abdfbd519e8f8a416e24fdb541a88ef3104c6 (patch)
tree4ae85fde3c41ecb0df7adea45c6f5cd429276dd3 /addons/web/static/src/js/corelib.js
parent44b662b5bb799f46ee9ce948de26b6e06cea8e6e (diff)
[IMP] move eval functions for domains, groupbys and contexts outside of corelib, as well as the standard evaluation context building (and related objects)
bzr revid: xmo@openerp.com-20120806094627-8c9lwtfkbfws2bmj
Diffstat (limited to 'addons/web/static/src/js/corelib.js')
-rw-r--r--addons/web/static/src/js/corelib.js229
1 files changed, 4 insertions, 225 deletions
diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js
index a46d6314ebe..bc506161db5 100644
--- a/addons/web/static/src/js/corelib.js
+++ b/addons/web/static/src/js/corelib.js
@@ -991,154 +991,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
this.server = this.origin; // keep chs happy
this.rpc_function = (this.origin == window_origin) ? this.rpc_json : this.rpc_jsonp;
},
- test_eval_get_context: function () {
- var asJS = function (arg) {
- if (arg instanceof py.object) {
- return arg.toJSON();
- }
- return arg;
- };
-
- var datetime = new py.object();
- datetime.datetime = new py.type(function datetime() {
- throw new Error('datetime.datetime not implemented');
- });
- var date = datetime.date = new py.type(function date(y, m, d) {
- if (y instanceof Array) {
- d = y[2];
- m = y[1];
- y = y[0];
- }
- this.year = asJS(y);
- this.month = asJS(m);
- this.day = asJS(d);
- }, py.object, {
- strftime: function (args) {
- var f = asJS(args[0]), self = this;
- return new py.str(f.replace(/%([A-Za-z])/g, function (m, c) {
- switch (c) {
- case 'Y': return self.year;
- case 'm': return _.str.sprintf('%02d', self.month);
- case 'd': return _.str.sprintf('%02d', self.day);
- }
- throw new Error('ValueError: No known conversion for ' + m);
- }));
- }
- });
- date.__getattribute__ = function (name) {
- if (name === 'today') {
- return date.today;
- }
- throw new Error("AttributeError: object 'date' has no attribute '" + name +"'");
- };
- date.today = new py.def(function () {
- var d = new Date();
- return new date(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate());
- });
- datetime.time = new py.type(function time() {
- throw new Error('datetime.time not implemented');
- });
-
- var time = new py.object();
- time.strftime = new py.def(function (args) {
- return date.today.__call__().strftime(args);
- });
-
- var relativedelta = new py.type(function relativedelta(args, kwargs) {
- if (!_.isEmpty(args)) {
- throw new Error('Extraction of relative deltas from existing datetimes not supported');
- }
- this.ops = kwargs;
- }, py.object, {
- __add__: function (other) {
- if (!(other instanceof datetime.date)) {
- return py.NotImplemented;
- }
- // TODO: test this whole mess
- var year = asJS(this.ops.year) || asJS(other.year);
- if (asJS(this.ops.years)) {
- year += asJS(this.ops.years);
- }
-
- var month = asJS(this.ops.month) || asJS(other.month);
- if (asJS(this.ops.months)) {
- month += asJS(this.ops.months);
- // FIXME: no divmod in JS?
- while (month < 1) {
- year -= 1;
- month += 12;
- }
- while (month > 12) {
- year += 1;
- month -= 12;
- }
- }
-
- var lastMonthDay = new Date(year, month, 0).getDate();
- var day = asJS(this.ops.day) || asJS(other.day);
- if (day > lastMonthDay) { day = lastMonthDay; }
- var days_offset = ((asJS(this.ops.weeks) || 0) * 7) + (asJS(this.ops.days) || 0);
- if (days_offset) {
- day = new Date(year, month-1, day + days_offset).getDate();
- }
- // TODO: leapdays?
- // TODO: hours, minutes, seconds? Not used in XML domains
- // TODO: weekday?
- return new datetime.date(year, month, day);
- },
- __radd__: function (other) {
- return this.__add__(other);
- },
-
- __sub__: function (other) {
- if (!(other instanceof datetime.date)) {
- return py.NotImplemented;
- }
- // TODO: test this whole mess
- var year = asJS(this.ops.year) || asJS(other.year);
- if (asJS(this.ops.years)) {
- year -= asJS(this.ops.years);
- }
-
- var month = asJS(this.ops.month) || asJS(other.month);
- if (asJS(this.ops.months)) {
- month -= asJS(this.ops.months);
- // FIXME: no divmod in JS?
- while (month < 1) {
- year -= 1;
- month += 12;
- }
- while (month > 12) {
- year += 1;
- month -= 12;
- }
- }
-
- var lastMonthDay = new Date(year, month, 0).getDate();
- var day = asJS(this.ops.day) || asJS(other.day);
- if (day > lastMonthDay) { day = lastMonthDay; }
- var days_offset = ((asJS(this.ops.weeks) || 0) * 7) + (asJS(this.ops.days) || 0);
- if (days_offset) {
- day = new Date(year, month-1, day - days_offset).getDate();
- }
- // TODO: leapdays?
- // TODO: hours, minutes, seconds? Not used in XML domains
- // TODO: weekday?
- return new datetime.date(year, month, day);
- },
- __rsub__: function (other) {
- return this.__sub__(other);
- }
- });
-
- return {
- uid: new py.float(this.uid),
- datetime: datetime,
- time: time,
- relativedelta: relativedelta,
- current_date: date.today.__call__().strftime(['%Y-%m-%d'])
- };
- },
/**
* FIXME: Huge testing hack, especially the evaluation context, rewrite + test for real before switching
*/
@@ -1154,8 +1006,8 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
'</ul>';
try {
// see Session.eval_context in Python
- var ctx = this.test_eval_contexts(
- ([this.context] || []).concat(source.contexts));
+ var ctx = instance.web.pyeval.eval('contexts',
+ ([this.context] || []).concat(source.contexts));
if (!_.isEqual(ctx, expected.context)) {
instance.webclient.notification.warn('Context mismatch, report to xmo',
_.str.sprintf(match_template, {
@@ -1173,7 +1025,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
}
try {
- var dom = this.test_eval_domains(source.domains, this.test_eval_get_context());
+ var dom = instance.web.pyeval.eval('domains', source.domains);
if (!_.isEqual(dom, expected.domain)) {
instance.webclient.notification.warn('Domains mismatch, report to xmo',
_.str.sprintf(match_template, {
@@ -1191,7 +1043,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
}
try {
- var groups = this.test_eval_groupby(source.group_by_seq);
+ var groups = instance.web.pyeval.eval('groupbys', source.group_by_seq);
if (!_.isEqual(groups, expected.group_by)) {
instance.webclient.notification.warn('GroupBy mismatch, report to xmo',
_.str.sprintf(match_template, {
@@ -1208,79 +1060,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
}), true);
}
},
- test_eval_contexts: function (contexts, evaluation_context) {
- evaluation_context = evaluation_context || {};
- var self = this;
- return _(contexts).reduce(function (result_context, ctx) {
- // __eval_context evaluations can lead to some of `contexts`'s
- // values being null, skip them as well as empty contexts
- if (_.isEmpty(ctx)) { return result_context; }
- var evaluated = ctx;
- switch(ctx.__ref) {
- case 'context':
- evaluated = py.eval(ctx.__debug, evaluation_context);
- break;
- case 'compound_context':
- var eval_context = self.test_eval_contexts([ctx.__eval_context]);
- evaluated = self.test_eval_contexts(
- ctx.__contexts, _.extend({}, evaluation_context, eval_context));
- break;
- }
- // add newly evaluated context to evaluation context for following
- // siblings
- _.extend(evaluation_context, evaluated);
- return _.extend(result_context, evaluated);
- }, _.extend({}, this.user_context));
- },
- test_eval_domains: function (domains, evaluation_context) {
- var result_domain = [], self = this;
- _(domains).each(function (dom) {
- switch(dom.__ref) {
- case 'domain':
- result_domain.push.apply(
- result_domain, py.eval(dom.__debug, evaluation_context));
- break;
- case 'compound_domain':
- var eval_context = self.test_eval_contexts([dom.__eval_context]);
- result_domain.push.apply(
- result_domain, self.test_eval_domains(
- dom.__domains, _.extend(
- {}, evaluation_context, eval_context)));
- break;
- default:
- result_domain.push.apply(
- result_domain, dom);
- }
- });
- return result_domain;
- },
- test_eval_groupby: function (contexts) {
- var result_group = [], self = this;
- _(contexts).each(function (ctx) {
- var group;
- switch(ctx.__ref) {
- case 'context':
- group = py.eval(ctx.__debug).group_by;
- break;
- case 'compound_context':
- group = self.test_eval_contexts(
- ctx.__contexts, ctx.__eval_context).group_by;
- break;
- default:
- group = ctx.group_by
- }
- if (!group) { return; }
- if (typeof group === 'string') {
- result_group.push(group);
- } else if (group instanceof Array) {
- result_group.push.apply(result_group, group);
- } else {
- throw new Error('Got invalid groupby {{'
- + JSON.stringify(group) + '}}');
- }
- });
- return result_group;
- },
/**
* Executes an RPC call, registering the provided callbacks.
*