← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-client-web/import_export into lp:openobject-client-web

 

kch (Open ERP) has proposed merging lp:~openerp-dev/openobject-client-web/import_export into lp:openobject-client-web.

Requested reviews:
  OpenERP SA's Web Client R&D (openerp-dev-web)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client-web/import_export/+merge/45209

Bug:-https://bugs.launchpad.net/openobject-client-web/+bug/693308

1. I have make change for export data.
   -When check import compatible mode For every field:
      - many2one: just display two children: id and .id
      - many2many: just display this field without children
      - one2many: normal behavior.
   -When uncheck import compatible mode For every field:
      - many2one: you can see all children
      - many2many: you can see all children
      - one2many: you can see all children
2. I have make change for import data.
   -When you select a file, the web client should make a preview of the first three rows.
-- 
https://code.launchpad.net/~openerp-dev/openobject-client-web/import_export/+merge/45209
Your team OpenERP SA's Web Client R&D is requested to review the proposed merge of lp:~openerp-dev/openobject-client-web/import_export into lp:openobject-client-web.
=== modified file 'addons/openerp/controllers/impex.py'
--- addons/openerp/controllers/impex.py	2010-12-13 08:56:54 +0000
+++ addons/openerp/controllers/impex.py	2011-01-05 07:25:54 +0000
@@ -30,6 +30,7 @@
 import csv
 import re
 import xml.dom.minidom
+import cherrypy
 
 from openerp.controllers import SecuredController
 from openerp.utils import rpc, common, TinyDict, node_attributes
@@ -103,28 +104,29 @@
 
     dom = xml.dom.minidom.parseString(v1['arch'].encode('utf-8'))
     root = dom.childNodes[0]
-
     f1 = parse(root, v1['fields'])
 
     dom = xml.dom.minidom.parseString(v2['arch'].encode('utf-8'))
     root = dom.childNodes[0]
-
     f2 = parse(root, v2['fields'])
 
     fields = {}
     fields.update(f1)
     fields.update(f2)
 
+
     return fields
 
+
+
 class ImpEx(SecuredController):
 
     _cp_path = "/openerp/impex"
 
     @expose(template="/openerp/controllers/templates/exp.mako")
-    def exp(self, **kw):
+    def exp(self, import_com=None, **kw):
+
         params, data = TinyDict.split(kw)
-
         ctx = dict((params.context or {}), **rpc.session.context)
 
         views = {}
@@ -142,7 +144,8 @@
                                  url=tools.url('/openerp/impex/get_fields'),
                                  field_parent='relation',
                                  context=ctx,
-                                 views=views)
+                                 views=views,
+                                 import_com=import_com)
 
         tree.show_headers = False
 
@@ -151,11 +154,9 @@
                                  domain=[('resource', '=', params.model)],
                                  context=ctx, selectable=1, editable=False, pageable=False, impex=True)
 
-
-
         return dict(new_list=new_list, model=params.model, ids=params.ids, ctx=ctx,
                     search_domain=params.search_domain, source=params.source,
-                    tree=tree, xls_export_available=xls_export_available)
+                    tree=tree, xls_export_available=xls_export_available, import_com=import_com)
 
     @expose()
     def save_exp(self, **kw):
@@ -183,10 +184,17 @@
 
         raise redirect('/openerp/impex/exp', **kw)
 
+
     @expose('json')
     def get_fields(self, model, prefix='', name='', field_parent=None, **kw):
 
+        if len(kw.get('ids').split(',')[0].split('/')) == 1:
+            parent = kw.get('ids').split(',')[0].split('/')[0]
+        else:
+            parent = kw.get('ids').split(',')[0].split('/')[-2]
+
         is_importing = kw.get('is_importing', False)
+        import_compat= kw.get('import_com', False)
 
         try:
             ctx = ast.literal_eval(kw['context'])
@@ -200,18 +208,23 @@
         except:
             views = {}
 
-
         fields = _fields_get_all(model, views, ctx)
+        if cherrypy.session.get('fld'):
+            m2ofields = cherrypy.session.get('fld')
+            for i in cherrypy.session.get('fld'):
+                if i == parent:
+                    fields = {}
+        else:
+            m2ofields = []
 
-        fields.update({'id': {'string': 'ID'}, 'db_id': {'string': 'Database ID'}})
+        fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}})
 
         fields_order = fields.keys()
         fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', '')))
