From efd46a5e9d9cc327ae540cf4eae8acd1d7f986f6 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Fri, 19 Sep 2008 08:30:20 +0200 Subject: [PATCH] fixedrelated bzr revid: fp@tinyerp.com-20080919063020-bgvwhya3r7xs85ct --- bin/addons/base/res/partner/partner.py | 2 +- bin/osv/fields.py | 46 ++++++++++++++------------ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/bin/addons/base/res/partner/partner.py b/bin/addons/base/res/partner/partner.py index 87df45c300c..4183eccaf2f 100644 --- a/bin/addons/base/res/partner/partner.py +++ b/bin/addons/base/res/partner/partner.py @@ -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, diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 4e148d68df7..60586e5e5af 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -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) + def __init__(self,*arg,**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()