[MERGE] Merge With trunk upto revision no 1054.

bzr revid: ysa@tinyerp.com-20110919051426-lopfi9crlu90yzla
This commit is contained in:
Yogesh (OpenERP) 2011-09-19 10:44:26 +05:30
commit afdb618365
20 changed files with 204 additions and 105 deletions

View File

@ -5,8 +5,7 @@ import logging
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
def wsgi_postload():
try:
import openerp.wsgi import openerp.wsgi
import os import os
import tempfile import tempfile
@ -24,9 +23,6 @@ try:
#import openerp.wsgi #import openerp.wsgi
openerp.wsgi.register_wsgi_handler(app) openerp.wsgi.register_wsgi_handler(app)
except ImportError:
_logger.info("standalone mode")
# TODO # TODO
# if we detect that we are imported from the openerp server register common.Root() as a wsgi entry point # if we detect that we are imported from the openerp server register common.Root() as a wsgi entry point

View File

@ -45,5 +45,5 @@
"static/src/css/base.css", "static/src/css/base.css",
"static/src/css/data_export.css", "static/src/css/data_export.css",
], ],
'wsgi' : 'app', 'post_load' : 'wsgi_postload',
} }

View File

@ -43,30 +43,30 @@ class OpenERPSession(object):
def build_connection(self): def build_connection(self):
return openerplib.get_connection(hostname=self._server, port=self._port, 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) user_id=self._uid, password=self._password)
def proxy(self, service): def proxy(self, service):
return self.build_connection().get_service(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._db = db
self._uid = uid self._uid = uid
self._login = login
self._password = password self._password = password
def login(self, db, login, password): def login(self, db, login, password):
uid = self.proxy('common').login(db, login, password) uid = self.proxy('common').login(db, login, password)
self.bind(db, uid, password) self.bind(db, uid, login, password)
self._login = login
if uid: self.get_context() if uid: self.get_context()
return uid return uid
def assert_valid(self): def assert_valid(self, force=False):
""" """
Ensures this session is valid (logged into the openerp server) 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): def execute(self, model, func, *l, **d):
self.assert_valid() self.assert_valid()

View File

