这是一个非常简单但很难回答的问题,因为我认为只有"少数"人会处理这个问题。
我有一个简单的Python脚本:
import xmlrpclib
username = 'my_openerp_user'
pwd = 'my_password'
dbname = 'my_openerp_database'
sock = xmlrpclib.ServerProxy('http://localhost:8063/xmlrpc/common')
uid = sock.login(dbname, username, pwd)
sock = xmlrpclib.ServerProxy('http://localhost:8063/xmlrpc/object')
args = [('name', 'ilike', 'my_product')]
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args)
print ids
它应该在OpenERP数据库中找到名称为"my_product"的所有产品,但它没有。我知道原因:
我不在一个讲英语的国家,所以我在OpenERP中安装了一种语言,xmlrpc的"搜索"是在寻找名为"my_product"的产品,但只能用英语。问题是,显然没有保存翻译名称的字段。。。它似乎也是"名字"!因此,如果我用我的语言指定产品名称,我就找不到它们。
世界上有人有同样的问题吗?
编辑
好吧,我有一个线索:如果我不做"搜索",而是"阅读":
product_names = sock.execute(dbname, uid, pwd, 'product.product', 'read', ids, ['name'], {'lang': 'es_ES'})
通过这种方式,我可以指定语言,它可以工作!但我不能用"搜索"做同样的事情,我会出错。有人知道路吗???
新版
context = {'lang': 'es_ES'}
args = [('name', 'ilike', 'my_product')] # consulta
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args, context)
我几乎可以肯定,如果您在context
中传递lang
,它应该会起作用。
例如:context = {'lang': u'pl_PL'}
。
如果不起作用,您应该尝试覆盖name_search方法。
搜索方法如下:
search(cr, uid, args, offset=0, limit=None, order=None, context=None, count=False)
如果你想发送上下文,你还必须在参数和上下文之间发送参数:
ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args, 0, 0, False, context)
在openerp/osv/expression.py中,查询被重新制定为首先搜索翻译,只有在ir_translation中不存在翻译的情况下才搜索英文原名。OpenERP服务器6.0.4
query1 = '( SELECT res_id'
' FROM ir_translation'
' WHERE name = %s'
' AND lang = %s'
' AND type = %s'
instr = ' %s'
#Covering in,not in operators with operands (%s,%s) ,etc.
if operator in ['in','not in']:
instr = ','.join(['%s'] * len(right))
query1 += ' AND value ' + operator + ' ' +" (" + instr + ")" + ')'
else:
query1 += ' AND value ' + operator + instr + ')'
query1 +=' UNION ('
' SELECT id'
' FROM "' + working_table._table + '"' + ' as wt '
' WHERE "'+ left + '" ' + operator + instr +
' AND NOT EXISTS ( '
' SELECT res_id FROM ir_translation '
' WHERE wt.id = res_id '
' AND name = %s'
' AND lang = %s'
' AND type = %s)' + ")"
query2 = [working_table._name + ',' + left,
context.get('lang', False) or 'en_US',
'model',
right,
right,
working_table._name + ',' + left,
context.get('lang', False) or 'en_US',
'model'
]