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)