diff --git a/addons/web/__init__.py b/addons/web/__init__.py index bcb8f6db28c..2478edb81b7 100644 --- a/addons/web/__init__.py +++ b/addons/web/__init__.py @@ -5,8 +5,7 @@ import logging _logger = logging.getLogger(__name__) - -try: +def wsgi_postload(): import openerp.wsgi import os import tempfile @@ -24,9 +23,6 @@ try: #import openerp.wsgi openerp.wsgi.register_wsgi_handler(app) -except ImportError: - _logger.info("standalone mode") - # TODO # if we detect that we are imported from the openerp server register common.Root() as a wsgi entry point diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 9a1fd119fb9..74633fa4969 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -45,5 +45,5 @@ "static/src/css/base.css", "static/src/css/data_export.css", ], - 'wsgi' : 'app', + 'post_load' : 'wsgi_postload', } diff --git a/addons/web/common/session.py b/addons/web/common/session.py index 3691f88e3f5..d1997a3f903 100644 --- a/addons/web/common/session.py +++ b/addons/web/common/session.py @@ -43,30 +43,30 @@ class OpenERPSession(object): def build_connection(self): return openerplib.get_connection(hostname=self._server, port=self._port, - database=self._db, + database=self._db, login=self._login, user_id=self._uid, password=self._password) def proxy(self, service): return self.build_connection().get_service(service) - def bind(self, db, uid, password): + def bind(self, db, uid, login, password): self._db = db self._uid = uid + self._login = login self._password = password def login(self, db, login, password): uid = self.proxy('common').login(db, login, password) - self.bind(db, uid, password) - self._login = login + self.bind(db, uid, login, password) if uid: self.get_context() return uid - def assert_valid(self): + def assert_valid(self, force=False): """ Ensures this session is valid (logged into the openerp server) """ - self.build_connection().check_login(False) + self.build_connection().check_login(force) def execute(self, model, func, *l, **d): self.assert_valid() diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 6ce4bd612f2..d0c8950f9e1 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -301,6 +301,7 @@ class Session(openerpweb.Controller): } @openerpweb.jsonrequest def get_session_info(self, req): + req.session.assert_valid(force=True) return { "uid": req.session._uid, "context": req.session.get_context() if req.session._uid else False, diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 6462529d0c9..a33fca458d0 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -501,6 +501,8 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web self.on_session_valid(); else self.on_session_invalid(); + }, function() { + self.on_session_invalid(); }); }, /** @@ -741,6 +743,59 @@ openerp.web.SessionAware = openerp.web.CallbackEnabled.extend(/** @lends openerp } }); +/** + * Base class for all visual components. Provides a lot of functionalities helpful + * for the management of a part of the DOM. + * + * Widget handles: + * - Rendering with QWeb. + * - Life-cycle management and parenting (when a parent is destroyed, all its children are + * destroyed too). + * - Insertion in DOM. + * + * Widget also extends SessionAware for ease of use. + * + * Guide to create implementations of the Widget class: + * ============================================== + * + * Here is a sample child class: + * + * MyWidget = openerp.base.Widget.extend({ + * // the name of the QWeb template to use for rendering + * template: "MyQWebTemplate", + * // identifier prefix, it is useful to put an obvious one for debugging + * identifier_prefix: 'my-id-prefix-', + * + * init: function(parent) { + * this._super(parent); + * // stuff that you want to init before the rendering + * }, + * start: function() { + * this._super(); + * // stuff you want to make after the rendering, `this.$element` holds a correct value + * this.$element.find(".my_button").click(/* an example of event binding * /); + * + * // if you have some asynchronous operations, it's a good idea to return + * // a promise in start() + * var promise = this.rpc(...); + * return promise; + * } + * }); + * + * Now this class can simply be used with the following syntax: + * + * var my_widget = new MyWidget(this); + * my_widget.appendTo($(".some-div")); + * + * With these two lines, the MyWidget instance was inited, rendered, it was inserted into the + * DOM inside the ".some-div" div and its events were binded. + * + * And of course, when you don't need that widget anymore, just do: + * + * my_widget.stop(); + * + * That will kill the widget in a clean way and erase its content from the dom. + */ openerp.web.Widget = openerp.web.SessionAware.extend(/** @lends openerp.web.Widget# */{ /** * The name of the QWeb template that will be used for rendering. Must be diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index f6c53b4ad17..5db66ab7260 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -2,6 +2,7 @@ openerp.web.search = function(openerp) { var QWeb = openerp.web.qweb; openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.SearchView# */{ + template: "EmptyComponent", /** * @constructs openerp.web.SearchView * @extends openerp.web.Widget @@ -12,8 +13,8 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search * @param view_id * @param defaults */ - init: function(parent, element_id, dataset, view_id, defaults) { - this._super(parent, element_id); + init: function(parent, dataset, view_id, defaults) { + this._super(parent); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; @@ -28,6 +29,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search this.ready = $.Deferred(); }, start: function() { + this._super(); this.rpc("/web/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded); return this.ready.promise(); }, @@ -463,30 +465,6 @@ openerp.web.search.Widget = openerp.web.Widget.extend( /** @lends openerp.web.se })); } }); -openerp.web.search.FilterGroup = openerp.web.search.Widget.extend(/** @lends openerp.web.search.FilterGroup# */{ - template: 'SearchView.filters', - /** - * Inclusive group of filters, creates a continuous "button" with clickable - * sections (the normal display for filters is to be a self-contained button) - * - * @constructs openerp.web.search.FilterGroup - * @extends openerp.web.search.Widget - * - * @param {Array} filters elements of the group - * @param {openerp.web.SearchView} view view in which the filters are contained - */ - init: function (filters, view) { - this._super(view); - this.filters = filters; - this.length = filters.length; - }, - start: function () { - this._super(); - _.each(this.filters, function (filter) { - filter.start(); - }); - } -}); openerp.web.search.add_expand_listener = function($root) { $root.find('a.searchview_group_string').click(function (e) { $root.toggleClass('folded expanded'); @@ -533,6 +511,49 @@ openerp.web.search.Input = openerp.web.search.Widget.extend( /** @lends openerp. "get_domain not implemented for widget " + this.attrs.type); } }); +openerp.web.search.FilterGroup = openerp.web.search.Input.extend(/** @lends openerp.web.search.FilterGroup# */{ + template: 'SearchView.filters', + /** + * Inclusive group of filters, creates a continuous "button" with clickable + * sections (the normal display for filters is to be a self-contained button) + * + * @constructs openerp.web.search.FilterGroup + * @extends openerp.web.search.Input + * + * @param {Array} filters elements of the group + * @param {openerp.web.SearchView} view view in which the filters are contained + */ + init: function (filters, view) { + this._super(view); + this.filters = filters; + this.length = filters.length; + }, + start: function () { + this._super(); + _.each(this.filters, function (filter) { + filter.start(); + }); + }, + get_context: function () { }, + /** + * Handles domains-fetching for all the filters within it: groups them. + */ + get_domain: function () { + var domains = _(this.filters).chain() + .filter(function (filter) { return filter.is_enabled(); }) + .map(function (filter) { return filter.attrs.domain; }) + .value(); + + if (!domains.length) { return; } + if (domains.length === 1) { return domains[0]; } + for (var i=domains.length; --i;) { + domains.unshift(['|']); + } + return _.extend(new openerp.web.CompoundDomain(), { + __domains: domains + }); + } +}); openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.web.search.Filter# */{ template: 'SearchView.filter', /** @@ -586,12 +607,11 @@ openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.w } return this.attrs.context; }, - get_domain: function () { - if (!this.is_enabled()) { - return; - } - return this.attrs.domain; - } + /** + * Does not return anything: filter domain is handled at the FilterGroup + * level + */ + get_domain: function () { } }); openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.web.search.Field# */ { template: 'SearchView.field', diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index a2188d736fd..d3293b4f2ad 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -10,20 +10,19 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# * view should be displayed (if there is one active). */ searchable: false, - template: "FormView", + form_template: "FormView", /** * @constructs openerp.web.FormView * @extends openerp.web.View * * @param {openerp.web.Session} session the current openerp session - * @param {String} element_id this view's root element id * @param {openerp.web.DataSet} dataset the dataset this view will work with * @param {String} view_id the identifier of the OpenERP view object * * @property {openerp.web.Registry} registry=openerp.web.form.widgets widgets registry for this form view instance */ - init: function(parent, element_id, dataset, view_id, options) { - this._super(parent, element_id); + init: function(parent, dataset, view_id, options) { + this._super(parent); this.set_default_options(options); this.dataset = dataset; this.model = dataset.model; @@ -45,6 +44,10 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# _.defaults(this.options, {"always_show_new_button": true}); }, start: function() { + this._super(); + return this.init_view(); + }, + init_view: function() { if (this.embedded_view) { var def = $.Deferred().then(this.on_loaded); var self = this; @@ -75,7 +78,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# this.fields_view = data; var frame = new (this.registry.get_object('frame'))(this, this.fields_view.arch); - this.$element.html(QWeb.render(this.template, { 'frame': frame, 'view': this })); + this.$element.html(QWeb.render(this.form_template, { 'frame': frame, 'view': this })); _.each(this.widgets, function(w) { w.start(); }); @@ -399,7 +402,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# if (!r.result) { // should not happen in the server, but may happen for internal purpose } else { - console.debug(_.sprintf("The record #%s has been saved.", this.datarecord.id)); if (success) { success(r); } @@ -480,11 +482,11 @@ openerp.web.FormDialog = openerp.web.Dialog.extend({ }, start: function() { this._super(); - this.form = new openerp.web.FormView(this, this.element_id, this.dataset, this.view_id, { + this.form = new openerp.web.FormView(this, this.dataset, this.view_id, { sidebar: false, pager: false }); - this.form.start(); + this.form.appendTo(this.$element); this.form.on_created.add_last(this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); return this; @@ -829,7 +831,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ }, on_click: function(saved) { var self = this; - if ((!this.node.attrs.special && this.view.dirty_for_user && saved !== true) || !this.view.recordcount.id) { + if ((!this.node.attrs.special && this.view.dirty_for_user && saved !== true) || !this.view.datarecord.id) { this.view.do_save(function() { self.on_click(true); }); @@ -2022,7 +2024,7 @@ openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({ self.on_ui_change(); }); - this.list_view = new openerp.web.form.Many2ManyListView(this, this.list_id, this.dataset, false, { + this.list_view = new openerp.web.form.Many2ManyListView(this, this.dataset, false, { 'addable': 'Add', 'selectable': self.multi_selection }); @@ -2031,7 +2033,7 @@ openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({ self.is_started.resolve(); }); setTimeout(function () { - self.list_view.start(); + self.list_view.appendTo($("#" + self.list_id)); }, 0); }, set_value: function(value) { @@ -2141,7 +2143,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope this.searchview.stop(); } this.searchview = new openerp.web.SearchView(this, - this.element_id + "_search", this.dataset, false, { + this.dataset, false, { "selectable": !this.options.disable_multiple_selection, "deletable": false }); @@ -2170,15 +2172,17 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope self.stop(); }); self.view_list = new openerp.web.form.SelectCreateListView(self, - self.element_id + "_view_list", self.dataset, false, + self.dataset, false, {'deletable': false}); self.view_list.popup = self; - self.view_list.do_show(); - self.view_list.start().then(function() { + self.view_list.appendTo($("#" + self.element_id + "_view_list")).pipe(function() { + self.view_list.do_show(); + }).pipe(function() { self.searchview.do_search(); }); + }); - this.searchview.start(); + this.searchview.appendTo($("#" + this.element_id + "_search")); }, create_row: function(data) { var self = this; @@ -2205,11 +2209,11 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope this.view_list.$element.hide(); } this.dataset.index = null; - this.view_form = new openerp.web.FormView(this, this.element_id + "_view_form", this.dataset, false); + this.view_form = new openerp.web.FormView(this, this.dataset, false); if (this.options.alternative_form_view) { this.view_form.set_embedded_view(this.options.alternative_form_view); } - this.view_form.start(); + this.view_form.appendTo(this.$element.find("#" + this.element_id + "_view_form")); this.view_form.on_loaded.add_last(function() { var $buttons = self.view_form.$element.find(".oe_form_buttons"); $buttons.html(QWeb.render("SelectCreatePopup.form.buttons", {widget:self})); @@ -2314,11 +2318,11 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp on_write_completed: function() {}, setup_form_view: function() { var self = this; - this.view_form = new openerp.web.FormView(this, this.element_id + "_view_form", this.dataset, false); + this.view_form = new openerp.web.FormView(this, this.dataset, false); if (this.options.alternative_form_view) { this.view_form.set_embedded_view(this.options.alternative_form_view); } - this.view_form.start(); + this.view_form.appendTo(this.$element.find("#" + this.element_id + "_view_form")); this.view_form.on_loaded.add_last(function() { var $buttons = self.view_form.$element.find(".oe_form_buttons"); $buttons.html(QWeb.render("FormOpenPopup.form.buttons")); @@ -2549,7 +2553,7 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ }); openerp.web.form.FieldStatus = openerp.web.form.Field.extend({ - template: "FieldStatus", + template: "EmptyComponent", start: function() { this._super(); this.selected_value = null; diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 883fae81bbf..f8a89cd34a1 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -31,7 +31,6 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * @extends openerp.web.View * * @param parent parent object - * @param element_id the id of the DOM elements this view should link itself to * @param {openerp.web.DataSet} dataset the dataset the view should work with * @param {String} view_id the listview's identifier, if any * @param {Object} options A set of options used to configure the view @@ -42,9 +41,9 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * @param {Boolean} [options.sortable=true] is it possible to sort the table by clicking on column headers * @param {Boolean} [options.reorderable=true] is it possible to reorder list rows */ - init: function(parent, element_id, dataset, view_id, options) { + init: function(parent, dataset, view_id, options) { var self = this; - this._super(parent, element_id); + this._super(parent); this.set_default_options(_.extend({}, this.defaults, options || {})); this.dataset = dataset; this.model = dataset.model; @@ -128,6 +127,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * @returns {$.Deferred} loading promise */ start: function() { + this._super(); this.$element.addClass('oe-listview'); return this.reload_view(null, null, true); }, diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index c38c43a4c9c..b5a5a3d8c10 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -180,11 +180,11 @@ openerp.web.list_editable = function (openerp) { } self.edition = true; self.edition_id = record_id; - self.edition_form = _.extend(new openerp.web.FormView( - self, $new_row.attr('id'), self.dataset, false), { - template: 'ListView.row.form', + self.edition_form = _.extend(new openerp.web.ListEditableFormView(self, self.dataset, false), { + form_template: 'ListView.row.form', registry: openerp.web.list.form.widgets }); + self.edition_form.appendTo($("#" + $new_row.attr('id'))); $.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') @@ -333,4 +333,8 @@ openerp.web.list_editable = function (openerp) { }); list_form_widgets.add(key, new_path); }); + + openerp.web.ListEditableFormView = openerp.web.FormView.extend({ + init_view: function() {} + }); }; diff --git a/addons/web/static/src/js/view_tree.js b/addons/web/static/src/js/view_tree.js index 2a314f57fa8..7988d65805c 100644 --- a/addons/web/static/src/js/view_tree.js +++ b/addons/web/static/src/js/view_tree.js @@ -19,13 +19,12 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView# * @extends openerp.web.View * * @param parent - * @param element_id * @param dataset * @param view_id * @param options */ - init: function(parent, element_id, dataset, view_id, options) { - this._super(parent, element_id); + init: function(parent, dataset, view_id, options) { + this._super(parent); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 46c3f7e6b30..88db848118f 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -133,11 +133,19 @@ db.web.ActionManager = db.web.Widget.extend({ (this.client_widget = new ClientWidget(this, action.params)).appendTo(this); }, ir_actions_report_xml: function(action) { + var self = this; $.blockUI(); - this.session.get_file({ - url: '/web/report', - data: {action: JSON.stringify(action)}, - complete: $.unblockUI + self.rpc("/web/session/eval_domain_and_context", { + contexts: [action.context], + domains: [] + }).then(function(res) { + action = _.clone(action); + action.context = res.context; + self.session.get_file({ + url: '/web/report', + data: {action: JSON.stringify(action)}, + complete: $.unblockUI + }); }); } }); @@ -212,8 +220,7 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ if (!view.controller) { // Lazy loading of views var controllerclass = this.registry.get_object(view_type); - var controller = new controllerclass(this, this.element_id + '_view_' + view_type, - this.dataset, view.view_id, view.options); + var controller = new controllerclass(this, this.dataset, view.view_id, view.options); if (view.embedded_view) { controller.set_embedded_view(view.embedded_view); } @@ -232,7 +239,8 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ unique: true }); } - view_promise = controller.start(); + var container = $("#" + this.element_id + '_view_' + view_type); + view_promise = controller.appendTo(container); $.when(view_promise).then(function() { self.on_controller_inited(view_type, controller); }); @@ -285,14 +293,14 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ this.searchview.stop(); } this.searchview = new db.web.SearchView( - this, this.element_id + "_search", this.dataset, + this, this.dataset, view_id, search_defaults); this.searchview.on_search.add(function(domains, contexts, groupbys) { var controller = self.views[self.active_view].controller; controller.do_search.call(controller, domains, contexts, groupbys); }); - return this.searchview.start(); + return this.searchview.appendTo($("#" + this.element_id + "_search")); }, /** * Called when one of the view want to execute an action @@ -729,6 +737,7 @@ db.web.TranslateDialog = db.web.Dialog.extend({ }); db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{ + template: "EmptyComponent", set_default_options: function(options) { this.options = options || {}; _.defaults(this.options, { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 83ca819b4e6..486dea94671 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1412,9 +1412,6 @@

