From 8ac7724a67d878db2f8cc7ab94f1b247818052f9 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 18 Aug 2011 14:05:50 +0200 Subject: [PATCH 01/17] [IMP] fields.function: don't wrap int values unless really needed There was no need to wrap/cast int values for values less than 2^31-1, which the highest XML-RPC int value. Also, instead of wrapping them in strings, we can use float values, which are 64bits based in the XMLRPC standard, and closer to the real value (for comparisons, etc.). Added note for integer_big, as a reminder of this possible issue. bzr revid: qdp-launchpad@openerp.com-20110818120550-ulvffm6ka9f3c5ym --- openerp/osv/fields.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 056198a76d7..782cc8e796a 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -145,6 +145,14 @@ class integer(_column): _symbol_get = lambda self,x: x or 0 class integer_big(_column): + """Experimental 64 bit integer column type, currently unused. + + TODO: this field should work fine for values up + to 32 bits, but greater values will not fit + in the XML-RPC int type, so a specific + get() method is needed to pass them as floats, + like what we do for integer functional fields. + """ _type = 'integer_big' # do not reference the _symbol_* of integer class, as that would possibly # unbind the lambda functions @@ -1026,8 +1034,13 @@ class function(_column): else: result = sanitize_binary_value(value) - if field_type == "integer": - result = tools.ustr(value) + if field_type in ("integer","integer_big") and value > xmlrpclib.MAXINT: + # integer/long values greater than 2^31-1 are not supported + # in pure XMLRPC, so we have to pass them as floats :-( + # This is not needed for stored fields and non-functional integer + # fields, as their values are constrained by the database backend + # to the same 32bits signed int limit. + result = float(value) return result def get(self, cr, obj, ids, name, uid=False, context=None, values=None): From 3d3b99108c68dc0621273dca700e88365b6d8012 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 18 Aug 2011 19:43:22 +0200 Subject: [PATCH 02/17] [IMP] Added on_value_changed callback to all form's fields bzr revid: fme@openerp.com-20110818174322-quezskn0jrryz9o2 --- addons/base/static/src/js/form.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 6eeff025e1f..6a7e64049a8 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1,5 +1,5 @@ openerp.base.form = function (openerp) { - + var _t = openerp.base._t; openerp.base.views.add('form', 'openerp.base.FormView'); @@ -811,6 +811,7 @@ openerp.base.form.WidgetLabel = openerp.base.form.Widget.extend({ this.$element.find("label").dblclick(function() { var widget = self['for'] || self; self.log(widget.element_id , widget); + window.w = widget; }); } }); @@ -841,9 +842,12 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ this.value = value; this.invalid = false; this.update_dom(); + this.on_value_changed(); }, set_value_from_ui: function() { - this.value = undefined; + this.on_value_changed(); + }, + on_value_changed: function() { }, get_value: function() { return this.value; @@ -942,6 +946,7 @@ openerp.base.form.FieldChar = openerp.base.form.Field.extend({ }, set_value_from_ui: function() { this.value = this.$element.find('input').val(); + this._super(); }, validate: function() { this.invalid = false; @@ -1016,6 +1021,7 @@ openerp.base.form.FieldFloat = openerp.base.form.FieldChar.extend({ }, set_value_from_ui: function() { this.value = Number(this.$element.find('input').val().replace(/,/g, '.')); + this._super(); } }); @@ -1036,6 +1042,7 @@ openerp.base.form.FieldInteger = openerp.base.form.FieldFloat.extend({ }, set_value_from_ui: function() { this.value = Number(this.$element.find('input').val()); + this._super(); } }); @@ -1073,6 +1080,7 @@ openerp.base.form.FieldDatetime = openerp.base.form.Field.extend({ if (this.value) { this.value = this.format(this.value); } + this._super(); }, update_dom: function() { this._super.apply(this, arguments); @@ -1124,6 +1132,7 @@ openerp.base.form.FieldFloatTime = openerp.base.form.FieldChar.extend({ set_value_from_ui: function() { var time = this.$element.find('input').val().split(':'); this.set_value(parseInt(time[0], 10) + parseInt(time[1], 10) / 60); + this._super(); } }); @@ -1148,6 +1157,7 @@ openerp.base.form.FieldText = openerp.base.form.Field.extend({ }, set_value_from_ui: function() { this.value = this.$element.find('textarea').val(); + this._super(); }, validate: function() { this.invalid = false; @@ -1183,6 +1193,7 @@ openerp.base.form.FieldBoolean = openerp.base.form.Field.extend({ }, set_value_from_ui: function() { this.value = this.$element.find('input').is(':checked'); + this._super(); }, update_dom: function() { this._super.apply(this, arguments); @@ -1265,6 +1276,7 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({ 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._super(); }, update_dom: function() { this._super.apply(this, arguments); @@ -1529,7 +1541,6 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ this.on_ui_change(); } }, - set_value_from_ui: function() {}, set_value: function(value) { value = value || null; var self = this; @@ -1697,7 +1708,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ }); } }, - set_value_from_ui: function() {}, set_value: function(value) { value = value || []; var self = this; @@ -1918,7 +1928,6 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ get_value: function() { return [commands.replace_with(this.dataset.ids)]; }, - set_value_from_ui: function() {}, validate: function() { this.invalid = false; // TODO niv @@ -2192,13 +2201,6 @@ openerp.base.form.FormOpenPopup = openerp.base.OldWidget.extend({ } }); -openerp.base.form.FieldReference = openerp.base.form.FieldChar.extend({ - init: function(view, node) { - this._super(view, node); - //this.template = "FieldReference"; - } -}); - openerp.base.form.FieldBinary = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); @@ -2211,8 +2213,6 @@ openerp.base.form.FieldBinary = openerp.base.form.Field.extend({ this.$element.find('button.oe-binary-file-save').click(this.on_save_as); this.$element.find('.oe-binary-file-clear').click(this.on_clear); }, - set_value_from_ui: function() { - }, update_dom: function() { this._super.apply(this, arguments); this.$element.find('.oe-binary').toggle(!this.readonly); From 79001193eaf623a6e15167cc8bed8414e2783201 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 18 Aug 2011 19:45:08 +0200 Subject: [PATCH 03/17] [ADD] FormView: added field reference bzr revid: fme@openerp.com-20110818174508-zkpi5l5eocl3lj6z --- addons/base/static/src/js/form.js | 64 +++++++++++++++++++++++++++++ addons/base/static/src/xml/base.xml | 11 ++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 6a7e64049a8..d3056e618bf 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -2201,6 +2201,70 @@ openerp.base.form.FormOpenPopup = openerp.base.OldWidget.extend({ } }); +openerp.base.form.FieldReference = openerp.base.form.Field.extend({ + init: function(view, node) { + this._super(view, node); + this.template = "FieldReference"; + this.fields_view = { + fields: { + selection: { + selection: view.fields_view.fields[this.name].selection + }, + m2o: { + relation: null + } + } + } + this.get_fields_values = view.get_fields_values; + this.do_onchange = this.on_form_changed = this.on_nop; + this.widgets = {}; + this.fields = {}; + this.selection = new openerp.base.form.FieldSelection(this, { attrs: { + name: 'selection', + widget: 'selection' + }}); + this.selection.on_value_changed.add_last(this.on_selection_changed); + this.m2o = new openerp.base.form.FieldMany2One(this, { attrs: { + name: 'm2o', + widget: 'many2one' + }}); + }, + on_nop: function() { + }, + on_selection_changed: function() { + this.m2o.field.relation = this.selection.get_value(); + this.m2o.set_value(null); + }, + start: function() { + this._super(); + this.selection.start(); + this.m2o.start(); + }, + is_valid: function() { + return this.required === false || typeof(this.get_value()) === 'string'; + }, + is_dirty: function() { + return this.selection.is_dirty() || this.m2o.is_dirty(); + }, + set_value: function(value) { + this._super(value); + if (typeof(value) === 'string') { + var vals = value.split(','); + this.selection.set_value(vals[0]); + this.m2o.set_value(parseInt(vals[1], 10)); + } + }, + get_value: function() { + var model = this.selection.get_value(), + id = this.m2o.get_value(); + if (typeof(model) === 'string' && typeof(id) === 'number') { + return model + ',' + id; + } else { + return false; + } + } +}); + openerp.base.form.FieldBinary = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 4f0be9bd552..34a729a028c 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -784,7 +784,16 @@
- + + + + + +
+ + + +
Date: Thu, 18 Aug 2011 20:36:56 +0200 Subject: [PATCH 04/17] [IMP] factorize http request handling bzr revid: al@openerp.com-20110818183656-qp9zy271jl6wccq9 --- addons/base/controllers/main.py | 27 ++++----- openerpweb/openerpweb.py | 98 +++++++++++++-------------------- 2 files changed, 51 insertions(+), 74 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 65e061211f8..8663a22d885 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -87,9 +87,9 @@ def concat_files(file_list): ftime = os.path.getmtime(fname) if ftime > files_timestamp: files_timestamp = ftime - files_content = open(fname).read() + files_content.append(open(fname).read()) files_concat = "".join(files_content) - return files_concat + return (files_concat,files_timestamp) home_template = textwrap.dedent(""" @@ -127,17 +127,17 @@ class WebClient(openerpweb.Controller): def css(self, req, mods='base'): cherrypy.response.headers['Content-Type'] = 'text/css' files = manifest_glob(mods.split(','), 'css') - concat = concat_files(files)[0] + content,timestamp = concat_files(files) # TODO request set the Date of last modif and Etag - return concat + return content @openerpweb.httprequest def js(self, req, mods='base'): cherrypy.response.headers['Content-Type'] = 'application/javascript' files = manifest_glob(mods.split(','), 'js') - concat = concat_files(files)[0] + content,timestamp = concat_files(files) # TODO request set the Date of last modif and Etag - return concat + return content @openerpweb.httprequest def home(self, req, s_action=None): @@ -157,7 +157,7 @@ class WebClient(openerpweb.Controller): 'css': css } return r - + @openerpweb.jsonrequest def translations(self, req, mods, lang): lang_model = req.session.model('res.lang') @@ -193,7 +193,6 @@ class WebClient(openerpweb.Controller): transl["messages"].append({'id': x.id, 'string': x.string}) return {"modules": transs, "lang_parameters": lang_obj} - class Database(openerpweb.Controller): _cp_path = "/base/database" @@ -439,18 +438,16 @@ def clean_action(action, session, context=None): return action # values come from the server, we can just eval them if isinstance(action.get('context'), basestring): - action['context'] = eval( - action['context'], - session.evaluation_context(context=context)) or {} + localvars = session.evaluation_context(context=context) + action['context'] = eval( action['context'], localvars ) or {} if isinstance(action.get('domain'), basestring): - action['domain'] = eval( - action['domain'], - session.evaluation_context( - action.get('context', {}))) or [] + localvars = session.evaluation_context( action.get('context', {})) + action['domain'] = eval( action['domain'], localvars ) or [] return fix_view_modes(action) +# I think generate_views,fix_view_modes should go into js ActionManager def generate_views(action): """ While the server generates a sequence called "views" computing dependencies diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 0f6b7f8031e..4bf490eba90 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -233,7 +233,25 @@ class OpenERPSession(object): #---------------------------------------------------------- # OpenERP Web RequestHandler #---------------------------------------------------------- -class JsonRequest(object): +class CherryPyRequest(object): + """ CherryPy request handling + """ + def init(self,params): + self.params = params + # Move cherrypy thread local objects to attributes + self.applicationsession = applicationsession + self.httprequest = cherrypy.request + self.httpresponse = cherrypy.response + self.httpsession = cherrypy.session + self.httpsession_id = "cookieid" + # OpenERP session setup + self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex + host = cherrypy.config['openerp.server.host'] + port = cherrypy.config['openerp.server.port'] + self.session = self.httpsession.setdefault(self.session_id, OpenERPSession(host, port)) + self.context = self.params.pop('context', None) + +class JsonRequest(CherryPyRequest): """ JSON-RPC2 over HTTP. Sucessful request:: @@ -267,48 +285,27 @@ class JsonRequest(object): """ - def parse(self, request): - self.request = request - self.params = request.get("params", {}) - self.applicationsession = applicationsession - self.httprequest = cherrypy.request - self.httpresponse = cherrypy.response - self.httpsession = cherrypy.session - self.httpsession_id = "cookieid" - self.httpsession = cherrypy.session - self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex - host = cherrypy.config['openerp.server.host'] - port = cherrypy.config['openerp.server.port'] - self.session = self.httpsession.setdefault(self.session_id, OpenERPSession(host, port)) - self.context = self.params.pop('context', None) - return self.params - def dispatch(self, controller, method, requestf=None, request=None): """ Calls the method asked for by the JSON-RPC2 request :param controller: the instance of the controller which received the request - :type controller: type :param method: the method which received the request - :type method: callable :param requestf: a file-like object containing an encoded JSON-RPC2 request - :type requestf: bytes> - :param request: an encoded JSON-RPC2 request - :type request: bytes + :param request: a JSON-RPC2 request - :returns: a string-encoded JSON-RPC2 reply - :rtype: bytes + :returns: an utf8 encoded JSON-RPC2 reply """ - # Read POST content or POST Form Data named "request" - if requestf: - request = simplejson.load(requestf, object_hook=nonliterals.non_literal_decoder) - else: - request = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) - - response = {"jsonrpc": "2.0", "id": request.get('id')} + response = {"jsonrpc": "2.0" } + error = None try: - print "--> %s.%s %s" % (controller.__class__.__name__, method.__name__, request) - error = None - self.parse(request) + # Read POST content or POST Form Data named "request" + if requestf: + self.jsonrequest = simplejson.load(requestf, object_hook=nonliterals.non_literal_decoder) + else: + self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) + print "--> %s.%s %s" % (controller.__class__.__name__, method.__name__, self.jsonrequest) + self.init(self.jsonrequest.get("params", {})) + response['id'] = self.jsonrequest.get('id') response["result"] = method(controller, self, **self.params) except OpenERPUnboundException: error = { @@ -357,41 +354,24 @@ def jsonrequest(f): @functools.wraps(f) def json_handler(controller): return JsonRequest().dispatch(controller, f, requestf=cherrypy.request.body) - return json_handler -class HttpRequest(object): +class HttpRequest(CherryPyRequest): """ Regular GET/POST request """ - def dispatch(self, controller, f, request, **kw): - self.request = request - self.applicationsession = applicationsession - self.httpsession_id = "cookieid" - self.httpsession = cherrypy.session - self.context = kw.get('context', {}) - host = cherrypy.config['openerp.server.host'] - port = cherrypy.config['openerp.server.port'] - self.session_id = kw.pop('session_id', None) - self.session = self.httpsession.setdefault(self.session_id, OpenERPSession(host, port)) - self.result = "" - if request.method == 'GET': - print "GET --> %s.%s %s %r" % (controller.__class__.__name__, f.__name__, request, kw) - else: - akw = dict([(key, kw[key] if isinstance(kw[key], basestring) else type(kw[key])) for key in kw.keys()]) - print "POST --> %s.%s %s %r" % (controller.__class__.__name__, f.__name__, request, akw) - r = f(controller, self, **kw) - if isinstance(r, str): - print "<--", len(r), 'bytes' - else: - print "<--", len(r), 'characters' + def dispatch(self, controller, method, **kw): + self.init(kw) + print "%s --> %s %s.%s %r" % (self.httprequest.method, controller.__class__.__name__, method.__name__, self.httprequest, kw) + r = method(controller, self, **kw) + print "<--", 'size:', len(r) print return r def httprequest(f): # check cleaner wrapping: # functools.wraps(f)(lambda x: JsonRequest().dispatch(x, f)) - def http_handler(self,*l, **kw): - return HttpRequest().dispatch(self, f, cherrypy.request, **kw) + def http_handler(controller,*l, **kw): + return HttpRequest().dispatch(controller, f, **kw) http_handler.exposed = 1 return http_handler From fa81a097f255bc484558d2fed562ad574957f028 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 20:51:45 +0200 Subject: [PATCH 05/17] [IMP] remove some cherry in base main.py bzr revid: al@openerp.com-20110818185145-4egjwrxm7it298fe --- addons/base/controllers/main.py | 52 ++++++++++++++++----------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 8663a22d885..4dc9b82926f 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -125,7 +125,7 @@ class WebClient(openerpweb.Controller): @openerpweb.httprequest def css(self, req, mods='base'): - cherrypy.response.headers['Content-Type'] = 'text/css' + req.httpresponse.headers['Content-Type'] = 'text/css' files = manifest_glob(mods.split(','), 'css') content,timestamp = concat_files(files) # TODO request set the Date of last modif and Etag @@ -133,7 +133,7 @@ class WebClient(openerpweb.Controller): @openerpweb.httprequest def js(self, req, mods='base'): - cherrypy.response.headers['Content-Type'] = 'application/javascript' + req.httpresponse.headers['Content-Type'] = 'application/javascript' files = manifest_glob(mods.split(','), 'js') content,timestamp = concat_files(files) # TODO request set the Date of last modif and Etag @@ -248,16 +248,16 @@ class Database(openerpweb.Controller): try: db_dump = base64.decodestring( req.session.proxy("db").dump(backup_pwd, backup_db)) - cherrypy.response.headers['Content-Type'] = "application/octet-stream; charset=binary" - cherrypy.response.headers['Content-Disposition'] = 'attachment; filename="' + backup_db + '.dump"' - cherrypy.response.cookie['fileToken'] = token - cherrypy.response.cookie['fileToken']['path'] = '/' + req.httpresponse.headers['Content-Type'] = "application/octet-stream; charset=binary" + req.httpresponse.headers['Content-Disposition'] = 'attachment; filename="' + backup_db + '.dump"' + req.httpresponse.cookie['fileToken'] = token + req.httpresponse.cookie['fileToken']['path'] = '/' return db_dump except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return 'Backup Database|' + e.faultCode return 'Backup Database|Could not generate database backup' - + @openerpweb.httprequest def restore(self, req, db_file, restore_pwd, new_db): try: @@ -266,9 +266,7 @@ class Database(openerpweb.Controller): return '' except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': - raise cherrypy.HTTPError(403) - - raise cherrypy.HTTPError() + raise Exception("AccessDenied") @openerpweb.jsonrequest def change_password(self, req, fields): @@ -385,10 +383,10 @@ class Session(openerpweb.Controller): :return: A key identifying the saved action. :rtype: integer """ - saved_actions = cherrypy.session.get('saved_actions') + saved_actions = req.httpsession.get('saved_actions') if not saved_actions: saved_actions = {"next":0, "actions":{}} - cherrypy.session['saved_actions'] = saved_actions + req.httpsession['saved_actions'] = saved_actions # we don't allow more than 10 stored actions if len(saved_actions["actions"]) >= 10: del saved_actions["actions"][min(saved_actions["actions"].keys())] @@ -408,7 +406,7 @@ class Session(openerpweb.Controller): :return: The saved action or None. :rtype: anything """ - saved_actions = cherrypy.session.get('saved_actions') + saved_actions = req.httpsession.get('saved_actions') if not saved_actions: return None return saved_actions["actions"].get(key) @@ -944,10 +942,10 @@ class Binary(openerpweb.Controller): _cp_path = "/base/binary" @openerpweb.httprequest - def image(self, request, model, id, field, **kw): - cherrypy.response.headers['Content-Type'] = 'image/png' - Model = request.session.model(model) - context = request.session.eval_context(request.context) + def image(self, req, model, id, field, **kw): + req.httpresponse.headers['Content-Type'] = 'image/png' + Model = req.session.model(model) + context = req.session.eval_context(req.context) try: if not id: res = Model.default_get([field], context).get(field, '') @@ -960,26 +958,26 @@ class Binary(openerpweb.Controller): return open(os.path.join(openerpweb.path_addons, 'base', 'static', 'src', 'img', 'placeholder.png'), 'rb').read() @openerpweb.httprequest - def saveas(self, request, model, id, field, fieldname, **kw): - Model = request.session.model(model) - context = request.session.eval_context(request.context) + def saveas(self, req, model, id, field, fieldname, **kw): + Model = req.session.model(model) + context = req.session.eval_context(req.context) res = Model.read([int(id)], [field, fieldname], context)[0] filecontent = res.get(field, '') if not filecontent: raise cherrypy.NotFound else: - cherrypy.response.headers['Content-Type'] = 'application/octet-stream' + req.httpresponse.headers['Content-Type'] = 'application/octet-stream' filename = '%s_%s' % (model.replace('.', '_'), id) if fieldname: filename = res.get(fieldname, '') or filename - cherrypy.response.headers['Content-Disposition'] = 'attachment; filename=' + filename + req.httpresponse.headers['Content-Disposition'] = 'attachment; filename=' + filename return base64.decodestring(filecontent) @openerpweb.httprequest - def upload(self, request, callback, ufile=None): + def upload(self, req, callback, ufile=None): cherrypy.response.timeout = 500 headers = {} - for key, val in cherrypy.request.headers.iteritems(): + for key, val in req.httprequest.headers.iteritems(): headers[key.lower()] = val size = int(headers.get('content-length', 0)) # TODO: might be useful to have a configuration flag for max-length file uploads @@ -1003,10 +1001,10 @@ class Binary(openerpweb.Controller): return out % (simplejson.dumps(callback), simplejson.dumps(args)) @openerpweb.httprequest - def upload_attachment(self, request, callback, model, id, ufile=None): + def upload_attachment(self, req, callback, model, id, ufile=None): cherrypy.response.timeout = 500 - context = request.session.eval_context(request.context) - Model = request.session.model('ir.attachment') + context = req.session.eval_context(req.context) + Model = req.session.model('ir.attachment') try: out = """ - - %(css)s - @@ -143,13 +142,13 @@ class WebClient(openerpweb.Controller): def home(self, req, s_action=None): # script tags jslist = ['/base/webclient/js'] - if 1: # debug == 1 + if req.debug: jslist = manifest_glob(['base'], 'js') js = "\n ".join([''%i for i in jslist]) # css tags csslist = ['/base/webclient/css'] - if 1: # debug == 1 + if req.debug: csslist = manifest_glob(['base'], 'css') css = "\n ".join([''%i for i in csslist]) r = home_template % { diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index e8d411b1ae1..30ca7a5231c 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -381,7 +381,7 @@ label.error { /* Header */ .openerp .header { height: 65px; - background: url("../img/header-background.png") repeat-x scroll left top transparent; + background: url("/base/static/src/img/header-background.png") repeat-x scroll left top transparent; color: #FFFFFF; letter-spacing: 0.5px; text-shadow: 0 1px 0 #333333; diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 4bf490eba90..2ca1f7ea358 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -249,7 +249,9 @@ class CherryPyRequest(object): host = cherrypy.config['openerp.server.host'] port = cherrypy.config['openerp.server.port'] self.session = self.httpsession.setdefault(self.session_id, OpenERPSession(host, port)) + # Request attributes self.context = self.params.pop('context', None) + self.debug = self.params.pop('debug',False) != False class JsonRequest(CherryPyRequest): """ JSON-RPC2 over HTTP. @@ -361,7 +363,13 @@ class HttpRequest(CherryPyRequest): """ def dispatch(self, controller, method, **kw): self.init(kw) - print "%s --> %s %s.%s %r" % (self.httprequest.method, controller.__class__.__name__, method.__name__, self.httprequest, kw) + akw = {} + for key in kw.keys(): + if isinstance(kw[key], basestring) and len(kw[key]) < 1024: + akw[key] = kw[key] + else: + akw[key] = str(type(kw[key])) + print "%s --> %s.%s %r" % (self.httprequest.method, controller.__class__.__name__, method.__name__, akw) r = method(controller, self, **kw) print "<--", 'size:', len(r) print From ed5097650b236bbd7bb4b96690258a9dbfb9d2c9 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 21:53:49 +0200 Subject: [PATCH 08/17] [IMP] more production mode move Session above session aware, jquery ui css is not absolute bzr revid: al@openerp.com-20110818195349-zebyew12sefo93ml --- addons/base/static/src/js/boot.js | 33 +- addons/base/static/src/js/core.js | 578 ++++++++++----------- addons/base/static/src/js/list-editable.js | 2 +- 3 files changed, 294 insertions(+), 319 deletions(-) diff --git a/addons/base/static/src/js/boot.js b/addons/base/static/src/js/boot.js index 3d1d1e75e7c..461d84b2253 100644 --- a/addons/base/static/src/js/boot.js +++ b/addons/base/static/src/js/boot.js @@ -14,8 +14,6 @@ /** @lends openerp */ var openerp = this.openerp = { - // debug flag - debug: true, // Per session namespace // openerp. will map to // openerp.sessions.sessionname. using a closure @@ -57,32 +55,11 @@ openerp.base = function(instance) { openerp.base.formats(instance); openerp.base.chrome(instance); openerp.base.data(instance); - if (openerp.base.views) { - openerp.base.views(instance); - } - if (openerp.base.search) { - openerp.base.search(instance); - } - if (openerp.base.list) { - openerp.base.list(instance); - } - if (openerp.base. m2o) { - openerp.base.m2o(instance); - } - if (openerp.base.form) { - openerp.base.form(instance); - } - if (openerp.base.list && openerp.base.list.editable) { - openerp.base.list.editable(instance); - } - if (openerp.web_mobile) { - openerp.web_mobile(instance); - } - if (openerp.base.view_tree) { - openerp.base.view_tree(instance); - } - if (openerp.base.data_export) { - openerp.base.data_export(instance); + files = ["views","search","list","form","list_editable","web_mobile","view_tree","data_export"]; + for(i=0; i Date: Thu, 18 Aug 2011 22:31:47 +0200 Subject: [PATCH 09/17] [IMP] Use Ubuntu font bzr revid: fme@openerp.com-20110818203147-3utl21mr2xpom01n --- addons/base/static/src/css/base.css | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 30ca7a5231c..21016dcb5a7 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1,11 +1,17 @@ /* TODO: separate openerp web client page css from openerp views css */ -body { +body.openerp { padding: 0; margin: 0; - font-family: helvetica, arial, sans-serif; + height: 100%; + min-width: 1000px; + overflow-y: scroll; font-size: 80%; } +body.openerp, .openerp textarea, .openerp input, .openerp select, .openerp option, .openerp button, .openerp .ui-widget { + font-family: Ubuntu, Helvetica, sans-serif; +} + .oe_box { border: 1px solid #aaf; padding: 2px; @@ -20,13 +26,6 @@ body { margin: 0; } - -body.openerp { - height: 100%; - min-width: 1000px; - overflow-y: scroll; -} - .openerp .oe-number { text-align: right !important; } @@ -120,7 +119,6 @@ body.openerp { -moz-border-radius: 3px; -webkit-border-radius: 3px; color: white; - font-family: Ubuntu, Helvetica, sans-serif; font-size: 16px; font-weight: bold; padding: 5px; @@ -497,7 +495,6 @@ label.error { color: #666666; font-weight: bold; font-size: 0.8em; - font-family: Ubuntu, Helvetica, sans-serif; text-align: center; } .openerp div.oe_footer p.oe_footer_powered a { @@ -515,7 +512,6 @@ label.error { .openerp h2.oe_view_title { font-size: 175%; font-weight: normal; - font-family: Ubuntu, Helvetica, sans-serif; margin: 2px 0; color: #252424; text-shadow: white 0 1px 0; @@ -859,7 +855,7 @@ label.error { -webkit-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; - padding: 2px; + padding: 0 2px 0 2px; border: 1px solid #999; -moz-border-radius: 3px; -webkit-border-radius: 3px; @@ -988,7 +984,6 @@ label.error { margin: 0; width: 180px; height: 100%; - font-family: Ubuntu, Helvetica, sans-serif; font-size: 0.9em; } @@ -1046,7 +1041,6 @@ label.error { .openerp .view-manager-main-sidebar h2 { margin:0; - font-family: Ubuntu, Helvetica, sans-serif; font-size: 1.15em; color: #8E8E8E; text-shadow: white 0 1px 0; From e75e156a793d678143e7dfee711b3112b653f4ed Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 22:39:20 +0200 Subject: [PATCH 10/17] [IMP] add web_rpc module minimal js deps to make rpc call to openerp with example bzr revid: al@openerp.com-20110818203920-2jrq8ioal9ybh8dh --- addons/web_rpc/__init__.py | 0 addons/web_rpc/__openerp__.py | 21 ++++++++++++++++++++ addons/web_rpc/static/src/example.html | 27 ++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 addons/web_rpc/__init__.py create mode 100644 addons/web_rpc/__openerp__.py create mode 100644 addons/web_rpc/static/src/example.html diff --git a/addons/web_rpc/__init__.py b/addons/web_rpc/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/web_rpc/__openerp__.py b/addons/web_rpc/__openerp__.py new file mode 100644 index 00000000000..c1c744da43b --- /dev/null +++ b/addons/web_rpc/__openerp__.py @@ -0,0 +1,21 @@ +{ + "name" : "OpenERP Web base", + "version" : "2.0", + "depends" : [], + 'active': False, + 'js' : [ + "../base/static/lib/datejs/date-en-US.js", + "../base/static/lib/jquery/jquery-1.6.2.js", + "../base/static/lib/json/json2.js", + "../base/static/lib/qweb/qweb2.js", + "../base/static/lib/underscore/underscore.js", + "../base/static/lib/underscore/underscore.string.js", + "../base/static/src/js/boot.js", + "../base/static/src/js/core.js", + "../base/static/src/js/formats.js", + "../base/static/src/js/chrome.js", + "../base/static/src/js/data.js", + ], + 'css' : [ + ], +} diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html new file mode 100644 index 00000000000..c94c43e319e --- /dev/null +++ b/addons/web_rpc/static/src/example.html @@ -0,0 +1,27 @@ + + + + + OpenERP RPC example + + + + +

Example 1

+

Code:

+
+QWeb = new QWeb2.Engine();
+var o_db = openerp.init();
+var o_sess = new o_db.Session();
+//.base.webclient("oe");
+        
+

div id="ex1res" to output results:

+
+   +
+ + + From 89c8ed860bc3bd2e76c56b64b3709abe12baf600 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 22:58:20 +0200 Subject: [PATCH 11/17] [IMP] web_rpc partial example bzr revid: al@openerp.com-20110818205820-japmg7a9dsr6k6yn --- addons/web_rpc/static/src/example.html | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index c94c43e319e..6f96c609527 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -6,17 +6,28 @@ -

Example 1

+

Example 1: Display all res_users in an html table

Code:

 QWeb = new QWeb2.Engine();
 var o_db = openerp.init();
-var o_sess = new o_db.Session();
-//.base.webclient("oe");
+var o_sess = new o_db.base.Session();
+o_sess.debug = 1;
+o_sess.session_login("web_trunk", "admin", "admin", function() {
+    var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
+    // search for res.users
+    //o_ds.sear()
+    // read res.users
+    // display them
+    $("#ex1res").html(o_sess.debug.toString());
+});
         

div id="ex1res" to output results:

From e9d031cb0bc047fbc9e0af072b8c3c697bf9bd08 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 23:26:35 +0200 Subject: [PATCH 12/17] [IMP] web_rpc example page bzr revid: al@openerp.com-20110818212635-pewkb53nab2tq7ca --- addons/web_rpc/static/src/example.html | 41 +++++++++++++++++--------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index 6f96c609527..8e466e63971 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -3,7 +3,15 @@ OpenERP RPC example - + + + + + +

OpenERP web_rpc module examples

Example 1: Display all res_users in an html table

Code:

-
-QWeb = new QWeb2.Engine();
-var o_db = openerp.init();
-var o_sess = new o_db.base.Session();
-o_sess.debug = 1;
-o_sess.session_login("web_trunk", "admin", "admin", function() {
-    var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
-    // search for res.users
-    //o_ds.sear()
-    // read res.users
-    // display them
-    $("#ex1res").html(o_sess.debug.toString());
-});
+        
+<script type="text/javascript" src="/base/webclient/js?mods=web_rpc"></script> 
+<script type="text/javascript">
+
+    QWeb = new QWeb2.Engine();
+    var o_db = openerp.init();
+    var o_sess = new o_db.base.Session();
+    o_sess.debug = 1;
+    o_sess.session_login("web-trunk", "admin", "admin", function() {
+        var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
+        // search for res.users
+        //o_ds.sear()
+        // read res.users
+        // display them
+        $("#ex1res").html(o_sess.debug.toString());
+    });
+
</script>

div id="ex1res" to output results:

From 47e709eb735f0fab8ee53c802e1352ee445d52cc Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 19 Aug 2011 00:57:21 +0200 Subject: [PATCH 13/17] [IMP] read_slice fields outside option [] are probably bugs bzr revid: al@openerp.com-20110818225721-tn1vl2450tbe11d6 --- addons/base/static/src/js/data.js | 15 +++++++----- addons/base/static/src/js/form.js | 4 +--- addons/base/static/src/js/list.js | 11 ++++----- addons/base/static/src/js/view_tree.js | 2 +- addons/base/static/src/js/views.js | 24 +++++++++++++++++++ .../base_calendar/static/src/js/calendar.js | 3 +-- .../base_dashboard/static/src/js/dashboard.js | 10 +++----- .../base_default_home/static/src/js/home.js | 2 +- addons/base_gantt/static/src/js/gantt.js | 4 ++-- addons/base_graph/static/src/js/graph.js | 4 ++-- .../web_mobile/static/src/js/form_mobile.js | 2 +- 11 files changed, 50 insertions(+), 31 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 244c057d544..2dac0bb5ae4 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -286,14 +286,16 @@ openerp.base.DataSet = openerp.base.Widget.extend( /** @lends openerp.base.Data * Read a slice of the records represented by this DataSet, based on its * domain and context. * + * @param {Array} [fields] fields to read and return, by default all fields are returned * @params {Object} options - * @param {Array} [options.fields] fields to read and return, by default all fields are returned * @param {Number} [options.offset=0] The index from which selected records should be returned * @param {Number} [options.limit=null] The maximum number of records to return * @param {Function} callback function called with read_slice result * @returns {$.Deferred} */ - read_slice: function (options, callback) { return null; }, + read_slice: function (fields, options, callback) { + return null; + }, /** * Reads the current dataset record (from its index) * @@ -478,11 +480,12 @@ openerp.base.DataSetStatic = openerp.base.DataSet.extend({ // all local records this.ids = ids || []; }, - read_slice: function (options, callback) { + read_slice: function (fields, options, callback) { + // TODO remove fields from options var self = this, offset = options.offset || 0, limit = options.limit || false, - fields = options.fields || false; + fields = fields || false; var end_pos = limit && limit !== -1 ? offset + limit : undefined; return this.read_ids(this.ids.slice(offset, end_pos), fields, callback); }, @@ -532,12 +535,12 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ * @param {Function} callback function called with read_slice result * @returns {$.Deferred} */ - read_slice: function (options, callback) { + read_slice: function (fields, options, callback) { var self = this; var offset = options.offset || 0; return this.rpc('/base/dataset/search_read', { model: this.model, - fields: options.fields || false, + fields: fields || false, domain: this.get_domain(options.domain), context: this.get_context(options.context), sort: this.sort(), diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index d3056e618bf..c85d1fd4cb2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -458,9 +458,7 @@ openerp.base.form.SidebarAttachments = openerp.base.Widget.extend({ ['res_model', '=', this.view.dataset.model], ['res_id', '=', this.view.datarecord.id], ['type', 'in', ['binary', 'url']] - ])).read_slice( - {fields: ['name', 'url', 'type']}, - this.on_attachments_loaded); + ])).read_slice(['name', 'url', 'type'], this.on_attachments_loaded); } }, on_attachments_loaded: function(attachments) { diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index a0440221520..d715c3600be 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -476,7 +476,8 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi */ do_activate_record: function (index, id, dataset) { var self = this; - this.dataset.read_slice({ + // TODO is it needed ? + this.dataset.read_slice([],{ context: dataset.get_context(), domain: dataset.get_domain() }, function () { @@ -1034,11 +1035,9 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas d = new $.Deferred(), page = this.datagroup.openable ? this.page : view.page; - dataset.read_slice({ - fields: _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name'), - offset: page * limit, - limit: limit - }, function (records) { + var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name'); + var options = { offset: page * limit, limit: limit }; + dataset.read_slice(fields, options , function (records) { if (!self.datagroup.openable) { view.configure_pager(dataset); } else { diff --git a/addons/base/static/src/js/view_tree.js b/addons/base/static/src/js/view_tree.js index 5c3c7457e1c..59544a998b3 100644 --- a/addons/base/static/src/js/view_tree.js +++ b/addons/base/static/src/js/view_tree.js @@ -72,7 +72,7 @@ openerp.base.TreeView = openerp.base.View.extend({ 'toolbar': has_toolbar })); - this.dataset.read_slice({fields: this.fields_list()}, function (records) { + this.dataset.read_slice(this.fields_list(), {}, function (records) { if (!has_toolbar) { // WARNING: will do a second read on the same ids, but only on // first load so not very important diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index f21c6387d32..ad75268156f 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -17,6 +17,7 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.dialog = null; this.dialog_viewmanager = null; this.client_widget = null; + this.url = {} }, render: function() { return "
"; @@ -35,6 +36,28 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.inner_viewmanager = null; } }, + url_update: function(action) { + // this.url = { + // "model": action.model, + // "domain": action.domain, + // }; + // action.res_model + // action.domain + // action.context + // after + // action.views + // action.res_id + // mode + // menu + }, + url_stringify: function(action) { + }, + url_parse: function(action) { + }, + on_url_update: function(url) { + }, + do_url_action: function(url) { + }, do_action: function(action, on_close) { var type = action.type.replace(/\./g,'_'); var popup = action.target === 'new'; @@ -69,6 +92,7 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.inner_stop(); this.inner_viewmanager = new openerp.base.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); + this.url_update(action); } /* new window code this.rpc("/base/session/save_session_action", { the_action : action}, function(key) { diff --git a/addons/base_calendar/static/src/js/calendar.js b/addons/base_calendar/static/src/js/calendar.js index d02fbe490e2..8b0f1e995b6 100644 --- a/addons/base_calendar/static/src/js/calendar.js +++ b/addons/base_calendar/static/src/js/calendar.js @@ -302,8 +302,7 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ // TODO: handle non-empty results.group_by with read_group self.dataset.context = self.context = results.context; self.dataset.domain = self.domain = results.domain; - self.dataset.read_slice({ - fields: _.keys(self.fields), + self.dataset.read_slice(_.keys(self.fields), { offset:0, limit: self.limit }, function(events) { diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 422d279a485..727e5e5519c 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -290,7 +290,7 @@ openerp.base_dashboard.ConfigOverview = openerp.base.View.extend({ this.dataset.domain = [['type', '=', 'manual']]; }, start: function () { - $.when(this.dataset.read_slice({fields: ['state', 'action_id', 'category_id']}), + $.when(this.dataset.read_slice(['state', 'action_id', 'category_id']), this.dataset.call('progress')) .then(this.on_records_loaded); }, @@ -352,9 +352,7 @@ openerp.base_dashboard.ApplicationTiles = openerp.base.View.extend({ }, start: function () { var self = this; - this.dataset.read_slice( - {fields: ['name', 'web_icon_data', 'web_icon_hover_data']}, - function (applications) { + this.dataset.read_slice( ['name', 'web_icon_data', 'web_icon_hover_data'], {}, function (applications) { // Create a matrix of 3*x applications var rows = []; while (applications.length) { @@ -384,9 +382,7 @@ openerp.base_dashboard.Widgets = openerp.base.View.extend({ this.widgets = new openerp.base.DataSetSearch(this, 'res.widget'); }, start: function () { - this.user_widgets.read_slice( - {fields: ['widget_id', 'user_id']}, - this.on_widgets_list_loaded); + this.user_widgets.read_slice(['widget_id', 'user_id'], {}, this.on_widgets_list_loaded); }, on_widgets_list_loaded: function (user_widgets) { var self = this; diff --git a/addons/base_default_home/static/src/js/home.js b/addons/base_default_home/static/src/js/home.js index ebdf7ea7d00..e1f96c89da7 100644 --- a/addons/base_default_home/static/src/js/home.js +++ b/addons/base_default_home/static/src/js/home.js @@ -86,7 +86,7 @@ openerp.base_default_home = function (openerp) { $.blockUI({ message: '' }); - Modules.read_slice({fields: ['id']}, function (records) { + Modules.read_slice(['id'], function (records) { if (!(records.length === 1)) { return; } Modules.call('state_update', [_.pluck(records, 'id'), 'to install', ['uninstalled']], diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index 307dc94c6b8..6a5342f9c55 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -79,7 +79,7 @@ init: function(parent, element_id, dataset, view_id) { get_events: function() { var self = this; - this.dataset.read_slice({}, function(result) { + this.dataset.read_slice([],{}, function(result) { self.load_event(result); }); @@ -498,7 +498,7 @@ init: function(parent, element_id, dataset, view_id) { reload_gantt: function() { var self = this; - this.dataset.read_slice({}, function(response) { + this.dataset.read_slice([],{}, function(response) { ganttChartControl.clearAll(); jQuery("#GanttDiv").children().remove(); self.load_event(response); diff --git a/addons/base_graph/static/src/js/graph.js b/addons/base_graph/static/src/js/graph.js index f7c949dc194..e76d38b33bc 100644 --- a/addons/base_graph/static/src/js/graph.js +++ b/addons/base_graph/static/src/js/graph.js @@ -89,7 +89,7 @@ openerp.base_graph.GraphView = openerp.base.View.extend({ } this.dataset.domain = domain; this.dataset.context = this.view_manager.dataset.context; - this.dataset.read_slice({fields: _(this.fields).keys()}, function(res) { + this.dataset.read_slice(_(this.fields).keys(),{}, function(res) { self.schedule_chart(res); }); } @@ -468,7 +468,7 @@ openerp.base_graph.GraphView = openerp.base.View.extend({ } self.dataset.context = results.context; self.dataset.domain = results.domain; - self.dataset.read_slice({}, $.proxy(self, 'load_chart')); + self.dataset.read_slice([],{}, $.proxy(self, 'load_chart')); }); } }); diff --git a/addons/web_mobile/static/src/js/form_mobile.js b/addons/web_mobile/static/src/js/form_mobile.js index a8c7bcc480e..793d944ddcd 100644 --- a/addons/web_mobile/static/src/js/form_mobile.js +++ b/addons/web_mobile/static/src/js/form_mobile.js @@ -12,7 +12,7 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({ view_id = this.action.views[1][0]; this.dataset = new openerp.base.DataSetSearch(this.session, this.action.res_model, null, null); - this.dataset.read_slice({}, function (result) { + this.dataset.read_slice([],{}, function (result) { for (var i = 0; i < result.length; i++) { if (result[i].id == id) { From 056a91f72439ae99f1df02a75c30aafc13bd3648 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 19 Aug 2011 01:38:11 +0200 Subject: [PATCH 14/17] [IMP] web_rpc example bzr revid: al@openerp.com-20110818233811-yiee3czhbtc6p3ob --- addons/base/static/src/js/core.js | 2 +- addons/base/static/src/js/data.js | 1 + .../base_default_home/static/src/js/home.js | 8 ++-- addons/web_rpc/static/src/example.html | 37 ++++++++++--------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 58d19de9008..e0ec45c3e6f 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -323,7 +323,6 @@ openerp.base.CallbackEnabled = openerp.base.Class.extend({ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.base.Session# */{ /** * @constructs - * @param element_id to use for exception reporting * @param server * @param port */ @@ -344,6 +343,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.context = {}; this.shortcuts = []; this.active_id = null; + this.session = this; }, start: function() { this.session_restore(); diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 2dac0bb5ae4..04c23224806 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -537,6 +537,7 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ */ read_slice: function (fields, options, callback) { var self = this; + var options = options || {}; var offset = options.offset || 0; return this.rpc('/base/dataset/search_read', { model: this.model, diff --git a/addons/base_default_home/static/src/js/home.js b/addons/base_default_home/static/src/js/home.js index e1f96c89da7..7470b2914ce 100644 --- a/addons/base_default_home/static/src/js/home.js +++ b/addons/base_default_home/static/src/js/home.js @@ -78,15 +78,13 @@ openerp.base_default_home = function (openerp) { }); }, install_module: function (module_name) { - var Modules = new openerp.base.DataSetSearch( - this, 'ir.module.module', null, - [['name', '=', module_name], ['state', '=', 'uninstalled']]), - Upgrade = new openerp.base.DataSet(this, 'base.module.upgrade'); + var Modules = new openerp.base.DataSetSearch( this, 'ir.module.module', null, [['name', '=', module_name], ['state', '=', 'uninstalled']]); + var Upgrade = new openerp.base.DataSet(this, 'base.module.upgrade'); $.blockUI({ message: '' }); - Modules.read_slice(['id'], function (records) { + Modules.read_slice(['id'], {}, function (records) { if (!(records.length === 1)) { return; } Modules.call('state_update', [_.pluck(records, 'id'), 'to install', ['uninstalled']], diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index 8e466e63971..7242a3716a5 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -2,7 +2,7 @@ - OpenERP RPC example + OpenERP web_rpc example @@ -15,37 +15,40 @@ -

OpenERP web_rpc module examples

-

Example 1: Display all res_users in an html table

+

OpenERP web_rpc examples

+

Example 1: Display a list of defined ir.model

Code:

 <script type="text/javascript" src="/base/webclient/js?mods=web_rpc"></script> 
 <script type="text/javascript">
 
-    QWeb = new QWeb2.Engine();
-    var o_db = openerp.init();
-    var o_sess = new o_db.base.Session();
-    o_sess.debug = 1;
-    o_sess.session_login("web-trunk", "admin", "admin", function() {
-        var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
-        // search for res.users
-        //o_ds.sear()
-        // read res.users
-        // display them
-        $("#ex1res").html(o_sess.debug.toString());
-    });
+    var c = openerp.init(); // get a new webclient
+    c._modules_loaded = true; // Hack to prevent loading of additional modules
+
+    var s = new c.base.Session(); // setup a Session
+    s.session_login("web-trunk", "admin", "admin", function() {
+
+            var ds = new c.base.DataSetSearch(s, "ir.model"); // DataSetSearch used to search, read
+            ds.read_slice(['name','model'], {}, function(users){
+                for(var i in users) { 
+                    $("#ex1res").append("<li>" + users[i].model + " (" + users[i].name + ") </li>")
+                }
+            });
+        }
+    );
 
</script>
-

div id="ex1res" to output results:

+

Div for output:

 
+

Help me to complete this example page on launchpad

From 8f785e16a87321e505504c74ef8c1c8a0f82ff16 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 19 Aug 2011 02:06:15 +0200 Subject: [PATCH 15/17] [FIX] remove wrong paste of ie7 css bzr revid: al@openerp.com-20110819000615-8cv9mqtrwzgxo1pd --- addons/web_rpc/static/src/example.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index 7242a3716a5..724de9d2885 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -3,9 +3,6 @@ OpenERP web_rpc example - - -