From b8f93a7bc653d41bd519e7769573fe2ccab8ccbe Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 14 Aug 2012 14:16:10 +0200 Subject: [PATCH] [ADD] base import logic: implement creating an import, uploading a file and displaying the preview bzr revid: xmo@openerp.com-20120814121610-j2rpg7u5zh4h93j1 --- addons/base_import/__init__.py | 1 + addons/base_import/__openerp__.py | 2 + addons/base_import/controllers.py | 24 ++++++ addons/base_import/static/src/js/import.js | 82 ++++++++++++++++++++ addons/base_import/static/src/xml/import.xml | 25 ++++++ 5 files changed, 134 insertions(+) create mode 100644 addons/base_import/controllers.py create mode 100644 addons/base_import/static/src/js/import.js create mode 100644 addons/base_import/static/src/xml/import.xml diff --git a/addons/base_import/__init__.py b/addons/base_import/__init__.py index f0736de3bd1..ab0a528f1f1 100644 --- a/addons/base_import/__init__.py +++ b/addons/base_import/__init__.py @@ -1,2 +1,3 @@ +import controllers import models import tests.models diff --git a/addons/base_import/__openerp__.py b/addons/base_import/__openerp__.py index 7f117349ba9..230c514efc8 100644 --- a/addons/base_import/__openerp__.py +++ b/addons/base_import/__openerp__.py @@ -27,4 +27,6 @@ Re-implement openerp's file import system: 'depends': ['base'], 'installable': True, 'auto_install': False, # set to true and allow uninstall? + 'js': ['static/src/js/import.js'], + 'qweb': ['static/src/xml/import.xml'], } diff --git a/addons/base_import/controllers.py b/addons/base_import/controllers.py new file mode 100644 index 00000000000..bc014cd8265 --- /dev/null +++ b/addons/base_import/controllers.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +import base64 +import simplejson + +try: + import openerp.addons.web.common.http as openerpweb +except ImportError: + import web.common.http as openerpweb + +class ImportController(openerpweb.Controller): + _cp_path = '/base_import' + + @openerpweb.httprequest + def set_file(self, req, file, import_id, jsonp='callback'): + import_id = int(import_id) + + written = req.session.model('base_import.import').write(import_id, { + 'file': base64.b64encode(file.read()), + 'file_name': file.filename, + 'file_type': file.content_type, + }, req.session.eval_context(req.context)) + + return 'window.top.%s(%s)' % ( + jsonp, simplejson.dumps({'result': written})) diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js new file mode 100644 index 00000000000..5bb81d23cbb --- /dev/null +++ b/addons/base_import/static/src/js/import.js @@ -0,0 +1,82 @@ +openerp.base_import = function (instance) { + var QWeb = instance.web.qweb; + var _lt = instance.web._lt; + + /** + * Safari does not deal well at all with raw JSON data being + * returned. As a result, we're going to cheat by using a + * pseudo-jsonp: instead of getting JSON data in the iframe, we're + * getting a ``script`` tag which consists of a function call and + * the returned data (the json dump). + * + * The function is an auto-generated name bound to ``window``, + * which calls back into the callback provided here. + * + * @param {Object} form the form element (DOM or jQuery) to use in the call + * @param {Object} attributes jquery.form attributes object + * @param {Function} callback function to call with the returned data + */ + function jsonp(form, attributes, callback) { + attributes = attributes || {}; + var options = {jsonp: _.uniqueId('import_callback_')}; + window[options.jsonp] = function () { + delete window[options.jsonp]; + callback.apply(null, arguments); + }; + if ('data' in attributes) { + _.extend(attributes.data, options); + } else { + _.extend(attributes, {data: options}); + } + _.extend(attributes, { + dataType: 'script', + }); + $(form).ajaxSubmit(attributes); + } + + instance.web.DataImport = instance.web.Dialog.extend({ + template: 'ImportView', + dialog_title: _lt("Import Data"), + events: { + 'change input.oe_import_file': 'file_update' + }, + init: function (parent, dataset) { + this._super(parent, {}); + this.res_model = parent.model; + // import object id + this.id = null; + this.Import = new instance.web.Model('base_import.import'); + }, + start: function () { + var self = this; + return this.Import.call('create', [{ + 'res_model': this.res_model + }]).then(function (id) { + self.id = id; + self.$('input[name=import_id]').val(id); + }); + }, + + //- File change section + file_update: function (e) { + if (!this.$('input.oe_import_file').val()) { return; } + + // TODO: hide preview before calling set_file + jsonp(this.$element, { + url: '/base_import/set_file' + }, this.proxy('file_updated')); + }, + file_updated: function () { + // immediately trigger preview... + // TODO: test that write // succeeded? + this.Import.call('parse_preview', [this.id, { + quote: '"', + separator: ',', + headers: true, + }]).then(this.proxy('preview')); + }, + preview: function (result) { + this.$('table').html(QWeb.render('ImportView.preview', result)); + }, + }); +}; diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml new file mode 100644 index 00000000000..d2a3ec4f66d --- /dev/null +++ b/addons/base_import/static/src/xml/import.xml @@ -0,0 +1,25 @@ + + +
+ + + + + + +
+
+
+ + + + + + + + + +