From c326d6942ca25782fbdcc67f5df33ecb8c5f9f08 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 30 Aug 2011 13:02:04 +0200 Subject: [PATCH] [IMP] get export to work correctly with Session.get_file (so the user really downloads a file each time) bzr revid: xmo@openerp.com-20110830110204-lf3qi2r5ck8avcs9 --- addons/base/controllers/main.py | 23 +++++++++---- addons/base/static/src/js/core.js | 41 ++++++++++++++++++------ addons/base/static/src/js/data_export.js | 32 +++++++++--------- 3 files changed, 64 insertions(+), 32 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index a0da55eb868..e000affcf44 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -1112,7 +1112,7 @@ def export_xls(fieldnames, table): data = fp.read() fp.close() #return data.decode('ISO-8859-1') - return base64.b64encode(data) + return data class Export(View): _cp_path = "/base/export" @@ -1238,19 +1238,30 @@ class Export(View): return _fields return rec(fields) - @openerpweb.jsonrequest - def export_data(self, req, model, fields, ids, domain, import_compat=False, export_format="csv", context=None): + @openerpweb.httprequest + def export_data(self, req, data, token): + model, fields, ids, domain, import_compat, export_format = \ + operator.itemgetter('model', 'fields', 'ids', 'domain', + 'import_compat', 'export_format')( + simplejson.loads(data)) + context = req.session.eval_context(req.context) - modle_obj = req.session.model(model) - ids = ids or modle_obj.search(domain, context=context) + Model = req.session.model(model) + ids = ids or Model.search(domain, context=context) field = fields.keys() - result = modle_obj.export_data(ids, field , context).get('datas',[]) + result = Model.export_data(ids, field, context).get('datas',[]) if not import_compat: field = [val.strip() for val in fields.values()] + req.httpresponse.headers['Content-Disposition'] = \ + 'attachment; filename="%s.%s"' % (model, export_format) + req.httpresponse.cookie['fileToken'] = int(token) + req.httpresponse.cookie['fileToken']['path'] = '/' if export_format == 'xls': + req.httpresponse.headers['Content-Type'] = 'application/vnd.mx-excel' return export_xls(field, result) else: + req.httpresponse.headers['Content-Type'] = 'text/csv;charset=utf8' return export_csv(field, result) diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 48c05c60854..fab90427824 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -627,7 +627,9 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b * "known" type (e.g. text/plain, or for some browsers application/json * * @param {Object} options - * @param {HTMLFormElement} options.form the form to submit in order to fetch the file + * @param {String} [options.url] used to dynamically create a form + * @param {Object} [options.data] data to add to the form submission. If can be used without a form, in which case a form is created from scratch. Otherwise, added to form data + * @param {HTMLFormElement} [options.form] the form to submit in order to fetch the file * @param {Function} [options.success] callback in case of download success * @param {Function} [options.error] callback in case of request error, provided with the error body * @param {Function} [options.complete] called after both ``success`` and ``error` callbacks have executed @@ -640,25 +642,46 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b // http://geekswithblogs.net/GruffCode/archive/2010/10/28/detecting-the-file-download-dialog-in-the-browser.aspx var timer, token = new Date().getTime(), cookie_name = 'fileToken', cookie_length = cookie_name.length, - self = this, CHECK_INTERVAL = 100, id = _.uniqueId('get_file_frame'), - $token = $(''); + CHECK_INTERVAL = 1000, id = _.uniqueId('get_file_frame'), + remove_form = false; + + var $form, $form_data = $('
'); + var complete = function () { if (options.complete) { options.complete(); } clearTimeout(timer); - $token.remove(); + $form_data.remove(); $target.remove(); + if (remove_form && $form) { $form.remove(); } }; var $target = $('