Antony Lesuisse (OpenERP) has proposed merging 
lp:~openerp-dev/openerp-web/trunk-import-fixies-vja into lp:openerp-web.

Requested reviews:
  OpenERP R&D Web Team (openerp-dev-web)

For more details, see:
https://code.launchpad.net/~openerp-dev/openerp-web/trunk-import-fixies-vja/+merge/120488
-- 
https://code.launchpad.net/~openerp-dev/openerp-web/trunk-import-fixies-vja/+merge/120488
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openerp-web/trunk-import-fixies-vja.
=== modified file 'addons/web/static/src/css/base.css'
--- addons/web/static/src/css/base.css	2012-08-20 12:22:43 +0000
+++ addons/web/static/src/css/base.css	2012-08-21 00:31:23 +0000
@@ -2744,3 +2744,6 @@
   filter: alpha(opacity=30);
   opacity: 0.3;
 }
+.invalid-value{
+    background-color: #DF6D80;
+}
\ No newline at end of file

=== modified file 'addons/web/static/src/css/data_import.css'
--- addons/web/static/src/css/data_import.css	2012-06-27 14:12:49 +0000
+++ addons/web/static/src/css/data_import.css	2012-08-21 00:31:23 +0000
@@ -36,11 +36,27 @@
 .openerp .duplicate_fld{
     background-color:#FF6666;
 }
+.openerp .img_warning{
+    height:18px;
+}
 .openerp .select_fld{
     background: none repeat scroll 0 0 white;
 }
 .openerp .ui-autocomplete {
     max-height: 300px;
-    overflow-y: auto;
+    overflow: auto;
     padding-right: 20px;
 }
+
+.openerp .oe-import div.oe-import-result div.oe-closed {
+    display: none;
+}
+.oe-import .ui-dialog-content{
+    overflow-x:auto ;!important;
+}
+.openerp span.oe-m2o-drop-down-button {
+  position:absolute;
+  margin-left: -15px;
+  margin-top: 5px;
+ 
+}
\ No newline at end of file

