fixedrelated
authorFabien Pinckaers <fp@tinyerp.com>
Fri, 19 Sep 2008 06:30:20 +0000 (08:30 +0200)
committerFabien Pinckaers <fp@tinyerp.com>
Fri, 19 Sep 2008 06:30:20 +0000 (08:30 +0200)
bzr revid: fp@tinyerp.com-20080919063020-bgvwhya3r7xs85ct

bin/addons/base/res/partner/partner.py
bin/osv/fields.py

index 87df45c..4183ecc 100644 (file)
@@ -154,7 +154,7 @@ class res_partner(osv.osv):
         'customer': fields.boolean('Customer'),
         'supplier': fields.boolean('Supplier'),
         'city':fields.related('address','city',type='char', string='City'),
-        'country':fields.related('address','country_id','name',type='char', string='Country'),
+        'country':fields.related('address','country_id',type='many2one', relation='res.country', string='Country'),
     }
     _defaults = {
         'active': lambda *a: 1,
index 4e148d6..60586e5 100644 (file)
@@ -638,39 +638,41 @@ class function(_column):
 class related(function):
 
     def _fnct_search(self, cr, uid, ids, obj=None, name=None, context=None):
-        print "_fnct_search >>>",ids,obj,name
-        return self._fnct_search(obj, cr, uid, obj, name, args)
+        raise 'Not Implemented Yet'
+
+    def _fnct_write(self,obj,cr, uid, ids, field_name, args, context=None):
+        raise 'Not Implemented Yet'
 
     def _fnct_read(self,obj,cr, uid, ids, field_name, args, context=None):
+        if not ids: return {}
         relation=obj._name
         res={}
-        for data in obj.browse(cr,uid,ids):
+        objlst = obj.browse(cr,uid,ids)
+        for data in objlst:
             t_data=data
             relation=obj._name
-            for i in range(0,len(args)-1):
-                field_detail=self._field_get(cr,uid,relation,args[i])
+            for i in range(len(self.arg)):
+                field_detail=self._field_get(cr,uid,relation,self.arg[i])
                 relation=field_detail[0]
-                if field_detail[1]=='one2many':
-                    if t_data[args[i]]:
-                        t_data=t_data[args[i]][0]
-                    else:
-                        t_data=False
-                        break
-                elif field_detail[1]=='many2one':
-                    if t_data[args[i]]:
-                        t_data=t_data[args[i]]
-                    else:
-                        t_data=False
-                        break
-            if t_data:
-                res[data.id]=t_data[args[len(args)-1]]
+                if not t_data[self.arg[i]]:
+                    t_data = False
+                    break
+                if field_detail[1] in ('one2many','many2many'):
+                    t_data=t_data[self.arg[i]][0]
+                else:
+                    t_data=t_data[self.arg[i]]
+            if type(t_data) == type(objlst[0]):
+                res[data.id]=t_data.id
             else:
                 res[data.id]=t_data
         return res
-    
+
     def __init__(self,*arg,**args):
-        function.__init__(self,self._fnct_read, arg, fnct_inv_arg=arg,method=True, fnct_search=self._fnct_search,**args)
+        print arg
+        self.arg = arg
+        super(related, self).__init__(self._fnct_read, arg, fnct_inf=self._fnct_write, fnct_inv_arg=arg,method=True, fnct_search=self._fnct_search,**args)
 
+    # TODO: call field_get on the object, not in the DB
     def _field_get(self, cr, uid, model_name, prop):
         cr.execute('SELECT relation,ttype FROM ir_model_fields WHERE name=%s AND model=%s', (prop, model_name))
         res = cr.fetchone()