From 63ee6a74a91a630f5b5049f10ae67291df85f760 Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Mon, 9 Jul 2012 17:09:54 +0530 Subject: [PATCH 01/68] [IMP] project : column project_task_history_cumulative.project_id does not exist. lp bug: https://launchpad.net/bugs/1022509 fixed bzr revid: mdi@tinyerp.com-20120709113954-l17wlurxovz6z05i --- addons/project/report/project_cumulative.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index 3f7f3b26d96..535fbaf5f87 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -9,7 +9,6 @@ - @@ -63,9 +62,7 @@ - - From e2ba0eb95c38a16839836deeaa9a73b58221e9aa Mon Sep 17 00:00:00 2001 From: "Divyesh Makwana (Open ERP)" Date: Mon, 9 Jul 2012 18:42:59 +0530 Subject: [PATCH 02/68] [IMP] project : Revert the unneccessary changes. bzr revid: mdi@tinyerp.com-20120709131259-c9fl7g3hgwhxutgb --- addons/project/report/project_cumulative.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index 535fbaf5f87..177e945bc93 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -9,6 +9,7 @@ + From 627bb128e04991fad61688b8b86ca82061a90977 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 26 Sep 2012 10:25:30 +0200 Subject: [PATCH 03/68] [IMP] adapt base_import to using Model.load instead of Model.import_data bzr revid: xmo@openerp.com-20120926082530-krhladsrn9mzs3lx --- addons/base_import/models.py | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 1e5ad002b84..733532ae095 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -307,22 +307,14 @@ class ir_import(orm.TransientModel): except ValueError, e: return [{ 'type': 'error', - 'message': str(e), + 'message': unicode(e), 'record': False, }] - try: - _logger.info('importing %d rows...', len(data)) - (code, record, message, _wat) = self.pool[record.res_model].import_data( - cr, uid, import_fields, data, context=context) - _logger.info('done') - - except Exception, e: - _logger.exception("Import failed") - # TODO: remove when exceptions stop being an "expected" - # behavior of import_data on some (most) invalid - # input. - code, record, message = -1, None, str(e) + _logger.info('importing %d rows...', len(data)) + import_result = self.pool[record.res_model].load( + cr, uid, import_fields, data, context=context) + _logger.info('done') # If transaction aborted, RELEASE SAVEPOINT is going to raise # an InternalError (ROLLBACK should work, maybe). Ignore that. @@ -339,14 +331,4 @@ class ir_import(orm.TransientModel): except psycopg2.InternalError: pass - if code != -1: - return [] - - # TODO: add key for error location? - # TODO: error not within normal preview, how to display? Re-preview - # with higher ``count``? - return [{ - 'type': 'error', - 'message': message, - 'record': record or False - }] + return import_result['messages'] From fd5d4e5dd34eeeec885ffd2fe5ae340c5bebb00c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 26 Sep 2012 13:42:35 +0200 Subject: [PATCH 04/68] [IMP] don't display deprecated fields in import window bzr revid: xmo@openerp.com-20120926114235-iqkmi23yk2v1hq7w --- addons/base_import/models.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 733532ae095..16bb52d5856 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -83,6 +83,10 @@ class ir_import(orm.TransientModel): }] fields_got = self.pool[model].fields_get(cr, uid, context=context) for name, field in fields_got.iteritems(): + # an empty string means the field is deprecated, @deprecated must + # be absent or False to mean not-deprecated + if field.get('deprecated', False) is not False: + continue if field.get('readonly'): states = field.get('states') if not states: @@ -97,7 +101,7 @@ class ir_import(orm.TransientModel): 'id': name, 'name': name, 'string': field['string'], - # Y U NO ALWAYS HAVE REQUIRED + # Y U NO ALWAYS HAS REQUIRED 'required': bool(field.get('required')), 'fields': [], } From f6f37632ceb0ed2a6abd043c884e5e9de1cb8d51 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 26 Sep 2012 15:50:13 +0200 Subject: [PATCH 05/68] [IMP] errors display, dryrun management (add button) bzr revid: xmo@openerp.com-20120926135013-rkbvxluu6tqz9a1l --- addons/base_import/static/src/js/import.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index c2deb660ff2..9cb2f74bd48 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -63,7 +63,7 @@ openerp.base_import = function (instance) { {name: 'quoting', label: _lt("Quoting:"), value: '"'} ], events: { - 'change .oe_import_grid input': 'import_dryrun', + // 'change .oe_import_grid input': 'import_dryrun', 'change input.oe_import_file': 'file_update', 'change input.oe_import_has_header, .oe_import_options input': 'settings_updated', 'click a.oe_import_csv': function (e) { @@ -85,9 +85,10 @@ openerp.base_import = function (instance) { var self = this; this._super(parent, { buttons: [ - {text: _t("Import File"), click: function () { - self.do_import(); - }, 'class': 'oe_import_dialog_button'} + {text: _t("Import"), click: self.proxy('do_import'), + 'class': 'oe_import_dialog_button'}, + {text: _t("Validate"), click: self.proxy('import_dryrun'), + 'class': 'oe_import_dialog_button'} ] }); this.res_model = parent.model; @@ -134,11 +135,12 @@ openerp.base_import = function (instance) { .then(this.proxy('preview')); }, preview: function (result) { + this.$el.removeClass('oe_import_preview_error oe_import_error'); this.$el.toggleClass( 'oe_import_noheaders', !this.$('input.oe_import_has_header').prop('checked')); if (result.error) { - this.$el.addClass('oe_import_error'); + this.$el.addClass('oe_import_preview_error oe_import_error'); this.$('.oe_import_error_report').html( QWeb.render('ImportView.preview.error', result)); return; @@ -180,7 +182,7 @@ openerp.base_import = function (instance) { width: 'resolve', dropdownCssClass: 'oe_import_selector' }); - this.import_dryrun(); + //this.import_dryrun(); }, generate_fields_completion: function (root) { var basic = []; @@ -252,7 +254,6 @@ openerp.base_import = function (instance) { //- import itself call_import: function (options) { - var self = this; var fields = this.$('.oe_import_fields input.oe_import_match_field').map(function (index, el) { return $(el).select2('val') || false; }).get(); @@ -260,12 +261,12 @@ openerp.base_import = function (instance) { 'do', [this.id, fields, this.import_options()], options); }, import_dryrun: function () { -// this.call_import({ dryrun: true }) -// .then(this.proxy('render_import_errors')); + return this.call_import({ dryrun: true }) + .then(this.proxy('render_import_errors')); }, do_import: function () { var self = this; - this.call_import({ dryrun: false }).then(function (errors) { + return this.call_import({ dryrun: false }).then(function (errors) { if (_.isEmpty(errors)) { if (self.getParent().reload_content) { self.getParent().reload_content(); From 27aeae974aa4a001e7c8f13cd01f98a5ca295334 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 26 Sep 2012 18:50:52 +0200 Subject: [PATCH 06/68] [IMP] warning and error reporting during import bzr revid: xmo@openerp.com-20120926165052-7eq4ne62h63zbqqm --- addons/base_import/static/src/css/import.css | 6 ++- addons/base_import/static/src/js/import.js | 41 +++++++++++++++----- addons/base_import/static/src/xml/import.xml | 26 +++++++++++-- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css index f6258f5aa50..da61473fdba 100644 --- a/addons/base_import/static/src/css/import.css +++ b/addons/base_import/static/src/css/import.css @@ -10,7 +10,8 @@ .oe_import .oe_import_grid, .oe_import .oe_import_error_report, .oe_import .oe_import_with_file, -.oe_import .oe_import_noheaders { +.oe_import .oe_import_noheaders, +.oe_import .oe_import_report_more { display: none; } @@ -19,7 +20,8 @@ } .oe_import.oe_import_error .oe_import_error_report, .oe_import.oe_import_with_file .oe_import_with_file, -.oe_import.oe_import_noheaders .oe_import_noheaders { +.oe_import.oe_import_noheaders .oe_import_noheaders, +.oe_import .oe_import_report_showmore .oe_import_report_more { display: block; } diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 9cb2f74bd48..d5f059d0656 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -79,6 +79,10 @@ openerp.base_import = function (instance) { ? $el.next() : $el.parent().next()) .toggle(); + }, + 'click .oe_import_report a.oe_import_report_count': function (e) { + e.preventDefault(); + $(e.target).parent().toggleClass('oe_import_report_showmore'); } }, init: function (parent, dataset) { @@ -262,31 +266,50 @@ openerp.base_import = function (instance) { }, import_dryrun: function () { return this.call_import({ dryrun: true }) - .then(this.proxy('render_import_errors')); + .then(this.proxy('render_import_result')); }, do_import: function () { var self = this; - return this.call_import({ dryrun: false }).then(function (errors) { - if (_.isEmpty(errors)) { + return this.call_import({ dryrun: false }).then(function (message) { + if (!_.any(message, function (message) { + return message.type === 'error' })) { if (self.getParent().reload_content) { self.getParent().reload_content(); } self.close(); return; } - self.render_import_errors(errors); + self.render_import_result(message); }); }, - render_import_errors: function (errors) { - if (_.isEmpty(errors)) { + render_import_result: function (message) { + if (_.isEmpty(message)) { this.$el.removeClass('oe_import_error'); return; } - // import failed (or maybe just warnings, if we ever get - // warnings?) + // row indexes come back 0-indexed, spreadsheets + // display 1-indexed. + var offset = 1; + // offset more if header + if (this.import_options().header) { offset += 1; } + this.$el.addClass('oe_import_error'); this.$('.oe_import_error_report').html( - QWeb.render('ImportView.error', {errors: errors})); + QWeb.render('ImportView.error', { + errors: _(message).groupBy('message'), + at: function (rows) { + var from = rows.from + offset; + var to = rows.to + offset; + if (from === to) { + return _.str.sprintf(_t("at row %d"), from); + } + return _.str.sprintf(_t("between rows %d and %d"), + from, to); + }, + more: function (n) { + return _.str.sprintf(_t("(%d times more)"), n); + }, + })); }, }); }; diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index 386348bea4b..5d36eae4d2d 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -86,12 +86,30 @@
    -
  • - - +
  • + + + + + + + +
      +
    • + + + +
    • +