=== modified file 'addons/web/static/src/js/data_import.js'
--- addons/web/static/src/js/data_import.js	2012-08-02 14:46:23 +0000
+++ addons/web/static/src/js/data_import.js	2012-08-21 00:31:23 +0000
@@ -1,6 +1,7 @@
 openerp.web.data_import = function(instance) {
 var QWeb = instance.web.qweb,
-    _t = instance.web._t;
+    _t = instance.web._t,	
+   _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
@@ -31,22 +32,35 @@
 
 instance.web.DataImport = instance.web.Dialog.extend({
     template: 'ImportDataView',
-    dialog_title: {toString: function () { return _t("Import Data"); }},
+    dialog_title:_t("Import Data"),
     init: function(parent, dataset){
         var self = this;
         this._super(parent, {});
         this.model = parent.model;
+        this.dataset = dataset;
         this.fields = [];
         this.all_fields = [];
         this.fields_with_defaults = [];
         this.required_fields = null;
-
+        var m2o = [];
+        var normal_fields = [],one2many_fields = [],many2many_fields = [],many2one_fields = [];
         var convert_fields = function (root, prefix) {
             prefix = prefix || '';
             _(root.fields).each(function (f) {
-                self.all_fields.push(prefix + f.name);
+                if(f.type=="one2many"){
+                    one2many_fields.push(prefix + f.string)
+                }
+                else if(f.type=="many2many"){
+                    many2many_fields.push(prefix + f.string)
+                }
+                else if(f.type=="many2one"){
+                    many2one_fields.push(prefix + f.string)
+                }
+                else{
+                    normal_fields.push(prefix + f.string)
+                }
                 if (f.fields) {
-                    convert_fields(f, prefix + f.id + '/');
+                    convert_fields(f, prefix + f.string + '/');
                 }
             });
         };
@@ -58,14 +72,32 @@
                 .pluck('id')
                 .uniq()
                 .value();
-            convert_fields(self);
-            self.all_fields.sort();
+                convert_fields(self);
+                self.all_fields.push({label: _.str.sprintf(_t("<b>Normal Fields</b>")),value:''});
+                _(normal_fields).each(function(i){
+                    self.all_fields.push(i)
+                })
+                self.all_fields.push({label: _.str.sprintf(_t("<b>One2many Fields</b>")),value:''});
+                _(one2many_fields).each(function(i){
+                    self.all_fields.push(i)
+                })
+                self.all_fields.push({label: _.str.sprintf(_t("<b>Many2one Fields</b>")),value:''});
+                _(many2one_fields).each(function(i){
+                    self.all_fields.push(i)
+                })
+                self.all_fields.push({label: _.str.sprintf(_t("<b>Many2Many Fields</b>")),value:''});
+                _(many2many_fields).each(function(i){
+                    self.all_fields.push(i)
+                })
         });
     },
     start: function() {
         var self = this;
         this._super();
+        this.$element = $('#import_data')
         this.open({
+            height:'auto',
+            width:'auto',
             buttons: [
                 {text: _t("Close"), click: function() { self.destroy(); }},
                 {text: _t("Import File"), click: function() { self.do_import(); }, 'class': 'oe_import_dialog_button'}
@@ -75,11 +107,18 @@
             }
         });
         this.toggle_import_button(false);
+        this.$element.on('click','.export', function() {
+            return new instance.web.DataExport(self,self.dataset).start();
+        });
         this.$element.find('#csvfile').change(this.on_autodetect_data);
         this.$element.find('fieldset').change(this.on_autodetect_data);
         this.$element.delegate('fieldset legend', 'click', function() {
             $(this).parent().toggleClass('oe_closed');
         });
+        this.$element.find("div.oe-import-result input").attr('checked', true);
+        this.$element.find("div.oe-import-result input").click(function(){
+            $("div").toggleClass('oe-closed');
+        });
         this.ready.push(new instance.web.DataSet(this, this.model).call(
             'fields_get', [], function (fields) {
                 self.graft_fields(fields);
@@ -97,7 +136,6 @@
     graft_fields: function (fields, parent, level) {
         parent = parent || this;
         level = level || 0;
-
         var self = this;
         if (level === 0) {
             parent.fields.push({
@@ -123,22 +161,30 @@
                     return _(modifiers).chain().pluck(0).contains('readonly').value();
                 })) { return; }
             }
-
             var f = {
                 id: field_name,
                 name: field_name,
                 string: field.string,
-                required: field.required
+                required: field.required,
+                type:field.type,
+                model:field.relation || self.model,
+                selection:field.selection
             };
 
             switch (field.type) {
             case 'many2many':
             case 'many2one':
+<<<<<<< TREE
                 // push a copy for the bare many2one field, to allow importing
                 // using name_search too - even if we default to exporting the XML ID
                 var many2one_field = _.extend({}, f)
                 parent.fields.push(many2one_field);
+=======
+
+>>>>>>> MERGE-SOURCE
                 f.name += '/id';
+                var many2one =[]
+
                 break;
             case 'one2many':
                 f.name += '/id';
@@ -161,6 +207,7 @@
                 .button('option', 'disabled', !newstate);
     },
     do_import: function() {
+        var self = this;
         if(!this.$element.find('#csvfile').val()) { return; }
         var lines_to_skip = parseInt(this.$element.find('#csv_skip').val(), 10);
         var with_headers = this.$element.find('#file_has_headers').prop('checked');
@@ -176,26 +223,53 @@
             indices.push(index);
             fields.push(val);
         });
+        model_dataset = new instance.web.DataSetSearch(this,'ir.model', null, null);
+        model_dataset.read_slice([], {domain: [['model','=', self.model]]}).then(function(res) {
+            model_data = new instance.web.DataSetSearch(self, 'ir.model.data', null, null);
+            model_data.read_slice([], {domain: [['model','=', self.model],['res_id', 'in', [res[0].id]]]}).then(function(result) {
+                 var context = {
+                    'module' :result[0].module,
+                    'xml_id' :result[0].name
+                };
+                jsonp($('#import_data'), {
+                    url: '/web/import/import_data',
+                    data: {
+                        model: self.model,
+                        meta: JSON.stringify({
+                            skip: lines_to_skip,
+                            indices: indices,
+                            fields: fields,
+                            context: context
+                        })
 
-        jsonp(this.$element.find('#import_data'), {
-            url: '/web/import/import_data',
-            data: {
-                model: this.model,
-                meta: JSON.stringify({
-                    skip: lines_to_skip,
-                    indices: indices,
-                    fields: fields
-                })
-            }
-        }, this.on_import_results);
+                    }
+                }, self.on_import_results);
+            });
+        });
     },
+
     on_autodetect_data: function() {
         if(!this.$element.find('#csvfile').val()) { return; }
-        jsonp(this.$element.find('#import_data'), {
-            url: '/web/import/detect_data'
-        }, this.on_import_results);
+        if (this.$element.find('#csv_separator').val().length > 1 ) {
+            return $('<div id="msg" style="color: red;">* "Separator" must be an 1-character string.</div>').insertBefore(this.$element.find('#result'));
+        }
+        else {
+            jsonp($('#import_data'), {
+                url: '/web/import/detect_data'
+            }, this.on_import_results);
+        }
     },
     on_import_results: function(results) {
+        var self = this;
+        var map_dict = {};		
+		_(this.headers).each(function(j){
+			$('[for="'+j+'"]').remove();
+		})
+        if(this.headers && this.selected_fields){
+            _(this.headers).each(function(i,j){
+                map_dict[i] = self.selected_fields[j]
+            });
+        }
         this.$element.find('#result').empty();
         var headers, result_node = this.$element.find("#result");
 
@@ -212,27 +286,81 @@
             this.destroy();
             return;
         }
-
         if (results['records']) {
             var lines_to_skip = parseInt(this.$element.find('#csv_skip').val(), 10),
                 with_headers = this.$element.find('#file_has_headers').prop('checked');
+            var allvalue_Footer = [];
+           _(results.records[0]).each( function(record) {
+                _(self.fields).each( function(field) {
+                        if (field.type == 'many2one' && record == field.name) {
+                          var name = record.split('/id')[0] += '/name';
+                            results.records[0].push(name);
+                            var i =  _.indexOf(results.records[0],record)
+                            _(results.records.slice(1)).each(function(data, index){
+                                var ids = [];
+                                new instance.web.DataSetSearch(self, 'ir.model.data', null, null).read_slice([], {domain: [['model', '=', field.model], ['name', 'ilike', data[i].split('.')[1]]]
+                                }).pipe(function(res){
+                                    if(res){
+                                        _(res).each(function(j){
+                                            ids.push(j.res_id)
+                                        })
+                                        new instance.web.DataSet(self,field.model).name_get(ids,function(names) {
+                                            values = _.map(names, function(x) { return x[1] })
+                                            var index =  _.indexOf(results.records[0],name)
+                                            data.splice(index,0,values)
+                                            $('.oe_import_grid').remove();
+                                            $("#result").append(QWeb.render('ImportView.result', {
+                                                'headers': self.results.records[0],
+                                                'records': self.results.records.slice(1)
+                                            }));
+                                            self.on_render();
+                                        })
+                                    }
+                                });
+                            });
+                        }
+                   });
+            });
             headers = with_headers ? results.records[0] : null;
-
+            for(var i = 0 ;i < headers.length; i++){
+                allvalue_Footer.push("All Values");
+            }
+            if(map_dict){
+                self.match_headers = [];
+                _(headers).each(function(i){
+                    _(map_dict).each(function(j,k){
+                        if(k == i){
+                            self.match_headers.push(i);
+                        }
+                    });
+                });
+            }
+            results.records.push(allvalue_Footer);
             result_node.append(QWeb.render('ImportView.result', {
                 'headers': headers,
                 'records': lines_to_skip ? results.records.slice(lines_to_skip)
                           : with_headers ? results.records.slice(1)
                           : results.records
             }));
+<<<<<<< TREE
             this.$element.find('fieldset').addClass('oe_closed');
+=======
+			self.on_render();
+            self.results = results;
+            this.$element.find('fieldset').addClass('oe-closed');
+>>>>>>> MERGE-SOURCE
         }
+<<<<<<< TREE
         this.$element.find('form').removeClass('oe_import_no_result');
+=======
+        $('#import_data').removeClass('oe-import-no-result');
+>>>>>>> MERGE-SOURCE
 
         this.$element.delegate('.oe_m2o_drop_down_button', 'click', function () {
             $(this).prev('input').focus();
         });
-
-        var self = this;
+        $('.ui-menu-item').text('Name').addClass('oe_required')
+        this.headers = headers;
         this.ready.then(function () {
             var $fields = self.$element.find('.sel_fields').bind('blur', function () {
                 if (this.value && !_(self.all_fields).contains(this.value)) {
@@ -241,16 +369,31 @@
             }).autocomplete({
                 minLength: 0,
                 source: self.all_fields,
-                change: self.on_check_field_values
+                change: self.on_check_field_values,
+                html: true
             }).focus(function () {
                 $(this).autocomplete('search');
             });
             // Column auto-detection
             _(headers).each(function (header, index) {
+                var temp = 0;
                 var field_name = self.match_column_to_field(header);
                 if (field_name) {
                     $fields.eq(index).val(field_name);
                 }
+                _(self.match_headers).each(function (h){
+                    if(!temp){
+                        if(h==header){
+                            if(_(self.all_fields).contains(map_dict[header])){
+                                temp = 1;
+                                field_name = map_dict[header];
+                                if(field_name){
+                                    $fields.eq(index).val(map_dict[header]);
+                                }
+                            }
+                        }
+                    }
+                });
             });
             self.on_check_field_values();
         });
@@ -335,15 +478,19 @@
         return duplicates;
     },
     on_check_field_values: function () {
+        var self = this
         this.$element.find("#message, #msg").remove();
-
         var required_valid = this.check_required();
-
+        self.on_check_values();
         var duplicates = this.find_duplicate_fields();
         if (_.isEmpty(duplicates)) {
             this.toggle_import_button(required_valid);
         } else {
+<<<<<<< TREE
             var $err = $('<div id="msg" style="color: red;">'+_t("Destination fields should only be selected once, some fields are selected more than once:")+'</div>').insertBefore(this.$element.find('#result'));
+=======
+            var $err = $('<div id="msg" style="color: red;"><img class= "img_warning" src="/web/static/src/img/warning.png"/>Destination fields should only be selected once, some fields are selected more than once:</div>').insertBefore(this.$element.find('#result'));
+>>>>>>> MERGE-SOURCE
             var $dupes = $('<dl>').appendTo($err);
             _(duplicates).each(function(elements, value) {
                 $('<dt>').text(value).appendTo($dupes);
@@ -356,7 +503,66 @@
         }
 
     },
+    on_check_values:function(){
+        var self = this;
+        _(self.fields).each(function(field){
+            var count = 0;
+            _(self.results.records.slice(1)).each(function(record){
+                if((self.results.records.slice(1).length)-1!=count){
+                    _(self.results.records[0]).each(function(fieldName,index){
+                      var field_Index =  _.indexOf(self.results.records[0],fieldName)
+                      if(field.name == fieldName.split('/')[0]){
+                          switch (field.type){
+                             case 'selection':
+                                var flag = 0;
+                                for(var i=0;i<field.selection.length;i++){
+                                    if(record[field_Index]==field.selection[i][1]){
+                                        flag=1;
+                                    }
+                                }
+                                if(!flag){
+                                    self.invalid_Values(self.headers[field_Index], field, record[field_Index]);
+                                }
+                                break;
+                             case 'boolean':
+                                if(!(record[field_Index]=='True' || record[field_Index]=='true' || record[field_Index]=='False' || record[field_Index]=='false' || record[field_Index]=='1' || record[field_Index]=='0')){
+                                    self.invalid_Values(self.headers[field_Index], field, record[field_Index]);
+                               }
+                               break;
+                             case 'date':
+                                try {
+                                    new instance.web.parse_value(record[field_Index], field)
+                                }
+                                catch (ex) {
+                                    self.invalid_Values(self.headers[field_Index], field, record[field_Index]);
+                                }
+                                break;
+                             case 'integer':
+                                try {
+                                    new instance.web.parse_value(record[field_Index], field)
+                                }
+                                catch (ex) {
+                                    self.invalid_Values(self.headers[field_Index], field, record[field_Index]);
+                                }
+                                break;
+                             case 'float':
+                                try {
+                                    new instance.web.parse_value(record[field_Index], field)
+                                }
+                                catch (ex) {
+                                    self.invalid_Values(self.headers[field_Index], field, record[field_Index]);
+                                }
+                                break;
+                            }
+                        }
+                    });
+                    count++;
+                }
+            });
+        });
+    },
     check_required: function() {
+<<<<<<< TREE
         var self = this;
         if (!self.required_fields.length) { return true; }
 
@@ -372,15 +578,22 @@
             return f.id;
         };
 
+=======
+        if (!this.required_fields.length) { return true; }
+>>>>>>> MERGE-SOURCE
         var selected_fields = _(this.$element.find('.sel_fields').get()).chain()
             .pluck('value')
             .compact()
             .map(resolve_field_id)
             .value();
-
+        this.selected_fields = selected_fields;
         var missing_fields = _.difference(this.required_fields, selected_fields);
         if (missing_fields.length) {
+<<<<<<< TREE
             this.$element.find("#result").before('<div id="message" style="color:red">' + _t("*Required Fields are not selected :") + missing_fields + '.</div>');
+=======
+            this.$element.find("#result").before('<div id="message" style="color:red"><img class= "img_warning" src="/web/static/src/img/warning.png"/> No column assingned to the required field : "' + missing_fields + '".</div>');
+>>>>>>> MERGE-SOURCE
             return false;
         }
         return true;
@@ -388,6 +601,74 @@
     destroy: function() {
         this.$element.remove();
         this._super();
-    }
+    },
+    invalid_Values: function(header, field, value) {
+        $('.oe_import_grid-header .oe_import_grid-cell').each(function(i){
+            if ($.trim($(this).text()) == header) {
+                $('.oe_import_grid-row').each(function(j){
+                    if((($('.oe_import_grid-row').length)-1)!=j){
+                        $(this).find('.oe_import_grid-cell').each(function(k){
+                            if(k == i){
+                                if($.trim($(this).text())==value){
+                                    $(this).addClass('invalid-value');
+                                    $('[for="'+header+'"]').remove();
+                                    var ucfirst = field.name.charAt(0).toUpperCase()
+                                    var name = field.name.substring(1);
+                                    $("#result").before('<div name="msgdiv" for="'+header+'"><img class= "img_warning" src="/web/static/src/img/warning.png"/><span id="msg" style="color: red;"> Invalid value for the field '+"'"+ucfirst+name+"'"+': "' +$.trim($(this).text())+'"</span></div>')
+                                }
+                            }
+                        });
+                    }
+                })
+            }
+        });
+    },
+	on_render: function() {
+        $('.oe_import_grid-row:gt(2)').children().find('span').css({'visibility':'hidden'});
+        $('.oe_import_grid-row:gt(2)').children().css({'display': 'none'});
+        $('.oe_import_grid-row:last').children().removeAttr('style');
+        $('.oe_import_grid-header .oe_import_grid-cell').each(function(i){
+            var count = 0;
+            $('.oe_import_grid-row').each(function(j){
+                if((($('.oe_import_grid-row').length)-1)!=j){
+                    $(this).find('.oe_import_grid-cell').each(function(k){
+                        if(k == i){
+                            if($.trim($(this).text())){
+                                count++;
+                            }
+                        }
+                    })
+                }
+            });
+            if(count<3){
+                $('.oe_import_grid-row:last').find('td').each(function(l){
+                    if(l==i){
+                        $(this).empty()
+                    }
+                })
+            }
+        });
+        $('.oe_import_grid-row:last').children().find('span').removeAttr('style');
+        $('.oe_import_grid-row:last td').css({
+            'color': 'blue',
+            'cursor': 'pointer'
+        }).bind('click', function(event, ui){
+            $(this).addClass('oe_new');
+            var index = $(this).parent().find('.oe_new').index();
+            $(this).removeClass('oe_new').empty()
+            $('.oe_import_grid-row').each(function(j){
+                $(this).find('.oe_import_grid-cell').each(function(k){
+                    if (k == index) {
+                        $('.oe_import_grid-row:gt(2)').children().removeAttr('style');
+                        $(this).find('span').css({'visibility':'visible'});
+                        $('.oe_import_grid-row:last td').css({
+                            'color': 'blue',
+                            'cursor': 'pointer'
+                        })
+                    }
+                })
+            })
+        })
+   },
 });
-};
+};
\ No newline at end of file