@ -301,6 +301,7 @@ class Session(openerpweb.Controller):
} }
@openerpweb.jsonrequest @openerpweb.jsonrequest
def get_session_info(self, req): def get_session_info(self, req):
req.session.assert_valid(force=True)
return { return {
"uid": req.session._uid, "uid": req.session._uid,
"context": req.session.get_context() if req.session._uid else False, "context": req.session.get_context() if req.session._uid else False,

View File

@ -501,6 +501,8 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web
self.on_session_valid(); self.on_session_valid();
else else
self.on_session_invalid(); 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# */{ 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 * The name of the QWeb template that will be used for rendering. Must be

View File

@ -2,6 +2,7 @@ openerp.web.search = function(openerp) {
var QWeb = openerp.web.qweb; var QWeb = openerp.web.qweb;
openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.SearchView# */{ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.SearchView# */{
template: "EmptyComponent",
/** /**
* @constructs openerp.web.SearchView * @constructs openerp.web.SearchView
* @extends openerp.web.Widget * @extends openerp.web.Widget
@ -12,8 +13,8 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search
* @param view_id * @param view_id
* @param defaults * @param defaults
*/ */
init: function(parent, element_id, dataset, view_id, defaults) { init: function(parent, dataset, view_id, defaults) {
this._super(parent, element_id); this._super(parent);
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; this.model = dataset.model;
this.view_id = view_id; this.view_id = view_id;
@ -28,6 +29,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search
this.ready = $.Deferred(); this.ready = $.Deferred();
}, },
start: function() { start: function() {
this._super();
this.rpc("/web/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded); this.rpc("/web/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded);
return this.ready.promise(); 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<openerp.web.search.Filter>} 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) { openerp.web.search.add_expand_listener = function($root) {
$root.find('a.searchview_group_string').click(function (e) { $root.find('a.searchview_group_string').click(function (e) {
$root.toggleClass('folded expanded'); $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); "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<openerp.web.search.Filter>} 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# */{ openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.web.search.Filter# */{
template: 'SearchView.filter', template: 'SearchView.filter',
/** /**
@ -586,12 +607,11 @@ openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.w
} }
return this.attrs.context; return this.attrs.context;
}, },
get_domain: function () { /**
if (!this.is_enabled()) { * Does not return anything: filter domain is handled at the FilterGroup
return; * level
} */
return this.attrs.domain; get_domain: function () { }
}
}); });
openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.web.search.Field# */ { openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.web.search.Field# */ {
template: 'SearchView.field', template: 'SearchView.field',

View File

@ -10,20 +10,19 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
* view should be displayed (if there is one active). * view should be displayed (if there is one active).
*/ */
searchable: false, searchable: false,
template: "FormView", form_template: "FormView",
/** /**
* @constructs openerp.web.FormView * @constructs openerp.web.FormView
* @extends openerp.web.View * @extends openerp.web.View
* *
* @param {openerp.web.Session} session the current openerp session * @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 {openerp.web.DataSet} dataset the dataset this view will work with
* @param {String} view_id the identifier of the OpenERP view object * @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 * @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) { init: function(parent, dataset, view_id, options) {
this._super(parent, element_id); this._super(parent);
this.set_default_options(options); this.set_default_options(options);
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; 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}); _.defaults(this.options, {"always_show_new_button": true});
}, },
start: function() { start: function() {
this._super();
return this.init_view();
},
init_view: function() {
if (this.embedded_view) { if (this.embedded_view) {
var def = $.Deferred().then(this.on_loaded); var def = $.Deferred().then(this.on_loaded);
var self = this; var self = this;
@ -75,7 +78,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
this.fields_view = data; this.fields_view = data;
var frame = new (this.registry.get_object('frame'))(this, this.fields_view.arch); 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) { _.each(this.widgets, function(w) {
w.start(); w.start();
}); });
@ -399,7 +402,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
if (!r.result) { if (!r.result) {
// should not happen in the server, but may happen for internal purpose // should not happen in the server, but may happen for internal purpose
} else { } else {
console.debug(_.sprintf("The record #%s has been saved.", this.datarecord.id));
if (success) { if (success) {
success(r); success(r);
} }
@ -480,11 +482,11 @@ openerp.web.FormDialog = openerp.web.Dialog.extend({
}, },
start: function() { start: function() {
this._super(); 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, sidebar: false,
pager: 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_created.add_last(this.on_form_dialog_saved);
this.form.on_saved.add_last(this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved);
return this; return this;
@ -829,7 +831,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({
}, },
on_click: function(saved) { on_click: function(saved) {
var self = this; 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() { this.view.do_save(function() {
self.on_click(true); self.on_click(true);
}); });
@ -2022,7 +2024,7 @@ openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({
self.on_ui_change(); 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', 'addable': 'Add',
'selectable': self.multi_selection 'selectable': self.multi_selection
}); });
@ -2031,7 +2033,7 @@ openerp.web.form.FieldMany2Many = openerp.web.form.Field.extend({
self.is_started.resolve(); self.is_started.resolve();
}); });
setTimeout(function () { setTimeout(function () {
self.list_view.start(); self.list_view.appendTo($("#" + self.list_id));
}, 0); }, 0);
}, },
set_value: function(value) { set_value: function(value) {
@ -2141,7 +2143,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
this.searchview.stop(); this.searchview.stop();
} }
this.searchview = new openerp.web.SearchView(this, this.searchview = new openerp.web.SearchView(this,
this.element_id + "_search", this.dataset, false, { this.dataset, false, {
"selectable": !this.options.disable_multiple_selection, "selectable": !this.options.disable_multiple_selection,
"deletable": false "deletable": false
}); });
@ -2170,15 +2172,17 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
self.stop(); self.stop();
}); });
self.view_list = new openerp.web.form.SelectCreateListView(self, self.view_list = new openerp.web.form.SelectCreateListView(self,
self.element_id + "_view_list", self.dataset, false, self.dataset, false,
{'deletable': false}); {'deletable': false});
self.view_list.popup = self; self.view_list.popup = self;
self.view_list.do_show(); self.view_list.appendTo($("#" + self.element_id + "_view_list")).pipe(function() {
self.view_list.start().then(function() { self.view_list.do_show();
}).pipe(function() {
self.searchview.do_search(); self.searchview.do_search();
}); });
}); });
this.searchview.start(); this.searchview.appendTo($("#" + this.element_id + "_search"));
}, },
create_row: function(data) { create_row: function(data) {
var self = this; var self = this;
@ -2205,11 +2209,11 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
this.view_list.$element.hide(); this.view_list.$element.hide();
} }
this.dataset.index = null; 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) { if (this.options.alternative_form_view) {
this.view_form.set_embedded_view(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() { this.view_form.on_loaded.add_last(function() {
var $buttons = self.view_form.$element.find(".oe_form_buttons"); var $buttons = self.view_form.$element.find(".oe_form_buttons");
$buttons.html(QWeb.render("SelectCreatePopup.form.buttons", {widget:self})); $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() {}, on_write_completed: function() {},
setup_form_view: function() { setup_form_view: function() {
var self = this; 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) { if (this.options.alternative_form_view) {
this.view_form.set_embedded_view(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() { this.view_form.on_loaded.add_last(function() {
var $buttons = self.view_form.$element.find(".oe_form_buttons"); var $buttons = self.view_form.$element.find(".oe_form_buttons");
$buttons.html(QWeb.render("FormOpenPopup.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({ openerp.web.form.FieldStatus = openerp.web.form.Field.extend({
template: "FieldStatus", template: "EmptyComponent",
start: function() { start: function() {
this._super(); this._super();
this.selected_value = null; this.selected_value = null;

View File

@ -31,7 +31,6 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
* @extends openerp.web.View * @extends openerp.web.View
* *
* @param parent parent object * @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 {openerp.web.DataSet} dataset the dataset the view should work with
* @param {String} view_id the listview's identifier, if any * @param {String} view_id the listview's identifier, if any
* @param {Object} options A set of options used to configure the view * @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.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 * @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; var self = this;
this._super(parent, element_id); this._super(parent);
this.set_default_options(_.extend({}, this.defaults, options || {})); this.set_default_options(_.extend({}, this.defaults, options || {}));
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; this.model = dataset.model;
@ -128,6 +127,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
* @returns {$.Deferred} loading promise * @returns {$.Deferred} loading promise
*/ */
start: function() { start: function() {
this._super();
this.$element.addClass('oe-listview'); this.$element.addClass('oe-listview');
return this.reload_view(null, null, true); return this.reload_view(null, null, true);
}, },

View File

@ -180,11 +180,11 @@ openerp.web.list_editable = function (openerp) {
} }
self.edition = true; self.edition = true;
self.edition_id = record_id; self.edition_id = record_id;
self.edition_form = _.extend(new openerp.web.FormView( self.edition_form = _.extend(new openerp.web.ListEditableFormView(self, self.dataset, false), {
self, $new_row.attr('id'), self.dataset, false), { form_template: 'ListView.row.form',
template: 'ListView.row.form',
registry: openerp.web.list.form.widgets 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 () { $.when(self.edition_form.on_loaded(self.get_form_fields_view())).then(function () {
// put in $.when just in case FormView.on_loaded becomes asynchronous // put in $.when just in case FormView.on_loaded becomes asynchronous
$new_row.find('td') $new_row.find('td')
@ -333,4 +333,8 @@ openerp.web.list_editable = function (openerp) {
}); });
list_form_widgets.add(key, new_path); list_form_widgets.add(key, new_path);
}); });
openerp.web.ListEditableFormView = openerp.web.FormView.extend({
init_view: function() {}
});
}; };

