在OpenERP中获取本地语言的产品名称?



这是一个非常简单但很难回答的问题,因为我认为只有"少数"人会处理这个问题。

我有一个简单的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'
           ]

最新更新