← Back to team overview

openerp-dev-web team mailing list archive

[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