=== modified file 'addons/web/static/src/xml/base.xml'
--- addons/web/static/src/xml/base.xml	2012-08-18 22:10:35 +0000
+++ addons/web/static/src/xml/base.xml	2012-08-21 00:31:23 +0000
@@ -1662,16 +1662,31 @@
         class="oe_import oe_import_no_result">
     <input type="hidden" name="session_id" t-att-value="widget.session.session_id"/>
     <h2 class="separator horizontal">1. Import a .CSV file</h2>
-    <p>Select a .CSV file to import. If you need a sample of file to import,
-       you should use the export tool with the "Import Compatible" option.
+    <p>Select a <a target="_blank"  style="color: blue;" href="http://en.wikipedia.org/wiki/Comma-separated_values";>.CSV </a> 
+       file to import. If you need a sample of file to import,
+       you should use the <a href="javascript: void(0)" class= "export" style="color: blue;" >export tool</a> with the "Import Compatible" option.
     </p>
     <p>
         <label for="csvfile">CSV File:</label>
         <input type="file" id="csvfile" size="50" name="csvfile"/>
     </p>
+<<<<<<< TREE
     <h2 class="separator horizontal oe_import_result">2. Check your file format</h2>
     <div id="result" class="oe_import_result"></div>
     <fieldset class="oe_closed oe_import_result">
