From 65828ae0a1df96b36f656343d8b70d45467ca703 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 21 Jun 2011 10:45:04 +0200 Subject: [PATCH 01/18] [IMP] slightly improve handling of nonliterals TODO: Should non_literal_decoder really call itself recursively like that? TODO: tests for compound stuff bzr revid: xmo@openerp.com-20110621084504-6cbkt6zd0rexfng8 --- openerpweb/nonliterals.py | 30 ++++++++++++++++++++---------- openerpweb/tests/test_session.py | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/openerpweb/nonliterals.py b/openerpweb/nonliterals.py index 40913cb628e..643ee8a393b 100644 --- a/openerpweb/nonliterals.py +++ b/openerpweb/nonliterals.py @@ -6,7 +6,6 @@ can't be sent there themselves). """ import binascii import hashlib -import simplejson.decoder import simplejson.encoder __all__ = ['Domain', 'Context', 'NonLiteralEncoder, non_literal_decoder'] @@ -17,6 +16,8 @@ SHORT_HASH_BYTES_SIZE = 6 class NonLiteralEncoder(simplejson.encoder.JSONEncoder): def default(self, object): + if not isinstance(object, (BaseDomain, BaseContext)): + return super(NonLiteralEncoder, self).default(object) if isinstance(object, Domain): return { '__ref': 'domain', @@ -30,14 +31,14 @@ class NonLiteralEncoder(simplejson.encoder.JSONEncoder): elif isinstance(object, CompoundDomain): return { '__ref': 'compound_domain', - '__domains': [self.default(el) for el in object.domains] + '__domains': object.domains } elif isinstance(object, CompoundContext): return { '__ref': 'compound_context', - '__contexts': [self.default(el) for el in object.contexts] + '__contexts': object.contexts } - return super(NonLiteralEncoder, self).default(object) + raise TypeError('Could not encode unknown non-literal %s' % object) def non_literal_decoder(dct): """ Decodes JSON dicts into :class:`Domain` and :class:`Context` based on @@ -69,7 +70,16 @@ def non_literal_decoder(dct): return ccontext return dct -class Domain(object): +# TODO: use abstract base classes if 2.6+? +class BaseDomain(object): + def evaluate(self, context=None): + raise NotImplementedError('Non literals must implement evaluate()') + +class BaseContext(object): + def evaluate(self, context=None): + raise NotImplementedError('Non literals must implement evaluate()') + +class Domain(BaseDomain): def __init__(self, session, domain_string=None, key=None): """ Uses session information to store the domain string and map it to a domain key, which can be safely round-tripped to the client. @@ -113,7 +123,7 @@ class Domain(object): ctx.update(self.own) return eval(self.get_domain_string(), ctx) -class Context(object): +class Context(BaseContext): def __init__(self, session, context_string=None, key=None): """ Uses session information to store the context string and map it to a key (stored in a secret location under a secret mountain), which can @@ -159,7 +169,7 @@ class Context(object): return eval(self.get_context_string(), ctx) -class CompoundDomain: +class CompoundDomain(BaseDomain): def __init__(self, *domains): self.domains = [] self.session = None @@ -169,7 +179,7 @@ class CompoundDomain: def evaluate(self, context=None): final_domain = [] for domain in self.domains: - if not isinstance(domain, (list, Domain, CompoundDomain)): + if not isinstance(domain, (list, BaseDomain)): raise TypeError("Domain %r is not a list or a nonliteral Domain", domain) @@ -188,7 +198,7 @@ class CompoundDomain: self.domains.append(domain) return self -class CompoundContext: +class CompoundContext(BaseContext): def __init__(self, *contexts): self.contexts = [] self.session = None @@ -199,7 +209,7 @@ class CompoundContext: ctx = dict(context or {}) final_context = {} for context_to_eval in self.contexts: - if not isinstance(context_to_eval, (dict, Context, CompoundContext)): + if not isinstance(context_to_eval, (dict, BaseContext)): raise TypeError("Context %r is not a dict or a nonliteral Context", context_to_eval) diff --git a/openerpweb/tests/test_session.py b/openerpweb/tests/test_session.py index ebf66e6289d..991a1d061ec 100644 --- a/openerpweb/tests/test_session.py +++ b/openerpweb/tests/test_session.py @@ -77,7 +77,7 @@ class TestOpenERPSession(unittest2.TestCase): def test_eval_empty_domains(self): self.assertEqual( - self.session.eval_domain(CompoundDomain(*[])), + self.session.eval_domain(CompoundDomain()), []) def test_eval_literal_domains(self): From 6371d8f8402fa0acb88f35e53d98038ab16de1d9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 21 Jun 2011 11:15:29 +0200 Subject: [PATCH 02/18] [IMP] remove explicit jquery conversion/parsing during list rendering, wastes time for nothing as .append() can handle taking strings as input directly bzr revid: xmo@openerp.com-20110621091529-rx1pah6y5j3gibdt --- addons/base/static/src/js/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index b4528de5afd..bd2518dcb66 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -571,7 +571,7 @@ openerp.base.ListView.List = Class.extend( /** @lends openerp.base.ListView.List this.$current.remove(); } this.$current = this.$_element.clone(true); - this.$current.empty().append($(QWeb.render('ListView.rows', this))); + this.$current.empty().append(QWeb.render('ListView.rows', this)); }, get_fields_view: function () { // deep copy of view From 7d9263a85c426e043abbc06cb3b80e935e811dea Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 21 Jun 2011 11:18:36 +0200 Subject: [PATCH 03/18] [IMP] converting values to strings with (new String) is 10~20% slower than using just String(). Switch Qweb.html_escape to String() bzr revid: xmo@openerp.com-20110621091836-5cnjwac3m3n12380 --- addons/base/static/lib/qweb/qweb2.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base/static/lib/qweb/qweb2.js b/addons/base/static/lib/qweb/qweb2.js index 5067d30d70e..5041142924d 100644 --- a/addons/base/static/lib/qweb/qweb2.js +++ b/addons/base/static/lib/qweb/qweb2.js @@ -35,10 +35,10 @@ var QWeb2 = { return (noquotes ? '' : "'") + s.replace(/\r?\n/g, "\\n").replace(/'/g, "\\'") + (noquotes ? '' : "'"); }, html_escape: function(s, attribute) { - if (s === null || s === undefined) { + if (s == null) { return ''; } - s = (new String(s)).replace(/&/g, '&').replace(//g, '>'); + s = String(s).replace(/&/g, '&').replace(//g, '>'); if (attribute) { s = s.replace(/"/g, '"'); } From 1399d19e3e9ff34dd0fa49aa76de28de3f28cf5d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 12:22:46 +0200 Subject: [PATCH 04/18] [FIX] Reload record in form view on_created and on_saved bzr revid: fme@openerp.com-20110621102246-91w528ppy8jf4bmi --- addons/base/static/src/js/form.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 90357325928..18d6976e99c 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1,4 +1,3 @@ - openerp.base.form = function (openerp) { openerp.base.views.add('form', 'openerp.base.FormView'); @@ -299,6 +298,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV if (success) { success(r); } + this.reload(); } }, /** @@ -333,6 +333,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV if (success) { success(_.extend(r, {created: true})); } + this.reload(); } }, do_search: function (domains, contexts, groupbys) { From aac4205519e1cd534d8ed802d5ccc6290901a418 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 14:03:51 +0200 Subject: [PATCH 05/18] [ADD] Added warning image bzr revid: fme@openerp.com-20110621120351-o4kfgaozg4qrmzck --- addons/base/static/src/img/warning.png | Bin 0 -> 1342 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/base/static/src/img/warning.png diff --git a/addons/base/static/src/img/warning.png b/addons/base/static/src/img/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfb25a89cdfaf19e0454890e2593bd6900dfa00 GIT binary patch literal 1342 zcmV-E1;P4>P)e$pZh!11-=vS* z`#I-(&hMO(|F2iMz9B^1LrCJk0>42>XCEO?ZV~bq>XX+BN1$qG)21cn+&N%cT3|>f z3*98-qt|A8pGd@7&!1m*R#gF0Qv>FcCzsKU>1%`}$31{A2x%PNwQJGa(E&P<2=rnx z2(Rzv=Rd{oI^vzZv`;J!GM6raB|jewSy`aZ$$^RO+ri%447Wt0Kd=<(@vMFKNM&V+ zKXnRpgn;epRj^&ZPMzQz8{yj>JD%b_pTz|}NJvJ%MDoPl(*vg5Trd_F1IsYLaU6`7 zmV$Z97I0!iY7!HLQf!TR0BCLRs7e*$jvS%c+cg>iPUXCFhq}Pk)xpEEvJkq^AM3{3 z`XwGU4`y$a$-q=uNx?3ci^}bGgZbb=FlJ-`i@l(cO2ZiNyRoc&|IZB#i_C!opi4*q z=kRbeoQfMA1zlnyIQQ-atx~y&$MQi;;GYvx{B=%F*mLArE+w4(|g&Y zN8zjNY+*!y_)>5oavZrvOKWS`T2car^mO15gm5am-5v?R>2y-K&*uZ5P@3FaI;eiF ztrbSJ9|zbQFOz-!y^@k8zNLj8G3&*P5jfVHS}qog1x4VKlat{0`+>P~h5m+7so?gu zZGsDJF9a8MyhbeM?VX*=mb^SL$mQU|j1e4x3rbB*rHY16O-+Fx-hJ@#%BH zv2!@1aCtzH>m`}P4k8^$2sSvLT*=-MN-I>hYXPe(3$|9%7< z)#;I%S73cHh;`v}b8`^T>xBVEkL82n;zbPLhxM}08_LdJa&>jlh%I$>&w@v6e-?ax zejXMU7Jxl_R`};cdtxvpMQ}m6R`!FBap5@1%W3V|{(kV7%~W2C1$+||RFhUK_-!_r z!rD(e98>|PlWK-xsDdmDvm6I=*u3*NHv(EMeWnRd%uhu{OW5eYtmY?RRKK~f_T!nE z^yYZTuwerj_v``e#4yepNpt`yxb+;56pFB?y&Zg52H%AX^v|ZZtqnY_t-zy=JnjPb z>C@oGt>?lS!5u#i+_7W8HZ%ZRUk?nP9Olp=aN_WB;Ocf%SA!j!&yFkFrc}bj?%nWE zE?>rS&mmJ99l*vGLO!@bND!lgcnTS_?S!b2nY6kL>8Q6033(6C$@@iwRL4rf^H5dz z>~dthMYCV$5({pi-b7`_PV{-HsAQCg{Fko30nwbH*2dXzhX4Qo07*qoM6N<$g3yM4 A1poj5 literal 0 HcmV?d00001 From 41716a15161f35368111e34f1fb4afb19645219a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 14:07:50 +0200 Subject: [PATCH 06/18] [IMP] Improved Dialog controller bzr revid: fme@openerp.com-20110621120750-2fo680iuqrzvjcpk --- addons/base/static/src/js/chrome.js | 71 +++++++++++++++++++---------- 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 84aa4acc325..1b886b34ea8 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -739,36 +739,47 @@ openerp.base.Dialog = openerp.base.BaseWidget.extend({ identifier_prefix: 'dialog', init: function (session, options) { this._super(null, session); - options = _.extend({ + this.options = { modal: true, - title: this.dialog_title, - width: '700px', + width: 'auto', min_width: 0, max_width: '100%', - height: '500px', + height: 'auto', min_height: 0, max_height: '100%', + autoOpen: false, buttons: {} - }, options); - - options.width = this.get_width(options.width); - options.min_width = this.get_width(options.min_width); - options.max_width = this.get_width(options.max_width); - options.height = this.get_height(options.height); - options.min_height = this.get_height(options.min_height); - options.max_height = this.get_height(options.max_height); - - if (options.width > options.max_width) options.width = options.max_width; - if (options.width < options.min_width) options.width = options.min_width; - if (options.height > options.max_height) options.height = options.max_height; - if (options.height < options.min_height) options.height = options.min_height; - + }; for (var f in this) { if (f.substr(0, 10) == 'on_button_') { - options.buttons[f.substr(10)] = this[f]; + this.options.buttons[f.substr(10)] = this[f]; } } - this.options = options; + if (options) { + this.set_options(options); + } + }, + set_options: function(options) { + options = options || {}; + options.width = this.get_width(options.width || this.options.width); + options.min_width = this.get_width(options.min_width || this.options.min_width); + options.max_width = this.get_width(options.max_width || this.options.max_width); + options.height = this.get_height(options.height || this.options.height); + options.min_height = this.get_height(options.min_height || this.options.min_height); + options.max_height = this.get_height(options.max_height || this.options.max_width); + + if (options.width !== 'auto') { + if (options.width > options.max_width) options.width = options.max_width; + if (options.width < options.min_width) options.width = options.min_width; + } + if (options.height !== 'auto') { + if (options.height > options.max_height) options.height = options.max_height; + if (options.height < options.min_height) options.height = options.min_height; + } + if (!options.title && this.dialog_title) { + options.title = this.dialog_title; + } + _.extend(this.options, options); }, get_width: function(val) { return this.get_size(val.toString(), $(window.top).width()); @@ -777,7 +788,7 @@ openerp.base.Dialog = openerp.base.BaseWidget.extend({ return this.get_size(val.toString(), $(window.top).height()); }, get_size: function(val, available_size) { - if (val == 'auto') { + if (val === 'auto') { return val; } else if (val.slice(-1) == "%") { return Math.round(available_size / 100 * parseInt(val.slice(0, -1), 10)); @@ -785,12 +796,26 @@ openerp.base.Dialog = openerp.base.BaseWidget.extend({ return parseInt(val, 10); } }, - start: function () { + start: function (auto_open) { this.$dialog = $('
').dialog(this.options); + if (auto_open !== false) { + this.open(); + } this._super(); }, + open: function(options) { + // TODO fme: bind window on resize + if (this.template) { + this.$element.html(this.render()); + } + this.set_options(options); + this.$dialog.dialog(this.options).dialog('open'); + }, + close: function(options) { + this.$dialog.dialog('close'); + }, stop: function () { - this.$dialog("destroy").remove(); + this.$dialog.dialog('destroy'); } }); From 8e20af033151e31aa33d2b751d8aaf9a59080855 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 14:10:02 +0200 Subject: [PATCH 07/18] [IMP] Improved CrashManager bzr revid: fme@openerp.com-20110621121002-bqcsuzdfncyb1v24 --- addons/base/static/src/css/base.css | 11 ++++++++ addons/base/static/src/js/chrome.js | 39 ++++++++++++++++++----------- addons/base/static/src/xml/base.xml | 15 ++++++----- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 30dc3718fa9..abf8431541a 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1042,3 +1042,14 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ .openerp .oe-m2o-disabled-cm { color: grey; } + +.openerp .oe-dialog-warning { + font-size: 1.2em; + font-weight: bold; +} +.openerp .oe-dialog-warning img { + float: left; + position: relative; + top: -0.5em; + margin:0 7px 7px 0; +} diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 1b886b34ea8..2bea20fe972 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -819,24 +819,32 @@ openerp.base.Dialog = openerp.base.BaseWidget.extend({ } }); -openerp.base.CrashManager = openerp.base.Controller.extend({ - init: function(session, element_id) { - this._super(session, element_id); +openerp.base.CrashManager = openerp.base.Dialog.extend({ + identifier_prefix: 'dialog_crash', + init: function(session) { + this._super(session); this.session.on_rpc_error.add(this.on_rpc_error); }, - on_rpc_error: function(error) { - var msg = error.message + "\n" + error.data.debug; - this.display_error(msg); + on_button_Ok: function() { + this.close(); }, - display_error: function(message) { - $('
').text(message).dialog({
-            modal: true,
-            buttons: {
-                OK: function() {
-                    $(this).dialog("close");
-                }
-            }
-        });
+    on_rpc_error: function(error) {
+        this.error = error;
+        if (error.code === 200) {
+            this.dialog_title = "OpenERP Warning";
+            this.template = 'DialogWarning';
+            this.open({
+                width: 'auto',
+                height: 'auto'
+            });
+        } else {
+            this.dialog_title = "OpenERP Error";
+            this.template = 'DialogTraceback';
+            this.open({
+                width: '80%',
+                height: '80%'
+            });
+        }
     }
 });
 
@@ -1066,6 +1074,7 @@ openerp.base.WebClient = openerp.base.Controller.extend({
         this.session = new openerp.base.Session("oe_errors");
         this.loading = new openerp.base.Loading(this.session, "oe_loading");
         this.crashmanager =  new openerp.base.CrashManager(this.session);
+        this.crashmanager.start(false);
 
         // Do you autorize this ?
         openerp.base.Controller.prototype.notification = new openerp.base.Notification("oe_notification");
diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml
index 949b38e0115..2592abb5fdc 100644
--- a/addons/base/static/src/xml/base.xml
+++ b/addons/base/static/src/xml/base.xml
@@ -870,12 +870,15 @@
     
 
 
-    
-

- - -

-
+

+ + +

+
+ +
+
+
From a47c69c873fabb6f7d306254576097ccdf44192a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 14:11:16 +0200 Subject: [PATCH 08/18] [IMP] Set flags for dialog actions bzr revid: fme@openerp.com-20110621121116-uvaasm0c01devhrg --- addons/base/static/src/js/views.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 4217031a7e3..586292a5561 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -398,6 +398,13 @@ openerp.base.View = openerp.base.Controller.extend({ execute_action: function (action_data, dataset, action_manager, record_id, on_no_action) { var handler = function (r) { if (r.result && r.result.constructor == Object) { + r.result.flags = { + sidebar : false, + search_view : false, + views_switcher : false, + action_buttons : false, + pager : false + }; action_manager.do_action(r.result); } else { on_no_action(r.result); From 76db3f38700cd4e4d8d03ab80cc0163b374dba83 Mon Sep 17 00:00:00 2001 From: "noz (OpenERP)" Date: Tue, 21 Jun 2011 17:49:26 +0530 Subject: [PATCH 09/18] [FIX] Just corrected spelling. bzr revid: noz@tinyerp.com-20110621121926-4b6fhety4r2p1u2l --- addons/base/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 2592abb5fdc..9645ce7cee2 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -90,7 +90,7 @@ t-att-value="selected_password || ''"/> - + From f90c073f2329a1582bcf36be111ecf5dab76bbe8 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 14:31:20 +0200 Subject: [PATCH 10/18] [IMP] Use CompondContext for button actions bzr revid: fme@openerp.com-20110621123120-y2kucare2kes52ac --- addons/base/static/src/js/views.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 586292a5561..c6ee9e69d71 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -416,10 +416,10 @@ openerp.base.View = openerp.base.Controller.extend({ result : { type: 'ir.actions.act_window_close' } }); } else { - var context = _.extend({}, dataset.context, action_data.context || {}); + var context = new openerp.base.CompoundContext(dataset.context).add(action_data.context || {}); switch(action_data.type) { case 'object': - return dataset.call(action_data.name, [[record_id], context], handler); + return dataset.call_and_eval(action_data.name, [[record_id], context], null, 1, handler); case 'action': return this.rpc('/base/action/load', { action_id: parseInt(action_data.name, 10) }, handler); default: From 884aaa86079542a6be8dd3797c50390cf8893e03 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 14:41:16 +0200 Subject: [PATCH 11/18] [FIX] Fixed selection widget. Wrongly select first option when value is false bzr revid: fme@openerp.com-20110621124116-rh6pv2a1v2de186q --- addons/base/static/src/js/form.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 18d6976e99c..7cb36cdc0c2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -84,6 +84,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.$element.hide(); }, on_record_loaded: function(record) { + console.info(record) this.touched = false; if (record) { this.datarecord = record; @@ -996,7 +997,7 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({ if (value != null && value !== false) { this.$element.find('select').val(value); } else { - this.$element.find('select')[0].selectedIndex = 0; + this.$element.find('select').val('false'); } }, set_value_from_ui: function() { From 016eff262b7969e7348fa9759504559e2054b3d9 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 21 Jun 2011 14:52:48 +0200 Subject: [PATCH 12/18] [FIX] account: opening entries didn't bring forward the amount in currency when closing a fiscalyear. The centralisation had to take care on that too. lp bug: https://launchpad.net/bugs/736890 fixed bzr revid: qdp-launchpad@openerp.com-20110621125248-xec0ogl2v1hwxsmo --- addons/account/account.py | 29 +++++++++++++++++++ addons/account/account_move_line.py | 2 +- .../wizard/account_fiscalyear_close.py | 12 +++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index f6dd36c01fc..d0e9c501bb9 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1331,6 +1331,7 @@ class account_move(osv.osv): def _centralise(self, cr, uid, move, mode, context=None): assert mode in ('debit', 'credit'), 'Invalid Mode' #to prevent sql injection + currency_obj = self.pool.get('res.currency') if context is None: context = {} @@ -1381,6 +1382,34 @@ class account_move(osv.osv): cr.execute('SELECT SUM(%s) FROM account_move_line WHERE move_id=%%s AND id!=%%s' % (mode,), (move.id, line_id2)) result = cr.fetchone()[0] or 0.0 cr.execute('update account_move_line set '+mode2+'=%s where id=%s', (result, line_id)) + + #adjust also the amount in currency if needed + cr.execute("select currency_id, sum(amount_currency) as amount_currency from account_move_line where move_id = %s and currency_id is not null group by currency_id", (move.id,)) + for row in cr.dictfetchall(): + currency_id = currency_obj.browse(cr, uid, row['currency_id'], context=context) + if not currency_obj.is_zero(cr, uid, currency_id, row['amount_currency']): + amount_currency = row['amount_currency'] * -1 + account_id = amount_currency > 0 and move.journal_id.default_debit_account_id.id or move.journal_id.default_credit_account_id.id + cr.execute('select id from account_move_line where move_id=%s and centralisation=\'currency\' and currency_id = %slimit 1', (move.id, row['currency_id'])) + res = cr.fetchone() + if res: + cr.execute('update account_move_line set amount_currency=%s , account_id=%s where id=%s', (amount_currency, account_id, res[0])) + else: + context.update({'journal_id': move.journal_id.id, 'period_id': move.period_id.id}) + line_id = self.pool.get('account.move.line').create(cr, uid, { + 'name': _('Currency Adjustment'), + 'centralisation': 'currency', + 'account_id': account_id, + 'move_id': move.id, + 'journal_id': move.journal_id.id, + 'period_id': move.period_id.id, + 'date': move.period_id.date_stop, + 'debit': 0.0, + 'credit': 0.0, + 'currency_id': row['currency_id'], + 'amount_currency': amount_currency, + }, context) + return True # diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 0b17eb676f6..2117d7fc40e 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -503,7 +503,7 @@ class account_move_line(osv.osv): }), 'date_created': fields.date('Creation date', select=True), 'analytic_lines': fields.one2many('account.analytic.line', 'move_id', 'Analytic lines'), - 'centralisation': fields.selection([('normal','Normal'),('credit','Credit Centralisation'),('debit','Debit Centralisation')], 'Centralisation', size=6), + 'centralisation': fields.selection([('normal','Normal'),('credit','Credit Centralisation'),('debit','Debit Centralisation'),('currency','Currency Adjustment')], 'Centralisation', size=8), 'balance': fields.function(_balance, fnct_search=_balance_search, method=True, string='Balance'), 'state': fields.selection([('draft','Unbalanced'), ('valid','Valid')], 'State', readonly=True, help='When new move line is created the state will be \'Draft\'.\n* When all the payments are done it will be in \'Valid\' state.'), diff --git a/addons/account/wizard/account_fiscalyear_close.py b/addons/account/wizard/account_fiscalyear_close.py index 89e28950535..927f895bb3b 100644 --- a/addons/account/wizard/account_fiscalyear_close.py +++ b/addons/account/wizard/account_fiscalyear_close.py @@ -103,6 +103,14 @@ class account_fiscalyear_close(osv.osv_memory): if accnt_type_data.close_method=='none' or account.type == 'view': continue if accnt_type_data.close_method=='balance': + balance_in_currency = 0.0 + if account.currency_id: + cr.execute('SELECT sum(amount_currency) as balance_in_currency FROM account_move_line ' \ + 'WHERE account_id = %s ' \ + 'AND ' + query_line + ' ' \ + 'AND currency_id = %s', (account.id, account.currency_id.id)) + balance_in_currency = cr.dictfetchone()['balance_in_currency'] + if abs(account.balance)>0.0001: obj_acc_move_line.create(cr, uid, { 'debit': account.balance>0 and account.balance, @@ -111,7 +119,9 @@ class account_fiscalyear_close(osv.osv_memory): 'date': period.date_start, 'journal_id': new_journal.id, 'period_id': period.id, - 'account_id': account.id + 'account_id': account.id, + 'currency_id': account.currency_id and account.currency_id.id or False, + 'amount_currency': balance_in_currency, }, {'journal_id': new_journal.id, 'period_id':period.id}) if accnt_type_data.close_method == 'unreconciled': offset = 0 From 4e9834f4e3a28bfec7678fa6845bfa2abc12f513 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Jun 2011 14:53:17 +0200 Subject: [PATCH 13/18] [imp] small improvements to advanced filters bzr revid: nicolas.vanhoren@openerp.com-20110621125317-0s7cfk7q8jkflmne --- addons/base/static/src/css/base.css | 1 + addons/base/static/src/js/search.js | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index abf8431541a..1cbdc05ba43 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -565,6 +565,7 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, .openerp .searchview_extended_delete_group { float:right; + display: none; } .openerp .searchview_extended_delete_group span, diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 4c23f64bcbb..13ca764e7d7 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -796,9 +796,6 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({ }); var delete_btn = this.$element.find('.searchview_extended_delete_group'); delete_btn.click(function (e) { - if (_this.parent.children.length == 1) { - _this.parent.hide(); - } _this.stop(); }); }, @@ -811,6 +808,11 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({ return [].concat(choice == "none" ? ['!'] : [], _.map(_.range(_.max([0,props.length - 1])), function() { return op; }), props); + }, + stop: function() { + if (this.parent.children.length == 1) + this.parent.hide(); + this._super(); } }); @@ -838,6 +840,11 @@ openerp.base.search.ExtendedSearchProposition = openerp.base.BaseWidget.extend({ _this.stop(); }); }, + stop: function() { + if (this.parent.children.length == 1) + this.parent.stop(); + this._super(); + }, changed: function() { var nval = this.$element.find(".searchview_extended_prop_field").val(); if(this.attrs.selected == null || nval != this.attrs.selected.name) { From 3cb34f3f852fb5bff92090fe3f067df95332e49d Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Jun 2011 15:05:01 +0200 Subject: [PATCH 14/18] [imp] small improvements to advanced filters bzr revid: nicolas.vanhoren@openerp.com-20110621130501-0f1rkr25vv86v8gq --- addons/base/static/src/css/base.css | 6 +++++- addons/base/static/src/js/search.js | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 1cbdc05ba43..ca4c8d0de87 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -547,11 +547,15 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, } .openerp .searchview_extended_group { - border: #696969 solid 1px; + border-bottom: #696969 solid 1px; padding: 3px; margin: 2px; } +.openerp .searchview_extended_group.last_group { + border-bottom: none; +} + .openerp .oe_search-view-custom-filter-btn span { background: url(../img/icons/gtk-add.png) repeat-y; padding-left: 18px; diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 13ca764e7d7..3c40332ce67 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -731,6 +731,7 @@ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({ var render = group.render(); this.$element.find('.searchview_extended_groups_list').append(render); group.start(); + this.check_last_element(); }, start: function () { this._super(); @@ -771,6 +772,10 @@ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({ if(this.$element.hasClass("expanded")) { this.$element.toggleClass("folded expanded"); } + }, + check_last_element: function() { + _.each(this.children, function(x) {x.set_last_group(false);}); + this.children[this.children.length - 1].set_last_group(true); } }); @@ -810,9 +815,17 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({ props); }, stop: function() { + var parent = this.parent; if (this.parent.children.length == 1) this.parent.hide(); this._super(); + parent.check_last_element(); + }, + set_last_group: function(is_last) { + if(is_last) + this.$element.addClass("last_group"); + else + this.$element.removeClass("last_group"); } }); From 04121f8b03478b860d3749cedbba785283f4a86e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Jun 2011 16:04:23 +0200 Subject: [PATCH 15/18] [imp] small improvement to advanced filters bzr revid: nicolas.vanhoren@openerp.com-20110621140423-efbxmrjuwlu8piy1 --- addons/base/static/src/css/base.css | 16 +++++++++++++--- addons/base/static/src/xml/base.xml | 1 + 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index ca4c8d0de87..e3a1e8b26fd 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -547,13 +547,23 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, } .openerp .searchview_extended_group { - border-bottom: #696969 solid 1px; padding: 3px; margin: 2px; } -.openerp .searchview_extended_group.last_group { - border-bottom: none; +.openerp .searchview_extended_group .oe_adv_filters_and { + border-bottom: 1px solid black; + text-align: center; +} +.openerp .searchview_extended_group .oe_adv_filters_and span { + background: #F0EEEE; + position: relative; + top: 0.5em; + padding: 0 1em 0 1em; +} + +.openerp .searchview_extended_group.last_group .oe_adv_filters_and { + display: none; } .openerp .oe_search-view-custom-filter-btn span { diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 9645ce7cee2..b03bb044ba4 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -804,6 +804,7 @@
Add condition +
and
From ee1970c2da36571cb05be9f3a67fc3e3a0bbd6d0 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Jun 2011 16:11:07 +0200 Subject: [PATCH 16/18] [imp] small improvement to advanced filters bzr revid: nicolas.vanhoren@openerp.com-20110621141107-m7xcywalskoujsq0 --- addons/base/static/src/js/search.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 3c40332ce67..cd69ec4f0e8 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -759,11 +759,9 @@ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({ on_activate: function() { this.add_group(); var table = this.$element.closest("table.oe-searchview-render-line"); - if(table.css("display") == "none") { - table.css("display", ""); - if(this.$element.hasClass("folded")) { - this.$element.toggleClass("folded expanded"); - } + table.css("display", ""); + if(this.$element.hasClass("folded")) { + this.$element.toggleClass("folded expanded"); } }, hide: function() { From 74e3e0576344978f3486d188f54ed73607ddc881 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 21 Jun 2011 16:14:19 +0200 Subject: [PATCH 17/18] [imp] small css improvement bzr revid: nicolas.vanhoren@openerp.com-20110621141419-8hdegu5ob3uh1w3y --- addons/base/static/src/css/base.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index e3a1e8b26fd..9749dc97110 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -552,14 +552,16 @@ background: linear-gradient(top, #ffffff 0%,#d8d8d8 11%,#afafaf 86%,#333333 91%, } .openerp .searchview_extended_group .oe_adv_filters_and { - border-bottom: 1px solid black; + border-bottom: 1px solid #8E8E8E; text-align: center; + margin-top: -10px; } .openerp .searchview_extended_group .oe_adv_filters_and span { background: #F0EEEE; position: relative; top: 0.5em; padding: 0 1em 0 1em; + color: #8E8E8E; } .openerp .searchview_extended_group.last_group .oe_adv_filters_and { From c57a3e0d98229ed66dde92c5caad39f6bc0efdbd Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jun 2011 16:38:04 +0200 Subject: [PATCH 18/18] [FIX] Fixed active_is in context for dialog actions bzr revid: fme@openerp.com-20110621143804-b51tp8n0a393oixi --- addons/base/static/src/js/data.js | 5 +++-- addons/base/static/src/js/form.js | 13 ++++++++++--- addons/base/static/src/js/views.js | 15 ++++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 1463ca279fa..736c31c1f7b 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -287,11 +287,12 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. }); } }, - default_get: function(fields, callback) { + default_get: function(fields, context, callback) { + context = context || this.context; return this.rpc('/base/dataset/default_get', { model: this.model, fields: fields, - context: this.context + context: context }, callback); }, create: function(data, callback, error_callback) { diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 7cb36cdc0c2..d221872598d 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -42,8 +42,12 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV if (this.embedded_view) { return $.Deferred().then(this.on_loaded).resolve({fields_view: this.embedded_view}); } else { + var context = new openerp.base.CompoundContext(this.dataset.context); + if (this.view_manager.action && this.view_manager.action.context) { + context.add(this.view_manager.action.context); + } return this.rpc("/base/formview/load", {"model": this.model, "view_id": this.view_id, - toolbar:!!this.flags.sidebar}, this.on_loaded); + toolbar:!!this.flags.sidebar, context: context}, this.on_loaded); } }, on_loaded: function(data) { @@ -84,7 +88,6 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.$element.hide(); }, on_record_loaded: function(record) { - console.info(record) this.touched = false; if (record) { this.datarecord = record; @@ -226,8 +229,12 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV }, on_button_new: function() { var self = this; + var context = new openerp.base.CompoundContext(this.dataset.context); + if (this.view_manager.action && this.view_manager.action.context) { + context.add(this.view_manager.action.context); + } $.when(this.has_been_loaded).then(function() { - self.dataset.default_get(_.keys(self.fields_view.fields), function(result) { + self.dataset.default_get(_.keys(self.fields_view.fields), context, function(result) { self.on_record_loaded(result.result); }); }); diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index c6ee9e69d71..ee910d57cfd 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -397,17 +397,22 @@ openerp.base.View = openerp.base.Controller.extend({ */ execute_action: function (action_data, dataset, action_manager, record_id, on_no_action) { var handler = function (r) { - if (r.result && r.result.constructor == Object) { - r.result.flags = { + var action = r.result; + if (action && action.constructor == Object) { + action.context = action.context || {}; + action.context['active_id'] = dataset.ids[dataset.index]; + action.context['active_ids'] = [dataset.ids[dataset.index]]; + action.context['active_model'] = dataset.model; + action.flags = { sidebar : false, search_view : false, views_switcher : false, action_buttons : false, pager : false }; - action_manager.do_action(r.result); + action_manager.do_action(action); } else { - on_no_action(r.result); + on_no_action(action); } }; @@ -421,7 +426,7 @@ openerp.base.View = openerp.base.Controller.extend({ case 'object': return dataset.call_and_eval(action_data.name, [[record_id], context], null, 1, handler); case 'action': - return this.rpc('/base/action/load', { action_id: parseInt(action_data.name, 10) }, handler); + return this.rpc('/base/action/load', { action_id: parseInt(action_data.name, 10), context: context }, handler); default: return dataset.exec_workflow(record_id, action_data.name, handler); }