openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #01908
[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"> </th>
Follow ups