From 0fd884d234f3ee4969dc4265da1a1aecc320717f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 1 Aug 2011 15:12:54 +0200 Subject: [PATCH] [FIX] fully reimplement dumping a DB so that it works correctly * handler should be an httprequest, as we're returning a binary file (maybe we could use ajax with file API abd b64, but... not now) * use cookie-hack to know when the file is downloading (or is finished downloading, not sure which, not that it matters) so we can add some kind of UI signal bzr revid: xmo@openerp.com-20110801131254-ik4m8yyc526pz7rf --- addons/base/controllers/main.py | 20 +++++------ addons/base/static/src/js/chrome.js | 55 ++++++++++++++++++++--------- addons/base/static/src/xml/base.xml | 4 ++- 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 36575f504c7..6df4287e071 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -191,18 +191,16 @@ class Database(openerpweb.Controller): return {'error': e.faultCode, 'title': 'Drop Database'} return {'error': 'Could not drop database !', 'title': 'Drop Database'} - @openerpweb.jsonrequest - def backup_db(self, req, fields): - password, db = operator.itemgetter( - 'backup_pwd', 'backup_db')( - dict(map(operator.itemgetter('name', 'value'), fields))) - + @openerpweb.httprequest + def backup_db(self, req, backup_db, backup_pwd, token): try: - res = req.session.proxy("db").dump(password, db) - if res: - cherrypy.response.headers['Content-Type'] = "application/data" - cherrypy.response.headers['Content-Disposition'] = 'filename="' + db + '.dump"' - return base64.decodestring(res) + db_dump = base64.decodestring( + req.session.proxy("db").dump(backup_pwd, backup_db)) + cherrypy.response.headers['Content-Type'] = "application/octet-stream; charset=binary" + cherrypy.response.headers['Content-Disposition'] = 'attachment; filename="' + backup_db + '.dump"' + cherrypy.response.cookie['fileToken'] = token + cherrypy.response.cookie['fileToken']['path'] = '/' + return db_dump except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return {'error': e.faultCode, 'title': 'Backup Database'} diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 1c5f9f05e1f..cf3e9b1ef2b 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -787,30 +787,51 @@ openerp.base.Database = openerp.base.Controller.extend({ } }); }, - + + wait_for_file: function (token, cleanup) { + var cookie_name = 'fileToken', + cookie_length = cookie_name.length; + var timer = setInterval(function () { + var cookies = document.cookie.split(';'); + for(var i=0; i