[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__)
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

View File

@ -45,5 +45,5 @@
"static/src/css/base.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):
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()

View File

@ -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,

View File

@ -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

View File

@ -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<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) {
$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<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# */{
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',

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).
*/
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;

View File

@ -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);
},

View File

@ -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() {}
});
};

View File

@ -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;

View File

@ -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, {

View File

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

View File

@ -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);
},

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.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);
},

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_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);
},

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_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) {

View File

@ -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) {

View File

@ -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'));
}

View File

@ -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)