diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py
index 6dfbdba0bf9..561086d646d 100644
--- a/addons/base/controllers/main.py
+++ b/addons/base/controllers/main.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-import base64
-import glob, os, re
+
+import base64, glob, os, re
from xml.etree import ElementTree
from cStringIO import StringIO
@@ -59,70 +59,20 @@ class Xml2Json:
class DatabaseCreationError(Exception): pass
class DatabaseCreationCrash(DatabaseCreationError): pass
-class Session(openerpweb.Controller):
- _cp_path = "/base/session"
-
- def manifest_glob(self, addons, key):
- files = []
- for addon in addons:
- globlist = openerpweb.addons_manifest.get(addon, {}).get(key, [])
-
- files.extend([
- resource_path[len(openerpweb.path_addons):]
- for pattern in globlist
- for resource_path in glob.glob(os.path.join(
- openerpweb.path_addons, addon, pattern))
- ])
- return files
-
- def concat_files(self, file_list):
- """ Concatenate file content
- return (concat,timestamp)
- concat: concatenation of file content
- timestamp: max(os.path.getmtime of file_list)
- """
- root = openerpweb.path_root
- files_content = []
- files_timestamp = 0
- for i in file_list:
- fname = os.path.join(root, i)
- ftime = os.path.getmtime(fname)
- if ftime > files_timestamp:
- files_timestamp = ftime
- files_content = open(fname).read()
- files_concat = "".join(files_content)
- return files_concat
-
- @openerpweb.jsonrequest
- def login(self, req, db, login, password):
- req.session.login(db, login, password)
-
- return {
- "session_id": req.session_id,
- "uid": req.session._uid,
- }
-
- @openerpweb.jsonrequest
- def sc_list(self, req):
- return req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu",
- req.session.eval_context(req.context))
+class Database(openerpweb.Controller):
+ _cp_path = "/base/database"
@openerpweb.jsonrequest
def get_databases_list(self, req):
proxy = req.session.proxy("db")
dbs = proxy.list()
-
+ h = req.httprequest.headers['Host'].split(':')[0]
+ d = h.split(':')[0]
+ r = cherrypy.config['openerp.dbfilter'].replace('%h',h).replace('%d',d)
+ print "h,d",h,d,r
+ dbs = [i for i in dbs if re.match(r,i)]
return {"db_list": dbs}
- @openerpweb.jsonrequest
- def get_lang_list(self, req):
- lang_list = [('en_US', 'English (US)')]
- try:
- lang_list = lang_list + (req.session.proxy("db").list_lang() or [])
- except Exception, e:
- pass
- return {"lang_list": lang_list}
-
@openerpweb.jsonrequest
def db_operation(self, req, flag, **kw):
@@ -216,6 +166,63 @@ class Session(openerpweb.Controller):
return {'error': 'Bad super admin password !', 'title': 'Change Password'}
else:
return {'error': 'Error, password not changed !', 'title': 'Change Password'}
+
+class Session(openerpweb.Controller):
+ _cp_path = "/base/session"
+
+ def manifest_glob(self, addons, key):
+ files = []
+ for addon in addons:
+ globlist = openerpweb.addons_manifest.get(addon, {}).get(key, [])
+
+ files.extend([
+ resource_path[len(openerpweb.path_addons):]
+ for pattern in globlist
+ for resource_path in glob.glob(os.path.join(
+ openerpweb.path_addons, addon, pattern))
+ ])
+ return files
+
+ def concat_files(self, file_list):
+ """ Concatenate file content
+ return (concat,timestamp)
+ concat: concatenation of file content
+ timestamp: max(os.path.getmtime of file_list)
+ """
+ root = openerpweb.path_root
+ files_content = []
+ files_timestamp = 0
+ for i in file_list:
+ fname = os.path.join(root, i)
+ ftime = os.path.getmtime(fname)
+ if ftime > files_timestamp:
+ files_timestamp = ftime
+ files_content = open(fname).read()
+ files_concat = "".join(files_content)
+ return files_concat
+
+ @openerpweb.jsonrequest
+ def login(self, req, db, login, password):
+ req.session.login(db, login, password)
+
+ return {
+ "session_id": req.session_id,
+ "uid": req.session._uid,
+ }
+
+ @openerpweb.jsonrequest
+ def sc_list(self, req):
+ return req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu",
+ req.session.eval_context(req.context))
+
+ @openerpweb.jsonrequest
+ def get_lang_list(self, req):
+ lang_list = [('en_US', 'English (US)')]
+ try:
+ lang_list = lang_list + (req.session.proxy("db").list_lang() or [])
+ except Exception, e:
+ pass
+ return {"lang_list": lang_list}
@openerpweb.jsonrequest
def modules(self, req):
@@ -337,14 +344,14 @@ class Session(openerpweb.Controller):
if not saved_actions:
return None
return saved_actions["actions"].get(key)
-
+
def eval_context_and_domain(session, context, domain=None):
e_context = session.eval_context(context)
# should we give the evaluated context as an evaluation context to the domain?
e_domain = session.eval_domain(domain or [])
return e_context, e_domain
-
+
def load_actions_from_ir_values(req, key, key2, models, meta, context):
Values = req.session.model('ir.values')
actions = Values.get(key, key2, models, meta, context)
@@ -408,7 +415,6 @@ def generate_views(action):
return
action['views'] = [(view_id, view_modes[0])]
-
def fix_view_modes(action):
""" For historical reasons, OpenERP has weird dealings in relation to
view_mode and the view_type attribute (on window actions):
@@ -652,7 +658,7 @@ class View(openerpweb.Controller):
# todo fme?: check that we should pass the evaluated context here
self.process_view(request.session, fvg, context, transform)
return fvg
-
+
def process_view(self, session, fvg, context, transform):
# depending on how it feels, xmlrpclib.ServerProxy can translate
# XML-RPC strings to ``str`` or ``unicode``. ElementTree does not
@@ -916,3 +922,5 @@ class Action(openerpweb.Controller):
def run(self, req, action_id):
return clean_action(req.session.model('ir.actions.server').run(
[action_id], req.session.eval_context(req.context)), req.session)
+
+#
diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js
index 934868651de..7ca2348c112 100644
--- a/addons/base/static/src/js/chrome.js
+++ b/addons/base/static/src/js/chrome.js
@@ -923,7 +923,7 @@ openerp.base.Database = openerp.base.Controller.extend({
var self = this;
- this.rpc("/base/session/get_databases_list", {}, function(result) {
+ this.rpc("/base/database/get_databases_list", {}, function(result) {
self.db_list = result.db_list;
});
@@ -974,7 +974,7 @@ openerp.base.Database = openerp.base.Controller.extend({
else
demo_data = 'False';
- self.rpc("/base/session/db_operation", {
+ self.rpc("/base/database/db_operation", {
'flag': 'create',
'super_admin_pwd': super_admin_pwd,
'db': db,
@@ -1016,7 +1016,7 @@ openerp.base.Database = openerp.base.Controller.extend({
var password = self.$option_id.find("input[name=drop_pwd]").val();
if (confirm("Do you really want to delete the database: " + db + " ?")) {
- self.rpc("/base/session/db_operation", {'flag': 'drop', 'db': db, 'password': password},
+ self.rpc("/base/database/db_operation", {'flag': 'drop', 'db': db, 'password': password},
function(result) {
if (result && ! result.error) {
self.$option_id.find("select[name=drop_db] :selected").remove();
@@ -1051,7 +1051,7 @@ openerp.base.Database = openerp.base.Controller.extend({
var db = self.$option_id.find("select[name=backup_db]").val();
var password = self.$option_id.find("input[name=backup_pwd]").val();
- self.rpc("/base/session/db_operation", {'flag': 'backup', 'db': db, 'password': password},
+ self.rpc("/base/database/db_operation", {'flag': 'backup', 'db': db, 'password': password},
function(result) {
if (result && !result.error) {
self.notification.notify("Backup Database", "Backup has been created for the database: '" + db + "'");
@@ -1085,7 +1085,7 @@ openerp.base.Database = openerp.base.Controller.extend({
var password = self.$option_id.find("input[name=restore_pwd]").val();
var new_db = self.$option_id.find("input[name=new_db]").val();
- self.rpc("/base/session/db_operation", {'flag': 'restore', 'db': db, 'password': password, 'new_db': new_db},
+ self.rpc("/base/database/db_operation", {'flag': 'restore', 'db': db, 'password': password, 'new_db': new_db},
function(result) {
if (result && !result.error) {
self.notification.notify("Restore Database", "You restored your database as: '" + new_db + "'");
@@ -1140,7 +1140,7 @@ openerp.base.Database = openerp.base.Controller.extend({
var new_pwd = self.$option_id.find("input[name=new_pwd]").val();
var confirm_pwd = self.$option_id.find("input[name=confirm_pwd]").val();
- self.rpc("/base/session/db_operation", {'flag': 'change_password', 'old_password': old_pwd, 'new_password': new_pwd, 'confirm_password': confirm_pwd},
+ self.rpc("/base/database/db_operation", {'flag': 'change_password', 'old_password': old_pwd, 'new_password': new_pwd, 'confirm_password': confirm_pwd},
function(result) {
if (result && !result.error) {
self.notification.notify("Changed Password", "Password has been changed successfully");
@@ -1183,7 +1183,7 @@ openerp.base.Login = openerp.base.Controller.extend({
},
start: function() {
var self = this;
- this.rpc("/base/session/get_databases_list", {}, function(result) {
+ this.rpc("/base/database/get_databases_list", {}, function(result) {
self.db_list = result.db_list;
self.display();
}, function() {
diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js
index 534fd356f06..a49e6cf901f 100644
--- a/addons/base/static/src/js/data.js
+++ b/addons/base/static/src/js/data.js
@@ -584,12 +584,12 @@ openerp.base.ReadOnlyDataSetSearch = openerp.base.DataSetSearch.extend({
},
on_create: function(data) {},
write: function (id, data, callback) {
- this.on_write(id);
+ this.on_write(id, data);
var to_return = $.Deferred().then(callback);
setTimeout(function () {to_return.resolve({"result": true});}, 0);
return to_return.promise();
},
- on_write: function(id) {},
+ on_write: function(id, data) {},
unlink: function(ids, callback, error_callback) {
this.on_unlink(ids);
var to_return = $.Deferred().then(callback);
diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js
index 7faa942c6b0..59b1e07e8e4 100644
--- a/addons/base/static/src/js/form.js
+++ b/addons/base/static/src/js/form.js
@@ -1267,13 +1267,10 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({
if (!self.value) {
return;
}
- self.session.action_manager.do_action({
- "res_model": self.field.relation,
- "views":[[false,"form"]],
- "res_id": self.value[0],
- "type":"ir.actions.act_window",
- "target":"new",
- "context": self.build_context()
+ var pop = new openerp.base.form.FormOpenPopup(null, self.view.session);
+ pop.show_element(self.field.relation, self.value[0],self.build_context(), {});
+ pop.on_write_completed.add_last(function() {
+ self.set_value(self.value[0]);
});
};
var cmenu = this.$menu_btn.contextMenu(this.cm_id, {'leftClickToo': true,
@@ -1788,15 +1785,11 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({
});
},
do_activate_record: function(index, id) {
- this.m2m_field.view.session.action_manager.do_action({
- "res_model": this.dataset.model,
- "views": [[false,"form"]],
- "res_id": id,
- "type": "ir.actions.act_window",
- "view_type": "form",
- "view_mode": "form",
- "target": "new",
- "context": this.m2m_field.build_context()
+ var self = this;
+ var pop = new openerp.base.form.FormOpenPopup(null, this.m2m_field.view.session);
+ pop.show_element(this.dataset.model, id, this.m2m_field.build_context(), {});
+ pop.on_write_completed.add_last(function() {
+ self.reload_content();
});
}
});
@@ -1885,7 +1878,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({
return;
var self = this;
var wdataset = new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain);
- wdataset = this.options.parent_view;
+ wdataset.parent_view = this.options.parent_view;
wdataset.create(data, function(r) {
self.on_select_elements([r.result]);
});
@@ -1945,6 +1938,72 @@ openerp.base.form.SelectCreateListView = openerp.base.ListView.extend({
}
});
+openerp.base.form.FormOpenPopup = openerp.base.BaseWidget.extend({
+ identifier_prefix: "formopenpopup",
+ template: "FormOpenPopup",
+ /**
+ * options:
+ * - alternative_form_view
+ * - auto_write (default true)
+ * - parent_view
+ */
+ show_element: function(model, row_id, context, options) {
+ this.model = model;
+ this.row_id = row_id;
+ this.context = context || {};
+ this.options = _.defaults(options || {}, {"auto_write": true});
+ jQuery(this.render()).dialog({title: '',
+ modal: true,
+ width: 960,
+ height: 600});
+ this.start();
+ },
+ start: function() {
+ this._super();
+ this.dataset = new openerp.base.ReadOnlyDataSetSearch(this.session, this.model,
+ this.context);
+ this.dataset.ids = [this.row_id];
+ this.dataset.index = 0;
+ this.dataset.parent_view = this.options.parent_view;
+ this.setup_form_view();
+ },
+ on_write: function(id, data) {
+ if (!this.options.auto_write)
+ return;
+ var self = this;
+ var wdataset = new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain);
+ wdataset.parent_view = this.options.parent_view;
+ wdataset.write(id, data, function(r) {
+ self.stop();
+ self.on_write_completed();
+ });
+ },
+ on_write_completed: function() {},
+ setup_form_view: function() {
+ var self = this;
+ this.view_form = new openerp.base.FormView(null, this.session,
+ this.element_id + "_view_form", 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.on_loaded.add_last(function() {
+ var $buttons = self.view_form.$element.find(".oe_form_buttons");
+ $buttons.html(QWeb.render("FormOpenPopup.form.buttons"));
+ var $nbutton = $buttons.find(".oe_formopenpopup-form-save");
+ $nbutton.click(function() {
+ self.view_form.do_save();
+ });
+ var $cbutton = $buttons.find(".oe_formopenpopup-form-close");
+ $cbutton.click(function() {
+ self.stop();
+ });
+ self.view_form.do_show();
+ });
+ this.dataset.on_write.add(this.on_write);
+ }
+});
+
openerp.base.form.FieldReference = openerp.base.form.Field.extend({
init: function(view, node) {
this._super(view, node);
diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml
index 035332d2961..9651227c804 100644
--- a/addons/base/static/src/xml/base.xml
+++ b/addons/base/static/src/xml/base.xml
@@ -1093,7 +1093,15 @@
-
+
+
+
+
+
+
+
$(document.createElement('t'))
diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js
index fe52f1affd9..1e0a8d22a80 100644
--- a/addons/base_dashboard/static/src/js/dashboard.js
+++ b/addons/base_dashboard/static/src/js/dashboard.js
@@ -226,9 +226,8 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
action_buttons : false,
pager: false
};
- new openerp.base.ActionManager(
- this.session, this.view.element_id + '_action_' + action.id)
- .do_action(action);
+ new openerp.base.ViewManagerAction(this.session,
+ this.view.element_id + '_action_' + action.id, action).start();
},
render: function() {
// We should start with three columns available
diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py
index f567cf1b812..ee75ac0b1f9 100644
--- a/openerpweb/openerpweb.py
+++ b/openerpweb/openerpweb.py
@@ -270,6 +270,9 @@ class JsonRequest(object):
self.request = request
self.params = request.get("params", {})
self.applicationsession = applicationsession
+ self.httprequest = cherrypy.request
+ self.httpresponse = cherrypy.response
+ self.httpsession = cherrypy.session
self.httpsession_id = "cookieid"
self.httpsession = cherrypy.session
self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex
@@ -454,22 +457,19 @@ def main(argv):
os.environ["TZ"] = "UTC"
DEFAULT_CONFIG = {
- 'openerp.server.host': '127.0.0.1',
- 'openerp.server.port': 8069,
- 'server.socket_port': 8002,
'server.socket_host': '0.0.0.0',
'tools.sessions.on': True,
'tools.sessions.storage_type': 'file',
- 'tools.sessions.storage_path': os.path.join(tempfile.gettempdir(), "cpsessions"),
'tools.sessions.timeout': 60
}
# Parse config
op = optparse.OptionParser()
- op.add_option("-p", "--port", dest="server.socket_port", help="listening port", type="int", metavar="NUMBER")
- op.add_option("-s", "--session-path", dest="tools.sessions.storage_path", help="directory used for session storage", metavar="DIR")
- op.add_option("--server-host", dest="openerp.server.host", help="OpenERP server hostname", metavar="HOST")
- op.add_option("--server-port", dest="openerp.server.port", help="OpenERP server port", type="int", metavar="NUMBER")
+ op.add_option("-p", "--port", dest="server.socket_port", default=8002, help="listening port", type="int", metavar="NUMBER")
+ op.add_option("-s", "--session-path", dest="tools.sessions.storage_path", default=os.path.join(tempfile.gettempdir(), "cpsessions"), help="directory used for session storage", metavar="DIR")
+ op.add_option("--server-host", dest="openerp.server.host", default='127.0.0.1', help="OpenERP server hostname", metavar="HOST")
+ op.add_option("--server-port", dest="openerp.server.port", default=8069, help="OpenERP server port", type="int", metavar="NUMBER")
+ op.add_option("--db-filter", dest="openerp.dbfilter", default='.*', help="Filter listed database", metavar="REGEXP")
(o, args) = op.parse_args(argv[1:])
o = vars(o)
for k in o.keys():
@@ -480,8 +480,8 @@ def main(argv):
cherrypy.tree.mount(Root())
cherrypy.config.update(config=DEFAULT_CONFIG)
- if os.path.exists(os.path.join(os.path.dirname( os.path.dirname(__file__)),'openerp-web.cfg')):
- cherrypy.config.update(os.path.join(os.path.dirname( os.path.dirname(__file__)),'openerp-web.cfg'))
+ if os.path.exists(os.path.join(path_root,'openerp-web.cfg')):
+ cherrypy.config.update(os.path.join(path_root,'openerp-web.cfg'))
if os.path.exists(os.path.expanduser('~/.openerp_webrc')):
cherrypy.config.update(os.path.expanduser('~/.openerp_webrc'))
cherrypy.config.update(o)