openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #06661
[Merge] lp:~openerp-dev/openobject-client/trunk-bug-771801-rga into lp:openobject-client
Ravi Gadhia (OpenERP) has proposed merging lp:~openerp-dev/openobject-client/trunk-bug-771801-rga into lp:openobject-client.
Requested reviews:
Naresh(OpenERP) (nch-openerp)
Related bugs:
Bug #771801 in OpenERP GTK Client: "Export data save doesn't work with not import compatible data"
https://bugs.launchpad.net/openobject-client/+bug/771801
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-bug-771801-rga/+merge/60759
Hello sir
I made changes as you describe. I move heavy weight method (model_populate) to server. which had rpc call (fields_get) in loop. related server branch: lp:~openerp-dev/openobject-server/trunk-bug-export_method-rga
--
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-bug-771801-rga/+merge/60759
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-client/trunk-bug-771801-rga.
=== modified file 'bin/modules/gui/window/win_export.py'
--- bin/modules/gui/window/win_export.py 2011-01-25 10:26:37 +0000
+++ bin/modules/gui/window/win_export.py 2011-05-12 10:31:47 +0000
@@ -30,6 +30,7 @@
import service
import types
import os
+import operator
def export_csv(fname, fields, result, write_title=False):
import csv
@@ -104,7 +105,7 @@
except:
common.error(_('Error Opening Excel !'),'')
-def datas_read(ids, model, fields, fields_view, prefix='', context=None):
+def datas_read(ids, model, fields, context=None):
ctx = context.copy()
ctx.update(rpc.session.context)
datas = rpc.session.rpc_exec_auth('/object', 'execute', model, 'export_data', ids, fields, ctx)
@@ -117,7 +118,6 @@
self.win = self.glade.get_widget('win_save_as')
self.ids = ids
self.model = model
- self.fields_data = {}
self.fields = {}
if context is None:
context = {}
@@ -141,24 +141,19 @@
cell = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Field Name'), cell, text=0, background=2)
self.view1.append_column(column)
-
+ self.save_fields ={}
cell = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('Field Name'), cell, text=0)
self.view2.append_column(column)
- #for f in preload:
- # self.model2.set(self.model2.append(), 0, f[1], 1, f[0])
self.wid_import_compatible = self.glade.get_widget('import_compatible')
self.model1 = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
self.model2 = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
-
self.fields_original = fields
- self.model_populate(self.fields_original)
+ self.fill_model(fields, import_comp=False)
- self.view1.set_model(self.model1)
self.view2.set_model(self.model2)
- self.view1.show_all()
self.view2.show_all()
@@ -200,37 +195,22 @@
# Fill the predefined export tree view and show everything
self.fill_predefwin()
self.pref_export.show_all()
-
- def model_populate(self, fields, prefix_node='', prefix=None, prefix_value='', level=2):
- import_comp = self.wid_import_compatible.get_active()
- fields = fields.copy()
- fields.update({'id':{'string':_('ID')}})
- fields.update({'.id':{'string':_('Database ID')}})
-
- fields_order = fields.keys()
- fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', '')))
- for field in fields_order:
- if import_comp and fields[field].get('readonly', False):
- ok = False
- for sl in fields[field].get('states', {}).values():
- for s in sl:
- ok = ok or (s==('readonly',False))
- if not ok: continue
- self.fields_data[prefix_node+field] = fields[field]
- if prefix_node:
- self.fields_data[prefix_node + field]['string'] = '%s%s' % (prefix_value, self.fields_data[prefix_node + field]['string'])
- st_name = fields[field]['string'] or field
- node = self.model1.insert(prefix, 0, [st_name, prefix_node+field, (fields[field].get('required', False) and '#ddddff') or 'white'])
- self.fields[prefix_node+field] = (st_name, fields[field].get('relation', False))
- if fields[field].get('relation', False) and level>0:
- if (fields[field]['type'] in ['many2many']) and import_comp:
- pass
- else:
- if (not import_comp) or (fields[field]['type'] in ['one2many']):
- fields2 = rpc.session.rpc_exec_auth('/object', 'execute', fields[field]['relation'], 'fields_get', False, rpc.session.context)
- self.model_populate(fields2, prefix_node+field+'/', node, st_name+'/', level-1)
- else:
- self.model_populate({}, prefix_node+field+'/', node, st_name+'/', level-1)
+ self.fill_model(self.fields_original, import_comp=True)
+
+
+ def fill_model(self, fields={}, prefix_node='', prefix=0, prefix_value='', level=2, import_comp=True):
+ context= rpc.session.context
+ context['reset'] = True
+ export_list = rpc.session.rpc_exec_auth('/object', 'execute', 'ir.exports', 'export_list', fields, prefix_node, prefix, prefix_value, level, import_comp, context)
+ export_list.sort(key=operator.itemgetter(0))
+ self.model1.clear()
+ child_node ={}
+ for element in export_list:
+ node = self.model1.insert(child_node.get(element[0]), 0, element[2])
+ child_node[element[1]] = node
+ self.view1.set_model(self.model1)
+ self.view1.show_all()
+
def del_export_list_key(self,widget, event, *args):
if event.keyval==gtk.keysyms.Delete:
@@ -249,7 +229,6 @@
ir_export_line = rpc.RPCProxy('ir.exports.line')
export_ids=ir_export.search([('name','=',export_name)])
-
for id in export_ids:
fields=[]
line_ids=ir_export_line.search([('export_id','=',id)])
@@ -257,8 +236,8 @@
obj_line=ir_export_line.read(line_ids)
for i in range(0,len(obj_line)):
fields.append(obj_line[i]['name'])
-
- if fields==export_fields:
+
+ if set(fields)== set(export_fields):
ir_export.unlink(id)
ir_export_line.unlink(line_ids)
store.remove(store.get_iter(p))
@@ -275,11 +254,16 @@
sel.selected_foreach(self._sig_sel_add)
def _sig_sel_add(self, store, path, iter):
- name, relation = self.fields[store.get_value(iter,1)]
- #if relation:
- # return
- num = self.model2.append()
- self.model2.set(num, 0, store.get_value(iter,0), 1, store.get_value(iter,1))
+ ok = True
+ model2_iter = self.model2.get_iter_root()
+ while model2_iter:
+ field_name = self.model2.get_value(model2_iter, 1)
+ if field_name == store.get_value(iter,1):
+ ok = False
+ model2_iter = self.model2.iter_next(model2_iter)
+ if ok:
+ num = self.model2.append()
+ self.model2.set(num, 0, store.get_value(iter,0), 1, store.get_value(iter,1))
def sig_unsel(self, widget=None):
store, paths = self.view2.get_selection().get_selected_rows()
@@ -289,21 +273,29 @@
def import_toggled(self, widget=None):
self.model1.clear()
self.model2.clear()
- self.model_populate(self.fields_original)
+ self.fill_model(self.fields_original, import_comp = self.wid_import_compatible.get_active())
def sig_unsel_all(self, widget=None):
self.model2.clear()
def fill_predefwin(self):
- self.predef_model = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, gobject.TYPE_STRING)
+ def foreach_handler(model, path, iter, fields_list):
+ for field in fields_list:
+ if model.get_value(iter,1) == field:
+ self.save_fields[field] = model.get_value(iter,0)
+
+ self.predef_model = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
ir_export = rpc.RPCProxy('ir.exports')
ir_export_line = rpc.RPCProxy('ir.exports.line')
export_ids = ir_export.search([('resource', '=', self.model)])
for export in ir_export.read(export_ids):
fields = ir_export_line.read(export['export_fields'])
+ fields_list = [f['name'] for f in fields]
+ self.save_fields ={}
+ self.model1.foreach(foreach_handler, fields_list)
try:
- self.predef_model.append(([f['name'] for f in fields], export['name'], ', '.join([self.fields_data[f['name']]['string'] for f in fields])))
- except:
+ self.predef_model.append((self.save_fields.keys(), export['name'], ', '.join(self.save_fields.values()), self.save_fields.values()))
+ except Exception, e:
pass
self.pref_export.set_model(self.predef_model)
@@ -314,17 +306,20 @@
ir_export = rpc.RPCProxy('ir.exports')
iter = self.model2.get_iter_root()
fields = []
+ fields_str = []
while iter:
field_name = self.model2.get_value(iter, 1)
+ str = self.model2.get_value(iter, 0)
+ fields_str.append(str)
fields.append(field_name)
iter = self.model2.iter_next(iter)
ir_export.create({'name' : name, 'resource' : self.model, 'export_fields' : [(0, 0, {'name' : f}) for f in fields]})
- self.predef_model.append((fields, name, ','.join([self.fields_data[f]['string'] for f in fields])))
+ self.predef_model.append((fields, name, ' ,'.join(fields_str), fields_str))
def sel_predef(self, treeview, path, column):
self.model2.clear()
- for field in self.predef_model[path[0]][0]:
- self.model2.append((self.fields_data[field]['string'], field))
+ for field, string in zip(self.predef_model[path[0]][0], self.predef_model[path[0]][3]):
+ self.model2.append((string, field))
def go(self):
button = self.win.run()
@@ -340,7 +335,7 @@
self.parent.present()
self.win.destroy()
import_comp = self.wid_import_compatible.get_active()
- result = datas_read(self.ids, self.model, fields, self.fields_data, context=self.context)
+ result = datas_read(self.ids, self.model, fields, context=self.context)
if result.get('warning',False):
common.message_box(_('Exportation Error !'), unicode(result.get('warning',False)))
return False
Follow ups