[IMP] get export to work correctly with Session.get_file (so the user really download...
authorXavier Morel <xmo@openerp.com>
Tue, 30 Aug 2011 11:02:04 +0000 (13:02 +0200)
committerXavier Morel <xmo@openerp.com>
Tue, 30 Aug 2011 11:02:04 +0000 (13:02 +0200)
bzr revid: xmo@openerp.com-20110830110204-lf3qi2r5ck8avcs9

addons/base/controllers/main.py
addons/base/static/src/js/core.js
addons/base/static/src/js/data_export.js

index a0da55e..e000aff 100644 (file)
@@ -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)
index 48c05c6..fab9042 100644 (file)
@@ -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 = $('<input type="hidden" name="token" value="' + token +'">');
+            CHECK_INTERVAL = 1000, id = _.uniqueId('get_file_frame'),
+            remove_form = false;
+
+        var $form, $form_data = $('<div>');
+
         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 = $('<iframe style="display: none;">')
             .attr({id: id, name: id})
             .appendTo(document.body)
             .load(function () {
-                if (options.error) {
-                    options.error(this.contentDocument.body)
-                }
+                if (options.error) { options.error(this.contentDocument.body); }
                 complete();
             });
-        $(options.form)
-            .append($token)
+
+        if (options.form) {
+            $form = $(options.form);
+        } else {
+            remove_form = true;
+            $form = $('<form>', {
+                action: options.url,
+                method: 'POST'
+            }).appendTo(document.body);
+        }
+
+        _(_.extend({}, options.data || {},
+                   {session_id: this.session_id, token: token}))
+            .each(function (value, key) {
+                $('<input type="hidden" name="' + key + '">')
+                    .val(value)
+                    .appendTo($form_data);
+            });
+
+        $form
+            .append($form_data)
             .attr('target', id)
             .get(0).submit();
 
index 6180ef8..6ebd3f6 100644 (file)
@@ -373,10 +373,10 @@ openerp.base.DataExport = openerp.base.Dialog.extend({
         return export_field;
     },
     on_click_export_data: function() {
-        var self = this;
+        $.blockUI(this.$element);
         var export_field = {};
         var flag = true;
-        self.$element.find("#fields_list option").each(function() {
+        this.$element.find("#fields_list option").each(function() {
             export_field[$(this).val()] = $(this).text();
             flag = false;
         });
@@ -385,22 +385,20 @@ openerp.base.DataExport = openerp.base.Dialog.extend({
             return;
         }
 
-        var import_comp = self.$element.find("#import_compat option:selected").val(),
-            export_format = self.$element.find("#export_format").val();
+        var import_comp = this.$element.find("#import_compat option:selected").val(),
+            export_format = this.$element.find("#export_format").val();
 
-        self.rpc("/base/export/export_data", {
-            model: self.dataset.model,
-            fields: export_field,
-            ids: self.dataset.ids,
-            domain: self.dataset.domain,
-            import_compat: parseInt(import_comp),
-            export_format: export_format
-        }, function(data) {
-            var mime = export_format === 'csv'
-                    ? 'text/csv;charset=utf8'
-                    : 'application/vnd.mx-excel;base64';
-            window.location = 'data:' + mime + ',' + data;
-            self.close();
+        this.session.get_file({
+            url: '/base/export/export_data',
+            data: {data: JSON.stringify({
+                model: this.dataset.model,
+                fields: export_field,
+                ids: this.dataset.ids,
+                domain: this.dataset.domain,
+                import_compat: parseInt(import_comp),
+                export_format: export_format
+            })},
+            complete: $.unblockUI
         });
     },
     close: function() {