From 8498eb0d07968b481371d15de3d138d5a04894fb Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Wed, 7 Sep 2011 18:03:24 +0530 Subject: [PATCH 001/119] [FIX] do not show shortcuts availibilty in o2m. lp bug: https://launchpad.net/bugs/842545 fixed bzr revid: vda@tinyerp.com-20110907123324-l7cw056zjsrmr3m2 --- addons/web/static/src/js/form.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 73695e93ea3..567c08a009d 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -1717,6 +1717,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({ }); this.viewmanager.on_mode_switch.add_first(function() { self.save_form_view(); + self.$element.find('.oe-shortcut-toggle').hide(); }); setTimeout(function () { self.viewmanager.appendTo(self.$element); From 1f9289a098afbec64e492d6ec2bd054f74c1d905 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 14:37:03 +0200 Subject: [PATCH 002/119] [imp] improved server loggin bzr revid: nicolas.vanhoren@openerp.com-20110907123703-owcjsptzd4o3h3ww --- addons/web/common/dispatch.py | 25 ++++++++++++------------- addons/web_chat/controllers/main.py | 5 ++++- openerp-web.py | 11 +++++++++++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index 0f2b7fd2293..571b5179a46 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -26,6 +26,11 @@ import backendrpc as backend __all__ = ['Root', 'jsonrequest', 'httprequest', 'Controller', 'WebRequest', 'JsonRequest', 'HttpRequest'] +_logger = logging.getLogger(__name__) +if not _logger.handlers: + _logger.addHandler(logging.StreamHandler(sys.stdout)) + _logger.propagate = False + #----------------------------------------------------------- # Globals (wont move into a pool) #----------------------------------------------------------- @@ -159,8 +164,7 @@ class JsonRequest(WebRequest): else: self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) self.init(self.jsonrequest.get("params", {})) - if self.debug or 1: - print "--> %s.%s %s" % (controller.__class__.__name__, method.__name__, self.jsonrequest) + _logger.debug("--> %s.%s %s" % (controller.__class__.__name__, method.__name__, self.jsonrequest)) response['id'] = self.jsonrequest.get('id') response["result"] = method(controller, self, **self.params) except backend.OpenERPUnboundException: @@ -197,10 +201,7 @@ class JsonRequest(WebRequest): if error: response["error"] = error - if self.debug or 1: - print "<--", response - print - + _logger.debug("<-- %s" % response) content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder) return werkzeug.wrappers.Response( content, headers=[('Content-Type', 'application/json'), @@ -237,15 +238,13 @@ class HttpRequest(WebRequest): akw[key] = value else: akw[key] = type(value) - if self.debug or 1: - print "%s --> %s.%s %r" % (self.httprequest.method, controller.__class__.__name__, method.__name__, akw) + _logger.debug("%s --> %s.%s %r" % (self.httprequest.method, controller.__class__.__name__, method.__name__, akw)) r = method(controller, self, **self.params) if self.debug or 1: if isinstance(r, werkzeug.wrappers.BaseResponse): - print '<--', r + _logger.debug('<-- %s' % r) else: - print "<--", 'size:', len(r) - print + _logger.debug("<-- size: %s" % len(r)) return r def make_response(self, data, headers=None, cookies=None): @@ -391,7 +390,7 @@ class Root(object): manifest_path = os.path.join(addons_path, module, '__openerp__.py') if os.path.isfile(manifest_path): manifest = ast.literal_eval(open(manifest_path).read()) - print "Loading", module + _logger.info("Loading %s", module) m = __import__(module) addons_module[module] = m addons_manifest[module] = manifest @@ -424,6 +423,6 @@ class Root(object): meth = rest[0] m = getattr(c, meth) if getattr(m, 'exposed', False): - print "Dispatching to", ps, c, meth, m + _logger.debug("Dispatching to %s %s %s %s", ps, c, meth, m) return m return None diff --git a/addons/web_chat/controllers/main.py b/addons/web_chat/controllers/main.py index 1e0710163f8..e9a026759b1 100644 --- a/addons/web_chat/controllers/main.py +++ b/addons/web_chat/controllers/main.py @@ -3,6 +3,9 @@ import time import simplejson import web.common as openerpweb +import logging + +_logger = logging.getLogger(__name__) #---------------------------------------------------------- # OpenERP Web ajaxim Controllers @@ -195,7 +198,7 @@ class PollServer(openerpweb.Controller): """ mq = req.applicationsession.setdefault("web_chat", PollServerMessageQueue()) - print "======== chat status ========",kw + _logger.debug("======== chat status ======== %s", kw) # mq.write() return {"action": ""} diff --git a/openerp-web.py b/openerp-web.py index 29a958b7834..a9c948b4202 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -3,6 +3,7 @@ import optparse import os import sys import tempfile +import logging import werkzeug.serving @@ -31,6 +32,10 @@ optparser.add_option('--no-serve-static', dest='serve_static', optparser.add_option('--reloader', dest='reloader', default=False, action='store_true', help="Reload application when python files change") +optparser.add_option("--log-level", dest="log_level", + default='debug', help="Log level", metavar="LOG_LEVEL") +optparser.add_option("--log-config", dest="log_config", + default='', help="Log config file", metavar="LOG_CONFIG") import web.common.dispatch @@ -38,6 +43,12 @@ if __name__ == "__main__": (options, args) = optparser.parse_args(sys.argv[1:]) os.environ["TZ"] = "UTC" + + if not options.log_config: + logging.basicConfig(level=getattr(logging, options.log_level.upper())) + else: + logging.config.fileConfig(options.log_config) + app = web.common.dispatch.Root(options) werkzeug.serving.run_simple( From e2c6e14fbb2d1f2698d86b0f223e97bc176885e1 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 14:44:24 +0200 Subject: [PATCH 003/119] [fix] problem with file config for logging bzr revid: nicolas.vanhoren@openerp.com-20110907124424-o12vxv6ux7hpzeq7 --- openerp-web.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openerp-web.py b/openerp-web.py index a9c948b4202..9153740b2a8 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -4,6 +4,7 @@ import os import sys import tempfile import logging +import logging.config import werkzeug.serving From 3b1627b7a461fb808ac4225ea1f4a7519980fe3c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 15:05:02 +0200 Subject: [PATCH 004/119] [fix] problem with xmo and concept of cleaning actions bzr revid: nicolas.vanhoren@openerp.com-20110907130502-r8a3146hmq8oojvy --- addons/web/controllers/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 3a67a44f710..844eaf9dfea 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -451,8 +451,6 @@ def load_actions_from_ir_values(req, key, key2, models, meta): def clean_action(req, action): action.setdefault('flags', {}) - if action['type'] != 'ir.actions.act_window': - return action context = req.session.eval_context(req.context) eval_ctx = req.session.evaluation_context(context) @@ -464,7 +462,9 @@ def clean_action(req, action): if isinstance(action.get('domain'), basestring): action['domain'] = eval( action['domain'], eval_ctx ) or [] - return fix_view_modes(action) + if action['type'] == 'ir.actions.act_window': + return fix_view_modes(action) + return action # I think generate_views,fix_view_modes should go into js ActionManager def generate_views(action): From b4694f6a91efb1dbd93ed72bbb53cde52a85cc91 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 15:23:20 +0200 Subject: [PATCH 005/119] [fix] (x-files mode on) problem with some reports that are not reports (x-files mode off) bzr revid: nicolas.vanhoren@openerp.com-20110907132320-uf2e5a6crjg04r84 --- addons/web/controllers/main.py | 7 +++++-- addons/web/static/src/js/views.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 844eaf9dfea..225e55c0591 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1060,8 +1060,11 @@ class Action(openerpweb.Controller): context = req.session.eval_context(req.context) action_type = Actions.read([action_id], ['type'], context) if action_type: - action = req.session.model(action_type[0]['type']).read([action_id], False, - context) + ctx = {} + if action_type[0]['type'] == 'ir.actions.report.xml': + ctx.update({'bin_size': True}) + ctx.update(context) + action = req.session.model(action_type[0]['type']).read([action_id], False, ctx) if action: value = clean_action(req, action[0]) return {'result': value} diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 2c616359f01..37738d3ec51 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -454,7 +454,7 @@ openerp.web.Sidebar = openerp.web.Widget.extend({ }; self.rpc("/web/action/load", { action_id: item.action.id, - context: _.extend({"bin_size": true}, additional_context) + context: additional_context }, function(result) { result.result.context = _.extend(result.result.context || {}, additional_context); From 51d0c0037b07d2f09437ba11eb494be451345848 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 15:28:10 +0200 Subject: [PATCH 006/119] [imp] added warning when no item selected in reports bzr revid: nicolas.vanhoren@openerp.com-20110907132810-q0norgc0qrlvg3hs --- addons/web/static/src/js/views.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 37738d3ec51..d94c697a2ee 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -444,7 +444,10 @@ openerp.web.Sidebar = openerp.web.Widget.extend({ if (item.action) { var ids = self.widget_parent.get_selected_ids(); if (ids.length == 0) { - //TODO niv: maybe show a warning? + $("
").text(_t("You must choose at least one record.")).dialog({ + title: _t("Warning"), + modal: true + }); return false; } var additional_context = { From 41dd08123341392bb48897f861f6a3a09293dfc4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 16:19:35 +0200 Subject: [PATCH 007/119] [IMP] move dispatch logger config to launcher script to avoid clobbering file-based or server-integrated logging config bzr revid: xmo@openerp.com-20110907141935-0tudrot0yc49ma4y --- addons/web/common/dispatch.py | 3 --- openerp-web.py | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index 571b5179a46..e4d88713409 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -27,9 +27,6 @@ __all__ = ['Root', 'jsonrequest', 'httprequest', 'Controller', 'WebRequest', 'JsonRequest', 'HttpRequest'] _logger = logging.getLogger(__name__) -if not _logger.handlers: - _logger.addHandler(logging.StreamHandler(sys.stdout)) - _logger.propagate = False #----------------------------------------------------------- # Globals (wont move into a pool) diff --git a/openerp-web.py b/openerp-web.py index 9153740b2a8..e58941448cd 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -47,6 +47,9 @@ if __name__ == "__main__": if not options.log_config: logging.basicConfig(level=getattr(logging, options.log_level.upper())) + dispatch = logging.getLogger('web.common.dispatch') + dispatch.addHandler(logging.StreamHandler(sys.stdout)) + dispatch.propagate = False else: logging.config.fileConfig(options.log_config) From 66e2cee0d55563ba8916990418e9cc12c36ac012 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 16:21:20 +0200 Subject: [PATCH 008/119] [IMP] logging string formatting bzr revid: xmo@openerp.com-20110907142120-2bq0k6xxwkenpuqh --- addons/web/common/dispatch.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index e4d88713409..92808e7e475 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -161,7 +161,7 @@ class JsonRequest(WebRequest): else: self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) self.init(self.jsonrequest.get("params", {})) - _logger.debug("--> %s.%s %s" % (controller.__class__.__name__, method.__name__, self.jsonrequest)) + _logger.debug("--> %s.%s %s", controller.__class__.__name__, method.__name__, self.jsonrequest) response['id'] = self.jsonrequest.get('id') response["result"] = method(controller, self, **self.params) except backend.OpenERPUnboundException: @@ -198,7 +198,7 @@ class JsonRequest(WebRequest): if error: response["error"] = error - _logger.debug("<-- %s" % response) + _logger.debug("<-- %s", response) content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder) return werkzeug.wrappers.Response( content, headers=[('Content-Type', 'application/json'), @@ -235,13 +235,13 @@ class HttpRequest(WebRequest): akw[key] = value else: akw[key] = type(value) - _logger.debug("%s --> %s.%s %r" % (self.httprequest.method, controller.__class__.__name__, method.__name__, akw)) + _logger.debug("%s --> %s.%s %r", self.httprequest.method, controller.__class__.__name__, method.__name__, akw) r = method(controller, self, **self.params) if self.debug or 1: if isinstance(r, werkzeug.wrappers.BaseResponse): - _logger.debug('<-- %s' % r) + _logger.debug('<-- %s', r) else: - _logger.debug("<-- size: %s" % len(r)) + _logger.debug("<-- size: %s", len(r)) return r def make_response(self, data, headers=None, cookies=None): From a2485c3c4c08e601b1dfa902da367a4c084557e4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 16:22:27 +0200 Subject: [PATCH 009/119] [FIX] name of all logger to exist at the correct place in the loggers hierarchy bzr revid: xmo@openerp.com-20110907142227-601yrbrzhcv1vq38 --- addons/web/common/dispatch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index 92808e7e475..a88c5b6289c 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -185,7 +185,7 @@ class JsonRequest(WebRequest): } } except Exception: - logging.getLogger('openerp.JSONRequest.dispatch').exception\ + logging.getLogger(__name__ + '.JSONRequest.dispatch').exception\ ("An error occured while handling a json request") error = { 'code': 300, From c4735c677090ff107d0af4200a4d7009f8023904 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 16:31:10 +0200 Subject: [PATCH 010/119] [ADD] autogenerated json-rpc2 ID, in a multithreaded server many requests may reach the server simultanously leading to logs which are a pain to decipher bzr revid: xmo@openerp.com-20110907143110-ujmkir821alxjxoo --- addons/web/static/src/js/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index ae2c4d0d657..da2afae3680 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -375,7 +375,7 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web jsonrpc: "2.0", method: "call", params: params, - id:null + id: _.uniqueId('browser-client-') }).then(function () {deferred.resolve.apply(deferred, arguments);}, function(error) {deferred.reject(error, $.Event());}); return deferred.fail(function() { From bc4485ef9632d26d9d9a162c96e1d26647169205 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 16:53:11 +0200 Subject: [PATCH 011/119] [ADD] Added FormDialog bzr revid: fme@openerp.com-20110907145311-0ry7eb2jryn3n2km --- addons/web/static/src/js/form.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 73695e93ea3..6042ebf7c66 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -456,6 +456,34 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# return id ? [id] : []; } }); +openerp.web.FormDialog = openerp.web.Dialog.extend({ + init: function(parent, options, view_id, dataset) { + this._super(parent, options); + this.dataset = dataset; + this.view_id = view_id; + return this; + }, + start: function() { + this._super(); + this.form = new openerp.web.FormView(this, this.element_id, this.dataset, this.view_id, { + sidebar: false, + pager: false + }); + this.form.start(); + this.form.on_created.add_last(this.on_form_dialog_saved); + this.form.on_saved.add_last(this.on_form_dialog_saved); + return this; + }, + load_id: function(id) { + var self = this; + return this.dataset.read_ids([id], _.keys(this.form.fields_view.fields), function(records) { + self.form.on_record_loaded(records[0]); + }); + }, + on_form_dialog_saved: function() { + this.close(); + } +}); /** @namespace */ openerp.web.form = {}; From ffa4549555f6697e22fc72c2fa9efa8cdb340eb2 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 17:02:57 +0200 Subject: [PATCH 012/119] [IMP] cleanup toolbar actions bzr revid: xmo@openerp.com-20110907150257-ewan3jhboq0xe710 --- addons/web/controllers/main.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 225e55c0591..489445deb29 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -762,6 +762,8 @@ class View(openerpweb.Controller): fvg = Model.fields_view_get(view_id, view_type, context, toolbar, submenu) # todo fme?: check that we should pass the evaluated context here self.process_view(req.session, fvg, context, transform) + if toolbar and transform: + self.process_toolbar(req, fvg['toolbar']) return fvg def process_view(self, session, fvg, context, transform): @@ -793,6 +795,17 @@ class View(openerpweb.Controller): if field.get('context'): field["context"] = self.parse_context(field["context"], session) + def process_toolbar(self, req, toolbar): + """ + The toolbar is a mapping of section_key: [action_descriptor] + + We need to clean all those actions in order to ensure correct + round-tripping + """ + for section in toolbar.keys(): + toolbar[section] = [clean_action(req, action) + for action in toolbar[section]] + @openerpweb.jsonrequest def add_custom(self, req, view_id, arch): CustomView = req.session.model('ir.ui.view.custom') From 86b77c4cf389b5f9fa7f09bc4a130f51437a07bf Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 7 Sep 2011 17:41:05 +0200 Subject: [PATCH 013/119] [IMP] logging use default python logging output bzr revid: al@openerp.com-20110907154105-0p2qf3iz1s22pvch --- openerp-web.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openerp-web.py b/openerp-web.py index e58941448cd..5617a0b8bdd 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -44,15 +44,12 @@ if __name__ == "__main__": (options, args) = optparser.parse_args(sys.argv[1:]) os.environ["TZ"] = "UTC" - + if not options.log_config: logging.basicConfig(level=getattr(logging, options.log_level.upper())) - dispatch = logging.getLogger('web.common.dispatch') - dispatch.addHandler(logging.StreamHandler(sys.stdout)) - dispatch.propagate = False else: logging.config.fileConfig(options.log_config) - + app = web.common.dispatch.Root(options) werkzeug.serving.run_simple( From 43a788378df5ad3ba4e9a481b9249771d2b1068c Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 7 Sep 2011 18:14:08 +0200 Subject: [PATCH 014/119] [IMP] logging debug use pprint bzr revid: al@openerp.com-20110907161408-0b4y5irl3c95mtn4 --- addons/web/common/dispatch.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index a88c5b6289c..2375623532c 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -4,6 +4,7 @@ from __future__ import with_statement import functools import logging import os +import pprint import sys import traceback import uuid @@ -161,7 +162,8 @@ class JsonRequest(WebRequest): else: self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) self.init(self.jsonrequest.get("params", {})) - _logger.debug("--> %s.%s %s", controller.__class__.__name__, method.__name__, self.jsonrequest) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest)) response['id'] = self.jsonrequest.get('id') response["result"] = method(controller, self, **self.params) except backend.OpenERPUnboundException: @@ -198,7 +200,8 @@ class JsonRequest(WebRequest): if error: response["error"] = error - _logger.debug("<-- %s", response) + if _logger.isEnabledFor(logging.DEBUG): + _logger.debug("<--\n%s", pprint.pformat(response)) content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder) return werkzeug.wrappers.Response( content, headers=[('Content-Type', 'application/json'), @@ -420,6 +423,6 @@ class Root(object): meth = rest[0] m = getattr(c, meth) if getattr(m, 'exposed', False): - _logger.debug("Dispatching to %s %s %s %s", ps, c, meth, m) + _logger.debug("Dispatching to %s %s %s", ps, c, meth) return m return None From 9b18066adcb6fa9a5a9847a2292d1fef4f1aa5a4 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 18:33:15 +0200 Subject: [PATCH 015/119] [FIX] Fixed FieldSelection problems with false values lp bug: https://launchpad.net/bugs/838924 fixed bzr revid: fme@openerp.com-20110907163315-b014e9pulr3nsqt4 --- addons/web/static/src/js/form.js | 25 +++++++++++++++---------- addons/web/static/src/xml/base.xml | 6 ++---- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 6042ebf7c66..d4bf9d76573 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -1251,11 +1251,16 @@ openerp.web.form.FieldTextXml = openerp.web.form.Field.extend({ openerp.web.form.FieldSelection = openerp.web.form.Field.extend({ init: function(view, node) { + var self = this; this._super(view, node); this.template = "FieldSelection"; - this.field_index = _.map(this.field.selection, function(x, index) { - return {"ikey": "" + index, "ekey": x[0], "label": x[1]}; + this.values = this.field.selection; + _.each(this.values, function(v, i) { + if (v[0] === false && v[1] === '') { + self.values.splice(i, 1); + } }); + this.values.unshift([false, '']); }, start: function() { // Flag indicating whether we're in an event chain containing a change @@ -1285,13 +1290,14 @@ openerp.web.form.FieldSelection = openerp.web.form.Field.extend({ value = value === null ? false : value; value = value instanceof Array ? value[0] : value; this._super(value); - var option = _.detect(this.field_index, function(x) {return x.ekey === value;}); - this.$element.find('select').val(option === undefined ? '' : option.ikey); + var index = 0; + for (var i = 0, ii = this.values.length; i < ii; i++) { + if (this.values[i][0] === value) index = i; + } + this.$element.find('select')[0].selectedIndex = index; }, set_value_from_ui: function() { - var ikey = this.$element.find('select').val(); - var option = _.detect(this.field_index, function(x) {return x.ikey === ikey;}); - this.value = option === undefined ? false : option.ekey; + this.value = this.values[this.$element.find('select')[0].selectedIndex][0]; this._super(); }, update_dom: function() { @@ -1299,9 +1305,8 @@ openerp.web.form.FieldSelection = openerp.web.form.Field.extend({ this.$element.find('select').attr('disabled', this.readonly); }, validate: function() { - var ikey = this.$element.find('select').val(); - var option = _.detect(this.field_index, function(x) {return x.ikey === ikey;}); - this.invalid = this.required && (option === undefined || option.ekey === false); + var value = this.values[this.$element.find('select')[0].selectedIndex]; + this.invalid = !(value && !(this.required && value[0] === false)); }, focus: function() { this.$element.find('select').focus(); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 677488d9d7d..ae03c8789b6 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -799,10 +799,8 @@ t-att-id="widget.element_id + '_field'" t-att-class="'field_' + widget.type" style="width: 100%"> - - + + From 08a456b3691395d1e4bdf7689fd26f69b65b1231 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 7 Sep 2011 19:41:09 +0200 Subject: [PATCH 016/119] [FIX] debug by default until we fix css merging bzr revid: al@openerp.com-20110907174109-xgh3c4efdftpyujt --- addons/web/common/dispatch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index 2375623532c..0829f360806 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -316,7 +316,7 @@ class Root(object): by the server, will be filtered by this pattern """ def __init__(self, options): - self.root = werkzeug.urls.Href('/web/webclient/home') + self.root = werkzeug.urls.Href('/web/webclient/home?debug') self.config = options self.session_cookie = 'sessionid' From 01e70a7a8e71c78ace8e2889c761bedba5c8a915 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 21:20:52 +0200 Subject: [PATCH 017/119] [FIX] Editable list gets wrong fields view get object due to previous refactoring lp bug: https://launchpad.net/bugs/843841 fixed bzr revid: fme@openerp.com-20110907192052-0bx7viwvee2r4i2d --- addons/web/static/src/js/list-editable.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 58 +++++++++++------------ 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/addons/web/static/src/js/list-editable.js b/addons/web/static/src/js/list-editable.js index 614c6fa42ef..ab78e5e0139 100644 --- a/addons/web/static/src/js/list-editable.js +++ b/addons/web/static/src/js/list-editable.js @@ -183,7 +183,7 @@ openerp.web.list_editable = function (openerp) { template: 'ListView.row.form', registry: openerp.web.list.form.widgets }); - $.when(self.edition_form.on_loaded({fields_view: self.get_form_fields_view()})).then(function () { + $.when(self.edition_form.on_loaded(self.get_form_fields_view())).then(function () { // put in $.when just in case FormView.on_loaded becomes asynchronous $new_row.find('td') .addClass('oe-field-cell') diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index dd101f44346..d6aff04e471 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -18,6 +18,9 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ this.all_display_data = false; this.groups = []; this.qweb = new QWeb2.Engine(); + if (this.options.action_views_ids.form) { + this.form_dialog = new openerp.web.FormDialog(this, {}, this.options.action_views_ids.form, dataset).start(); + } }, start: function() { return this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "kanban"}, this.on_loaded); @@ -157,25 +160,20 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ } }, on_confirm_click: function (dataset, button_attrs, index, record_id) { - if (button_attrs.type == 'edit') { - this.do_edit_record(dataset, index); + this.on_execute_button_click(dataset, button_attrs, record_id); + }, + do_add_record: function() { + this.dataset.index = null; + this.do_switch_view('form'); + }, + do_edit_record: function(record_id) { + if (this.form_dialog) { + this.form_dialog.load_id(record_id); + this.form_dialog.open(); } else { - this.on_execute_button_click(dataset, button_attrs, record_id); + this.notification.warn("Kanban", "No form view defined for this object"); } }, - do_add_record: function () { - this.do_edit_record(this.dataset, null); - }, - do_edit_record: function (dataset, index) { - var self = this; - _.extend(this.dataset, { - domain: dataset.domain, - context: dataset.get_context() - }).read_slice([], {}, function () { - self.dataset.index = index; - self.do_switch_view('form'); - }); - }, do_delete: function (id) { var self = this; return $.when(this.dataset.unlink([id])).then(function () { @@ -311,24 +309,24 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ self.all_display_data.splice(index, 1); } }); - this.$element.find('.oe_kanban_action').click(function() { - var record_id = $(this).closest(".oe_kanban_record").attr("id"); - if (record_id) { - record_id = parseInt(record_id.split("_")[1]) - if (record_id) { - if ($(this).data("type") == "delete") { - self.do_delete(record_id); - } else { - var button_attrs = $(this).data() - self.on_button_click(button_attrs, record_id); - } - } - } - }); + this.$element.find('.oe_kanban_action').click(this.on_action_clicked); this.$element.find('.oe_kanban_record').click(function() { $(this).find('.oe_kanban_box_show_onclick').removeClass('oe_kanban_box_show_onclick'); }); }, + on_action_clicked: function(evt) { + var $action = $(evt.currentTarget), + record_id = parseInt($action.closest(".oe_kanban_record").attr("id").split('_')[1]), + type = $action.data('type'); + if (type == 'delete') { + this.do_delete(record_id); + } else if (type == 'edit') { + this.do_edit_record(record_id); + } else { + var button_attrs = $(this).data(); + this.on_button_click(button_attrs, record_id); + } + }, do_transform_record: function(record) { var self = this, new_record = {}; From e8e6a91431c46eca2b08226164a37127f0e5f79c Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 7 Sep 2011 22:55:18 +0200 Subject: [PATCH 018/119] [IMP] document: (usability) improved wording of virtual folder wizard screen bzr revid: odo@openerp.com-20110907205518-we9s9ws5dphrcs7b --- addons/document/wizard/document_configuration.py | 8 ++++---- addons/document/wizard/document_configuration_view.xml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/document/wizard/document_configuration.py b/addons/document/wizard/document_configuration.py index 40dc2b3afd8..3485e7412c7 100644 --- a/addons/document/wizard/document_configuration.py +++ b/addons/document/wizard/document_configuration.py @@ -28,9 +28,9 @@ class document_configuration(osv.osv_memory): _inherit = 'res.config' _columns = { - 'sale_order' : fields.boolean('Sale Order', help="Auto directory configuration for Sale Orders and Quotation with report."), - 'product' : fields.boolean('Product', help="Auto directory configuration for Products."), - 'project': fields.boolean('Project', help="Auto directory configuration for Projects."), + 'sale_order' : fields.boolean('Sale Orders', help="Create virtual folders for Sale Orders and Quotations. One virtual folder will appear for each, in which the latest printed PDF document can be downloaded at any time, and where you can manage (view, add, delete) other attachments."), + 'product' : fields.boolean('Products', help="Create virtual folders for Products. One virtual folder will appear for each product, where you can manage (view, add, delete) the files attached to the product"), + 'project': fields.boolean('Projects', help="Create virtual folders for Projects. One virtual folder will appear for each project, where you can manage (view, add, delete) the files attached to the project"), } @@ -81,7 +81,7 @@ class document_configuration(osv.osv_memory): }) content_pool.create(cr, uid, { - 'name': "Print Qutation", + 'name': "Print Quotation", 'suffix': "_print", 'report_id': order_report_id, 'extension': '.pdf', diff --git a/addons/document/wizard/document_configuration_view.xml b/addons/document/wizard/document_configuration_view.xml index f6c3131b3a0..eaba3b7115e 100644 --- a/addons/document/wizard/document_configuration_view.xml +++ b/addons/document/wizard/document_configuration_view.xml @@ -11,10 +11,10 @@ Knowledge Application Configuration - Configure Resource Directory + Virtual Document Folders - Choose the following Resouces to auto directory configuration. + OpenERP's Document Management System supports mapping virtual folders with documents. The virtual folder of a document can be used to manage the files attached to the document, or to print and download any document report. A few common virtual folders can be created for you automatically from this screen. 12 @@ -33,7 +33,7 @@ - Auto Configure Directory + Document Management System: Configure Virtual Folders ir.actions.act_window document.configuration From a0a1ea0cfaeb107be1e2f041c33148d8c6133331 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 8 Sep 2011 09:03:09 +0200 Subject: [PATCH 019/119] [FIX] cleanup of toolbar actions during fields_view_get bzr revid: xmo@openerp.com-20110908070309-bbwmqxmwmmj06srj --- addons/web/controllers/main.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 489445deb29..e302f721fc7 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -802,9 +802,14 @@ class View(openerpweb.Controller): We need to clean all those actions in order to ensure correct round-tripping """ - for section in toolbar.keys(): - toolbar[section] = [clean_action(req, action) - for action in toolbar[section]] + for actions in toolbar.itervalues(): + for action in actions: + if 'context' in action: + action['context'] = self.parse_context( + action['context'], req.session) + if 'domain' in action: + action['domain'] = self.parse_domain( + action['domain'], req.session) @openerpweb.jsonrequest def add_custom(self, req, view_id, arch): From e13a97446a56aeb8745ff1563edbc0b7f73f9c70 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 8 Sep 2011 09:14:15 +0200 Subject: [PATCH 020/119] [FIX] reports: report_type may be missing from the action descriptor, don't rely on it being there bzr revid: xmo@openerp.com-20110908071415-9gdyvkpwq7i7fxob --- addons/web/controllers/main.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index e302f721fc7..647c6155018 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1362,13 +1362,15 @@ class Reports(View): context = req.session.eval_context( openerpweb.nonliterals.CompoundContext( req.context or {}, action[ "context"])) + + report_data = {"id": context["active_id"], "model": context["active_model"]} + if 'report_type' in action: + report_data['report_type'] = action['report_type'] report_id = report_srv.report( req.session._db, req.session._uid, req.session._password, action["report_name"], context["active_ids"], - {"id": context["active_id"], - "model": context["active_model"], - "report_type": action["report_type"]}, - context) + report_data, context) + report_struct = None while True: report_struct = report_srv.report_get( @@ -1384,7 +1386,7 @@ class Reports(View): report_struct['format'], 'octet-stream') return req.make_response(report, headers=[ - ('Content-Disposition', 'attachment; filename="%s.%s"' % (action['report_name'], action['report_type'])), + ('Content-Disposition', 'attachment; filename="%s.%s"' % (action['report_name'], report_struct['format'])), ('Content-Type', report_mimetype), ('Content-Length', len(report))], cookies={'fileToken': int(token)}) From 5b223f59610d598ff21de86f6e36ddaf956b47fc Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 8 Sep 2011 10:29:59 +0200 Subject: [PATCH 021/119] [REM] Remove useless colspan="1" on labels in order to be compatible with web client's heuristic for label vs paragraph detection bzr revid: fme@openerp.com-20110908082959-vb2pcrsuuz43vxqi --- addons/sale/sale_view.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml index 86835320d40..cb96ef279c5 100644 --- a/addons/sale/sale_view.xml +++ b/addons/sale/sale_view.xml @@ -493,13 +493,13 @@ - @@ -507,15 +507,15 @@ - - - From bba27daf04ff27b1f3c71e0dee7c73375efc11a4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 8 Sep 2011 12:14:06 +0200 Subject: [PATCH 022/119] [FIX] don't display non-searchable (non-stored without a fnct_search) function fields lp bug: https://launchpad.net/bugs/823049 fixed bzr revid: xmo@openerp.com-20110908101406-f6r8bgt155nq65in --- addons/web/static/src/xml/base.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index ae03c8789b6..5ac1929fce3 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1111,7 +1111,8 @@