+ + + + + + this.attr('t-if', 'widget.options.import_enabled'); From 4d7576393a3e0efadf639dbe9958725f76ae6f10 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 27 Sep 2012 09:48:45 +0200 Subject: [PATCH 07/68] [ADD] unstyled and incomplete handling of @moreinfo action triggering is still missing bzr revid: xmo@openerp.com-20120927074845-pb3osgymmtddglc0 --- addons/base_import/static/src/js/import.js | 35 +++++++++++++++++++- addons/base_import/static/src/xml/import.xml | 3 +- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index d5f059d0656..ac81f89c7a9 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -83,6 +83,12 @@ openerp.base_import = function (instance) { 'click .oe_import_report a.oe_import_report_count': function (e) { e.preventDefault(); $(e.target).parent().toggleClass('oe_import_report_showmore'); + }, + 'click .oe_import_moreinfo_action a': function (e) { + e.preventDefault(); + // #data will parse the attribute on its own, we don't like that + var action = JSON.parse($(e.target).attr('data-action')); + console.log(action); } }, init: function (parent, dataset) { @@ -307,7 +313,34 @@ openerp.base_import = function (instance) { from, to); }, more: function (n) { - return _.str.sprintf(_t("(%d times more)"), n); + return _.str.sprintf(_t("(%d more)"), n); + }, + info: function (msg) { + if (typeof msg === 'string') { + return _.str.sprintf( + '
%s
', + _.str.escapeHTML(msg)); + } + if (msg instanceof Array) { + return _.str.sprintf( + '
%s
    %s
', + _.str.escapeHTML(_t("Here are the possible values:")), + _(msg).map(function (msg) { + return '
  • ' + + _.str.escapeHTML(msg) + + '
  • '; + }).join()); + } + // Final should be object, action descriptor + return [ + '' + ].join('') }, })); }, diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index 5d36eae4d2d..2efd0b5a752 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -108,7 +108,8 @@ - + + From 4787939773e175475c03d70c4e32fdf0eeea1097 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 27 Sep 2012 11:49:50 +0200 Subject: [PATCH 08/68] [FIX] correctly transform 'get all possible values' action links to display list views as list views bzr revid: xmo@openerp.com-20120927094950-pwlgv2kt2a0jz8ji --- addons/base_import/static/src/js/import.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index ac81f89c7a9..8a73bcd5d71 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -86,9 +86,20 @@ openerp.base_import = function (instance) { }, 'click .oe_import_moreinfo_action a': function (e) { e.preventDefault(); - // #data will parse the attribute on its own, we don't like that + // #data will parse the attribute on its own, we don't like + // that sort of things var action = JSON.parse($(e.target).attr('data-action')); - console.log(action); + // FIXME: when JS-side clean_action + action.views = _(action.views).map(function (view) { + var id = view[0], type = view[1]; + return [ + id, + type !== 'tree' ? type + : action.view_type === 'form' ? 'list' + : 'tree' + ]; + }); + this.do_action(_.extend(action, {target: 'new'})); } }, init: function (parent, dataset) { @@ -329,7 +340,7 @@ openerp.base_import = function (instance) { return '
  • ' + _.str.escapeHTML(msg) + '
  • '; - }).join()); + }).join('')); } // Final should be object, action descriptor return [ From 45ee8b434d6ea9d1f1570478a091ce0eab2cc37d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 1 Oct 2012 09:17:28 +0200 Subject: [PATCH 09/68] [FIX] account: incorrect check for parent_id value would try a read on parent_id=False, which blows up bzr revid: xmo@openerp.com-20121001071728-npq7ieoe3rpz44i7 --- addons/account/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index e5e29f178a3..4eb99dc4bd4 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2522,14 +2522,14 @@ class account_account_template(osv.osv): ] def create(self, cr, uid, vals, context=None): - if 'parent_id' in vals: + if vals.get('parent_id'): parent = self.read(cr, uid, [vals['parent_id']], ['type']) if parent and parent[0]['type'] != 'view': raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'.")) return super(account_account_template, self).create(cr, uid, vals, context=context) def write(self, cr, uid, ids, vals, context=None): - if 'parent_id' in vals: + if vals.get('parent_id'): parent = self.read(cr, uid, [vals['parent_id']], ['type']) if parent and parent[0]['type'] != 'view': raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'.")) From 49998b5f72f2fa8a33472cc849203278cb80bbf0 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 1 Oct 2012 09:59:31 +0200 Subject: [PATCH 10/68] [FIX] account: correctly handle 'false' close_method bzr revid: xmo@openerp.com-20121001075931-zyrmydt1s7uz7ihk --- addons/account/account.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account/account.py b/addons/account/account.py index 4eb99dc4bd4..878f8759239 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -155,6 +155,7 @@ class account_account_type(osv.osv): return res def _save_report_type(self, cr, uid, account_type_id, field_name, field_value, arg, context=None): + field_value = field_value or 'none' obj_data = self.pool.get('ir.model.data') obj_financial_report = self.pool.get('account.financial.report') #unlink if it exists somewhere in the financial reports related to BS or PL From abf0579a9825a1a72a7525b26c80c87838fd6058 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 1 Oct 2012 12:52:35 +0200 Subject: [PATCH 11/68] [IMP] Invert order of buttons in import dialog, add 'or cancel' link bzr revid: xmo@openerp.com-20121001105235-0d954cxt9y80q89w --- addons/base_import/static/src/js/import.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 8a73bcd5d71..2a7e6f18d8a 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -106,10 +106,10 @@ openerp.base_import = function (instance) { var self = this; this._super(parent, { buttons: [ - {text: _t("Import"), click: self.proxy('do_import'), - 'class': 'oe_import_dialog_button'}, {text: _t("Validate"), click: self.proxy('import_dryrun'), - 'class': 'oe_import_dialog_button'} + 'class': 'oe_import_dialog_button'}, + {text: _t("Import"), click: self.proxy('do_import'), + 'class': 'oe_import_dialog_button oe_highlight'} ] }); this.res_model = parent.model; @@ -126,6 +126,16 @@ openerp.base_import = function (instance) { self.$('input[name=import_id]').val(id); }); }, + open: function () { + this._super.apply(this, arguments); + this.$el.dialog('widget').find('.ui-dialog-buttonset') + .append(_t(" or ")) + .append( + $(' + + or + Cancel + From e8a7d276bf700b3c880d4e961cfac1ea0b40c690 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 3 Oct 2012 14:16:19 +0200 Subject: [PATCH 17/68] [IMP] highlight toggling between validation and import buttons bzr revid: xmo@openerp.com-20121003121619-e6nbd78mfa5owycp --- addons/base_import/static/src/js/import.js | 6 ++++-- addons/base_import/static/src/xml/import.xml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index dd8b3288de9..4135f303513 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -325,8 +325,10 @@ openerp.base_import = function (instance) { }); }, render_import_result: function (message) { - if (_.isEmpty(message)) { - this.$('.oe_import_import').addClass('oe_highlight'); + var no_messages = _.isEmpty(message); + this.$('.oe_import_import').toggleClass('oe_highlight', no_messages); + this.$('.oe_import_validate').toggleClass('oe_highlight', !no_messages); + if (no_messages) { message.push({ type: 'info', message: _t("Everything seems valid.") diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index aab9482ee81..b0eea1fcf75 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -4,7 +4,7 @@
    + + + + + +
    +
    + +
    + dashed lines are asynchronous state transitions (3 seconds) +
    + + + + + + + + + + + diff --git a/addons/base_import/static/lib/javascript-state-machine/state-machine.js b/addons/base_import/static/lib/javascript-state-machine/state-machine.js new file mode 100644 index 00000000000..0d503ee7bdb --- /dev/null +++ b/addons/base_import/static/lib/javascript-state-machine/state-machine.js @@ -0,0 +1,155 @@ +(function (window) { + + StateMachine = { + + //--------------------------------------------------------------------------- + + VERSION: "2.1.0", + + //--------------------------------------------------------------------------- + + Result: { + SUCCEEDED: 1, // the event transitioned successfully from one state to another + NOTRANSITION: 2, // the event was successfull but no state transition was necessary + CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback + ASYNC: 4, // the event is asynchronous and the caller is in control of when the transition occurs + }, + + Error: { + INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state + PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending + INVALID_CALLBACK: 300, // caller provided callback function threw an exception + }, + + WILDCARD: '*', + ASYNC: 'async', + + //--------------------------------------------------------------------------- + + create: function(cfg, target) { + + var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false } + var fsm = target || cfg.target || {}; + var events = cfg.events || []; + var callbacks = cfg.callbacks || {}; + var map = {}; + + var add = function(e) { + var from = (e.from instanceof Array) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified + map[e.name] = map[e.name] || {}; + for (var n = 0 ; n < from.length ; n++) + map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified + }; + + if (initial) { + initial.event = initial.event || 'startup'; + add({ name: initial.event, from: 'none', to: initial.state }); + } + + for(var n = 0 ; n < events.length ; n++) + add(events[n]); + + for(var name in map) { + if (map.hasOwnProperty(name)) + fsm[name] = StateMachine.buildEvent(name, map[name]); + } + + for(var name in callbacks) { + if (callbacks.hasOwnProperty(name)) + fsm[name] = callbacks[name] + } + + fsm.current = 'none'; + fsm.is = function(state) { return this.current == state; }; + fsm.can = function(event) { return !this.transition && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); } + fsm.cannot = function(event) { return !this.can(event); }; + fsm.error = cfg.error || function(name, from, to, args, error, msg) { throw msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3) + + if (initial && !initial.defer) + fsm[initial.event](); + + return fsm; + + }, + + //=========================================================================== + + doCallback: function(fsm, func, name, from, to, args) { + if (func) { + try { + return func.apply(fsm, [name, from, to].concat(args)); + } + catch(e) { + return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, "an exception occurred in a caller-provided callback function"); + } + } + }, + + beforeEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); }, + afterEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); }, + leaveState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); }, + enterState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); }, + changeState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); }, + + + buildEvent: function(name, map) { + return function() { + + var from = this.current; + var to = map[from] || map[StateMachine.WILDCARD] || from; + var args = Array.prototype.slice.call(arguments); // turn arguments into pure array + + if (this.transition) + return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, "event " + name + " inappropriate because previous transition did not complete"); + + if (this.cannot(name)) + return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, "event " + name + " inappropriate in current state " + this.current); + + if (false === StateMachine.beforeEvent(this, name, from, to, args)) + return StateMachine.CANCELLED; + + if (from === to) { + StateMachine.afterEvent(this, name, from, to, args); + return StateMachine.NOTRANSITION; + } + + // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState) + var fsm = this; + this.transition = function() { + fsm.transition = null; // this method should only ever be called once + fsm.current = to; + StateMachine.enterState( fsm, name, from, to, args); + StateMachine.changeState(fsm, name, from, to, args); + StateMachine.afterEvent( fsm, name, from, to, args); + }; + + var leave = StateMachine.leaveState(this, name, from, to, args); + if (false === leave) { + this.transition = null; + return StateMachine.CANCELLED; + } + else if ("async" === leave) { + return StateMachine.ASYNC; + } + else { + if (this.transition) + this.transition(); // in case user manually called transition() but forgot to return ASYNC + return StateMachine.SUCCEEDED; + } + + }; + } + + }; // StateMachine + + //=========================================================================== + + if ("function" === typeof define) { + define("statemachine", [], function() { return StateMachine; }); + } + else { + window.StateMachine = StateMachine; + } + +}(this)); + diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 4135f303513..19d4e466cc7 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -71,14 +71,8 @@ openerp.base_import = function (instance) { ], events: { // 'change .oe_import_grid input': 'import_dryrun', - 'change input.oe_import_file': 'file_update', - 'change input.oe_import_has_header, .oe_import_options input': 'settings_updated', - 'click a.oe_import_csv': function (e) { - e.preventDefault(); - }, - 'click a.oe_import_export': function (e) { - e.preventDefault(); - }, + 'change input.oe_import_file': 'loaded_file', + 'change input.oe_import_has_header, .oe_import_options input': 'settings_changed', 'click a.oe_import_toggle': function (e) { e.preventDefault(); var $el = $(e.target); @@ -109,14 +103,15 @@ openerp.base_import = function (instance) { this.do_action(_.extend(action, {target: 'new'})); }, // buttons - 'click .oe_import_validate': 'import_dryrun', - 'click .oe_import_import': 'do_import', + 'click .oe_import_validate': 'validate', + 'click .oe_import_import': 'import', 'click .oe_import_cancel': function (e) { e.preventDefault(); this.exit(); } }, init: function (parent, params) { + var self = this; this._super.apply(this, arguments); this.res_model = params.model; // import object id @@ -150,42 +145,48 @@ openerp.base_import = function (instance) { }, //- File & settings change section - file_update: function (e) { + onfile_loaded: function () { this.$('.oe_import_button').prop('disabled', true); if (!this.$('input.oe_import_file').val()) { return; } this.$el.removeClass('oe_import_preview oe_import_error'); jsonp(this.$el, { url: '/base_import/set_file' - }, this.proxy('settings_updated')); + }, this.proxy('settings_changed')); }, - settings_updated: function () { + onpreviewing: function () { + var self = this; + this.$('.oe_import_button').prop('disabled', true); this.$el.addClass('oe_import_with_file'); // TODO: test that write // succeeded? - this.Import.call( - 'parse_preview', [this.id, this.import_options()]) - .then(this.proxy('preview')); - }, - preview: function (result) { this.$el.removeClass('oe_import_preview_error oe_import_error'); this.$el.toggleClass( 'oe_import_noheaders', !this.$('input.oe_import_has_header').prop('checked')); - if (result.error) { - this.$('.oe_import_options').show(); - this.$el.addClass('oe_import_preview_error oe_import_error'); - this.$('.oe_import_error_report').html( - QWeb.render('ImportView.preview.error', result)) - .get(0).scrollIntoView(); - return; - } + this.Import.call( + 'parse_preview', [this.id, this.import_options()]) + .then(function (result) { + var signal = result.error ? 'preview_failed' : 'preview_succeeded'; + self[signal](result); + }); + }, + onpreview_error: function (event, from, to, result) { + this.$('.oe_import_options').show(); + this.$el.addClass('oe_import_preview_error oe_import_error'); + this.$('.oe_import_error_report').html( + QWeb.render('ImportView.preview.error', result)) + .get(0).scrollIntoView(); + }, + onpreview_success: function (event, from, to, result) { + this.$('.oe_import_import').removeClass('oe_highlight'); + this.$('.oe_import_validate').addClass('oe_highlight'); this.$('.oe_import_button').prop('disabled', false); this.$el.addClass('oe_import_preview'); this.$('table').html(QWeb.render('ImportView.preview', result)); if (result.headers.length === 1) { this.$('.oe_import_options').show(); - this.render_import_result([{ + this.onresults(null, null, null, [{ type: 'warning', message: _t("A single column was found in the file, this often means the file separator is incorrect") }]); @@ -225,7 +226,6 @@ openerp.base_import = function (instance) { width: 'resolve', dropdownCssClass: 'oe_import_selector' }); - //this.import_dryrun(); }, generate_fields_completion: function (root) { var basic = []; @@ -303,28 +303,31 @@ openerp.base_import = function (instance) { return this.Import.call( 'do', [this.id, fields, this.import_options()], options); }, - import_dryrun: function () { + onvalidate: function () { return this.call_import({ dryrun: true }) - .then(this.proxy('render_import_result')); + .then(this.proxy('validated')); }, - do_import: function () { + onimport: function () { var self = this; return this.call_import({ dryrun: false }).then(function (message) { if (!_.any(message, function (message) { return message.type === 'error' })) { - self.exit(); + self['import_succeeded'](); return; } - self.render_import_result(message); + self['import_failed'](message); }); }, + onimported: function () { + this.exit(); + }, exit: function () { this.do_action({ type: 'ir.actions.client', tag: 'history_back' }); }, - render_import_result: function (message) { + onresults: function (event, from, to, message) { var no_messages = _.isEmpty(message); this.$('.oe_import_import').toggleClass('oe_highlight', no_messages); this.$('.oe_import_validate').toggleClass('oe_highlight', !no_messages); @@ -386,4 +389,23 @@ openerp.base_import = function (instance) { })).get(0).scrollIntoView(); }, }); + // FSM-ize DataImport + StateMachine.create({ + target: instance.web.DataImport.prototype, + events: [ + { name: 'loaded_file', + from: ['none', 'file_loaded', 'preview_error', 'preview_success', 'results'], + to: 'file_loaded' }, + { name: 'settings_changed', + from: ['file_loaded', 'preview_error', 'preview_success', 'results'], + to: 'previewing' }, + { name: 'preview_failed', from: 'previewing', to: 'preview_error' }, + { name: 'preview_succeeded', from: 'previewing', to: 'preview_success' }, + { name: 'validate', from: 'preview_success', to: 'validating' }, + { name: 'validated', from: 'validating', to: 'results' }, + { name: 'import', from: ['preview_success', 'results'], to: 'importing' }, + { name: 'import_succeeded', from: 'importing', to: 'imported'}, + { name: 'import_failed', from: 'importing', to: 'results' } + ] + }) }; From 9c9d9781093cf35bb5abec0d605a02bbd9b3f108 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 3 Oct 2012 17:24:44 +0200 Subject: [PATCH 19/68] [IMP] relational field 'more values' dialog list features force display of pager and search view, make list non-selectable bzr revid: xmo@openerp.com-20121003152444-phnn9sc9nqo1ecpn --- addons/base_import/static/src/js/import.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 19d4e466cc7..2867242749c 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -100,7 +100,15 @@ openerp.base_import = function (instance) { : 'tree' ]; }); - this.do_action(_.extend(action, {target: 'new'})); + this.do_action(_.extend(action, { + target: 'new', + flags: { + search_view: true, + display_title: true, + pager: true, + list: {selectable: false} + } + })); }, // buttons 'click .oe_import_validate': 'validate', From 82e849e180c89698fd86fb1e6aa9a6d59119216e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 4 Oct 2012 10:32:31 +0200 Subject: [PATCH 20/68] [FIX] base_import: should be possible to re-validate a file after a failed import or validation bzr revid: xmo@openerp.com-20121004083231-qyl8l58wyhb7g2c3 --- addons/base_import/static/src/js/import.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 2867242749c..937565a24e8 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -410,6 +410,7 @@ openerp.base_import = function (instance) { { name: 'preview_failed', from: 'previewing', to: 'preview_error' }, { name: 'preview_succeeded', from: 'previewing', to: 'preview_success' }, { name: 'validate', from: 'preview_success', to: 'validating' }, + { name: 'validate', from: 'results', to: 'validating' }, { name: 'validated', from: 'validating', to: 'results' }, { name: 'import', from: ['preview_success', 'results'], to: 'importing' }, { name: 'import_succeeded', from: 'importing', to: 'imported'}, From 8f3db5bcf1f1eb6eb505e9847536fd8d26e46497 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 4 Oct 2012 12:22:36 +0200 Subject: [PATCH 21/68] [IMP] move file format options from below preview table to below file field bzr revid: xmo@openerp.com-20121004102236-auj053d38tp5fpvy --- addons/base_import/static/src/css/import.css | 2 +- addons/base_import/static/src/xml/import.xml | 26 +++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css index 25678cbe98a..21e598ff707 100644 --- a/addons/base_import/static/src/css/import.css +++ b/addons/base_import/static/src/css/import.css @@ -52,7 +52,7 @@ } .oe_import .oe_import_options label { display: inline-block; - width: 10em; + width: 8em; text-align: right; } diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index b0eea1fcf75..91debd64897 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -24,6 +24,20 @@ +
    + + File Format Options… +
    +

    + + + +

    +
    +

    Map your data to OpenERP

    @@ -38,18 +52,6 @@
    - - File Format Options… -
    -

    - - - -

    -

    Frequently Asked Questions

    From 1b17b59f50b73c927f1283901003d6ea793785af Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 4 Oct 2012 13:50:24 +0200 Subject: [PATCH 22/68] [IMP] base_import: provide an encoding picker bzr revid: xmo@openerp.com-20121004115024-m77q5c95i12q3qkm --- addons/base_import/static/src/js/import.js | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 937565a24e8..551196678a3 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -128,6 +128,7 @@ openerp.base_import = function (instance) { }, start: function () { var self = this; + this.setup_encoding_picker(); return $.when( this._super(), @@ -139,6 +140,25 @@ openerp.base_import = function (instance) { }) ) }, + setup_encoding_picker: function () { + this.$('input.oe_import_encoding').select2({ + width: '160px', + query: function (q) { + var make = function (term) { return {id: term, text: term}; }; + var suggestions = _.map( + ('utf-8 utf-16 windows-1252 latin1 latin2 big5 ' + + 'gb18030 shift_jis windows-1251 koir8_r').split(/\s+/), + make); + if (q.term) { + suggestions.unshift(make(q.term)); + } + q.callback({results: suggestions}); + }, + initSelection: function (e, c) { + return c({id: 'utf-8', text: 'utf-8'}); + } + }).select2('val', 'utf-8'); + }, import_options: function () { var self = this; @@ -182,8 +202,7 @@ openerp.base_import = function (instance) { this.$('.oe_import_options').show(); this.$el.addClass('oe_import_preview_error oe_import_error'); this.$('.oe_import_error_report').html( - QWeb.render('ImportView.preview.error', result)) - .get(0).scrollIntoView(); + QWeb.render('ImportView.preview.error', result)); }, onpreview_success: function (event, from, to, result) { this.$('.oe_import_import').removeClass('oe_highlight'); From cb265f710c0b752e2928553ffc8a654ed2436ca5 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Thu, 4 Oct 2012 17:57:11 +0530 Subject: [PATCH 23/68] [IMP]replace callenabled for on_record_loaded method. bzr revid: vme@tinyerp.com-20121004122711-hzymzdnzbyutxge5 --- addons/web/static/src/js/view_form.js | 20 ++++++---- addons/web_diagram/static/src/js/diagram.js | 42 +++++++++++++++++---- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 1c32d5ef63e..279f44827ba 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -111,6 +111,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.on("change:actual_mode", self, self.init_pager); self.init_pager(); }); + self.on("record_load", self, self.on_record_loaded); instance.web.bus.on('clear_uncommitted_changes', this, function(e) { if (!this.can_be_discarded()) { e.preventDefault(); @@ -316,7 +317,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM fields.push('display_name'); return self.dataset.read_index(fields, { context: { 'bin_size': true, 'future_display_name' : true } - }).pipe(self.on_record_loaded); + }).pipe(function(r){self.trigger('record_load',r)}); }); } return shown.pipe(function() { @@ -364,6 +365,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM field._inhibit_on_change_flag = false; set_values.push(result); }); + console.log("on_record_loaded"); return $.when.apply(null, set_values).pipe(function() { if (!record.id) { // New record: Second pass in order to trigger the onchanges @@ -398,12 +400,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM * @return {$.Deferred} */ load_defaults: function () { + var self = this; var keys = _.keys(this.fields_view.fields); if (keys.length) { return this.dataset.default_get(keys) - .pipe(this.on_record_loaded); + .pipe(function(r){self.trigger('record_load',r)}); } - return this.on_record_loaded({}); + return self.trigger('record_load',{}); }, on_form_changed: function() { this.trigger("view_content_has_changed"); @@ -737,7 +740,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.trigger('history_back'); } else { this.to_view_mode(); - this.on_record_loaded(this.datarecord); + self.trigger('record_load',this.datarecord); } } return false; @@ -943,7 +946,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM fields.push('display_name'); return self.dataset.read_index(fields, { context : { 'bin_size' : true, 'future_display_name' : true } - }).pipe(self.on_record_loaded); + }).pipe(function(r){self.trigger('record_load',r)}); } }); }, @@ -3291,9 +3294,10 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ if (self.get("effective_readonly")) { $(".oe_form_buttons", controller.$el).children().remove(); } - controller.on_record_loaded.add_last(function() { - once.resolve(); - }); + controller.on("record_load", self, function(){ + console.log("view manager form"); + once.resolve(); + }); controller.on_pager_action.add_first(function() { self.save_any_view(); }); diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 543cc6a9c12..e2ec463ec8e 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -241,22 +241,35 @@ instance.web.DiagramView = instance.web.View.extend({ } ); - pop.on_write.add(function() { + pop.on_write_completed.add(function() { self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); }); var form_fields = [self.parent_field]; var form_controller = pop.view_form; - form_controller.on_record_loaded.add_first(function() { + /*form_controller.on_record_loaded.add_first(function() { + console.log("web diagram add_first"); _.each(form_fields, function(fld) { if (!(fld in form_controller.fields)) { return; } var field = form_controller.fields[fld]; field.$input.prop('disabled', true); field.$drop_down.unbind(); - field.$menu_btn.unbind(); + //field.$menu_btn.unbind(); }); - }); + });*/ + form_controller.on("record_load", self, function(){ + console.log("web diagram add_first"); + _.each(form_fields, function(fld) { + if (!(fld in form_controller.fields)) { return; } + var field = form_controller.fields[fld]; + field.$input.prop('disabled', true); + field.$drop_down.unbind(); + //field.$menu_btn.unbind(); + }); + }); + + }, // Creates a popup to add a node to the diagram @@ -281,7 +294,15 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; var form_fields = [this.parent_field]; - form_controller.on_record_loaded.add_last(function() { + /*form_controller.on_record_loaded.add_last(function() { + _.each(form_fields, function(fld) { + if (!(fld in form_controller.fields)) { return; } + var field = form_controller.fields[fld]; + field.set_value(self.id); + field.dirty = true; + }); + });*/ + form_controller.on("record_load", self, function(){ _.each(form_fields, function(fld) { if (!(fld in form_controller.fields)) { return; } var field = form_controller.fields[fld]; @@ -340,12 +361,19 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; - form_controller.on_record_loaded.add_last(function () { + /*form_controller.on_record_loaded.add_last(function () { form_controller.fields[self.connectors.attrs.source].set_value(node_source_id); form_controller.fields[self.connectors.attrs.source].dirty = true; form_controller.fields[self.connectors.attrs.destination].set_value(node_dest_id); form_controller.fields[self.connectors.attrs.destination].dirty = true; - }); + });*/ + form_controller.on("record_load", self, function(){ + console.log("add_connector"); + form_controller.fields[self.connectors.attrs.source].set_value(node_source_id); + form_controller.fields[self.connectors.attrs.source].dirty = true; + form_controller.fields[self.connectors.attrs.destination].set_value(node_dest_id); + form_controller.fields[self.connectors.attrs.destination].dirty = true; + }); }, on_pager_action: function(action) { From 25f695a650079d68fabb96a923c4d7411a27cd98 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 4 Oct 2012 15:38:40 +0200 Subject: [PATCH 24/68] [IMP] pass restore callback to import action so that the listview can reload itself after coming back from an import (successful or not) and show the results of the import. bzr revid: xmo@openerp.com-20121004133840-a2uy4s5qhpqqvp8h --- addons/base_import/static/src/js/import.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 551196678a3..5980eb2384c 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -53,6 +53,8 @@ openerp.base_import = function (instance) { params: { model: self.dataset.model } + }, void 0, void 0, function () { + self.reload(); }); return false; }); From a3f1a64c45568fe0fe2f0ceecb41887c4b61a1a4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 5 Oct 2012 10:34:40 +0200 Subject: [PATCH 25/68] [IMP] make base_import auto-install bzr revid: xmo@openerp.com-20121005083440-xenjci6qag7bkk3n --- addons/base_import/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base_import/__openerp__.py b/addons/base_import/__openerp__.py index bb527e7b49d..f5a707650d8 100644 --- a/addons/base_import/__openerp__.py +++ b/addons/base_import/__openerp__.py @@ -26,7 +26,7 @@ Re-implement openerp's file import system: 'author': 'OpenERP SA', 'depends': ['base'], 'installable': True, - 'auto_install': False, # set to true and allow uninstall? + 'auto_install': True, 'css': [ 'static/lib/select2/select2.css', 'static/src/css/import.css', From 6b30915df24f7f5082d0ad3a636e57de12d4bb7d Mon Sep 17 00:00:00 2001 From: Vishmita Date: Mon, 8 Oct 2012 12:57:33 +0530 Subject: [PATCH 26/68] [Fix]replace callenabled for on_button_cancel bzr revid: vja@tinyerp.com-20121008072733-kveozkvheu9kiti2 --- addons/web_kanban/static/src/js/kanban.js | 4 ++-- addons/web_view_editor/static/src/js/view_editor.js | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 41cc366226f..dae3d7b214d 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -194,7 +194,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on_button_cancel.add_last(am.dialog.on_close); + form.on("on_button_cancel",self,am.dialog.on_close); form.on_created.add_last(function(r) { (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { am.dialog.on_close(); @@ -672,7 +672,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on_button_cancel.add_last(am.dialog.on_close); + form.on("on_button_cancel",self,am.dialog.on_close); form.on_saved.add_last(function() { am.dialog.on_close(); self.view.do_reload(); diff --git a/addons/web_view_editor/static/src/js/view_editor.js b/addons/web_view_editor/static/src/js/view_editor.js index e65f0ab5d38..f26e12a55d7 100644 --- a/addons/web_view_editor/static/src/js/view_editor.js +++ b/addons/web_view_editor/static/src/js/view_editor.js @@ -1014,9 +1014,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var action_manager = new instance.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { var controller = action_manager.dialog_widget.views['form'].controller; - controller.on_button_cancel.add_last(function(){ - action_manager.destroy() - }); + controller.on("on_button_cancel",self,action_manager.destroy); controller.do_save.add_last(function(){ action_manager.destroy(); var value =controller.fields.name.get('value'); From 777243bef32482803e8ccbc6735293c19187a54a Mon Sep 17 00:00:00 2001 From: Vishmita Date: Mon, 8 Oct 2012 15:03:15 +0530 Subject: [PATCH 27/68] [Fix]Improve code bzr revid: vja@tinyerp.com-20121008093315-tnfnrr0rhum2yyoy --- addons/web_view_editor/static/src/js/view_editor.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/web_view_editor/static/src/js/view_editor.js b/addons/web_view_editor/static/src/js/view_editor.js index f26e12a55d7..b3a4f0dcfac 100644 --- a/addons/web_view_editor/static/src/js/view_editor.js +++ b/addons/web_view_editor/static/src/js/view_editor.js @@ -1014,7 +1014,9 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var action_manager = new instance.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { var controller = action_manager.dialog_widget.views['form'].controller; - controller.on("on_button_cancel",self,action_manager.destroy); + controller.on("on_button_cancel",self,function(){ + action_manager.destroy(); + }); controller.do_save.add_last(function(){ action_manager.destroy(); var value =controller.fields.name.get('value'); From f893835350de746d054913cdb30b923f8fa2f0c5 Mon Sep 17 00:00:00 2001 From: ggh-openerp Date: Mon, 8 Oct 2012 15:19:24 +0530 Subject: [PATCH 28/68] [IMP] Remove add_last in on_created method bzr revid: ggh@tinyerp.com-20121008094924-uawry36sh9ffz8ut --- addons/web/static/src/js/view_form.js | 8 +++++--- addons/web_calendar/static/src/js/calendar.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b41039361c0..366b2e7a9e9 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -131,6 +131,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM e.preventDefault(); } }); + self.on('on_rec_create', self, self.on_created); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -778,7 +779,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var def = $.Deferred(); $.when(this.has_been_loaded).then(function() { self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) { - return self.on_created({ result : new_id }); + return self.trigger('on_rec_create',{ result : new_id }); }).then(function() { return self.to_edit_mode(); }).then(function() { @@ -859,7 +860,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (!self.datarecord.id) { // Creation save save_deferral = self.dataset.create(values).pipe(function(r) { - return self.on_created(r, prepend_on_create); + return self.trigger('on_rec_create', r, prepend_on_create); }, null); } else if (_.isEmpty(values) && ! self.force_dirty) { // Not dirty, noop save @@ -1622,12 +1623,13 @@ instance.web.form.FormDialog = instance.web.Dialog.extend({ return this; }, start: function() { + var self = this; this._super(); this.form = new instance.web.FormView(this, this.dataset, this.view_id, { pager: false }); this.form.appendTo(this.$el); - this.form.on_created.add_last(this.on_form_dialog_saved); + this.form.on('on_rec_create', self, this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); return this; }, diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index 81533413312..35cac441b35 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -458,7 +458,7 @@ instance.web_calendar.CalendarFormDialog = instance.web.Dialog.extend({ pager: false }); var def = this.form.appendTo(this.$el); - this.form.on_created.add_last(this.on_form_dialog_saved); + this.form.on('on_rec_create', self, this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); this.form.on_button_cancel = function() { self.close(); diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 41cc366226f..45f5c98bf51 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -195,7 +195,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; form.on_button_cancel.add_last(am.dialog.on_close); - form.on_created.add_last(function(r) { + form.on('on_rec_create', self, function(r) { (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { am.dialog.on_close(); var domain = self.dataset.domain.slice(0); @@ -673,7 +673,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; form.on_button_cancel.add_last(am.dialog.on_close); - form.on_saved.add_last(function() { + form.on('on_saved', self, function() { am.dialog.on_close(); self.view.do_reload(); }); From 4dd9a36f6e88d23344deaecbf997fc2ec63a64cc Mon Sep 17 00:00:00 2001 From: ggh-openerp Date: Mon, 8 Oct 2012 16:33:46 +0530 Subject: [PATCH 29/68] [IMP] Remove add_last in on_saved method bzr revid: ggh@tinyerp.com-20121008110346-r0dzmjy3161bxglb --- addons/web/static/src/js/view_form.js | 5 +++-- addons/web_calendar/static/src/js/calendar.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b41039361c0..ce2e1ac5689 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -131,6 +131,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM e.preventDefault(); } }); + self.on("on_rec_save", self, self.on_saved); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -868,7 +869,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.force_dirty = false; // Write save save_deferral = self.dataset.write(self.datarecord.id, values, {}).pipe(function(r) { - return self.on_saved(r); + return self.trigger('on_rec_save', r); }, null); } return save_deferral; @@ -1628,7 +1629,7 @@ instance.web.form.FormDialog = instance.web.Dialog.extend({ }); this.form.appendTo(this.$el); this.form.on_created.add_last(this.on_form_dialog_saved); - this.form.on_saved.add_last(this.on_form_dialog_saved); + this.form.on('on_rec_save', this, this.on_form_dialog_saved); return this; }, select_id: function(id) { diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index 81533413312..37c49462b59 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -459,7 +459,7 @@ instance.web_calendar.CalendarFormDialog = instance.web.Dialog.extend({ }); var def = this.form.appendTo(this.$el); this.form.on_created.add_last(this.on_form_dialog_saved); - this.form.on_saved.add_last(this.on_form_dialog_saved); + this.form.on('on_rec_save', self, this.on_form_dialog_saved); this.form.on_button_cancel = function() { self.close(); } diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 41cc366226f..438b1f7cb14 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -673,7 +673,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; form.on_button_cancel.add_last(am.dialog.on_close); - form.on_saved.add_last(function() { + form.on('on_rec_save', self, function() { am.dialog.on_close(); self.view.do_reload(); }); From 775fe69fc10603c8b859e2c2554827f74f0405fc Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 8 Oct 2012 15:08:56 +0200 Subject: [PATCH 30/68] [IMP] base_import: always open CSV link in new window bzr revid: xmo@openerp.com-20121008130856-fw0p92lofx7u27b2 --- addons/base_import/static/src/xml/import.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index 91debd64897..adca0579f8f 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -18,7 +18,7 @@

    Upload your file

    Select the .CSV + class="oe_import_csv" target="_blank">.CSV file to import. If you need a sample importable file, you can use the export tool to generate one.

    From 5300124eb0cf643297971e4c7d9d6756ffd40c62 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Mon, 8 Oct 2012 18:49:24 +0200 Subject: [PATCH 31/68] [FIX] wrong var assignation lp bug: https://launchpad.net/bugs/1022509 fixed bzr revid: abo@openerp.com-20121008164924-6pfc9k8lzt11uw9m --- addons/board/static/src/js/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js index 43d7ca76d39..6037c8c08fa 100644 --- a/addons/board/static/src/js/dashboard.js +++ b/addons/board/static/src/js/dashboard.js @@ -173,7 +173,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({ }, on_load_action: function(result, index, action_attrs) { var self = this, - action = result.result, + action = result, view_mode = action_attrs.view_mode; if (action_attrs.context && action_attrs.context['dashboard_merge_domains_contexts'] === false) { From f168998a49cbced240962f1aca86f2c89f665549 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 9 Oct 2012 11:44:11 +0200 Subject: [PATCH 32/68] [FIX] l10n_uk: import doesn't skip empty cells anymore, so fix import which relied on default value being set on empty cell bzr revid: xmo@openerp.com-20121009094411-6eji2zzp3r1afx9h --- addons/l10n_uk/data/account.account.type.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/l10n_uk/data/account.account.type.csv b/addons/l10n_uk/data/account.account.type.csv index 0827975b22f..379656ece39 100644 --- a/addons/l10n_uk/data/account.account.type.csv +++ b/addons/l10n_uk/data/account.account.type.csv @@ -10,4 +10,4 @@ "account_type_output_tax","Output Tax","Output Tax","liability","Unreconciled" "account_type_input_tax","Input Tax","Input Tax","asset","Unreconciled" "account_type_profit_and_loss","Profit and Loss","Profit and Loss","none","None" -"account_type_view","View","view",,"None" +"account_type_view","View","view","none","None" From 1b7d0029221be19c6b23634f60d6f8109db852d8 Mon Sep 17 00:00:00 2001 From: Vishmita Date: Tue, 9 Oct 2012 15:40:28 +0530 Subject: [PATCH 33/68] [IMP]replace callenabled for on_mode_switch bzr revid: vja@tinyerp.com-20121009101028-z5andmt2pi0973za --- addons/web/static/src/js/view_form.js | 2 +- addons/web/static/src/js/views.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b41039361c0..db68b8d7a23 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3370,7 +3370,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ } def.resolve(); }); - this.viewmanager.on_mode_switch.add_first(function(n_mode, b, c, d, e) { + this.viewmanager.on('on_mode_switch',self,function(n_mode, b, c, d, e) { $.when(self.save_any_view()).then(function() { if(n_mode === "list") $.async_when().then(function() {self.reload_current_view();}); diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 21f539fed1b..18d7e9d5666 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -552,7 +552,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ add_breadcrumb: function(on_reverse_breadcrumb) { var self = this; var views = [this.active_view || this.views_src[0].view_type]; - this.on_mode_switch.add(function(mode) { + this.on('on_mode_switch',self,function(mode) { var last = views.slice(-1)[0]; if (mode !== last) { if (mode !== 'form') { From fb3a8ca573e4ce66ad562e1b504a9abd4fa0f695 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Tue, 9 Oct 2012 14:23:49 +0200 Subject: [PATCH 34/68] [REM] commented code bzr revid: abo@openerp.com-20121009122349-ex5ypwulksc7ibx4 --- addons/project/report/project_cumulative.xml | 30 -------------------- 1 file changed, 30 deletions(-) diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index 3531b5ffc27..dc556be22e7 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -29,21 +29,6 @@ - - - - - - - - - - - - - - - project.task.history.cumulative.search @@ -78,20 +63,5 @@ id="menu_action_view_task_history_cumulative" parent="base.menu_project_report" /> - - - - - - - - - - - - - - - From abac1cae455e3380fee45a2d9503427ed6fa3269 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Tue, 9 Oct 2012 18:05:32 +0530 Subject: [PATCH 35/68] [IMP]improvements to record load event. bzr revid: vme@tinyerp.com-20121009123532-bwlrg4ldtprd1w2d --- addons/web/static/src/js/view_form.js | 3 +- addons/web_diagram/static/src/js/diagram.js | 34 +++------------------ addons/web_tests/static/src/js/web_tests.js | 6 ++-- 3 files changed, 8 insertions(+), 35 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index e55258d45d1..45e49366ba2 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -380,7 +380,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM field._inhibit_on_change_flag = false; set_values.push(result); }); - console.log("on_record_loaded"); return $.when.apply(null, set_values).pipe(function() { if (!record.id) { // New record: Second pass in order to trigger the onchanges @@ -755,7 +754,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.trigger('history_back'); } else { this.to_view_mode(); - self.trigger('record_load',this.datarecord); + this.trigger('record_load',this.datarecord); } } return false; diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 083dfd56dc0..6c32a12384a 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -239,24 +239,13 @@ instance.web.DiagramView = instance.web.View.extend({ title: _t("Open: ") + title } ); - - pop.on_write_completed.add(function() { + pop.on('on_write_complete', self, function() { self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); }); - + var form_fields = [self.parent_field]; var form_controller = pop.view_form; - /*form_controller.on_record_loaded.add_first(function() { - console.log("web diagram add_first"); - _.each(form_fields, function(fld) { - if (!(fld in form_controller.fields)) { return; } - var field = form_controller.fields[fld]; - field.$input.prop('disabled', true); - field.$drop_down.unbind(); - //field.$menu_btn.unbind(); - }); - });*/ form_controller.on("record_load", self, function(){ console.log("web diagram add_first"); _.each(form_fields, function(fld) { @@ -264,7 +253,6 @@ instance.web.DiagramView = instance.web.View.extend({ var field = form_controller.fields[fld]; field.$input.prop('disabled', true); field.$drop_down.unbind(); - //field.$menu_btn.unbind(); }); }); @@ -293,14 +281,6 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; var form_fields = [this.parent_field]; - /*form_controller.on_record_loaded.add_last(function() { - _.each(form_fields, function(fld) { - if (!(fld in form_controller.fields)) { return; } - var field = form_controller.fields[fld]; - field.set_value(self.id); - field.dirty = true; - }); - });*/ form_controller.on("record_load", self, function(){ _.each(form_fields, function(fld) { if (!(fld in form_controller.fields)) { return; } @@ -324,7 +304,7 @@ instance.web.DiagramView = instance.web.View.extend({ title: _t("Open: ") + title } ); - pop.on_write.add(function() { + pop.on('on_write_complete', self, function() { self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); }); }, @@ -360,14 +340,8 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; - /*form_controller.on_record_loaded.add_last(function () { - form_controller.fields[self.connectors.attrs.source].set_value(node_source_id); - form_controller.fields[self.connectors.attrs.source].dirty = true; - form_controller.fields[self.connectors.attrs.destination].set_value(node_dest_id); - form_controller.fields[self.connectors.attrs.destination].dirty = true; - });*/ + form_controller.on("record_load", self, function(){ - console.log("add_connector"); form_controller.fields[self.connectors.attrs.source].set_value(node_source_id); form_controller.fields[self.connectors.attrs.source].dirty = true; form_controller.fields[self.connectors.attrs.destination].set_value(node_dest_id); diff --git a/addons/web_tests/static/src/js/web_tests.js b/addons/web_tests/static/src/js/web_tests.js index 5b9c1d02503..8c146644372 100644 --- a/addons/web_tests/static/src/js/web_tests.js +++ b/addons/web_tests/static/src/js/web_tests.js @@ -23,14 +23,14 @@ openerp.web_tests = function (instance) { on_everything_loaded: function (slice) { var records = slice[0].records; if (!records.length) { - this.form.on_record_loaded({}); + this.form.trigger("record_load",{}); return; } - this.form.on_record_loaded(records[0]); + this.form.trigger("record_load", records[0]) _(records.slice(1)).each(function (record, index) { this.dataset.index = index+1; this.form.reposition($('
    ').appendTo(this.$el)); - this.form.on_record_loaded(record); + this.form.trigger("record_load", record) }, this); } }); From 5645a84a1651b9f2104ec22e62033de70fa8a334 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Tue, 9 Oct 2012 18:19:08 +0530 Subject: [PATCH 36/68] [IMP]replace add* method. bzr revid: vme@tinyerp.com-20121009124908-r33qqpx15ea39p78 --- addons/board/static/src/js/dashboard.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js index 43d7ca76d39..bba076e8594 100644 --- a/addons/board/static/src/js/dashboard.js +++ b/addons/board/static/src/js/dashboard.js @@ -25,9 +25,9 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({ }).bind('sortstop', self.do_save_dashboard); var old_title = this.__parentedParent.get('title'); - this.__parentedParent.on_record_loaded.add_last(function(){ + this.__parentedParent.on('record_load', this, function(){ self.__parentedParent.set({ 'title' : old_title}); - }); + }) // Events this.$el.find('.oe_dashboard_link_reset').click(this.on_reset); this.$el.find('.oe_dashboard_link_change_layout').click(this.on_change_layout); From 91f97769790fbd59bd6360c0392a4c1c1cece0cd Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Tue, 9 Oct 2012 18:26:47 +0530 Subject: [PATCH 37/68] [rem]console bzr revid: vme@tinyerp.com-20121009125647-zwx4fj95fjs0y34u --- addons/web_diagram/static/src/js/diagram.js | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 6c32a12384a..3b9e81fdf6e 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -247,7 +247,6 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; form_controller.on("record_load", self, function(){ - console.log("web diagram add_first"); _.each(form_fields, function(fld) { if (!(fld in form_controller.fields)) { return; } var field = form_controller.fields[fld]; From b8d7b8cb0ac768220eb28b3823b02d63027267ca Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Tue, 9 Oct 2012 18:30:30 +0530 Subject: [PATCH 38/68] [REM]one more console. bzr revid: vme@tinyerp.com-20121009130030-8437spz1j1eogh8x --- addons/web/static/src/js/view_form.js | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 45e49366ba2..43afe3a3bf1 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3372,7 +3372,6 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ $(".oe_form_buttons", controller.$el).children().remove(); } controller.on("record_load", self, function(){ - console.log("view manager form"); once.resolve(); }); controller.on_pager_action.add_first(function() { From c98de15a09c4d2dda02426ccb0bda9f6d37677bd Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 9 Oct 2012 16:26:07 +0200 Subject: [PATCH 39/68] [IMP] osv/orm.py: evaluate in python the 'options' attribute of a field in an xml view, before enclosing it in json. This allow to use python instead of json syntax in the definition of the options of a widget, which is a much more consistent behavior bzr revid: qdp-launchpad@openerp.com-20121009142607-rk3l00atu3w3kksp --- openerp/addons/base/res/res_bank_view.xml | 4 ++-- openerp/addons/base/res/res_company_view.xml | 4 ++-- openerp/addons/base/res/res_country_view.xml | 2 +- openerp/addons/base/res/res_partner_view.xml | 6 +++--- openerp/osv/orm.py | 8 ++++++-- openerp/tools/safe_eval.py | 2 +- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/res/res_bank_view.xml b/openerp/addons/base/res/res_bank_view.xml index ac91684d4d9..33b98c690c6 100644 --- a/openerp/addons/base/res/res_bank_view.xml +++ b/openerp/addons/base/res/res_bank_view.xml @@ -106,8 +106,8 @@
    - - + + diff --git a/openerp/addons/base/res/res_company_view.xml b/openerp/addons/base/res/res_company_view.xml index cac53b7a76a..b8cb12d3dd0 100644 --- a/openerp/addons/base/res/res_company_view.xml +++ b/openerp/addons/base/res/res_company_view.xml @@ -46,10 +46,10 @@
    - +
    - +
    @@ -177,7 +177,7 @@ + options='{"no_open": True}' attrs="{'invisible': [('is_company','=', True)]}" /> diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index c713c0378ea..8bc5c386527 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -60,7 +60,7 @@ import openerp import openerp.netsvc as netsvc import openerp.tools as tools from openerp.tools.config import config -from openerp.tools.safe_eval import safe_eval as eval +from openerp.tools.safe_eval import const_eval, safe_eval as eval from openerp.tools.translate import _ from openerp import SUPERUSER_ID from query import Query @@ -1732,7 +1732,11 @@ class BaseModel(object): field = model_fields.get(node.get('name')) if field: transfer_field_to_modifiers(field, modifiers) - + if node.get('options'): + try: + node.set('options', simplejson.dumps(const_eval(node.get('options')))) + except Exception, msg: + raise except_orm('Invalide Python code in %s'%(node.get('options')), msg[0]) elif node.tag in ('form', 'tree'): result = self.view_header_get(cr, user, False, node.tag, context) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index 601fd95200a..6bc92e57465 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -46,7 +46,7 @@ _ALLOWED_MODULES = ['_strptime', 'time'] _CONST_OPCODES = set(opmap[x] for x in [ 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'ROT_FOUR', 'DUP_TOP', 'DUP_TOPX', 'POP_BLOCK','SETUP_LOOP', 'BUILD_LIST', 'BUILD_MAP', 'BUILD_TUPLE', - 'LOAD_CONST', 'RETURN_VALUE', 'STORE_SUBSCR'] if x in opmap) + 'LOAD_CONST', 'RETURN_VALUE', 'STORE_SUBSCR', 'STORE_MAP', 'LOAD_NAME'] if x in opmap) _EXPR_OPCODES = _CONST_OPCODES.union(set(opmap[x] for x in [ 'UNARY_POSITIVE', 'UNARY_NEGATIVE', 'UNARY_NOT', From fe07dc2e6d67c32ebf6aab8e3e32e57f24886c28 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Tue, 9 Oct 2012 16:51:13 +0200 Subject: [PATCH 40/68] [FIX] Fixed on_switch_mode tirggering. bzr revid: vta@openerp.com-20121009145113-8sazhfrp3xaan5cq --- addons/web/static/src/js/view_form.js | 9 ++++-- addons/web/static/src/js/views.js | 32 ++++++++----------- addons/web_kanban/static/src/js/kanban.js | 4 +-- .../static/src/js/view_editor.js | 4 +-- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index db68b8d7a23..98fd83dadaf 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3370,10 +3370,13 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ } def.resolve(); }); - this.viewmanager.on('on_mode_switch',self,function(n_mode, b, c, d, e) { + this.viewmanager.on("on_mode_switch", self, function(n_mode, b, c, d, e) { $.when(self.save_any_view()).then(function() { - if(n_mode === "list") - $.async_when().then(function() {self.reload_current_view();}); + if (n_mode === "list") { + $.async_when().then(function() { + self.reload_current_view(); + }); + } }); }); this.is_setted.then(function() { diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 18d7e9d5666..e18a3e361be 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -417,7 +417,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ this._super(); var self = this; this.$el.find('.oe_view_manager_switch a').click(function() { - self.on_mode_switch($(this).data('view-type')); + self.trigger('on_mode_switch', $(this).data('view-type')); }).tipsy(); var views_ids = {}; _.each(this.views_src, function(view) { @@ -439,16 +439,12 @@ instance.web.ViewManager = instance.web.Widget.extend({ } // If no default view defined, switch to the first one in sequence var default_view = this.flags.default_view || this.views_src[0].view_type; - return this.on_mode_switch(default_view); + this.on('on_mode_switch', self, function(view_type, no_store, view_options) { + self.switch_mode(view_type, no_store, view_options); + }); + return this.trigger('on_mode_switch', default_view); }, - /** - * Asks the view manager to switch visualization mode. - * - * @param {String} view_type type of view to display - * @param {Boolean} [no_store=false] don't store the view being switched to on the switch stack - * @returns {jQuery.Deferred} new view loading promise - */ - on_mode_switch: function(view_type, no_store, view_options) { + switch_mode: function(view_type, no_store, view_options) { var self = this; var view = this.views[view_type]; var view_promise; @@ -552,7 +548,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ add_breadcrumb: function(on_reverse_breadcrumb) { var self = this; var views = [this.active_view || this.views_src[0].view_type]; - this.on('on_mode_switch',self,function(mode) { + this.on('on_mode_switch',self,function(mode) { var last = views.slice(-1)[0]; if (mode !== last) { if (mode !== 'form') { @@ -568,7 +564,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ var view_to_select = views[index]; self.$el.show(); if (self.active_view !== view_to_select) { - self.on_mode_switch(view_to_select); + self.trigger('on_mode_switch', view_to_select); } }, get_title: function() { @@ -604,7 +600,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ * consist to switch to the asked view. */ switch_view: function(view_type, no_store, options) { - return this.on_mode_switch(view_type, no_store, options); + return this.trigger('on_mode_switch', view_type, no_store, options); }, /** * Returns to the view preceding the caller view in this manager's @@ -623,12 +619,12 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (options.created && current_view === 'form' && previous_view === 'list') { // APR special case: "If creation mode from list (and only from a list), // after saving, go to page view (don't come back in list)" - return this.on_mode_switch('form'); + return this.trigger('on_mode_switch', 'form'); } else if (options.created && !previous_view && this.action && this.action.flags.default_view === 'form') { // APR special case: "If creation from dashboard, we have no previous view - return this.on_mode_switch('form'); + return this.trigger('on_mode_switch', 'form'); } - return this.on_mode_switch(previous_view, true); + return this.trigger('on_mode_switch', previous_view, true); }, /** * Sets up the current viewmanager's search view. @@ -897,7 +893,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ }, action || {}); this.do_action(action); }, - on_mode_switch: function (view_type, no_store, options) { + switch_mode: function (view_type, no_store, options) { var self = this; return $.when(this._super.apply(this, arguments)).then(function () { @@ -932,7 +928,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ if (state.view_type && state.view_type !== this.active_view) { defs.push( this.views[this.active_view].deferred.pipe(function() { - return self.on_mode_switch(state.view_type, true); + return self.trigger('on_mode_switch', state.view_type, true) }) ); } diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 41cc366226f..dae3d7b214d 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -194,7 +194,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on_button_cancel.add_last(am.dialog.on_close); + form.on("on_button_cancel",self,am.dialog.on_close); form.on_created.add_last(function(r) { (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { am.dialog.on_close(); @@ -672,7 +672,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on_button_cancel.add_last(am.dialog.on_close); + form.on("on_button_cancel",self,am.dialog.on_close); form.on_saved.add_last(function() { am.dialog.on_close(); self.view.do_reload(); diff --git a/addons/web_view_editor/static/src/js/view_editor.js b/addons/web_view_editor/static/src/js/view_editor.js index e65f0ab5d38..f26e12a55d7 100644 --- a/addons/web_view_editor/static/src/js/view_editor.js +++ b/addons/web_view_editor/static/src/js/view_editor.js @@ -1014,9 +1014,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var action_manager = new instance.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { var controller = action_manager.dialog_widget.views['form'].controller; - controller.on_button_cancel.add_last(function(){ - action_manager.destroy() - }); + controller.on("on_button_cancel",self,action_manager.destroy); controller.do_save.add_last(function(){ action_manager.destroy(); var value =controller.fields.name.get('value'); From 90fc4d66511634b11c95dfcb454eebe097486459 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 9 Oct 2012 17:28:28 +0200 Subject: [PATCH 41/68] [IMP] use of literal_eval from ast instead of const_eval from tools, as per Olivier recommendation bzr revid: qdp-launchpad@openerp.com-20121009152828-3bdxpatkrl1qmyfi --- openerp/osv/orm.py | 5 +++-- openerp/tools/safe_eval.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 8bc5c386527..a6d192240a2 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -60,7 +60,8 @@ import openerp import openerp.netsvc as netsvc import openerp.tools as tools from openerp.tools.config import config -from openerp.tools.safe_eval import const_eval, safe_eval as eval +from openerp.tools.safe_eval import safe_eval as eval +from ast import literal_eval from openerp.tools.translate import _ from openerp import SUPERUSER_ID from query import Query @@ -1734,7 +1735,7 @@ class BaseModel(object): transfer_field_to_modifiers(field, modifiers) if node.get('options'): try: - node.set('options', simplejson.dumps(const_eval(node.get('options')))) + node.set('options', simplejson.dumps(literal_eval(node.get('options')))) except Exception, msg: raise except_orm('Invalide Python code in %s'%(node.get('options')), msg[0]) diff --git a/openerp/tools/safe_eval.py b/openerp/tools/safe_eval.py index 6bc92e57465..601fd95200a 100644 --- a/openerp/tools/safe_eval.py +++ b/openerp/tools/safe_eval.py @@ -46,7 +46,7 @@ _ALLOWED_MODULES = ['_strptime', 'time'] _CONST_OPCODES = set(opmap[x] for x in [ 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'ROT_FOUR', 'DUP_TOP', 'DUP_TOPX', 'POP_BLOCK','SETUP_LOOP', 'BUILD_LIST', 'BUILD_MAP', 'BUILD_TUPLE', - 'LOAD_CONST', 'RETURN_VALUE', 'STORE_SUBSCR', 'STORE_MAP', 'LOAD_NAME'] if x in opmap) + 'LOAD_CONST', 'RETURN_VALUE', 'STORE_SUBSCR'] if x in opmap) _EXPR_OPCODES = _CONST_OPCODES.union(set(opmap[x] for x in [ 'UNARY_POSITIVE', 'UNARY_NEGATIVE', 'UNARY_NOT', From 83c00b75ff7773916d8a1d6b7a8cc1087be3779d Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 11:37:00 +0200 Subject: [PATCH 42/68] [FIX] Fixed on_mode_switch. bzr revid: vta@openerp.com-20121010093700-nz326tlux3v5olqj --- addons/web_shortcuts/static/src/js/web_shortcuts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_shortcuts/static/src/js/web_shortcuts.js b/addons/web_shortcuts/static/src/js/web_shortcuts.js index 743f3fc73aa..c6d5a2f41fb 100644 --- a/addons/web_shortcuts/static/src/js/web_shortcuts.js +++ b/addons/web_shortcuts/static/src/js/web_shortcuts.js @@ -108,7 +108,7 @@ instance.web.UserMenu.include({ }); instance.web.ViewManagerAction.include({ - on_mode_switch: function (view_type, no_store) { + switch_mode: function (view_type, no_store) { var self = this; this._super.apply(this, arguments).then(function() { self.shortcut_check(self.views[view_type]); From 12c35d031dac08296e05bd4231994257e5247bbd Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 11:37:37 +0200 Subject: [PATCH 43/68] [FIX] Fixed on_mode_switch. bzr revid: vta@openerp.com-20121010093737-0kheus1v0kdj5tk7 --- addons/web/static/src/js/view_form.js | 2 +- addons/web/static/src/js/views.js | 24 +++++++++++------------ addons/web_kanban/static/src/js/kanban.js | 4 ++-- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 98fd83dadaf..7395011a5e7 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3370,7 +3370,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ } def.resolve(); }); - this.viewmanager.on("on_mode_switch", self, function(n_mode, b, c, d, e) { + this.viewmanager.on("switch_mode", self, function(n_mode, b, c, d, e) { $.when(self.save_any_view()).then(function() { if (n_mode === "list") { $.async_when().then(function() { diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index e18a3e361be..f0df367c5e3 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -417,7 +417,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ this._super(); var self = this; this.$el.find('.oe_view_manager_switch a').click(function() { - self.trigger('on_mode_switch', $(this).data('view-type')); + self.trigger('switch_mode', $(this).data('view-type')); }).tipsy(); var views_ids = {}; _.each(this.views_src, function(view) { @@ -439,10 +439,8 @@ instance.web.ViewManager = instance.web.Widget.extend({ } // If no default view defined, switch to the first one in sequence var default_view = this.flags.default_view || this.views_src[0].view_type; - this.on('on_mode_switch', self, function(view_type, no_store, view_options) { - self.switch_mode(view_type, no_store, view_options); - }); - return this.trigger('on_mode_switch', default_view); + this.on('switch_mode', self, self.switch_mode); + return this.trigger('switch_mode', default_view); }, switch_mode: function(view_type, no_store, view_options) { var self = this; @@ -548,7 +546,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ add_breadcrumb: function(on_reverse_breadcrumb) { var self = this; var views = [this.active_view || this.views_src[0].view_type]; - this.on('on_mode_switch',self,function(mode) { + this.on('switch_mode', self, function(mode) { var last = views.slice(-1)[0]; if (mode !== last) { if (mode !== 'form') { @@ -564,7 +562,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ var view_to_select = views[index]; self.$el.show(); if (self.active_view !== view_to_select) { - self.trigger('on_mode_switch', view_to_select); + self.trigger('switch_mode', view_to_select); } }, get_title: function() { @@ -600,12 +598,12 @@ instance.web.ViewManager = instance.web.Widget.extend({ * consist to switch to the asked view. */ switch_view: function(view_type, no_store, options) { - return this.trigger('on_mode_switch', view_type, no_store, options); + return this.trigger('switch_mode', view_type, no_store, options); }, /** * Returns to the view preceding the caller view in this manager's * navigation history (the navigation history is appended to via - * on_mode_switch) + * switch_mode) * * @param {Object} [options] * @param {Boolean} [options.created=false] resource was created @@ -619,12 +617,12 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (options.created && current_view === 'form' && previous_view === 'list') { // APR special case: "If creation mode from list (and only from a list), // after saving, go to page view (don't come back in list)" - return this.trigger('on_mode_switch', 'form'); + return this.trigger('switch_mode', 'form'); } else if (options.created && !previous_view && this.action && this.action.flags.default_view === 'form') { // APR special case: "If creation from dashboard, we have no previous view - return this.trigger('on_mode_switch', 'form'); + return this.trigger('switch_mode', 'form'); } - return this.trigger('on_mode_switch', previous_view, true); + return this.trigger('switch_mode', previous_view, true); }, /** * Sets up the current viewmanager's search view. @@ -928,7 +926,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ if (state.view_type && state.view_type !== this.active_view) { defs.push( this.views[this.active_view].deferred.pipe(function() { - return self.trigger('on_mode_switch', state.view_type, true) + return self.trigger('switch_mode', state.view_type, true) }) ); } diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index dae3d7b214d..d95546dfe41 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -194,7 +194,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on("on_button_cancel",self,am.dialog.on_close); + form.on("on_button_cancel", self, am.dialog.on_close); form.on_created.add_last(function(r) { (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { am.dialog.on_close(); @@ -672,7 +672,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on("on_button_cancel",self,am.dialog.on_close); + form.on("on_button_cancel", self, am.dialog.on_close); form.on_saved.add_last(function() { am.dialog.on_close(); self.view.do_reload(); From 9c71d984e6937cc598fc8da52bf353322acc03cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Wed, 10 Oct 2012 11:55:09 +0200 Subject: [PATCH 44/68] [IMP] Class instanciations throws an error when you forgot to use the new operator bzr revid: fva@openerp.com-20121010095509-ojvigsva4hblta7m --- addons/web/static/src/js/corelib.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index ff193605033..21d593069e7 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -121,6 +121,10 @@ openerp.web.corelib = function(instance) { // The dummy class constructor function Class() { + if(this.constructor !== instance.web.Class){ + throw new Error("You need a 'new' to instanciate an object"); + return null; + } // All construction is actually done in the init method if (!initializing && this.init) { var ret = this.init.apply(this, arguments); From 31760fd2496a3287e10515a6e88cc5cd32f8db2c Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 12:02:18 +0200 Subject: [PATCH 45/68] [FIX] Fixed on_record_loaded. bzr revid: vta@openerp.com-20121010100218-drvx420qtrjucom1 --- addons/board/static/src/js/dashboard.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/board/static/src/js/dashboard.js b/addons/board/static/src/js/dashboard.js index bba076e8594..2dbd9f5c9cc 100644 --- a/addons/board/static/src/js/dashboard.js +++ b/addons/board/static/src/js/dashboard.js @@ -25,8 +25,8 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({ }).bind('sortstop', self.do_save_dashboard); var old_title = this.__parentedParent.get('title'); - this.__parentedParent.on('record_load', this, function(){ - self.__parentedParent.set({ 'title' : old_title}); + this.__parentedParent.on('load_record', self, function(){ + self.__parentedParent.set({ 'title': old_title}); }) // Events this.$el.find('.oe_dashboard_link_reset').click(this.on_reset); @@ -173,7 +173,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({ }, on_load_action: function(result, index, action_attrs) { var self = this, - action = result.result, + action = result, view_mode = action_attrs.view_mode; if (action_attrs.context && action_attrs.context['dashboard_merge_domains_contexts'] === false) { From 40eceb20a384b56b1e1acad6750afa27521a8fa4 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 12:02:33 +0200 Subject: [PATCH 46/68] [FIX] Fixed on_record_loaded. bzr revid: vta@openerp.com-20121010100233-tulf3c1fvnt2s85e --- addons/web/static/src/js/view_form.js | 31 ++++++++++++------- .../web/static/src/js/view_list_editable.js | 7 ++--- addons/web_diagram/static/src/js/diagram.js | 6 ++-- addons/web_tests/static/src/js/web_tests.js | 6 ++-- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 43afe3a3bf1..6a9d1dcb3a4 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -126,7 +126,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.on("change:actual_mode", self, self.init_pager); self.init_pager(); }); - self.on("record_load", self, self.on_record_loaded); + self.on("load_record", self, self.load_record); instance.web.bus.on('clear_uncommitted_changes', this, function(e) { if (!this.can_be_discarded()) { e.preventDefault(); @@ -332,7 +332,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM fields.push('display_name'); return self.dataset.read_index(fields, { context: { 'bin_size': true, 'future_display_name' : true } - }).pipe(function(r){self.trigger('record_load',r)}); + }).pipe(function(r) { + self.trigger('load_record', r); + }); }); } return shown.pipe(function() { @@ -355,7 +357,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } this._super(); }, - on_record_loaded: function(record) { + load_record: function(record) { var self = this, set_values = []; if (!record) { this.set({ 'title' : undefined }); @@ -417,10 +419,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var self = this; var keys = _.keys(this.fields_view.fields); if (keys.length) { - return this.dataset.default_get(keys) - .pipe(function(r){self.trigger('record_load',r)}); + return this.dataset.default_get(keys).pipe(function(r) { + self.trigger('load_record', r); + }); } - return self.trigger('record_load',{}); + return self.trigger('load_record', {}); }, on_form_changed: function() { this.trigger("view_content_has_changed"); @@ -754,7 +757,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.trigger('history_back'); } else { this.to_view_mode(); - this.trigger('record_load',this.datarecord); + this.trigger('load_record', this.datarecord); } } return false; @@ -954,9 +957,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } else { var fields = _.keys(self.fields_view.fields); fields.push('display_name'); - return self.dataset.read_index(fields, { - context : { 'bin_size' : true, 'future_display_name' : true } - }).pipe(function(r){self.trigger('record_load',r)}); + return self.dataset.read_index(fields, + { + context: { + 'bin_size': true, + 'future_display_name': true + } + }).pipe(function(r) { + self.trigger('load_record', r); + }); } }); }, @@ -3371,7 +3380,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ if (self.get("effective_readonly")) { $(".oe_form_buttons", controller.$el).children().remove(); } - controller.on("record_load", self, function(){ + controller.on("load_record", self, function(){ once.resolve(); }); controller.on_pager_action.add_first(function() { diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 892221a347b..fe0f525fe3f 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -626,7 +626,7 @@ openerp.web.list_editable = function (instance) { }, start: function () { var self = this; - var _super = this._super(); + var _super = this._super(); this.form.embedded_view = this._validate_view( this.delegate.edition_view(this)); var form_ready = this.form.appendTo(this.$el).then( @@ -708,10 +708,9 @@ openerp.web.list_editable = function (instance) { var self = this; var form = self.form; var loaded = record - ? form.on_record_loaded(_.extend({}, record)) + ? form.trigger('load_record', _.extend({}, record)) : form.load_defaults(); - - return loaded.pipe(function () { + return $.when(loaded).pipe(function () { return form.do_show({reload: false}); }).pipe(function () { self.record = form.datarecord; diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 3b9e81fdf6e..9fd74853c3c 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -246,7 +246,7 @@ instance.web.DiagramView = instance.web.View.extend({ var form_fields = [self.parent_field]; var form_controller = pop.view_form; - form_controller.on("record_load", self, function(){ + form_controller.on("load_record", self, function(){ _.each(form_fields, function(fld) { if (!(fld in form_controller.fields)) { return; } var field = form_controller.fields[fld]; @@ -280,7 +280,7 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; var form_fields = [this.parent_field]; - form_controller.on("record_load", self, function(){ + form_controller.on("load_record", self, function(){ _.each(form_fields, function(fld) { if (!(fld in form_controller.fields)) { return; } var field = form_controller.fields[fld]; @@ -340,7 +340,7 @@ instance.web.DiagramView = instance.web.View.extend({ var form_controller = pop.view_form; - form_controller.on("record_load", self, function(){ + form_controller.on("load_record", self, function(){ form_controller.fields[self.connectors.attrs.source].set_value(node_source_id); form_controller.fields[self.connectors.attrs.source].dirty = true; form_controller.fields[self.connectors.attrs.destination].set_value(node_dest_id); diff --git a/addons/web_tests/static/src/js/web_tests.js b/addons/web_tests/static/src/js/web_tests.js index 8c146644372..bc7d16913fb 100644 --- a/addons/web_tests/static/src/js/web_tests.js +++ b/addons/web_tests/static/src/js/web_tests.js @@ -23,14 +23,14 @@ openerp.web_tests = function (instance) { on_everything_loaded: function (slice) { var records = slice[0].records; if (!records.length) { - this.form.trigger("record_load",{}); + this.form.trigger("load_record", {}); return; } - this.form.trigger("record_load", records[0]) + this.form.trigger("load_record", records[0]); _(records.slice(1)).each(function (record, index) { this.dataset.index = index+1; this.form.reposition($('
    ').appendTo(this.$el)); - this.form.trigger("record_load", record) + this.form.trigger("load_record", record); }, this); } }); From bbbc6a304dca2b58aef7e47e2bba9e155de160f9 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 12:12:00 +0200 Subject: [PATCH 47/68] [FIX] Fixed event name on_write_complete. bzr revid: vta@openerp.com-20121010101200-1lwcqae44bb88ffa --- addons/process/static/src/js/process.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/process/static/src/js/process.js b/addons/process/static/src/js/process.js index c593c1569fc..386a9653c02 100644 --- a/addons/process/static/src/js/process.js +++ b/addons/process/static/src/js/process.js @@ -239,7 +239,7 @@ instance.web.ViewManager.include({ title: _t('Process') }); var form_controller = pop.view_form; - pop.on('on_write_complete', self, self.initialize_process_view); + pop.on('write_completed', self, self.initialize_process_view); } }); }; From a8bf5bfbab84fdc278a9481a493b44adbaf0676c Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 12:12:46 +0200 Subject: [PATCH 48/68] [FIX] Fixed event name on_write_complete. bzr revid: vta@openerp.com-20121010101246-1ht2npz6l75ah06e --- addons/web/static/src/js/view_form.js | 6 +++--- addons/web_gantt/static/src/js/gantt.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index d635ab7e640..1478ae6e4ac 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2982,7 +2982,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc title: _t("Open: ") + self.string } ); - pop.on('on_write_complete', self, function(){ + pop.on('write_completed', self, function(){ self.display_value = {}; self.render_value(); self.focus(); @@ -4134,7 +4134,7 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in title: _t("Open: ") + this.m2m_field.string, readonly: this.getParent().get("effective_readonly") }); - pop.on('on_write_complete', self, self.reload_content); + pop.on('write_completed', self, self.reload_content); } }); @@ -4382,7 +4382,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({ this.dataset.write_function = function(id, data, options, sup) { var fct = self.options.write_function || sup; return fct.call(this, id, data, options).then(function() { - self.trigger('on_write_complete'); + self.trigger('write_completed'); }); }; this.dataset.parent_view = this.options.parent_view; diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 0d600712d4a..66d699c2cde 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -211,7 +211,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ on_task_display: function(task) { var self = this; var pop = new instance.web.form.FormOpenPopup(self); - pop.on('on_write_complete',self,self.reload); + pop.on('write_completed',self,self.reload); pop.show_element( self.dataset.model, task.id, From 4dd9a0529e79eccb7670a180c5d88fad144fa4c9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 10 Oct 2012 12:18:36 +0200 Subject: [PATCH 49/68] [ADD] reload file button next to the file input, as webkit browsers and MSIE don't trigger change when a file input is re-set to thee same file Using other events (e.g. 'click') is not kosher as the event is triggered long before the file is picked, the alternative is to use the File API and regularly check the file in the input to see if it's been altered (by storing a crc) and re-pushing it if the hash is different. Of course this has other issues (risks catching the file mid-edition...) A third alternative is, once a file has been uploaded, to clear and re-insert the corresponding file input. This means the file input will *always* be empty bzr revid: xmo@openerp.com-20121010101836-qtqmcc5n5zblgmcp --- addons/base_import/static/src/css/import.css | 19 +++++++++++++++++++ addons/base_import/static/src/js/import.js | 3 ++- addons/base_import/static/src/xml/import.xml | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css index 21e598ff707..3b4daf815e5 100644 --- a/addons/base_import/static/src/css/import.css +++ b/addons/base_import/static/src/css/import.css @@ -60,3 +60,22 @@ .oe_import_selector li { margin: 0; padding: 0; } + +.oe_import .oe_import_file_reload { + font-size: 1px; + letter-spacing: -1px; + color: transparent; + font-weight: normal; + position: relative; + padding: 0; + height: 19px; + width: 20px; +} +.oe_import .oe_import_file_reload:before { + font: 26px "mnmliconsRegular"; + content: "Q"; + color: #4C4C4C; + position: absolute; + top: -6px; + left: 2px; +} diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 5980eb2384c..0a60fe18ffb 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -73,7 +73,8 @@ openerp.base_import = function (instance) { ], events: { // 'change .oe_import_grid input': 'import_dryrun', - 'change input.oe_import_file': 'loaded_file', + 'change .oe_import_file': 'loaded_file', + 'click .oe_import_file_reload': 'loaded_file', 'change input.oe_import_has_header, .oe_import_options input': 'settings_changed', 'click a.oe_import_toggle': function (e) { e.preventDefault(); diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index adca0579f8f..902478468e1 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -24,6 +24,7 @@ +
    File Format Options… From f4f3d6fa153bc3bb446cf841fc3844614f5103dc Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 10 Oct 2012 12:42:20 +0200 Subject: [PATCH 50/68] [REF] code review by odo bzr revid: qdp-launchpad@openerp.com-20121010104220-nqi6c12ua7tnaejt --- openerp/osv/orm.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index a6d192240a2..4f717e69dad 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -1733,11 +1733,13 @@ class BaseModel(object): field = model_fields.get(node.get('name')) if field: transfer_field_to_modifiers(field, modifiers) + #evaluate the options as python code, but send it as json to the client if node.get('options'): try: node.set('options', simplejson.dumps(literal_eval(node.get('options')))) - except Exception, msg: - raise except_orm('Invalide Python code in %s'%(node.get('options')), msg[0]) + except Exception, e: + _logger.exception('Invalid `options´ attribute, should be a valid python expression: %r', node.get('options')) + raise except_orm('Invalid options', 'Invalid options: %r %s' % (node.get('options'), e)) elif node.tag in ('form', 'tree'): result = self.view_header_get(cr, user, False, node.tag, context) From 21dcc15a2ca38725d963fd16f57f5c9f4b1c5afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Wed, 10 Oct 2012 12:44:33 +0200 Subject: [PATCH 51/68] [FIX] previous 'forgot now' error message was a bit crappy bzr revid: fva@openerp.com-20121010104433-cb03lb11fi15qrzd --- addons/web/static/src/js/corelib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 21d593069e7..7a9af79b4fb 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -122,7 +122,7 @@ openerp.web.corelib = function(instance) { // The dummy class constructor function Class() { if(this.constructor !== instance.web.Class){ - throw new Error("You need a 'new' to instanciate an object"); + throw new Error("You can only instanciate objects with the 'new' operator"); return null; } // All construction is actually done in the init method From 42b2412782ea665217fb3652665c762ca45ef054 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 10 Oct 2012 13:15:38 +0200 Subject: [PATCH 52/68] [REV] revert the previous 'bugfix' which is not a bugfix; removing a bugged feature doesn't fix anything also remove whitespaces bzr revid: abo@openerp.com-20121010111538-03xm67fpc3tljfd4 --- addons/project/report/project_cumulative.xml | 26 +++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index dc556be22e7..75bfe3b8879 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -18,10 +18,12 @@ + project.task.history.cumulative.graph project.task.history.cumulative + @@ -36,16 +38,18 @@ - - - - - - - - - + + + + + + + + + + + @@ -56,12 +60,12 @@ form graph,tree - + {"search_default_open":1, "search_default_this_month": 1} + parent="base.menu_project_report"/> From 9fa829ebcad8a0bcd68617f9553ebe24b66747c5 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 10 Oct 2012 13:16:49 +0200 Subject: [PATCH 53/68] [FIX] replace the related field with a m2o field and adapt the requet in init() method bzr revid: abo@openerp.com-20121010111649-11p1h305w6j7dwqf --- addons/project/project.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index 6b02a018293..1bdbd34c575 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1099,7 +1099,7 @@ class task(base_stage, osv.osv): task_record = self.browse(cr, uid, task_id, context=context) if task_record.project_id: project_follower_ids = [follower.id for follower in task_record.project_id.message_follower_ids] - self.message_subscribe(cr, uid, [task_id], project_follower_ids, + self.message_subscribe(cr, uid, [task_id], project_follower_ids, context=context) self._store_history(cr, uid, [task_id], context=context) self.create_send_note(cr, uid, [task_id], context=context) @@ -1353,16 +1353,15 @@ class project_project(osv.osv): 'use_tasks': True } - -# -# Tasks History, used for cumulative flow charts (Lean/Agile) -# - class project_task_history(osv.osv): + """ + Tasks History, used for cumulative flow charts (Lean/Agile) + """ _name = 'project.task.history' _description = 'History of Tasks' _rec_name = 'task_id' _log_access = False + def _get_date(self, cr, uid, ids, name, arg, context=None): result = {} for history in self.browse(cr, uid, ids, context=context): @@ -1414,35 +1413,38 @@ class project_task_history(osv.osv): 'date': fields.date.context_today, } - class project_task_history_cumulative(osv.osv): _name = 'project.task.history.cumulative' _table = 'project_task_history_cumulative' _inherit = 'project.task.history' _auto = False + _columns = { 'end_date': fields.date('End Date'), - 'project_id': fields.related('task_id', 'project_id', string='Project', type='many2one', relation='project.project') + 'project_id': fields.many2one('project.project', 'Project'), } + def init(self, cr): cr.execute(""" CREATE OR REPLACE VIEW project_task_history_cumulative AS ( SELECT - history.date::varchar||'-'||history.history_id::varchar as id, - history.date as end_date, + history.date::varchar||'-'||history.history_id::varchar AS id, + history.date AS end_date, * FROM ( SELECT - id as history_id, - date+generate_series(0, CAST((coalesce(end_date,DATE 'tomorrow')::date - date)AS integer)-1) as date, - task_id, type_id, user_id, kanban_state, state, - greatest(remaining_hours,1) as remaining_hours, greatest(planned_hours,1) as planned_hours + h.id AS history_id, + h.date+generate_series(0, CAST((coalesce(h.end_date, DATE 'tomorrow')::date - h.date) AS integer)-1) AS date, + h.task_id, h.type_id, h.user_id, h.kanban_state, h.state, + greatest(h.remaining_hours, 1) AS remaining_hours, greatest(h.planned_hours, 1) AS planned_hours, + t.project_id FROM - project_task_history - ) as history + project_task_history AS h + JOIN project_task AS t ON (h.task_id = t.id) + + ) AS history ) """) - class project_category(osv.osv): """ Category of project's task (or issue) """ _name = "project.category" From 550d7905b55423cc8b7d3931cc1ff23a46b14cd5 Mon Sep 17 00:00:00 2001 From: Antonin Bourguignon Date: Wed, 10 Oct 2012 13:25:53 +0200 Subject: [PATCH 54/68] [FIX] domain in view bzr revid: abo@openerp.com-20121010112553-no3nhdvaj5kun1a8 --- addons/project/report/project_cumulative.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index 75bfe3b8879..c30c91fe6c0 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -49,7 +49,7 @@ - + From f8a29989c8d921732956f9ba7f81a69b048056de Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 10 Oct 2012 13:27:31 +0200 Subject: [PATCH 55/68] [IMP] base_import: simplify styling of looks button bzr revid: xmo@openerp.com-20121010112731-flw3bkijm229mr53 --- addons/base_import/static/src/css/import.css | 19 ------------------- addons/base_import/static/src/xml/import.xml | 4 +++- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css index 3b4daf815e5..21e598ff707 100644 --- a/addons/base_import/static/src/css/import.css +++ b/addons/base_import/static/src/css/import.css @@ -60,22 +60,3 @@ .oe_import_selector li { margin: 0; padding: 0; } - -.oe_import .oe_import_file_reload { - font-size: 1px; - letter-spacing: -1px; - color: transparent; - font-weight: normal; - position: relative; - padding: 0; - height: 19px; - width: 20px; -} -.oe_import .oe_import_file_reload:before { - font: 26px "mnmliconsRegular"; - content: "Q"; - color: #4C4C4C; - position: absolute; - top: -6px; - left: 2px; -} diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index 902478468e1..1c57c40c9db 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -24,7 +24,9 @@ - +
    File Format Options… From 4c7f416dd4b2689a38a6be14a4bcaeeb44583ca7 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 10 Oct 2012 13:30:25 +0200 Subject: [PATCH 56/68] [FIX] switch_view bzr revid: al@openerp.com-20121010113025-qpz12d28uob7hab9 --- addons/web/static/src/js/view_form.js | 2 +- addons/web/static/src/js/views.js | 35 +++++++++++---------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 1478ae6e4ac..9315ce15d1a 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3565,7 +3565,7 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({ }); this.__ignore_blur = false; }, - switch_view: function(mode, unused) { + do_switch_view: function(mode, unused) { if (mode !== 'form') { return this._super(mode, unused); } diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 0474e43bee3..f985e5f6dc8 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -417,7 +417,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ this._super(); var self = this; this.$el.find('.oe_view_manager_switch a').click(function() { - self.trigger('switch_mode', $(this).data('view-type')); + self.switch_mode($(this).data('view-type')); }).tipsy(); var views_ids = {}; _.each(this.views_src, function(view) { @@ -439,8 +439,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ } // If no default view defined, switch to the first one in sequence var default_view = this.flags.default_view || this.views_src[0].view_type; - this.on('switch_mode', self, self.switch_mode); - return this.trigger('switch_mode', default_view); + return this.switch_mode(default_view); }, switch_mode: function(view_type, no_store, view_options) { var self = this; @@ -448,9 +447,9 @@ instance.web.ViewManager = instance.web.Widget.extend({ var view_promise; var form = this.views['form']; if (!view || (form && form.controller && !form.controller.can_be_discarded())) { + self.trigger('switch_mode', view_type, no_store, view_options); return $.Deferred().reject(); } - if (!no_store) { this.views_history.push(view_type); } @@ -468,13 +467,12 @@ instance.web.ViewManager = instance.web.Widget.extend({ this.searchview[(view.controller.searchable === false || this.searchview.hidden) ? 'hide' : 'show'](); } - this.$el - .find('.oe_view_manager_switch a').parent().removeClass('active'); + this.$el.find('.oe_view_manager_switch a').parent().removeClass('active'); this.$el .find('.oe_view_manager_switch a').filter('[data-view-type="' + view_type + '"]') .parent().addClass('active'); - return $.when(view_promise).then(function () { + r = $.when(view_promise).then(function () { _.each(_.keys(self.views), function(view_name) { var controller = self.views[view_name].controller; if (controller) { @@ -495,7 +493,9 @@ instance.web.ViewManager = instance.web.Widget.extend({ } } }); + self.trigger('switch_mode', view_type, no_store, view_options); }); + return r; }, do_create_view: function(view_type) { // Lazy loading of views @@ -524,7 +524,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (view.embedded_view) { controller.set_embedded_view(view.embedded_view); } - controller.do_switch_view.add_last(_.bind(this.switch_view, this)); + controller.on('switch_mode', self, this.switch_mode); controller.do_prev_view.add_last(this.on_prev_view); var container = this.$el.find(".oe_view_manager_view_" + view_type); @@ -562,7 +562,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ var view_to_select = views[index]; self.$el.show(); if (self.active_view !== view_to_select) { - self.trigger('switch_mode', view_to_select); + self.switch_mode(view_to_select); } }, get_title: function() { @@ -592,14 +592,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ on_reverse_breadcrumb: on_reverse_breadcrumb, }); }, - /** - * Method used internally when a view asks to switch view. This method is meant - * to be extended by child classes to change the default behavior, which simply - * consist to switch to the asked view. - */ - switch_view: function(view_type, no_store, options) { - return this.trigger('switch_mode', view_type, no_store, options); - }, /** * Returns to the view preceding the caller view in this manager's * navigation history (the navigation history is appended to via @@ -617,12 +609,12 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (options.created && current_view === 'form' && previous_view === 'list') { // APR special case: "If creation mode from list (and only from a list), // after saving, go to page view (don't come back in list)" - return this.trigger('switch_mode', 'form'); + return this.switch_mode('form'); } else if (options.created && !previous_view && this.action && this.action.flags.default_view === 'form') { // APR special case: "If creation from dashboard, we have no previous view - return this.trigger('switch_mode', 'form'); + return this.switch_mode('form'); } - return this.trigger('switch_mode', previous_view, true); + return this.switch_mode(previous_view, true); }, /** * Sets up the current viewmanager's search view. @@ -926,7 +918,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ if (state.view_type && state.view_type !== this.active_view) { defs.push( this.views[this.active_view].deferred.pipe(function() { - return self.trigger('switch_mode', state.view_type, true) + return self.switch_mode(state.view_type, true); }) ); } @@ -1265,6 +1257,7 @@ instance.web.View = instance.web.Widget.extend({ * @param {String} view view type to switch to */ do_switch_view: function(view) { + this.trigger('switch_mode',view); }, /** * Cancels the switch to the current view, switches to the previous one From 46b5ac9a377c9470b20aae0e8bdbdf0d359871af Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 13:40:07 +0200 Subject: [PATCH 57/68] [FIX] Fixed on_button_cancel. bzr revid: vta@openerp.com-20121010114007-3cw3qlxu2zwt1k0s --- addons/web/static/src/js/view_form.js | 9 +++++---- addons/web_kanban/static/src/js/kanban.js | 4 ++-- addons/web_view_editor/static/src/js/view_editor.js | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b41039361c0..b2faa93889e 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -172,10 +172,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } else { this.$el.find('.oe_form_buttons').replaceWith(this.$buttons); } - this.$buttons.on('click','.oe_form_button_create',this.on_button_create); - this.$buttons.on('click','.oe_form_button_edit',this.on_button_edit); - this.$buttons.on('click','.oe_form_button_save',this.on_button_save); - this.$buttons.on('click','.oe_form_button_cancel',this.on_button_cancel); + this.$buttons.on('click', '.oe_form_button_create', this.on_button_create); + this.$buttons.on('click', '.oe_form_button_edit', this.on_button_edit); + this.$buttons.on('click', '.oe_form_button_save', this.on_button_save); + this.$buttons.on('click', '.oe_form_button_cancel', this.on_button_cancel); this.$sidebar = this.options.$sidebar || this.$el.find('.oe_form_sidebar'); if (!this.sidebar && this.options.$sidebar) { @@ -755,6 +755,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.on_record_loaded(this.datarecord); } } + this.trigger('on_button_cancel'); return false; }, on_button_new: function() { diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index dae3d7b214d..d95546dfe41 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -194,7 +194,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on("on_button_cancel",self,am.dialog.on_close); + form.on("on_button_cancel", self, am.dialog.on_close); form.on_created.add_last(function(r) { (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { am.dialog.on_close(); @@ -672,7 +672,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; - form.on("on_button_cancel",self,am.dialog.on_close); + form.on("on_button_cancel", self, am.dialog.on_close); form.on_saved.add_last(function() { am.dialog.on_close(); self.view.do_reload(); diff --git a/addons/web_view_editor/static/src/js/view_editor.js b/addons/web_view_editor/static/src/js/view_editor.js index b3a4f0dcfac..40d333afa0f 100644 --- a/addons/web_view_editor/static/src/js/view_editor.js +++ b/addons/web_view_editor/static/src/js/view_editor.js @@ -1014,7 +1014,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var action_manager = new instance.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { var controller = action_manager.dialog_widget.views['form'].controller; - controller.on("on_button_cancel",self,function(){ + controller.on("on_button_cancel", self, function(){ action_manager.destroy(); }); controller.do_save.add_last(function(){ From f486bf1c9f7f4908e667576c45f07146c459e599 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 10 Oct 2012 14:08:49 +0200 Subject: [PATCH 58/68] [FIX] o2m switch_view bzr revid: al@openerp.com-20121010120849-8qekbmy570zozicn --- addons/web/static/src/js/view_form.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 4bdc122b690..a095ab129c1 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3566,7 +3566,7 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({ }); this.__ignore_blur = false; }, - do_switch_view: function(mode, unused) { + switch_mode: function(mode, unused) { if (mode !== 'form') { return this._super(mode, unused); } @@ -4204,7 +4204,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend( self.initial_is_loaded.resolve(); loaded.resolve(); }); - this.kanban_view.do_switch_view.add_last(_.bind(this.open_popup, this)); + this.kanban_view.on('switch_mode', this, this.open_popup); $.async_when().then(function () { self.kanban_view.appendTo(self.$el); }); From 9acd1e6bf3400ff945e39f7eefc01a4efefd42ae Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 14:09:17 +0200 Subject: [PATCH 59/68] [FIX] Fixed on_created. bzr revid: vta@openerp.com-20121010120917-8aah2jrats09jaol --- addons/web/static/src/js/view_form.js | 10 +++++----- addons/web_calendar/static/src/js/calendar.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 366b2e7a9e9..dc5721208e5 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -131,7 +131,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM e.preventDefault(); } }); - self.on('on_rec_create', self, self.on_created); + self.on('record_created', self, self.update_dataset); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -779,7 +779,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var def = $.Deferred(); $.when(this.has_been_loaded).then(function() { self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) { - return self.trigger('on_rec_create',{ result : new_id }); + return self.trigger('record_created', { result : new_id }); }).then(function() { return self.to_edit_mode(); }).then(function() { @@ -860,7 +860,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (!self.datarecord.id) { // Creation save save_deferral = self.dataset.create(values).pipe(function(r) { - return self.trigger('on_rec_create', r, prepend_on_create); + return self.trigger('record_created', r, prepend_on_create); }, null); } else if (_.isEmpty(values) && ! self.force_dirty) { // Not dirty, noop save @@ -919,7 +919,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM * @param {Boolean} [prepend_on_create=false] adds the newly created record * at the beginning of the dataset instead of the end */ - on_created: function(r, prepend_on_create) { + update_dataset: function(r, prepend_on_create) { if (!r) { // should not happen in the server, but may happen for internal purpose return $.Deferred().reject(); @@ -1629,7 +1629,7 @@ instance.web.form.FormDialog = instance.web.Dialog.extend({ pager: false }); this.form.appendTo(this.$el); - this.form.on('on_rec_create', self, this.on_form_dialog_saved); + this.form.on('record_created', self, this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); return this; }, diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index 35cac441b35..5e04743b8a9 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -458,7 +458,7 @@ instance.web_calendar.CalendarFormDialog = instance.web.Dialog.extend({ pager: false }); var def = this.form.appendTo(this.$el); - this.form.on('on_rec_create', self, this.on_form_dialog_saved); + this.form.on('record_created', self, this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); this.form.on_button_cancel = function() { self.close(); diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 45f5c98bf51..332f4e8d037 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -195,8 +195,8 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; form.on_button_cancel.add_last(am.dialog.on_close); - form.on('on_rec_create', self, function(r) { - (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { + form.on('record_created', self, function(r) { + (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r]).then(function(new_record) { am.dialog.on_close(); var domain = self.dataset.domain.slice(0); domain.push([self.group_by, '=', new_record[0][0]]); From 94e4c0750eceb46351d642c67e9e7b8b04cc50c6 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 10 Oct 2012 14:19:19 +0200 Subject: [PATCH 60/68] [IMP] auth_oauth2: log provider error bzr revid: fme@openerp.com-20121010121919-cefodm7vzat5z321 --- addons/auth_oauth/controllers/main.py | 2 +- addons/auth_oauth/res_users.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py index ae01df5f6f7..7baac5d67c4 100644 --- a/addons/auth_oauth/controllers/main.py +++ b/addons/auth_oauth/controllers/main.py @@ -43,7 +43,7 @@ class OAuthController(openerpweb.Controller): url = "/#action=login&oauth_error=1" except Exception,e: # signup error - _logger.exception('oops') + _logger.exception("OAuth2: %s" % str(e)) url = "/#action=login&oauth_error=2" return openerp.addons.web.controllers.main.set_cookie_and_redirect(req, url) diff --git a/addons/auth_oauth/res_users.py b/addons/auth_oauth/res_users.py index fd26e89c2e3..124c46d687c 100644 --- a/addons/auth_oauth/res_users.py +++ b/addons/auth_oauth/res_users.py @@ -41,7 +41,7 @@ class res_users(osv.Model): validation = self.auth_oauth_rpc(cr, uid, p.validation_endpoint, access_token) if validation.get("error"): - raise openerp.exceptions.AccessDenied + raise Exception(validation['error']) if p.data_endpoint: data = self.auth_oauth_rpc(cr, uid, p.data_endpoint, access_token) validation.update(data) From 3195c02971280355bf47135cb97979a60e1d432a Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 14:33:51 +0200 Subject: [PATCH 61/68] [FIX] Fixed on_created. bzr revid: vta@openerp.com-20121010123351-gq8mr73z5avh79nd --- addons/web/static/src/js/view_form.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index dc5721208e5..009de5a6211 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -131,7 +131,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM e.preventDefault(); } }); - self.on('record_created', self, self.update_dataset); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -779,7 +778,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var def = $.Deferred(); $.when(this.has_been_loaded).then(function() { self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) { - return self.trigger('record_created', { result : new_id }); + return self.record_created({ result : new_id }); }).then(function() { return self.to_edit_mode(); }).then(function() { @@ -860,7 +859,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (!self.datarecord.id) { // Creation save save_deferral = self.dataset.create(values).pipe(function(r) { - return self.trigger('record_created', r, prepend_on_create); + return self.record_created(r, prepend_on_create); }, null); } else if (_.isEmpty(values) && ! self.force_dirty) { // Not dirty, noop save @@ -919,9 +918,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM * @param {Boolean} [prepend_on_create=false] adds the newly created record * at the beginning of the dataset instead of the end */ - update_dataset: function(r, prepend_on_create) { + record_created: function(r, prepend_on_create) { + var self = this; if (!r) { // should not happen in the server, but may happen for internal purpose + this.trigger('record_created', r); return $.Deferred().reject(); } else { this.datarecord.id = r; @@ -935,9 +936,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.do_update_pager(); if (this.sidebar) { this.sidebar.do_attachement_update(this.dataset, this.datarecord.id); - } + } //openerp.log("The record has been created with id #" + this.datarecord.id); return $.when(this.reload()).pipe(function () { + self.trigger('record_created', r); return _.extend(r, {created: true}); }); } From b70d0dab52d3cbbb49d88ae2e9cc5e72f222cbc2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 10 Oct 2012 14:38:27 +0200 Subject: [PATCH 62/68] [FIX] cases where options dict is decoded as unicode strings on windows: csv.reader kwargs *must* be strings bzr revid: xmo@openerp.com-20121010123827-x76udyurqzgnqebg --- addons/base_import/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 16bb52d5856..996dbf7964d 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -128,8 +128,8 @@ class ir_import(orm.TransientModel): """ csv_iterator = csv.reader( StringIO(record.file), - quotechar=options['quoting'], - delimiter=options['separator']) + quotechar=str(options['quoting']), + delimiter=str(options['separator'])) csv_nonempty = itertools.ifilter(None, csv_iterator) # TODO: guess encoding with chardet? Or https://github.com/aadsm/jschardet encoding = options.get('encoding', 'utf-8') From 6ef264339c0870b7aee543f2c3fefeab7decc03c Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 14:52:12 +0200 Subject: [PATCH 63/68] [FIX] Fixed conflicts in kanban.js. Thanks to VME. bzr revid: vta@openerp.com-20121010125212-oy5m304knbifad52 --- addons/web_kanban/static/src/js/kanban.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index b786441cfc3..9176666e218 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -672,13 +672,8 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ }); var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; -<<<<<<< TREE form.on("on_button_cancel", self, am.dialog.on_close); form.on_saved.add_last(function() { -======= - form.on_button_cancel.add_last(am.dialog.on_close); - form.on('on_saved', self, function() { ->>>>>>> MERGE-SOURCE am.dialog.on_close(); self.view.do_reload(); }); From 7796ecaccf787b1a2f6833ff8c68fa1cfeec2d55 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 10 Oct 2012 14:55:45 +0200 Subject: [PATCH 64/68] [FIX] auth_oauth calling refactored method bzr revid: fme@openerp.com-20121010125545-kolr1xcmgvtt1ouc --- addons/auth_oauth/res_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/auth_oauth/res_users.py b/addons/auth_oauth/res_users.py index 124c46d687c..bdbe4128efb 100644 --- a/addons/auth_oauth/res_users.py +++ b/addons/auth_oauth/res_users.py @@ -66,7 +66,7 @@ class res_users(osv.Model): 'oauth_access_token': access_token, 'active': True, } - self.auth_signup_create(cr, uid, new_user) + self._signup_create_user(cr, uid, new_user) credentials = (cr.dbname, email, access_token) return credentials From 94ac244a221866f246542dac82a344a9df82c3a6 Mon Sep 17 00:00:00 2001 From: "vta vta@openerp.com" <> Date: Wed, 10 Oct 2012 15:20:49 +0200 Subject: [PATCH 65/68] [FIX] Fixed on_saved. bzr revid: vta@openerp.com-20121010132049-uuqru2c0k81s3o90 --- addons/web/static/src/js/view_form.js | 10 ++++++---- addons/web_calendar/static/src/js/calendar.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index ce2e1ac5689..719c7146d45 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -131,7 +131,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM e.preventDefault(); } }); - self.on("on_rec_save", self, self.on_saved); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -869,7 +868,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.force_dirty = false; // Write save save_deferral = self.dataset.write(self.datarecord.id, values, {}).pipe(function(r) { - return self.trigger('on_rec_save', r); + return self.record_saved(r); }, null); } return save_deferral; @@ -896,12 +895,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM * * @param {Object} r result of the write function. */ - on_saved: function(r) { + record_saved: function(r) { + var self = this; if (!r) { // should not happen in the server, but may happen for internal purpose + this.trigger('record_saved', r); return $.Deferred().reject(); } else { return $.when(this.reload()).pipe(function () { + self.trigger('record_saved', r); return r; }); } @@ -1629,7 +1631,7 @@ instance.web.form.FormDialog = instance.web.Dialog.extend({ }); this.form.appendTo(this.$el); this.form.on_created.add_last(this.on_form_dialog_saved); - this.form.on('on_rec_save', this, this.on_form_dialog_saved); + this.form.on('record_saved', this, this.on_form_dialog_saved); return this; }, select_id: function(id) { diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index 37c49462b59..9042cf74003 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -459,7 +459,7 @@ instance.web_calendar.CalendarFormDialog = instance.web.Dialog.extend({ }); var def = this.form.appendTo(this.$el); this.form.on_created.add_last(this.on_form_dialog_saved); - this.form.on('on_rec_save', self, this.on_form_dialog_saved); + this.form.on('record_saved', self, this.on_form_dialog_saved); this.form.on_button_cancel = function() { self.close(); } diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 438b1f7cb14..ab742628bd0 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -673,7 +673,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; form.on_button_cancel.add_last(am.dialog.on_close); - form.on('on_rec_save', self, function() { + form.on('record_saved', self, function() { am.dialog.on_close(); self.view.do_reload(); }); From cb89d2d842e5e40b4cbbdf17d94f3f7c2041914a Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 10 Oct 2012 15:53:59 +0200 Subject: [PATCH 66/68] [FIX] account_voucher: wrong accounting entry for supplier payment in foreign currency lp bug: https://launchpad.net/bugs/1007487 fixed bzr revid: qdp-launchpad@openerp.com-20121010135359-0h0cxeyvk8lrtzni --- addons/account_voucher/account_voucher.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 423026251c2..f97f3f6af3c 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -1070,7 +1070,8 @@ class account_voucher(osv.osv): if line.amount == line.amount_unreconciled: if not line.move_line_id.amount_residual: raise osv.except_osv(_('Wrong bank statement line'),_("You have to delete the bank statement line which the payment was reconciled to manually. Please check the payment of the partner %s by the amount of %s.")%(line.voucher_id.partner_id.name, line.voucher_id.amount)) - currency_rate_difference = line.move_line_id.amount_residual - amount + sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1 + currency_rate_difference = sign * (line.move_line_id.amount_residual - amount) else: currency_rate_difference = 0.0 move_line = { From ec5b3b7e64b3479e2647c6283404e12aa1db3f94 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 10 Oct 2012 15:54:14 +0200 Subject: [PATCH 67/68] [FIX] project: fixed error introduced in revision 7741 bzr revid: qdp-launchpad@openerp.com-20121010135414-q7hp9mu752j3z3rk --- addons/project/project_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index b81db3c4b57..03c0ee2440b 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -103,7 +103,7 @@ - + From 4436d11ad733ee0e08bf8c9fe18ed413e6740241 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 10 Oct 2012 16:01:04 +0200 Subject: [PATCH 68/68] [FIX] auth_oauth: add unique constraint on (oauth_provide_id,oauth_uid) + do not try to create user if signup is not installed bzr revid: chs@openerp.com-20121010140104-4amqblnbu0es753x --- addons/auth_oauth/res_users.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/addons/auth_oauth/res_users.py b/addons/auth_oauth/res_users.py index bdbe4128efb..9c1f88bd7f4 100644 --- a/addons/auth_oauth/res_users.py +++ b/addons/auth_oauth/res_users.py @@ -15,13 +15,17 @@ class res_users(osv.Model): _inherit = 'res.users' _columns = { - 'oauth_provider_id': fields.many2one('auth.oauth.provider','OAuth Provider'), + 'oauth_provider_id': fields.many2one('auth.oauth.provider', 'OAuth Provider'), 'oauth_uid': fields.char('OAuth User ID', help="Oauth Provider user_id"), - 'oauth_access_token': fields.char('OAuth Token', readonly=True), + 'oauth_access_token': fields.char('OAuth Access Token', readonly=True), } + _sql_constraints = [ + ('uniq_users_oauth_provider_oauht_uid', 'unique(auth_provider_id, auth_uid)', 'OAuth UID must be unique per provider'), + ] + def auth_oauth_rpc(self, cr, uid, endpoint, access_token, context=None): - params = urllib.urlencode({ 'access_token': access_token }) + params = urllib.urlencode({'access_token': access_token}) if urlparse.urlparse(endpoint)[4]: url = endpoint + '&' + params else: @@ -48,15 +52,19 @@ class res_users(osv.Model): # required oauth_uid = validation['user_id'] if not oauth_uid: - raise openerp.exceptions.AccessDenied + raise openerp.exceptions.AccessDenied() email = validation.get('email', 'provider_%d_user_%d' % (p.id, oauth_uid)) # optional name = validation.get('name', email) - res = self.search(cr, uid, [("oauth_uid", "=", oauth_uid)]) + res = self.search(cr, uid, [("oauth_uid", "=", oauth_uid), ('oauth_provider_id', '=', provider)]) if res: - self.write(cr, uid, res[0], { 'oauth_access_token': access_token }) + assert len(res) == 1 + self.write(cr, uid, res[0], {'oauth_access_token': access_token}) else: - # New user + # New user if signup module available + if not hasattr(self, '_signup_create_user'): + raise openerp.exceptions.AccessDenied() + new_user = { 'name': name, 'login': email, @@ -66,7 +74,9 @@ class res_users(osv.Model): 'oauth_access_token': access_token, 'active': True, } + # TODO pass signup token to allow attach new user to right partner self._signup_create_user(cr, uid, new_user) + credentials = (cr.dbname, email, access_token) return credentials @@ -74,7 +84,7 @@ class res_users(osv.Model): try: return super(res_users, self).check_credentials(cr, uid, password) except openerp.exceptions.AccessDenied: - res = self.search(cr, SUPERUSER_ID, [('id','=',uid),('oauth_access_token','=',password)]) + res = self.search(cr, SUPERUSER_ID, [('id', '=', uid), ('oauth_access_token', '=', password)]) if not res: raise