-
         records = []
 
+
         for i, field in enumerate(fields_order):
-
             value = fields[field]
             record = {}
 
@@ -229,33 +242,61 @@
                 records.append(record)
 
             elif not is_importing:
+
                 record.update(id=id, items={'name': nm},
                               action='javascript: void(0)', target=None,
                               icon=None, children=[])
-
                 records.append(record)
 
+
             if len(nm.split('/')) < 3 and value.get('relation', False):
 
-                if is_importing and not ((value['type'] not in ('reference',)) and (not value.get('readonly', False)) and value['type']=='one2many'):
-                    continue
-
-                ref = value.pop('relation')
-
-                proxy = rpc.RPCProxy(ref)
-                cfields = proxy.fields_get(False, rpc.session.context)
-                cfields_order = cfields.keys()
-                cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
-
-                children = []
-                for j, fld in enumerate(cfields_order):
-                    cid = id + '/' + fld
-                    cid = cid.replace(' ', '_')
-
-                    children.append(cid)
-
-                record['children'] = children or None
-                record['params'] = {'model': ref, 'prefix': id, 'name': nm}
+                if import_compat or is_importing:
+                    ref = value.pop('relation')
+                    proxy = rpc.RPCProxy(ref)
+                    cfields = proxy.fields_get(False, rpc.session.context)
+                    if (value['type'] == 'many2many') and not is_importing:
+                        record['children'] = None
+                        record['params'] = {'model': ref, 'prefix': id, 'name': nm}
+
+                    elif (value['type'] == 'many2one') or (value['type'] == 'many2many' and is_importing):
+                        m2ofields.append(field)
+                        cfields_order = cfields.keys()
+                        cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
+                        children = []
+                        for j, fld in enumerate(cfields_order):
+                            cid = id + '/' + fld
+                            cid = cid.replace(' ', '_')
+                            children.append(cid)
+                        record['children'] = children or None
+                        record['params'] = {'model': ref, 'prefix': id, 'name': nm}
+                        cherrypy.session['fld'] = m2ofields
+
+                    else:
+                        cfields_order = cfields.keys()
+                        cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
+                        children = []
+                        for j, fld in enumerate(cfields_order):
+                            cid = id + '/' + fld
+                            cid = cid.replace(' ', '_')
+                            children.append(cid)
+                        record['children'] = children or None
+                        record['params'] = {'model': ref, 'prefix': id, 'name': nm}
+
+                else:
+                    ref = value.pop('relation')
+                    proxy = rpc.RPCProxy(ref)
+                    cfields = proxy.fields_get(False, rpc.session.context)
+                    cfields_order = cfields.keys()
+                    cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
+                    children = []
+                    for j, fld in enumerate(cfields_order):
+                        cid = id + '/' + fld
+                        cid = cid.replace(' ', '_')
+                        children.append(cid)
+                    record['children'] = children or None
+                    record['params'] = {'model': ref, 'prefix': id, 'name': nm}
+                    cherrypy.session['fld'] = []
 
         records.reverse()
         return dict(records=records)
@@ -304,7 +345,7 @@
             fields.update(f2)
 
         def rec(fields):
-            _fields = {'id': {'string': 'ID'}, 'db_id': {'string': 'Database ID'}}
+            _fields = {'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}
 
             def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2):
                 fields_order = fields.keys()
@@ -331,8 +372,14 @@
         params, data_index = TinyDict.split(kw)
         proxy = rpc.RPCProxy(params.model)
 
+        flds = []
+        for item in fields:
+            fld = item
+            fld = fld.replace('/.id','.id')
+            flds.append(fld)
+
         if isinstance(fields, basestring):
-            fields = [fields]
+            flds = [fields]
 
         ctx = dict((params.context or {}), **rpc.session.context)
         ctx['import_comp'] = import_compat
@@ -340,7 +387,7 @@
         domain = params.seach_domain or []
 
         ids = params.ids or proxy.search(domain, 0, 0, 0, ctx)
-        result = datas_read(ids, params.model, fields, context=ctx)
+        result = datas_read(ids, params.model, flds, context=ctx)
 
         if result.get('warning'):
             common.warning(unicode(result.get('warning', False)), _('Export Error'))
