From ca91b75f21c074ff7d977c0009f6598056eb13a4 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 20 Jun 2011 17:26:15 +0200 Subject: [PATCH 01/11] [IMP] netsvc+ir_cron: display the execution time in debug_rpc. bzr revid: vmt@openerp.com-20110620152615-kyl8s7z6we2or1yw --- openerp/addons/base/ir/ir_cron.py | 11 ++++++++++- openerp/netsvc.py | 9 ++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index 6bde5c4b468..d9abc0701b2 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -99,10 +99,19 @@ class ir_cron(osv.osv, netsvc.Agent): try: netsvc.log('cron', (cr.dbname,uid,'*',model,func)+tuple(args), channel=logging.DEBUG, depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='object.execute') - f(cr, uid, *args) + logger = logging.getLogger('execution time') + if logger.isEnabledFor(logging.DEBUG_RPC): + start_time = time.time() + f(cr, uid, *args) + end_time = time.time() + logger.log(logging.DEBUG_RPC, '%.3fs (%s, %s)' % (end_time - start_time, model, func)) + else: + f(cr, uid, *args) except Exception, e: self._handle_callback_exception(cr, uid, model, func, args, job_id, e) + def yeah(self, cr, uid): + print "YEAH" def _poolJobs(self, db_name, check=False): try: diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 42ccab414c7..5e12b5c450d 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -434,7 +434,14 @@ class OpenERPDispatcher: logger = logging.getLogger('result') self.log('service', tuple(replace_request_password(params)), depth=(None if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='%s.%s'%(service_name,method)) auth = getattr(self, 'auth_provider', None) - result = ExportService.getService(service_name).dispatch(method, auth, params) + if logger.isEnabledFor(logging.DEBUG_RPC): + start_time = time.time() + result = ExportService.getService(service_name).dispatch(method, auth, params) + end_time = time.time() + logger = logging.getLogger('execution time') + self.log('execution time', tuple(replace_request_password(params)), depth=1, fn='%.3fs '%(end_time - start_time)) + else: + result = ExportService.getService(service_name).dispatch(method, auth, params) self.log('result', result, channel=logging.DEBUG_RPC_ANSWER) return result except Exception, e: From 73a97f3c3b94ff50c71788cc1a754e26b08f0f23 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 20 Jun 2011 17:33:47 +0200 Subject: [PATCH 02/11] [YEAH] bzr revid: vmt@openerp.com-20110620153347-zwc42po38cysj5p8 --- openerp/addons/base/ir/ir_cron.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index d9abc0701b2..373847d4c52 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -110,9 +110,6 @@ class ir_cron(osv.osv, netsvc.Agent): except Exception, e: self._handle_callback_exception(cr, uid, model, func, args, job_id, e) - def yeah(self, cr, uid): - print "YEAH" - def _poolJobs(self, db_name, check=False): try: db, pool = pooler.get_db_and_pool(db_name) From 78986ba9d21b89a9dd76fb0c7c6a4af6fd286018 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 21 Jun 2011 10:30:11 +0200 Subject: [PATCH 03/11] [REF] netsvc+ir_cron: removed unnecessary getLogger, removed double call to f/dispatch. bzr revid: vmt@openerp.com-20110621083011-53toyp3lsa4rxs39 --- openerp/addons/base/ir/ir_cron.py | 5 ++--- openerp/netsvc.py | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index 373847d4c52..afaaebc8774 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -102,11 +102,10 @@ class ir_cron(osv.osv, netsvc.Agent): logger = logging.getLogger('execution time') if logger.isEnabledFor(logging.DEBUG_RPC): start_time = time.time() - f(cr, uid, *args) + f(cr, uid, *args) + if logger.isEnabledFor(logging.DEBUG_RPC): end_time = time.time() logger.log(logging.DEBUG_RPC, '%.3fs (%s, %s)' % (end_time - start_time, model, func)) - else: - f(cr, uid, *args) except Exception, e: self._handle_callback_exception(cr, uid, model, func, args, job_id, e) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 5e12b5c450d..fbc1ed8498f 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -436,12 +436,10 @@ class OpenERPDispatcher: auth = getattr(self, 'auth_provider', None) if logger.isEnabledFor(logging.DEBUG_RPC): start_time = time.time() - result = ExportService.getService(service_name).dispatch(method, auth, params) + result = ExportService.getService(service_name).dispatch(method, auth, params) + if logger.isEnabledFor(logging.DEBUG_RPC): end_time = time.time() - logger = logging.getLogger('execution time') self.log('execution time', tuple(replace_request_password(params)), depth=1, fn='%.3fs '%(end_time - start_time)) - else: - result = ExportService.getService(service_name).dispatch(method, auth, params) self.log('result', result, channel=logging.DEBUG_RPC_ANSWER) return result except Exception, e: From 23ecb4f95650c5bcf822a06e82fb7802f0540e42 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 27 Jun 2011 16:31:28 +0200 Subject: [PATCH 04/11] [IMP] netsvc: even uglier logging code. bzr revid: vmt@openerp.com-20110627143128-fkau44h1smozzl8i --- openerp/netsvc.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/openerp/netsvc.py b/openerp/netsvc.py index fbc1ed8498f..a4190336941 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -431,15 +431,19 @@ class OpenERPDispatcher: log(title, msg, channel=channel, depth=depth, fn=fn) def dispatch(self, service_name, method, params): try: - logger = logging.getLogger('result') - self.log('service', tuple(replace_request_password(params)), depth=(None if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='%s.%s'%(service_name,method)) auth = getattr(self, 'auth_provider', None) + logger = logging.getLogger('result') + start_time = end_time = 0 + if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER): + self.log('service', tuple(replace_request_password(params)), depth=None, fn='%s.%s'%(service_name,method)) if logger.isEnabledFor(logging.DEBUG_RPC): start_time = time.time() result = ExportService.getService(service_name).dispatch(method, auth, params) if logger.isEnabledFor(logging.DEBUG_RPC): end_time = time.time() - self.log('execution time', tuple(replace_request_password(params)), depth=1, fn='%.3fs '%(end_time - start_time)) + if not logger.isEnabledFor(logging.DEBUG_RPC_ANSWER): + self.log('service (%.3fs)' % (end_time - start_time), tuple(replace_request_password(params)), depth=1, fn='%s.%s'%(service_name,method)) + self.log('execution time', '%.3fs' % (end_time - start_time), channel=logging.DEBUG_RPC_ANSWER) self.log('result', result, channel=logging.DEBUG_RPC_ANSWER) return result except Exception, e: From b567ed3398a49a107ca3c46986652710618d2db7 Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Tue, 28 Jun 2011 11:07:26 +0200 Subject: [PATCH 05/11] [FIX] unlink event traceback bzr revid: tfr@openerp.com-20110628090726-6uo0wda3lbhq6nlg --- addons/base_calendar/base_calendar.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index d47de045cca..7aad9cc4e9a 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -1430,8 +1430,11 @@ rule or repeating pattern of time to exclude from the recurring rule."), res = False for id in ids: - event_datas = self.read(cr, uid, [id], ['date', 'rrule', 'exdate'], context=context)[0] - event_id = event_datas['id'] + data_list = self.read(cr, uid, [id], ['date', 'rrule', 'exdate'], context=context) + if len(data_list) < 1: + continue + event_data = data_list[0] + event_id = event_data['id'] if self.get_edit_all(cr, uid, event_id, vals=None): event_id = base_calendar_id2real_id(event_id) @@ -1443,11 +1446,11 @@ rule or repeating pattern of time to exclude from the recurring rule."), else: str_event, date_new = event_id.split('-') event_id = int(str_event) - if event_datas['rrule']: + if event_data['rrule']: # Remove one of the recurrent event date_new = time.strftime("%Y%m%dT%H%M%S", \ time.strptime(date_new, "%Y%m%d%H%M%S")) - exdate = (event_datas['exdate'] and (event_datas['exdate'] + ',') or '') + date_new + exdate = (event_data['exdate'] and (event_data['exdate'] + ',') or '') + date_new res = self.write(cr, uid, [event_id], {'exdate': exdate}) else: res = super(calendar_event, self).unlink(cr, uid, [event_id], context=context) From 54dffb44fd7f7096fd27506b320d7f2ffcde64af Mon Sep 17 00:00:00 2001 From: Jigar Amin Date: Tue, 28 Jun 2011 15:53:59 +0530 Subject: [PATCH 06/11] [BUG/FIX] base_calendar - Events Reminder Schedular lp bug: https://launchpad.net/bugs/802418 fixed bzr revid: jam@tinyerp.com-20110628102359-cjo7aoljlmh6jy9c --- addons/base_calendar/base_calendar.py | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index d47de045cca..cefeda7edbf 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -810,7 +810,6 @@ class calendar_alarm(osv.osv): @param use_new_cursor: False or the dbname @param context: A standard dictionary for contextual values """ - return True # XXX FIXME REMOVE THIS AFTER FIXING get_recurrent_dates!! if context is None: context = {} current_datetime = datetime.now() From 5ae5809dab887a064727433571ee2fe8996f3d27 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 28 Jun 2011 17:31:48 +0200 Subject: [PATCH 07/11] [REF] ir_cron: use DEBUG instead of DEBUG_RPC (as done previously). bzr revid: vmt@openerp.com-20110628153148-hkxh5n1ct4y8k6z3 --- openerp/addons/base/ir/ir_cron.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index afaaebc8774..054a15257ef 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -100,12 +100,12 @@ class ir_cron(osv.osv, netsvc.Agent): netsvc.log('cron', (cr.dbname,uid,'*',model,func)+tuple(args), channel=logging.DEBUG, depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='object.execute') logger = logging.getLogger('execution time') - if logger.isEnabledFor(logging.DEBUG_RPC): + if logger.isEnabledFor(logging.DEBUG): start_time = time.time() f(cr, uid, *args) - if logger.isEnabledFor(logging.DEBUG_RPC): + if logger.isEnabledFor(logging.DEBUG): end_time = time.time() - logger.log(logging.DEBUG_RPC, '%.3fs (%s, %s)' % (end_time - start_time, model, func)) + logger.log(logging.DEBUG, '%.3fs (%s, %s)' % (end_time - start_time, model, func)) except Exception, e: self._handle_callback_exception(cr, uid, model, func, args, job_id, e) From d933184dcc6328b766ea73ab6c4fff0a5d2c435d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 28 Jun 2011 17:59:56 +0200 Subject: [PATCH 08/11] [ADD] Added Dataset#call_button for form's buttons triggering action that should be cleaned bzr revid: fme@openerp.com-20110628155956-yj8m2r7kpjye5m8v --- addons/base/controllers/main.py | 39 +++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 7afaa176bc5..9869adad92a 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -250,12 +250,12 @@ def load_actions_from_ir_values(req, key, key2, models, meta, context): def clean_action(action, session): # values come from the server, we can just eval them - if isinstance(action['context'], basestring): + if isinstance(action.get('context', None), basestring): action['context'] = eval( action['context'], session.evaluation_context()) or {} - if isinstance(action['domain'], basestring): + if isinstance(action.get('domain', None), basestring): action['domain'] = eval( action['domain'], session.evaluation_context( @@ -286,13 +286,15 @@ def fix_view_modes(action): if action.pop('view_type') != 'form': return - action['view_mode'] = ','.join( - mode if mode != 'tree' else 'list' - for mode in action['view_mode'].split(',')) - action['views'] = [ - [id, mode if mode != 'tree' else 'list'] - for id, mode in action['views'] - ] + if action.has_key('view_mode'): + action['view_mode'] = ','.join( + mode if mode != 'tree' else 'list' + for mode in action['view_mode'].split(',')) + if action.has_key('views'): + action['views'] = [ + [id, mode if mode != 'tree' else 'list'] + for id, mode in action['views'] + ] return action class Menu(openerpweb.Controller): @@ -440,8 +442,7 @@ class DataSet(openerpweb.Controller): Model = request.session.model(model) return Model.unlink(ids, request.session.eval_context(request.context)) - @openerpweb.jsonrequest - def call(self, req, model, method, args, domain_id=None, context_id=None): + def call_common(self, req, model, method, args, domain_id=None, context_id=None): domain = args[domain_id] if domain_id and len(args) - 1 >= domain_id else [] context = args[context_id] if context_id and len(args) - 1 >= context_id else {} c, d = eval_context_and_domain(req.session, context, domain); @@ -449,10 +450,20 @@ class DataSet(openerpweb.Controller): args[domain_id] = d if(context_id and len(args) - 1 >= context_id): args[context_id] = c - + m = req.session.model(model) - r = getattr(m, method)(*args) - return {'result': r} + return getattr(m, method)(*args) + + @openerpweb.jsonrequest + def call(self, req, model, method, args, domain_id=None, context_id=None): + return {'result': self.call_common(req, model, method, args, domain_id, context_id)} + + @openerpweb.jsonrequest + def call_button(self, req, model, method, args, domain_id=None, context_id=None): + action = self.call_common(req, model, method, args, domain_id, context_id) + if isinstance(action, dict) and action.get('type') != '': + clean_action(action, req.session) + return {'result': action} @openerpweb.jsonrequest def exec_workflow(self, req, model, id, signal): From 23ec19c2fb7675cc9f2032a90ac68f9c256a43dd Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 28 Jun 2011 18:01:03 +0200 Subject: [PATCH 09/11] [ADD] Added DataSet#call_button javascript side bzr revid: fme@openerp.com-20110628160103-jpkd4r1batz5nlfp --- addons/base/static/src/js/data.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 2d2b36f696a..9208e7138ab 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -328,6 +328,15 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. args: args || [] }, callback, error_callback); }, + call_button: function (method, args, callback, error_callback) { + return this.rpc('/base/dataset/call_button', { + model: this.model, + method: method, + domain_id: null, + context_id: 1, + args: args || [] + }, callback, error_callback); + }, /** * Arguments: * name='', args=[], operator='ilike', context=None, limit=100 From 48a76551269c3a55fa80e3cd248f7e9f5c86b7a6 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 28 Jun 2011 18:35:07 +0200 Subject: [PATCH 10/11] [FIX] Use record_id instead of dataset in View#execute_action bzr revid: fme@openerp.com-20110628163507-diaevrugqyxkfcvn --- addons/base/static/src/js/views.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 6852e5595e4..cfd12ee9c7b 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -432,8 +432,8 @@ openerp.base.View = openerp.base.Controller.extend({ if (action && action.constructor == Object) { action.context = action.context || {}; _.extend(action.context, { - active_id: dataset.ids[dataset.index], - active_ids: [dataset.ids[dataset.index]], + active_id: record_id || false, + active_ids: [record_id || false], active_model: dataset.model }); action.flags = { @@ -462,7 +462,7 @@ openerp.base.View = openerp.base.Controller.extend({ var context = new openerp.base.CompoundContext(dataset.context).add(action_data.context || {}); switch(action_data.type) { case 'object': - return dataset.call_and_eval(action_data.name, [[record_id], context], null, 1, handler); + return dataset.call_button(action_data.name, [[record_id], context], handler); case 'action': return this.rpc('/base/action/load', { action_id: parseInt(action_data.name, 10), context: context }, handler); default: From f07f60b3da21fa6980ae7b29af2c2bdf180adc60 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 28 Jun 2011 18:42:38 +0200 Subject: [PATCH 11/11] [IMP] Use label@colspan in order to diferentiate fields label from paragraph bzr revid: fme@openerp.com-20110628164238-zctbvza7isf4166t --- addons/base/static/src/js/form.js | 10 ++++++++-- addons/base/static/src/xml/base.xml | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 8044c425661..b7a61cc885a 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -677,12 +677,18 @@ openerp.base.form.WidgetButton = openerp.base.form.Widget.extend({ openerp.base.form.WidgetLabel = openerp.base.form.Widget.extend({ init: function(view, node) { - this.is_field_label = true; this.element_name = 'label_' + node.attrs.name; this._super(view, node); - this.template = "WidgetLabel"; + // TODO fme: support for attrs.align + if (this.node.tag == 'label' && this.node.attrs.colspan) { + this.is_field_label = false; + this.template = "WidgetParagraph"; + } else { + this.is_field_label = true; + this.template = "WidgetLabel"; + } this.colspan = 1; }, render: function () { diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index de95a4294e8..9bef00147d3 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -468,6 +468,9 @@ : + +

+