+=======
+    <h2 class="separator horizontal oe-import-result">2.Map your data to OpenERP fields</h2>
+        <div class="oe-import-result">
+        <th> <input class= "check" type="checkbox" /></th>
+        <label>The first row of the field contains the name of the fields/columns.</label> 
+        <div class="oe-closed">
+            <tr>
+            <td><p>If you import big files, we suggest you to always set the name of the column directly in the first row of your file, so that OpenERP will be able to auto-detect columns.
+                    This will allow you to easily re-import several times with less effort.</p></td>
+            </tr></div></div>
+    <div id="result" class="oe-import-result"></div>
+    <fieldset class="oe-closed oe-import-result">
+>>>>>>> MERGE-SOURCE
         <legend>Import Options</legend>
         <table>
             <tr>
@@ -1701,6 +1716,90 @@
             </tr>
         </table>
     </fieldset>
+    <h2 class="separator horizontal oe-import-result">Frequently Asked Questions</h2>
+    <fieldset class="oe-closed oe-import-result">
+        <legend>Need to import data from an other application ?</legend>
+        <table>
+        <tr>
+           <td><p>In oreder to re-create relationship from diffrent imported tables,you should use the uniq identifier from your initial database
+                  and map it as the ID column in OpenERP.When you import another table that links to this object,you can use the XXX/ID column with some identification.
+                  The ID can be a number of a text identifier.</p>
+                <p>It's a good practice to always assign a unique ID to every record you import in order to easily reuse it later or to re-imopert to modify it.</p>
+           </td>
+        </tr>
+        <tr>
+            <td style="padding-left:40px;width:50%;">1. Import categories of products</td>
+            <td style="padding-right:20px;width:50%;">2. Import products using these categories</td>
+        </tr>
+        <tr>
+            <td style="padding-left:40px;width:50%;">
+                <table BORDER='1' CELLPADDING='3' CELLSPACING='1'
+    RULES='COLS' FRAME='BOX' width='50%'>
+                    <tr>
+                        <th>Id
+                        </th>
+                        <th border="1">Category Name
+                        </th>
+                    </tr>
+                    <tr>
+                        <td>1
+                        </td>
+                        <td>Decoration
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>2
+                        </td>
+                        <td>Garden Tools
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>3
+                        </td>
+                        <td>Food
+                        </td>
+                    </tr>
+                </table>
+            </td>
+            <td>
+                <table BORDER='1' CELLPADDING='3' CELLSPACING='1'
+    RULES='COLS' FRAME='BOX' width='50%'>
+                    <tr>
+                        <th>Id
+                        </th>
+                        <th>Product Name
+                        </th>
+                        <th>Category/Id</th>
+                    </tr>
+                    <tr>
+                        <td>1
+                        </td>
+                        <td>Deco Product 1
+                        </td>
+                        <td>1
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>2
+                        </td>
+                        <td>Deco Product 2
+                        </td>
+                        <td>1
+                        </td>
+                    </tr>
+                    <tr>
+                        <td>3
+                        </td>
+                        <td>Carrots
+                        </td>
+                        <td>3
+                        </td>
+                    </tr>
+                </table>
+            </td>
+        </tr>
+        </table>
+    </fieldset>
 </form>
 </t>
 <t t-name="ImportView.result">
@@ -1717,7 +1816,7 @@
         </tr>
         <tr t-foreach="records" t-as="record" class="oe_import_grid-row">
             <td t-foreach="record" t-as="cell" class="oe_import_grid-cell">
-                <t t-esc="cell"/></td>
+                <span><t t-esc="cell"/></span></td>
         </tr>
     </table>
 </t>

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to