From 43cf7fc5670a0f3faa6a38de768e4ea69580c8e9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 08:12:12 +0200 Subject: [PATCH 01/29] [IMP] no need to cd in the doc folder, just use -C bzr revid: xmo@openerp.com-20110907061212-renpsn79r7i7je75 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 48b00b73822..9e84e356aaf 100644 --- a/Makefile +++ b/Makefile @@ -24,7 +24,7 @@ clean: @rm -rf *.egg-info doc: - cd doc; make html + make -C doc html cloc: cloc addons/*/common/*.py addons/*/controllers/*.py addons/*/static/src/*.js addons/*/static/src/js/*.js addons/*/static/src/css/*.css addons/*/static/src/xml/*.xml From ce55ea52550022b8da738e249f2e39b31276991e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 08:14:16 +0200 Subject: [PATCH 02/29] [FIX] more documentation bzr revid: xmo@openerp.com-20110907061416-thr8qy3td8dr78y0 --- doc/source/development.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/source/development.rst b/doc/source/development.rst index 3a88b767c44..bb7d6b6407b 100644 --- a/doc/source/development.rst +++ b/doc/source/development.rst @@ -391,14 +391,14 @@ Python These classes should be moved to other sections of the doc as needed, probably. -.. automodule:: base.common.dispatch +.. automodule:: web.common.dispatch :members: :undoc-members: - See also: :class:`~base.common.backendrpc.OpenERPSession`, - :class:`~base.common.backendrpc.OpenERPModel` + See also: :class:`~web.common.backendrpc.OpenERPSession`, + :class:`~web.common.backendrpc.OpenERPModel` -.. automodule:: base.controllers.main +.. automodule:: web.controllers.main :members: :undoc-members: From 0a4ebd1ed9f2d0068bc29d65bb77c7e84624316b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 08:34:57 +0200 Subject: [PATCH 03/29] [FIX] there is no view type 'list' in the openerp server, testing would be magic bzr revid: xmo@openerp.com-20110907063457-crgv4xxes23k0k4t --- addons/web/static/src/js/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/list.js b/addons/web/static/src/js/list.js index fe38721c520..6e1d534155a 100644 --- a/addons/web/static/src/js/list.js +++ b/addons/web/static/src/js/list.js @@ -373,7 +373,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# return this.rpc('/web/listview/load', { model: this.model, view_id: this.view_id, - "view_type": "list", + view_type: "tree", context: this.dataset.get_context(context), toolbar: this.options.sidebar }, callback); From 6bb9c16249194a68c833ae5e9e438ba217dccc9b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 08:40:41 +0200 Subject: [PATCH 04/29] [FIX] fields_view_get breakage bzr revid: xmo@openerp.com-20110907064041-zd58839fg5x7ag4k --- addons/web/static/src/js/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 3b960663670..91e19dbe0b0 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -99,7 +99,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# this.sidebar.start(); this.sidebar.do_unfold(); this.sidebar.attachments = new openerp.web.form.SidebarAttachments(this.sidebar, this.sidebar.add_section('attachments', "Attachments"), this); - this.sidebar.add_toolbar(data.fields_view.toolbar); + this.sidebar.add_toolbar(this.fields_view.toolbar); this.set_common_sidebar_sections(this.sidebar); } this.has_been_loaded.resolve(); From 1ffd3f324d5e6960a04f92c5242374189836f31a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 08:44:24 +0200 Subject: [PATCH 05/29] [FIX] fields_view_get breakage: embedded views edition bzr revid: xmo@openerp.com-20110907064424-cm6gy11tf1370l3c --- addons/web/static/src/js/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/list.js b/addons/web/static/src/js/list.js index 6e1d534155a..30c7138936f 100644 --- a/addons/web/static/src/js/list.js +++ b/addons/web/static/src/js/list.js @@ -368,7 +368,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# self.on_loaded(field_view_get, grouped); }; if (this.embedded_view) { - return $.Deferred().then(callback).resolve({fields_view: this.embedded_view}); + return $.Deferred().then(callback).resolve(this.embedded_view); } else { return this.rpc('/web/listview/load', { model: this.model, From 0b17356d23de5ca0f3d650d303fc68370e08caee Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 09:23:58 +0200 Subject: [PATCH 06/29] [FIX] report action management: correctly download reports bzr revid: xmo@openerp.com-20110907072358-94qnrzx1ww951shv --- addons/web/controllers/main.py | 53 +++++++++++++++++++++---------- addons/web/static/src/js/views.js | 10 +++--- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 5a907fbc8f9..a5a7dddcc4f 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -23,8 +23,6 @@ openerpweb.nonliterals = web.common.nonliterals from babel.messages.pofile import read_po -_REPORT_POLLER_DELAY = 0.05 - # Should move to openerpweb.Xml2Json class Xml2Json: # xml2json-direct @@ -1325,22 +1323,45 @@ class ExcelExport(Export): class Reports(View): _cp_path = "/web/report" + POLLING_DELAY = 0.25 + TYPES_MAPPING = { + 'doc': 'application/vnd.ms-word', + 'html': 'text/html', + 'odt': 'application/vnd.oasis.opendocument.text', + 'pdf': 'application/pdf', + 'sxw': 'application/vnd.sun.xml.writer', + 'xls': 'application/vnd.ms-excel', + } + + @openerpweb.httprequest + def index(self, req, action, token): + action = simplejson.loads(action) - @openerpweb.jsonrequest - def get_report(self, req, action): report_srv = req.session.proxy("report") - context = req.session.eval_context(openerpweb.nonliterals.CompoundContext(req.context, \ - action["context"])) - - args = [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_id = report_srv.report(*args) - report = None + context = req.session.eval_context( + openerpweb.nonliterals.CompoundContext( + req.context or {}, action[ "context"])) + 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_struct = None while True: - args2 = [req.session._db, req.session._uid, req.session._password, report_id] - report = report_srv.report_get(*args2) - if report["state"]: + report_struct = report_srv.report_get( + req.session._db, req.session._uid, req.session._password, report_id) + if report_struct["state"]: break - time.sleep(_REPORT_POLLER_DELAY) + time.sleep(self.POLLING_DELAY) - #TODO: ok now we've got the report, and so what? - return False + report = base64.b64decode(report_struct['result']) + report_mimetype = self.TYPES_MAPPING.get( + report_struct['format'], 'octet-stream') + return req.make_response(report, + headers=[ + ('Content-Disposition', 'attachment; filename="%s.%s"' % (action['report_name'], action['report_type'])), + ('Content-Type', report_mimetype), + ('Content-Length', len(report))], + cookies={'fileToken': int(token)}) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 936106ac103..e351d49c6eb 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -125,11 +125,11 @@ openerp.web.ActionManager = openerp.web.Widget.extend({ (this.client_widget = new ClientWidget(this, action.params)).appendTo(this); }, ir_actions_report_xml: function(action) { - this.rpc('/web/report/get_report', { - action: action, - context: {} - }).then(function(result) { - debugger; + $.blockUI(); + this.session.get_file({ + url: '/web/report', + data: {action: JSON.stringify(action)}, + complete: $.unblockUI }); } }); From 2a3cb447827f8e50cd3d00acb1756c858c4db064 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 7 Sep 2011 09:28:18 +0200 Subject: [PATCH 07/29] [ADD] support for zipped reports (code=zlib/reportgz config key) in report downloader bzr revid: xmo@openerp.com-20110907072818-9ondrxh0q2j0yo7d --- addons/web/controllers/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index a5a7dddcc4f..19ab3b9f476 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -11,6 +11,7 @@ import simplejson import textwrap import xmlrpclib import time +import zlib import webrelease from xml.etree import ElementTree from cStringIO import StringIO @@ -1357,6 +1358,8 @@ class Reports(View): time.sleep(self.POLLING_DELAY) report = base64.b64decode(report_struct['result']) + if report_struct.get('code') == 'zlib': + report = zlib.decompress(report) report_mimetype = self.TYPES_MAPPING.get( report_struct['format'], 'octet-stream') return req.make_response(report, From 0fc1b42aef80807f84137c08e3b3c97249e3ac0d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 09:48:10 +0200 Subject: [PATCH 08/29] [IMP] Improved css. bzr revid: fme@openerp.com-20110907074810-17ssgepzpc11u7bd --- addons/web/static/src/css/base.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index c6241cd4429..3003f9402ac 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -838,7 +838,8 @@ label.error { .openerp label.oe_label_help { cursor: help; } -.openerp .oe_form_field label.oe_label, .openerp .oe_form_field label.oe_label_help { +.openerp label.oe_label, +.openerp label.oe_label_help { text-align: right; margin: 3px 0 0 10px; } From 3908e0eb885467a1196ac0ce7fec48c983ecda7f Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 10:16:33 +0200 Subject: [PATCH 09/29] [ADD] QWeb2: add default dict bzr revid: fme@openerp.com-20110907081633-vhuaf55e1dxxja2z --- addons/web/static/lib/qweb/qweb2.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js index cfb9c9c461d..473e80d1229 100644 --- a/addons/web/static/lib/qweb/qweb2.js +++ b/addons/web/static/lib/qweb/qweb2.js @@ -201,7 +201,7 @@ QWeb2.Engine = (function() { this.templates = {}; this.compiled_templates = {}; this.extend_templates = {}; - this.dict = {}; + this.default_dict = {}; this.tools = QWeb2.tools; this.jQuery = window.jQuery; this.reserved_words = QWeb2.RESERVED_WORDS.slice(0); @@ -323,10 +323,12 @@ QWeb2.Engine = (function() { " return r.join('');"; }, render : function(template, dict) { + var ndict = QWeb2.tools.extend({}, this.default_dict); + QWeb2.tools.extend(ndict, dict); if (this.debug && window['console'] !== undefined) { console.time("QWeb render template " + template); } - var r = this._render(template, dict); + var r = this._render(template, ndict); if (this.debug && window['console'] !== undefined) { console.timeEnd("QWeb render template " + template); } From e0eec18342f5afc2a074f33707535cadf40abf19 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 11:37:43 +0200 Subject: [PATCH 10/29] [IMP] Removed global QWeb. Now instanciate a QWeb2.Engine for each session: instance.web.qweb bzr revid: fme@openerp.com-20110907093743-k0224c5qjb74hxvb --- addons/web/controllers/main.py | 1 - addons/web/static/src/js/chrome.js | 1 + addons/web/static/src/js/core.js | 5 +++-- addons/web/static/src/js/data_export.js | 1 + addons/web/static/src/js/form.js | 1 + addons/web/static/src/js/list.js | 1 + addons/web/static/src/js/search.js | 1 + addons/web/static/src/js/view_tree.js | 1 + addons/web/static/src/js/views.js | 1 + addons/web_calendar/static/src/js/calendar.js | 1 + addons/web_dashboard/static/src/js/dashboard.js | 2 +- addons/web_default_home/static/src/js/home.js | 1 + addons/web_diagram/static/src/js/diagram.js | 1 + addons/web_gantt/static/src/js/gantt.js | 1 + addons/web_graph/static/src/js/graph.js | 1 + addons/web_kanban/static/src/js/kanban.js | 1 + 16 files changed, 17 insertions(+), 4 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 19ab3b9f476..d18d393c3c3 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -103,7 +103,6 @@ home_template = textwrap.dedent(""" %(javascript)s '%i for i in jslist]) # css tags csslist = ['/web/webclient/css'] if req.debug: - csslist = manifest_glob(req.config.addons_path, ['web'], 'css') + csslist = [i + '?debug=' + str(time.time()) for i in manifest_glob(req.config.addons_path, ['web'], 'css')] css = "\n ".join([''%i for i in csslist]) r = home_template % { 'javascript': js, From 3d9fb5d4cc7ed3e187ce577d382177818652c08b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 13:02:07 +0200 Subject: [PATCH 12/29] [FIX] Fix bug caused by View#load refactoring bzr revid: fme@openerp.com-20110907110207-lujx2cnhabsbfzgf --- addons/web/static/src/js/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 0b931d7df88..73695e93ea3 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -47,7 +47,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# if (this.embedded_view) { var def = $.Deferred().then(this.on_loaded); var self = this; - setTimeout(function() {def.resolve({fields_view: self.embedded_view});}, 0); + setTimeout(function() {def.resolve(self.embedded_view);}, 0); return def.promise(); } else { var context = new openerp.web.CompoundContext(this.dataset.get_context()); From 1f9289a098afbec64e492d6ec2bd054f74c1d905 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 14:37:03 +0200 Subject: [PATCH 13/29] [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 14/29] [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 15/29] [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 16/29] [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 17/29] [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 18/29] [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 19/29] [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 20/29] [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 21/29] [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 22/29] [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 23/29] [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 24/29] [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 25/29] [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 26/29] [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 27/29] [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 28/29] [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 29/29] [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