[FIX]Fixed code for python related problems as par review.
authorKunal Chavda (OpenERP) <kch@tinyerp.com>
Thu, 8 Sep 2011 10:24:00 +0000 (15:54 +0530)
committerKunal Chavda (OpenERP) <kch@tinyerp.com>
Thu, 8 Sep 2011 10:24:00 +0000 (15:54 +0530)
bzr revid: kch@tinyerp.com-20110908102400-7udk4wzl0blt7jgg

addons/web/controllers/main.py
addons/web/static/src/js/views.js

index e8b7ef2..8b61484 100644 (file)
@@ -1369,19 +1369,18 @@ class Import(View):
         return fields
 
     @openerpweb.httprequest
-    def detect_data(self, req, **params):
-        import StringIO
+    def detect_data(self, req, csvfile, csvsep, csvdel, csvcode, csvskip, **params):
+
         _fields = {}
         _fields_invert = {}
         req_field = []
         error = None
-        all_fields = []
-        fields = dict(req.session.model(params.get('model')).fields_get(False, req.session.eval_context(req.context)))
+        fields = req.session.model(params.get('model')).fields_get(False, req.session.eval_context(req.context))
         fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}})
 
         for field in fields:
             value = fields[field]
-            if (value.get('required',False) == True):
+            if value.get('required'):
                 req_field.append(field)
 
         def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2):
@@ -1402,7 +1401,7 @@ class Import(View):
                     _fields[prefix_node+field] = st_name
                     _fields_invert[st_name] = prefix_node+field
 
-                    if fields[field].get('type','')=='one2many' and level>0:
+                    if fields[field].get('type')=='one2many' and level>0:
                         fields2 = self.fields_get(req,  fields[field]['relation'])
                         model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1)
 
@@ -1412,36 +1411,35 @@ class Import(View):
         fields.update({'id':{'string':'ID'},'.id':{'string':'Database ID'}})
         model_populate(fields)
         all_fields = fields.keys()
+        all_fields.sort()
 
         try:
-            data = csv.reader(params.get('csvfile'), quotechar=str(params.get('csvdel')), delimiter=str(params.get('csvsep')))
+            data = csv.reader(csvfile, quotechar=str(csvdel), delimiter=str(csvsep))
         except:
             error={'message': 'error opening .CSV file. Input Error.'}
             return simplejson.dumps({'error':error})
 
         records = []
-        fields = []
-        word=''
-        limit = 4
         count = 0
+        header_fields = []
+        word=''
+
         try:
-            for i, row in enumerate(data):
-                records.append(row)
-                if i == limit:
-                    break
-
-            for j, line in enumerate(records):
-                if j == 1:
-                    break
-                for word in line:
-                    word = str(word.decode(params.get('csvcode')))
-                    if word in _fields:
-                        fields.append((word, _fields[word]))
-                    elif word in _fields_invert.keys():
-                        fields.append((_fields_invert[word], word))
-                    else:
-                        count = count + 1
-                        fields.append((word, word))
+            for rec in itertools.islice(data,0,4):
+                records.append(rec)
+
+            headers = itertools.islice(records,1)
+            line = headers.next()
+
+            for word in line:
+                word = str(word.decode(csvcode))
+                if word in _fields:
+                    header_fields.append((word, _fields[word]))
+                elif word in _fields_invert.keys():
+                    header_fields.append((_fields_invert[word], word))
+                else:
+                    count = count + 1
+                    header_fields.append((word, word))
 
             if len(line) == count:
                 error = {'message':"File has not any column header."}
@@ -1449,15 +1447,15 @@ class Import(View):
             error = {'message':('Error processing the first line of the file. Field "%s" is unknown') % (word,)}
 
         if error:
-            params.get('csvfile').seek(0)
-            error=dict(error, preview=params.get('csvfile').read(200))
+            csvfile.seek(0)
+            error=dict(error, preview=csvfile.read(200))
             return simplejson.dumps({'error':error})
 
-        return simplejson.dumps({'records':records[1:],'header':fields,'all_fields':all_fields,'req_field':req_field})
+        return simplejson.dumps({'records':records[1:],'header':header_fields,'all_fields':all_fields,'req_field':req_field})
 
     @openerpweb.httprequest
-    def import_data(self, req, **params):
-        import StringIO
+    def import_data(self, req, csvfile, csvsep, csvdel, csvcode, csvskip, **params):
+
         _fields = {}
         _fields_invert = {}
         prefix_node=''
@@ -1466,24 +1464,22 @@ class Import(View):
         context = req.session.eval_context(req.context)
         modle_obj = req.session.model(params.get('model'))
         res = None
-        content = params.get('csvfile').read()
-        input=StringIO.StringIO(content)
+
         limit = 0
         data = []
 
-        if not (params.get('csvdel') and len(params.get('csvdel')) == 1):
+        if not (csvdel and len(csvdel) == 1):
             error={'message': "The CSV delimiter must be a single character"}
             return simplejson.dumps({'error':error})
 
         try:
-            for j, line in enumerate(csv.reader(input, quotechar=str(params.get('csvdel')), delimiter=str(params.get('csvsep')))):
-                # If the line contains no data, we should skip it.
-                if not line:
-                    continue
-                if j == limit:
-                    fields = line
-                else:
-                    data.append(line)
+            data_record = csv.reader(csvfile, quotechar=str(csvdel), delimiter=str(csvsep))
+            for rec in itertools.islice(data_record,0,None):
+                data.append(rec)
+
+            headers = itertools.islice(data,1)
+            fields = headers.next()
+
         except csv.Error, e:
             error={'message': str(e),'title': 'File Format Error'}
             return simplejson.dumps({'error':error})
@@ -1494,7 +1490,7 @@ class Import(View):
         if not isinstance(fields, list):
             fields = [fields]
 
-        flds = dict(req.session.model(params.get('model')).fields_get(False, req.session.eval_context(req.context)))
+        flds = modle_obj.fields_get(False, req.session.eval_context(req.context))
         flds.update({'id':{'string':'ID'},'.id':{'string':'Database ID'}})
         fields_order = flds.keys()
         for field in fields_order:
@@ -1504,16 +1500,16 @@ class Import(View):
 
         unmatch_field = []
         for fld in fields:
-            if ((fld not in _fields.keys()) and (fld not in _fields_invert.keys())):
+            if ((fld not in _fields) and (fld not in _fields_invert)):
                 unmatch_field.append(fld)
 
         if unmatch_field:
             error = {'message':("You cannot import the fields '%s',because we cannot auto-detect it." % (unmatch_field))}
             return simplejson.dumps({'error':error})
 
-        for line in data:
+        for line in data[1:]:
             try:
-                datas.append(map(lambda x:x.decode(params.get('csvcode')).encode('utf-8'), line))
+                datas.append(map(lambda x:x.decode(csvcode).encode('utf-8'), line))
             except:
                 datas.append(map(lambda x:x.decode('latin').encode('utf-8'), line))
 
index 530e9fc..f8382cb 100644 (file)
@@ -733,7 +733,7 @@ openerp.web.View = openerp.web.Widget.extend({
     },
     on_sidebar_import: function() {
         var import_view = new openerp.web.DataImport(this, this.dataset);
-        import_view.start(false);
+        import_view.start();
     },
     on_sidebar_export: function() {
         var export_view = new openerp.web.DataExport(this, this.dataset);