Added fields.related field type

bzr revid: hda@tinyerp.com-20080918112857-4ixoi25qv33lum32
This commit is contained in:
hda@tinyerp.com 2008-09-18 16:58:57 +05:30
parent c8298ab59f
commit 9abaa999e9
3 changed files with 105 additions and 26 deletions

View File

@ -153,6 +153,8 @@ class res_partner(osv.osv):
'active': fields.boolean('Active'),
'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'),
}
_defaults = {
'active': lambda *a: 1,

View File

@ -188,6 +188,8 @@
<field name="arch" type="xml">
<tree string="Partners">
<field name="name"/>
<field name="city"/>
<field name="country"/>
<field name="title" string="Type"/>
<field name="ref"/>
<field name="address" string="# of Contacts"/>
@ -208,6 +210,8 @@
<field domain="[('domain', '=', 'partner')]" name="title"/>
<field name="lang" select="2"/>
<field name="supplier" select="2"/>
<field name="city" select="2" />
<field name="country" select="2" />
</group>
<notebook colspan="4">
<page string="General">

View File

@ -631,6 +631,79 @@ class function(_column):
if self._fnct_inv:
self._fnct_inv(obj, cr, user, id, name, value, self._fnct_inv_arg, context)
# ---------------------------------------------------------
# Related fields
# ---------------------------------------------------------
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)
def _fnct_read(self,obj,cr, uid, ids, field_name, args, context=None):
relation=obj._name
res={}
for data in obj.browse(cr,uid,ids):
t_data=data
relation=obj._name
for i in range(0,len(args)-1):
field_detail=self._field_get(cr,uid,relation,args[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]]
else:
res[data.id]=t_data
return res
# def _fnct_write(self,obj, cr, uid, ids, name, value, args, context=None):
# print "_fnct_write>>>",ids,name,value,args
# if type(ids)!=type([]):
# ids=[ids]
# for data in obj.browse(cr,uid,ids):
# t_data=data
# relation=obj._name
# for i in range(0,len(args)-1):
# field_detail=self._field_get(cr,uid,relation,args[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:
# query="UPDATE",relation.replace('.','_'),"set",args[len(args)-1],"=",value," where id=",t_data.id
# print query
# cr.execute(query)
## return obj.write(cr,uid,data.id,{args[len(args)-1]:value})
# return True
def __init__(self,*arg,**args):
function.__init__(self,self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg,method=True, fnct_search=self._fnct_search,**args)
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()
return res
# ---------------------------------------------------------
# Serialized fields