@@ -383,7 +430,7 @@
             return export_csv(params.fields2, result, add_names)
 
     @expose(template="/openerp/controllers/templates/imp.mako")
-    def imp(self, error=None, **kw):
+    def imp(self, error=None, records=None, **kw):
         params, data = TinyDict.split(kw)
 
         ctx = dict((params.context or {}), **rpc.session.context)
@@ -404,8 +451,7 @@
                                     is_importing=1)
 
         tree.show_headers = False
-
-        return dict(error=error, model=params.model, source=params.source, tree=tree, fields=kw.get('fields', {}))
+        return dict(error=error, records=records, model=params.model, source=params.source, tree=tree, fields=kw.get('fields', {}))
 
     @expose()
     def detect_data(self, csvfile, csvsep, csvdel, csvcode, csvskip, **kw):
@@ -415,9 +461,8 @@
         _fields_invert = {}
         error = None
 
-        fields = dict(rpc.RPCProxy(params.model).fields_get(False, rpc.session.context),
-                      id={'type': 'char', 'string': 'ID'},
-                      db_id={'type': 'char', 'string': 'Database ID'})
+        fields = dict(rpc.RPCProxy(params.model).fields_get(False, rpc.session.context))
+        fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}})
 
         def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2):
             def str_comp(x,y):
@@ -436,25 +481,36 @@
                     st_name = prefix_value+fields[field]['string'] or field
                     _fields[prefix_node+field] = st_name
                     _fields_invert[st_name] = prefix_node+field
+
                     if fields[field].get('type','')=='one2many' and level>0:
                         fields2 = rpc.session.execute('object', 'execute', fields[field]['relation'], 'fields_get', False, rpc.session.context)
-                        fields2.update({'id': {'type': 'char', 'string': 'ID'}, 'db_id':{'type': 'char', 'string': 'Database ID'}})
                         model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1)
-                    if fields[field].get('type','') in ('many2one', 'many2many' ) and level>0:
-                        model_populate({'id': {'type': 'char', 'string': 'ID'}, 'db_id': {'type': 'char', 'string': 'Database ID'}},
-                                       prefix_node+field+':', None, st_name+'/', level-1)
 
+                    if fields[field].get('relation',False) and level>0:
+                        model_populate({'/id': {'type': 'char', 'string': 'ID'}, '.id': {'type': 'char', 'string': 'Database ID'}},
+                                       prefix_node+field, None, st_name+'/', level-1)
+        fields.update({'id':{'string':'ID'},'.id':{'string':_('Database ID')}})
         model_populate(fields)
 
+
         try:
             data = csv.reader(csvfile.file, quotechar=str(csvdel), delimiter=str(csvsep))
         except:
             raise common.warning(_('Error opening .CSV file'), _('Input Error.'))
 
+
+        records = []
         fields = []
         word=''
+        limit = 3
+
+        for i, row in enumerate(data):
+            records.append(row)
+            if i == limit:
+                break
+
         try:
-            for line in data:
+            for line in records:
                 for word in line:
                     word = ustr(word.decode(csvcode))
                     if word in _fields:
@@ -468,7 +524,11 @@
             error = {'message':_('Error processing your first line of the file. Field %s is unknown') % (word,), 'title':_('Import Error.')}
 
         kw['fields'] = fields
-        return self.imp(error=error, **kw)
+        if error:
+            return self.imp(error=error, **kw)
+        else:
+            return self.imp(records=records, **kw)
+
 
     @expose()
     def import_data(self, csvfile, csvsep, csvdel, csvcode, csvskip, fields=[], **kw):
@@ -494,7 +554,6 @@
         except Exception, e:
             raise common.warning(ustr(e), _('XML-RPC error'))
 
-
         if res[0]>=0:
             error = {'message':_('Imported %d objects') % (res[0],)}
 

=== modified file 'addons/openerp/controllers/templates/exp.mako'
--- addons/openerp/controllers/templates/exp.mako	2010-12-22 16:47:18 +0000
+++ addons/openerp/controllers/templates/exp.mako	2011-01-05 07:25:54 +0000
@@ -74,6 +74,17 @@
             });
         }
 
