Odoo中文网|Odoo实施培训

 找回密码
 立即注册
搜索
热搜: Odoo OpenERP 实施
查看: 5955|回复: 0
打印 上一主题 下一主题

使用xml-rpc调试openerp模块中的函数

[复制链接]

9

主题

9

帖子

35

积分

新手上路

Rank: 1

积分
35
跳转到指定楼层
楼主
发表于 2015-9-9 17:14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
运行openerp模块中的函数 有很多方式, 可以在视图中加个按钮然后点击它, 也可以在集成开发环境中强制执行它。 不过, 用python写个小脚本,xml-rpc调用直接执行它, 无疑是最简便的方法了

一 调用方法

示例:
            import xmlrpclib
            from pprint import pprint
            
            uid=1  #用户名admin所对应的id号
            pwd="admin"   #admin对应的密码
            dbname="demo"
            tcp_port="8069"
            sock=xmlrpclib.ServerProxy("http://127.0.0.1:%s/xmlrpc/object" % tcp_port)
            
            model="hr.employee.category"  ##要运行哪个类中的函数?
            method="read"      ##要运行的函数
            
            ##def read (self, cr, uid, ids, fields=None, context=None)  #函数签名
            ids=[1,2,3]  ##参数一,
            fields=['name','complete_name','parent_id', 'child_ids']  ##参数二
            result = sock.execute(dbname, uid, pwd,
                                  model,method ,
                                  ids, fields )
                        print "\n==== %s of %s ====" % (model, method)
            pprint(result)
            
            


可以看到, 我们在sock.execute中使用的参数, 与函数签名中给出的参数不完全相同,其对应关系是:
---函数签名中最前面的三个参数为 self, cr, uid
--socke.exec中最前面的五个参数为 dbname, uid, pwd,model,method
其后的参数相同。

二 调用日志

在openerp 7.0中, 我们在浏览器中做的操作,都会转换成xml-rpc调用, 我们可以通过查看xml-rpc的调用日志, 来了解openerp是使用什么参数调用xml-rpc的。 我们可以在函数disptach下增加如下语句来生成日志
            params = params[3:] ##加在这一行下面
            from pprint import pformat  ##这一行最后加在文件顶部
                        if ( params[0][0:2] =='op.' or params[0][1:3] =='op.'): #最关心的模块
                s=method+'!'+pformat(params[0])+pformat(params[1:],depth=9)
            elif ( params[1] =='get_needaction_data'):  #最不关心的调用
                s=method+'!'+pformat(params[0])+pformat(params[1:],depth=1)
            else :  #其他模块
                s=method+'!'+pformat(params[0])+pformat(params[1:],depth=3)
            
            


在7.0中,这段语句需要加在文件 service\web_services.py 的class objects_proxy中
在8.0中,这段语句需要加在文件 service\model.py中。 需要指出的是, 在默认情况下, oe8的浏览器操作已经不再使用xml-rpc了。
     
openerp提供了--log-request, 但是它记录的参数信息不够详细, 在oe7中, 生成的日志条数又太多, 因此我们不采用它。


三 调用以下划线开头的函数

出于安全的考虑, openerp不允许从模块外部调用下划线开头的函数。 在试验环境中, 这对于我们探索openerp的奥秘是个障碍, 我们注释如下这两行的源码就行了 (oe8在文件model.py中,oe7在文件osv.py中
if method.startswith('_'):
        #    raise except_orm('Access Denied', 'Private methods (such as %s) cannot be called remotely.' % (method,))



运行这些以下划线开头的函数(以及browse函数),返回结果可能无法打包成xml格式, 这就会出现如下错误,
xmlrpclib.Fault: objects:

我们对python库文件xmlrpclib.py中的dump_struct函数稍加修改, 就可以运行除了broswe之外几乎所有的函数了
                        
                  for k, v in value.items():                        write("\n")
                        if type(k) is IntType:  ##添加此行和下一行
                            k = "%d" % k        ##将diction的键值由数字转为字符  
                        if type(k) is not StringType:
                            if unicode and type(k) is UnicodeType:
                                k = k.encode(self.encoding)
                            else:
                                raise TypeError, "dictionary key must be string"

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|技术支持|开发手册|Odoo中文网-远鼎旗下odoo培训网站 ( 苏ICP备15039516号 )

GMT+8, 2024-4-24 16:26 , Processed in 0.015157 second(s), 9 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表