运行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"

使用xml-rpc调试openerp模块中的函数的更多相关文章

  1. ch2-1:创建模块,并调用模块中的函数

    模块就是一个包含python代码的文本文件,文件名以.py结尾,这是python扩展名: 1.创建一个模块nester.py,文件内容为: '''这是一个模块,可以打印列表,其中可能包含嵌套列表''' ...

  2. Python引用多个模块,调用模块中的函数时,要注意的地方

    转自:http://blog.csdn.net/yjk13703623757/article/details/70237463 python模块是”从下到上”导入(import)的. 例如: a.py ...

  3. functools模块中的函数

    Python自带的functools模块提供了一些常用的高阶函数,也就是用于处理其它函数的特殊函数.换言之,就是能使用该模块对可调用对象进行处理.functools模块函数概览functools.cm ...

  4. Python -- 使用模块中的函数

    在确定自己不会导入多个同名函数(从不同模块导入)的情况下,你可能不希望在每次调用函数的时候,都要写上模块的名字.那么,可以使用import命令的另外一种形式: >>> from ma ...

  5. python中thread模块中join函数

    http://www.cnblogs.com/vingi/articles/2657790.html for i in range(10): t = ThreadTest(i) thread_arr. ...

  6. 【集成学习】sklearn中xgboost模块中plot_importance函数(绘图--特征重要性)

    直接上代码,简单 # -*- coding: utf-8 -*- """ ################################################ ...

  7. sklearn中xgboost模块中plot_importance函数(特征重要性)

    # -*- coding: utf-8 -*- """ ######################################################### ...

  8. 【集成学习】sklearn中xgboot模块中fit函数参数详解(fit model for train data)

    参数解释,后续补上. # -*- coding: utf-8 -*- """ ############################################## ...

  9. urllib模块中parse函数中的urlencode和quote_plus方法

    本来只是向看一下quote_plus的作用,然后发现urlencode方法也是很方便的一个组合字符串的方法首先是介绍一下urlencode,他是将一些传入的元素使用&串联起来,效果如下: &g ...

随机推荐

  1. JZYZOJ1390【noi2001】炮兵阵地 状压DP

    http://172.20.6.3/Problem_Show.asp?id=1390 需要储存该行和上一行两个状态.通过观察规则可以发现条件允许的状态很少(相邻两个至少空两格),据此可以减少状态数量, ...

  2. BZOJ 2789 letters(树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2789 [题目大意] 给出两个字符串,通过A字符串相邻之间字符的交换得到B字符串, 求最 ...

  3. [Andrew Stankevich's Contest#21] Lempel-Ziv Compression

    Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)     Special Judge ...

  4. Codeforces Round #341 (Div. 2) D. Rat Kwesh and Cheese 数学

    D. Rat Kwesh and Cheese 题目连接: http://www.codeforces.com/contest/621/problem/D Description Wet Shark ...

  5. php中NULL、false、0、" "有何区别?

    php中很多还不懂php中0,"",null和false之间的区别,这些区别有时会影响到数据判断的正确性和安全性,给程序的测试运行造成很多麻烦.先看一个例子: <? $str ...

  6. jQuery插件示例笔记

    插件的种类 封装对象方法的插件 将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作. //注意,为了更好的兼容性开始前有个分号 ;(function($){ //此处将$作为匿名函数的 ...

  7. c/c++代码的unit-test中覆盖率的统计

    gcov lcov genhtml工具      gcov伴随gcc 发布.gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信 ...

  8. 高手从零开始的全定制发行版-Linux from Scratch

    在制作Linux发行版中Linux from Scratch可谓是真正的大师级.Linux from Scratch是在线的社区创建的一本电子书,目的是帮助那些根深蒂固的想方设法提高计算机性能的人(t ...

  9. Hibernate 注解@Column(nullable = false) 和 @Column(unique=true)

    unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样; nullable=false是这个字段在保存时必需有值,不能还是null值就调用save去保存入库;

  10. Docker从12升级到17ce

    先卸载 yum remove docker* yum remove container-selinux--.el7.centos.x86_64 安装 sudo yum install -y yum-u ...