- -
-
    @@ -1425,4 +1422,7 @@
+ +
+
diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index 7b9fcc3ed33..e590280b933 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -8,8 +8,8 @@ QWeb.add_template('/web_calendar/static/src/xml/web_calendar.xml'); openerp.web.views.add('calendar', 'openerp.web_calendar.CalendarView'); openerp.web_calendar.CalendarView = openerp.web.View.extend({ // Dhtmlx scheduler ? - init: function(parent, element_id, dataset, view_id, options) { - this._super(parent, element_id); + init: function(parent, dataset, view_id, options) { + this._super(parent); this.set_default_options(options); this.dataset = dataset; this.model = dataset.model; @@ -30,6 +30,7 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({ this.color_map = {}; }, start: function() { + this._super(); this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type":"calendar", 'toolbar': true}, this.on_loaded); }, stop: function() { @@ -344,11 +345,11 @@ openerp.web_calendar.CalendarFormDialog = openerp.web.Dialog.extend({ }, start: function() { this._super(); - this.form = new openerp.web.FormView(this, this.element_id, this.dataset, this.view_id, { + this.form = new openerp.web.FormView(this, this.dataset, this.view_id, { sidebar: false, pager: false }); - this.form.start(); + this.form.appendTo(this.$element); this.form.on_created.add_last(this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved); }, diff --git a/addons/web_dashboard/static/src/js/dashboard.js b/addons/web_dashboard/static/src/js/dashboard.js index a6855894a99..008d03d1548 100644 --- a/addons/web_dashboard/static/src/js/dashboard.js +++ b/addons/web_dashboard/static/src/js/dashboard.js @@ -288,13 +288,14 @@ if (!openerp.web_dashboard) { } openerp.web_dashboard.ConfigOverview = openerp.web.View.extend({ template: 'ConfigOverview', - init: function (parent, element_id) { - this._super(parent, element_id); + init: function (parent) { + this._super(parent); this.dataset = new openerp.web.DataSetSearch( this, 'ir.actions.todo'); this.dataset.domain = [['type', '=', 'manual']]; }, start: function () { + this._super(); $.when(this.dataset.read_slice(['state', 'action_id', 'category_id']), this.dataset.call('progress')) .then(this.on_records_loaded); @@ -352,6 +353,7 @@ openerp.web.client_actions.add( openerp.web_dashboard.ApplicationTiles = openerp.web.View.extend({ template: 'ApplicationTiles', start: function () { + this._super(); var self = this; return new openerp.web.DataSetSearch( this, 'ir.ui.menu', null, [['parent_id', '=', false]]) @@ -393,6 +395,7 @@ openerp.web_dashboard.Widget = openerp.web.View.extend(/** @lends openerp.web_da this.widget_id = options.widget_id; }, start: function () { + this._super(); return new openerp.web.DataSet(this, 'res.widget').read_ids( [this.widget_id], ['title'], this.on_widget_loaded); }, diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 6ddaf26df98..b4aa62fd8f0 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -8,8 +8,8 @@ QWeb.add_template('/web_diagram/static/src/xml/base_diagram.xml'); openerp.web.views.add('diagram', 'openerp.web.DiagramView'); openerp.web.DiagramView = openerp.web.View.extend({ searchable: false, - init: function(parent, element_id, dataset, view_id, options) { - this._super(parent, element_id); + init: function(parent, dataset, view_id, options) { + this._super(parent); this.set_default_options(options); this.view_manager = parent; this.dataset = dataset; @@ -20,6 +20,7 @@ openerp.web.DiagramView = openerp.web.View.extend({ this.ids = this.dataset.ids; }, start: function() { + this._super(); return this.rpc("/web_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 5bf04ff46c7..a045bae64e1 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -7,8 +7,8 @@ QWeb.add_template('/web_gantt/static/src/xml/web_gantt.xml'); openerp.web.views.add('gantt', 'openerp.web_gantt.GanttView'); openerp.web_gantt.GanttView = openerp.web.View.extend({ -init: function(parent, element_id, dataset, view_id) { - this._super(parent, element_id); +init: function(parent, dataset, view_id) { + this._super(parent); this.view_manager = parent || new openerp.web.NullViewManager(); this.dataset = dataset; this.model = dataset.model; @@ -32,6 +32,7 @@ init: function(parent, element_id, dataset, view_id) { }, start: function() { + this._super(); this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "gantt"}, this.on_loaded); }, diff --git a/addons/web_graph/static/src/js/graph.js b/addons/web_graph/static/src/js/graph.js index f35e6ab112c..2a493b89166 100644 --- a/addons/web_graph/static/src/js/graph.js +++ b/addons/web_graph/static/src/js/graph.js @@ -17,8 +17,8 @@ QWeb.add_template('/web_graph/static/src/xml/web_graph.xml'); openerp.web.views.add('graph', 'openerp.web_graph.GraphView'); openerp.web_graph.GraphView = openerp.web.View.extend({ - init: function(parent, element_id, dataset, view_id) { - this._super(parent, element_id); + init: function(parent, dataset, view_id) { + this._super(parent); this.view_manager = parent; this.dataset = dataset; this.dataset_index = 0; @@ -33,6 +33,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({ this.$element.hide(); }, start: function() { + this._super(); return this.rpc("/web_graph/graphview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, on_loaded: function(data) { diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index db9473b4ff5..8aa8e9f3c38 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -4,8 +4,8 @@ var QWeb = openerp.web.qweb; QWeb.add_template('/web_kanban/static/src/xml/web_kanban.xml'); openerp.web.views.add('kanban', 'openerp.web_kanban.KanbanView'); openerp.web_kanban.KanbanView = openerp.web.View.extend({ - init: function (parent, element_id, dataset, view_id, options) { - this._super(parent, element_id); + init: function (parent, dataset, view_id, options) { + this._super(parent); this.set_default_options(options); this.dataset = dataset; this.model = dataset.model; @@ -26,6 +26,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ } }, start: function() { + this._super(); return this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "kanban"}, this.on_loaded); }, on_loaded: function(data) { diff --git a/addons/web_mobile/static/src/js/chrome_mobile.js b/addons/web_mobile/static/src/js/chrome_mobile.js index 2b9d8600fef..b52b4642b67 100644 --- a/addons/web_mobile/static/src/js/chrome_mobile.js +++ b/addons/web_mobile/static/src/js/chrome_mobile.js @@ -131,9 +131,9 @@ openerp.web_mobile.Shortcuts = openerp.web.Widget.extend({ id = $shortcut.data('menu'); res_id = $shortcut.data('res'); // this.header = new openerp.web_mobile.Header(this, "oe_header"); - this.listview = new openerp.web_mobile.ListView(this, "oe_list", res_id); + this.listview = new openerp.web_mobile.ListView(this, res_id); // this.header.start(); - this.listview.start(); + this.listview.appendTo($("#oe_list")); jQuery("#oe_header").find("h1").html($shortcut.data('name')); } }); @@ -252,8 +252,8 @@ openerp.web_mobile.Secondary = openerp.web.Widget.extend({ var $menu = $(ev.currentTarget); id = $menu.data('menu'); if (id) { - this.listview = new openerp.web_mobile.ListView(this, "oe_list", id); - this.listview.start(); + this.listview = new openerp.web_mobile.ListView(this, id); + this.listview.appendTo("#oe_list"); } jQuery("#oe_header").find("h1").html($menu.data('name')); } diff --git a/openerp-web.py b/openerp-web.py index f822a389642..19fb5cd84b4 100755 --- a/openerp-web.py +++ b/openerp-web.py @@ -37,6 +37,9 @@ 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") +optparser.add_option('--multi-threaded', dest='threaded', + default=False, action='store_true', + help="Use multiple threads to handle requests") import web.common.dispatch @@ -55,5 +58,5 @@ if __name__ == "__main__": werkzeug.serving.run_simple( '0.0.0.0', options.socket_port, app, - use_reloader=options.reloader, threaded=True) + use_reloader=options.reloader, threaded=options.threaded)