View File

@ -19,13 +19,12 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView#
* @extends openerp.web.View * @extends openerp.web.View
* *
* @param parent * @param parent
* @param element_id
* @param dataset * @param dataset
* @param view_id * @param view_id
* @param options * @param options
*/ */
init: function(parent, element_id, dataset, view_id, options) { init: function(parent, dataset, view_id, options) {
this._super(parent, element_id); this._super(parent);
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; this.model = dataset.model;
this.view_id = view_id; this.view_id = view_id;

View File

@ -133,11 +133,19 @@ db.web.ActionManager = db.web.Widget.extend({
(this.client_widget = new ClientWidget(this, action.params)).appendTo(this); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this);
}, },
ir_actions_report_xml: function(action) { ir_actions_report_xml: function(action) {
var self = this;
$.blockUI(); $.blockUI();
this.session.get_file({ self.rpc("/web/session/eval_domain_and_context", {
url: '/web/report', contexts: [action.context],
data: {action: JSON.stringify(action)}, domains: []
complete: $.unblockUI }).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) { if (!view.controller) {
// Lazy loading of views // Lazy loading of views
var controllerclass = this.registry.get_object(view_type); var controllerclass = this.registry.get_object(view_type);
var controller = new controllerclass(this, this.element_id + '_view_' + view_type, var controller = new controllerclass(this, this.dataset, view.view_id, view.options);
this.dataset, view.view_id, view.options);
if (view.embedded_view) { if (view.embedded_view) {
controller.set_embedded_view(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 unique: true
}); });
} }
view_promise = controller.start(); var container = $("#" + this.element_id + '_view_' + view_type);
view_promise = controller.appendTo(container);
$.when(view_promise).then(function() { $.when(view_promise).then(function() {
self.on_controller_inited(view_type, controller); 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.stop();
} }
this.searchview = new db.web.SearchView( this.searchview = new db.web.SearchView(
this, this.element_id + "_search", this.dataset, this, this.dataset,
view_id, search_defaults); view_id, search_defaults);
this.searchview.on_search.add(function(domains, contexts, groupbys) { this.searchview.on_search.add(function(domains, contexts, groupbys) {
var controller = self.views[self.active_view].controller; var controller = self.views[self.active_view].controller;
controller.do_search.call(controller, domains, contexts, groupbys); 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 * 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# */{ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
template: "EmptyComponent",
set_default_options: function(options) { set_default_options: function(options) {
this.options = options || {}; this.options = options || {};
_.defaults(this.options, { _.defaults(this.options, {

View File

@ -1412,9 +1412,6 @@
</p> </p>
</div> </div>
</t> </t>
<t t-name="FieldStatus">
<div t-att-id="widget.element_id"></div>
</t>
<t t-name="FieldStatus.content"> <t t-name="FieldStatus.content">
<ul class="oe-arrow-list"> <ul class="oe-arrow-list">
<t t-set="size" t-value="widget.to_show.length"/> <t t-set="size" t-value="widget.to_show.length"/>
@ -1425,4 +1422,7 @@
</t> </t>
</ul> </ul>
</t> </t>
<t t-name="EmptyComponent">
<div></div>
</t>
</templates> </templates>

View File

@ -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.views.add('calendar', 'openerp.web_calendar.CalendarView');
openerp.web_calendar.CalendarView = openerp.web.View.extend({ openerp.web_calendar.CalendarView = openerp.web.View.extend({
// Dhtmlx scheduler ? // Dhtmlx scheduler ?
init: function(parent, element_id, dataset, view_id, options) { init: function(parent, dataset, view_id, options) {
this._super(parent, element_id); this._super(parent);
this.set_default_options(options); this.set_default_options(options);
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; this.model = dataset.model;
@ -30,6 +30,7 @@ openerp.web_calendar.CalendarView = openerp.web.View.extend({
this.color_map = {}; this.color_map = {};
}, },
start: function() { 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); this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type":"calendar", 'toolbar': true}, this.on_loaded);
}, },
stop: function() { stop: function() {
@ -344,11 +345,11 @@ openerp.web_calendar.CalendarFormDialog = openerp.web.Dialog.extend({
}, },
start: function() { start: function() {
this._super(); 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, sidebar: false,
pager: 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_created.add_last(this.on_form_dialog_saved);
this.form.on_saved.add_last(this.on_form_dialog_saved); this.form.on_saved.add_last(this.on_form_dialog_saved);
}, },

View File

@ -288,13 +288,14 @@ if (!openerp.web_dashboard) {
} }
openerp.web_dashboard.ConfigOverview = openerp.web.View.extend({ openerp.web_dashboard.ConfigOverview = openerp.web.View.extend({
template: 'ConfigOverview', template: 'ConfigOverview',
init: function (parent, element_id) { init: function (parent) {
this._super(parent, element_id); this._super(parent);
this.dataset = new openerp.web.DataSetSearch( this.dataset = new openerp.web.DataSetSearch(
this, 'ir.actions.todo'); this, 'ir.actions.todo');
this.dataset.domain = [['type', '=', 'manual']]; this.dataset.domain = [['type', '=', 'manual']];
}, },
start: function () { start: function () {
this._super();
$.when(this.dataset.read_slice(['state', 'action_id', 'category_id']), $.when(this.dataset.read_slice(['state', 'action_id', 'category_id']),
this.dataset.call('progress')) this.dataset.call('progress'))
.then(this.on_records_loaded); .then(this.on_records_loaded);
@ -352,6 +353,7 @@ openerp.web.client_actions.add(
openerp.web_dashboard.ApplicationTiles = openerp.web.View.extend({ openerp.web_dashboard.ApplicationTiles = openerp.web.View.extend({
template: 'ApplicationTiles', template: 'ApplicationTiles',
start: function () { start: function () {
this._super();
var self = this; var self = this;
return new openerp.web.DataSetSearch( return new openerp.web.DataSetSearch(
this, 'ir.ui.menu', null, [['parent_id', '=', false]]) 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; this.widget_id = options.widget_id;
}, },
start: function () { start: function () {
this._super();
return new openerp.web.DataSet(this, 'res.widget').read_ids( return new openerp.web.DataSet(this, 'res.widget').read_ids(
[this.widget_id], ['title'], this.on_widget_loaded); [this.widget_id], ['title'], this.on_widget_loaded);
}, },

View File

@ -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.views.add('diagram', 'openerp.web.DiagramView');
openerp.web.DiagramView = openerp.web.View.extend({ openerp.web.DiagramView = openerp.web.View.extend({
searchable: false, searchable: false,
init: function(parent, element_id, dataset, view_id, options) { init: function(parent, dataset, view_id, options) {
this._super(parent, element_id); this._super(parent);
this.set_default_options(options); this.set_default_options(options);
this.view_manager = parent; this.view_manager = parent;
this.dataset = dataset; this.dataset = dataset;
@ -20,6 +20,7 @@ openerp.web.DiagramView = openerp.web.View.extend({
this.ids = this.dataset.ids; this.ids = this.dataset.ids;
}, },
start: function() { start: function() {
this._super();
return this.rpc("/web_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); return this.rpc("/web_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
}, },

View File

@ -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.views.add('gantt', 'openerp.web_gantt.GanttView');
openerp.web_gantt.GanttView = openerp.web.View.extend({ openerp.web_gantt.GanttView = openerp.web.View.extend({
init: function(parent, element_id, dataset, view_id) { init: function(parent, dataset, view_id) {
this._super(parent, element_id); this._super(parent);
this.view_manager = parent || new openerp.web.NullViewManager(); this.view_manager = parent || new openerp.web.NullViewManager();
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; this.model = dataset.model;
@ -32,6 +32,7 @@ init: function(parent, element_id, dataset, view_id) {
}, },
start: function() { start: function() {
this._super();
this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "gantt"}, this.on_loaded); this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "gantt"}, this.on_loaded);
}, },

View File

@ -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.views.add('graph', 'openerp.web_graph.GraphView');
openerp.web_graph.GraphView = openerp.web.View.extend({ openerp.web_graph.GraphView = openerp.web.View.extend({
init: function(parent, element_id, dataset, view_id) { init: function(parent, dataset, view_id) {
this._super(parent, element_id); this._super(parent);
this.view_manager = parent; this.view_manager = parent;
this.dataset = dataset; this.dataset = dataset;
this.dataset_index = 0; this.dataset_index = 0;
@ -33,6 +33,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
this.$element.hide(); this.$element.hide();
}, },
start: function() { start: function() {
this._super();
return this.rpc("/web_graph/graphview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); return this.rpc("/web_graph/graphview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
}, },
on_loaded: function(data) { on_loaded: function(data) {

View File

@ -4,8 +4,8 @@ var QWeb = openerp.web.qweb;
QWeb.add_template('/web_kanban/static/src/xml/web_kanban.xml'); QWeb.add_template('/web_kanban/static/src/xml/web_kanban.xml');
openerp.web.views.add('kanban', 'openerp.web_kanban.KanbanView'); openerp.web.views.add('kanban', 'openerp.web_kanban.KanbanView');
openerp.web_kanban.KanbanView = openerp.web.View.extend({ openerp.web_kanban.KanbanView = openerp.web.View.extend({
init: function (parent, element_id, dataset, view_id, options) { init: function (parent, dataset, view_id, options) {
this._super(parent, element_id); this._super(parent);
this.set_default_options(options); this.set_default_options(options);
this.dataset = dataset; this.dataset = dataset;
this.model = dataset.model; this.model = dataset.model;
@ -26,6 +26,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
} }
}, },
start: function() { start: function() {
this._super();
return this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "kanban"}, this.on_loaded); return this.rpc("/web/view/load", {"model": this.model, "view_id": this.view_id, "view_type": "kanban"}, this.on_loaded);
}, },
on_loaded: function(data) { on_loaded: function(data) {

View File

@ -131,9 +131,9 @@ openerp.web_mobile.Shortcuts = openerp.web.Widget.extend({
id = $shortcut.data('menu'); id = $shortcut.data('menu');
res_id = $shortcut.data('res'); res_id = $shortcut.data('res');
// this.header = new openerp.web_mobile.Header(this, "oe_header"); // 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.header.start();
this.listview.start(); this.listview.appendTo($("#oe_list"));
jQuery("#oe_header").find("h1").html($shortcut.data('name')); 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); var $menu = $(ev.currentTarget);
id = $menu.data('menu'); id = $menu.data('menu');
if (id) { if (id) {
this.listview = new openerp.web_mobile.ListView(this, "oe_list", id); this.listview = new openerp.web_mobile.ListView(this, id);
this.listview.start(); this.listview.appendTo("#oe_list");
} }
jQuery("#oe_header").find("h1").html($menu.data('name')); jQuery("#oe_header").find("h1").html($menu.data('name'));
} }

View File

@ -37,6 +37,9 @@ optparser.add_option("--log-level", dest="log_level",
default='debug', help="Log level", metavar="LOG_LEVEL") default='debug', help="Log level", metavar="LOG_LEVEL")
optparser.add_option("--log-config", dest="log_config", optparser.add_option("--log-config", dest="log_config",
default='', help="Log config file", metavar="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 import web.common.dispatch
@ -55,5 +58,5 @@ if __name__ == "__main__":
werkzeug.serving.run_simple( werkzeug.serving.run_simple(
'0.0.0.0', options.socket_port, app, '0.0.0.0', options.socket_port, app,
use_reloader=options.reloader, threaded=True) use_reloader=options.reloader, threaded=options.threaded)