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

最新文章

  1. Clang: Undefined symbols, but it is there using nm.
  2. GROUP与HAVING的使用
  3. linux kernel 杂谈
  4. 使用ftp软件上传下载php文件时换行丢失bug
  5. 再详细的介绍一下Unity5的AssetBundle
  6. JQuery 选中Radio
  7. Java中List Set Map 是否有序等总结
  8. AIM Tech Round (Div. 2) A. Save Luke 水题
  9. ArcGIS Add-in开发(一)--获取选定要素的属性值
  10. Android studio 配置JNI环境
  11. Boost库学习之旅入门篇
  12. mysql的约束的讨论
  13. How feedback work for your improvement
  14. SQL注入(一) - 入门篇
  15. Redis中的数据对象
  16. .Net语言 APP开发平台——Smobiler学习日志:HoverBackColor属性的简单介绍
  17. java中函数的参数传递
  18. c#在Excel指定单元格中插入图片
  19. Alpha 冲刺十
  20. JSON.stringify() 格式化 输出log

热门文章

  1. JavaWeb中常见的乱码处理(亲测)
  2. 用Pandas获取商品期货价格并可视化
  3. [Codeforces #196] Tutorial
  4. 【BFS】Power Hungry Cows
  5. jquery 封装的ajax调用
  6. Mac电脑,Andorid studio 配置 Flutter
  7. Web安全测试指南--文件系统
  8. C# 获取文件版本
  9. __FILE__,__LINE__,FUNCTION__实现代码跟踪调试
  10. 解决myeclipse不编译的方法