+        function do_import_cmp(form){
+        	var import_com
+			if(jQuery("#import_compat").attr("checked")==true){
+				import_com = 1;
+			}
+
+			jQuery('#'+form).attr({
+	                'action': openobject.http.getURL('/openerp/impex/exp',{'import_com':import_com})
+            	}).submit();
+        }
+
         function delete_listname() {
 			var form = document.forms['view_form'];
             var list = new ListView('_terp_list');
@@ -115,7 +126,6 @@
                 o.selected = true;
                 fields2 = fields2.concat('"' + o.text + '"');
             });
-
             openobject.dom.get('_terp_fields2').value = '[' + fields2.join(',') + ']';
             jQuery('#'+form).attr('target', 'new');
             jQuery('#'+form).attr('action', openobject.http.getURL(
@@ -126,7 +136,7 @@
 </%def>
 
 <%def name="content()">
-    <form id='view_form' action="/openerp/impex/export_data" method="post" onsubmit="return false;">
+    <form id='view_form' action="/openerp/impex/export_data" method="post" target="_self" onsubmit="return false;">
 
     <input type="hidden" id="_terp_model" name="_terp_model" value="${model}"/>
     <input type="hidden" id="_terp_ids" name="_terp_ids" value="${ids}"/>
@@ -249,7 +259,11 @@
                             </td>
                             <td style="padding-left:3px">${_("Add field names")}</td>
                             <td style="padding-left:8px">
-                                <input type="checkbox" class="checkbox" name="import_compat" id="import_compat"/>
+                            % if import_com == '1' :
+                                <input type="checkbox" class="checkbox" name="import_compat" id="import_compat" checked="checked" onclick="do_import_cmp('view_form')"/>
+                            % else :
+                                <input type="checkbox" class="checkbox" name="import_compat" id="import_compat" onclick="do_import_cmp('view_form')"/>
+                            % endif
                             </td>
                             <td style="padding-left:3px"><label for="import_compat" title="Restricts the number of exportable fields in order to ensure the generated export will be importable back into OpenERP."
                                     >${_("Import Compatible")}</label></td>

=== modified file 'addons/openerp/controllers/templates/imp.mako'
--- addons/openerp/controllers/templates/imp.mako	2010-12-22 16:47:18 +0000
+++ addons/openerp/controllers/templates/imp.mako	2011-01-05 07:25:54 +0000
@@ -44,6 +44,9 @@
         }
 
         function do_import(form){
+			if (document.getElementById('record').innerHTML){
+				document.getElementById('record').innerHTML = " "
+			}
 
             var options = openobject.dom.get('fields').options;
 
@@ -87,6 +90,9 @@
         }
 
         function do_autodetect(form){
+			if (document.getElementById('record').innerHTML){
+				document.getElementById('record').innerHTML = " "
+			}
 
             if (! openobject.dom.get('csvfile').value ){
                 return error_display(_('You must select an import file first.'));
@@ -96,6 +102,7 @@
                 'target': "detector",
                 'action': openobject.http.getURL('/openerp/impex/detect_data')
             }).submit();
+
         }
 
     % if error:
@@ -110,6 +117,31 @@
         jQuery(window.parent.document.body).append($error_div);
     % endif
 
+	% if records:
+        var $rec = jQuery('\
+        	<table class="grid" width="100%">\
+	        	% for j, i in enumerate(records):
+	        		% if j == 0:
+		        		<tr class="grid-header">\
+		        		<th class="grid-cell">${i[0]}</th>\
+						<th class="grid-cell">${i[1]}</th>\
+						<th class="grid-cell">${i[2]}</th>\
+						</tr>\
+					% else:
+						<tr class="grid-row">\
+		        		<td class="grid-cell">${i[0]}</td>\
+						<td class="grid-cell">${i[1]}</td>\
+						<td class="grid-cell">${i[2]}</td>\
+						</tr>\
+					% endif
+				% endfor
+			</table>\
+		');
+		jQuery(window.parent.document.getElementById('record')).append($rec);
+	% endif
+
+
+
     </script>
 </%def>
 
@@ -139,6 +171,9 @@
         <tr>
             <td class="side_spacing">
                 <table class="fields-selector-import" cellspacing="5" border="0">
+                	<tr>
+			        	<div id="record" align="center"></div>
+			        </tr>
                     <tr>
                         <th class="fields-selector-left">${_("All fields")}</th>
                         <th class="fields-selector-center">&nbsp;</th>


Follow ups