测试
# TransactionCase 一旦测试用例成功,事务将会自动回滚
# test_开头的方法被视作 测试用例
# self.assertEqual方法 查看测试用力是否成功运行
# setUp() 方法会自动调用我们所运行的每个测试用例
# 启动odoo服务时 --test-enabled 启动测试用例
# tagged() 装饰器 是在安装模块后运行测试用例
# 额外测试工具类
SingleTransactionCase 由这个类生成的测试用例,会将所有测试用例运行到一个事务中,因此测试用例中做的修改会在另一个测试用例中使用到。 事务公共第一个测试方法开启,在完成最后一个测试用例时结束
SavepointCase 在回滚保存点之前运行, 不是将所有测试用例放在一个单独的事务中类运行。它用于创建大型测试用例,让它们通过仅生成一次数据来实现更快的速度。此处,我们使用 setUpClass()方法来生成初始测试数据
# 向导测试
Odoo中的远程过程调用(RPC)
XML-RPC
#1. 连接odoo 服务
from xmlrpc import client
server_url='http://127.0.0.1:8888' # 地址
db_name='12DB_ENTER' # 数据库
username='1' # 登录账号
password='1' # 登录密码
common=client.ServerProxy(f'{server_url}/xmlrpc/2/common') # 得到一个服务对象
# authenticate 认证方法 。四个参数:数据,账号,密码,user agent环境,环境不能为空。至少传一个空字典
user_id=common.authenticate(db_name,username,password,{}) # 获取超级管理员id
version_info=common.version() # 获取版本
if user_id:
print(user_id)
print(version_info)
# 2. 读取记录
# execute_kw 函数 执行查询数据库指令。
# 参数:数据库名称,用户的id,密码,模型名称,方法,位置参数数组(过滤域),关键字参数的字典(limit,offset,count,order)
search_domain = ['|', ['name', 'ilike', 'odoo'], ['name', 'ilike', 'sql']] # 设置过滤域
# seach 查询 获得是id列表
books_ids = models.execute_kw(db_name, user_id, password,
'library.book', 'search',
[search_domain],
{'limit': 5})
# read 读取数据 ,根据id获得该对象的其他值
books_data= models.execute_kw(db_name, user_id, password,
'library.book', 'read',
[books_ids, ['name', 'date_release']])
#### 注意:search 和read 合并的获取数据颇为费时,search_read 是获取同样数据的一个方法
search_domain = ['|', ['name', 'ilike', 'odoo'], ['name', 'ilike', 'python']]
books_ids = models.execute_kw(db_name, user_id, password,
'library.book', 'search_read',
[search_domain, ['name', 'date_release']],
{'limit': 5})
print('Books data:', books_ids)
# 对于many2one字段,将会获得一个数组
# 3. CUD 通过xml-rpc 增改删
# create新增
create_data = [
{'name': 'Book 1', 'release_date': '2019-01-26'},
{'name': 'Book 3', 'release_date': '2019-02-12'},
{'name': 'Book 3', 'release_date': '2019-05-08'},
{'name': 'Book 7', 'release_date': '2019-05-14'}
]
# 在 列表位置参数中,放入数据字典
books_ids = models.execute_kw(db_name, user_id, password,
'library.book', 'create',
[create_data])
print("Books created:", books_ids)
# write 修改
book_to_write = books_ids[1] # 将要修改的对象
write_data = {'name': 'Books 2'} # 修改后的值
# 在 列表位置参数中,放入要修改的数据对象和修改的数据
written = models.execute_kw(db_name, user_id, password,
'library.book', 'write',
[book_to_write, write_data])
# unlink 删除
books_to_delete = books_ids[2:] # 将要被删除的数据对象
# 在列表位置参数,放入要删除的对象
deleted = models.execute_kw(db_name, user_id, password,
'library.book', 'unlink',
[books_to_delete])
# 4. 调用方法
# book_id 是一个已有的 图书对象,可依据上述的 新增 一条
# make_available 是当前模型对象下的一个具体的方法
models.execute_kw(db_name, user_id, password,
'library.book', 'make_available',
[[book_id]])
# 注意:
1.无法通过RPC调用私有方法,只能调用公有方法
2. 如果方法产生了异常,事务中执行的操作会自动回滚到初始状态。 仅适用于单个事务
3. 多次调用RPC时,产生异常时。调用成功的RPC事务不会回滚。 推荐使用单个RPC调用执行
JSON-RPC
# 1. JSON-RPC 连接 odoo 服务
import json
import random
import requests
server_url = 'http://localhost:8069' # 访问odo服务地址
db_name = 'test-12' # 数据库
username = 'admin' # 登录账号
password = 'admin' # 登录密码
json_endpoint = "%s/jsonrpc" % server_url # 拼接JSONRPC访问地址
headers = {"Content-Type": "application/json"} # 设置头信息
def get_json_payload(service, method, *args): # 固定写法
return json.dumps({
"jsonrpc": "2.0",
"method": 'call',
"params": {
"service": service,
"method": method,
"args": args
},
"id": random.randint(0, 100000000),
})
# 组装请求的数据
payload = get_json_payload("common", "login", db_name, username, password)
# 发送请求
response = requests.post(json_endpoint, data=payload, headers=headers)
#响应结果在result中
user_id = response.json()['result']
# 2. 读取 和 搜索记录
# 搜索记录
# 设置 搜索域
search_domain=['|',['name','ilike','python'], ['name', 'ilike', 'sql']]
# 组装数据,
payload=get_json_payload('object','execute_kw',db_name,user_id,password,'library.book',
'search',[search_domain],{'limit':5})
# 发送请求
res=requests.post(url=json_endpoing,data=payload,headers=headers).json()
# 读取记录
# 组装数据
payload=get_json_payload('object','execute_kw',db_name,user_id,password,
'library.book','read',
[res['result'],['name','date_release']])
# 发送请求
res=requests.post(json_endpoing,data=payload,headers=headers).json()
# search_read
# 组装数据
payload=get_json_payload('object','execute_kw',db_name,user_id,password,
'library.book','search_read',
[search_domain,['name','date_release']],
{'limit':5})
# 发送请求
res=requests.post(json_endpoing,data=payload,headers=headers).json()
# 3. cud 增改删
# 增
payload=get_json_payload('object','execute_kw',db_name,user_id,password,
'library.book','create',
[create_data])
res=requests.post(json_endpoing,data=payload,headers=headers).json()
# 改
book_to_write=books_ids[0]
write_data={'name':'Book123456789'}
payload=get_json_payload('object','execute_kw',db_name,user_id,password,
'library.book','write',
[book_to_write,write_data])
res=requests.post(json_endpoing,data=payload,headers=headers).json()
# 删
book_to_unlink=books_ids[2]
payload=get_json_payload('object','execute_kw',db_name,user_id,password,
'library.book','unlink',
[book_to_unlink])
res=requests.post(json_endpoing,data=payload,headers=headers).json()
# 检查权限
payload = get_json_payload("object", "execute_kw",
db_name, user_id, password,
'library.book', 'check_access_rights', ['create'])
res = requests.post(json_endpoint, data=payload, headers=headers).json()
# 4. JSON-RPC 调用方法 , 只能调用公共方法
payload=get_json_payload('object','execute_kw',db_name,user_id,password,
'library.book','make_available',[book_id])
res=requests.post(json_endpoing,data=payload,headers=headers).json()
OCA odoorpc
# 1. 安装 pip install OdooRPC
# 2. 示例代码
import odoorpc
server_url='http://127.0.0.1:8888' # 地址
db_name='12DB_ENTER' # 数据库
username='1' # 账号
password='1' # 密码s
# 获得odoorpc对象
odoo=odoorpc.ODOO('localhost',port=8888)
# 登录验证
odoo.login(db_name,username,password)
# 当前用户
user=odoo.env.user
print(user)
print(user.company_id.name)
print(user.email)
# 获取模型
BookModel=odoo.env['library.book']
search_domain=['|',['name','ilike','python'],['name','ilike','信息']]
books_ids=BookModel.search(search_domain,limit=5)
for book in BookModel.browse(books_ids):
print(book.name,book.date_release)
# 新增
book_id=BookModel.create({'name':'Test','state':'draft'})
book=BookModel.browse(book_id)
book.make_available()
book=BookModel.browse(book_id)
print(book.state)
# login方法 传递数据库名,用户名 和密码
# odoo.execute方法 执行原声rpc语法
'''
books_info = odoo.execute('library.book', 'search_read',
[['name', 'ilike', 'odoo']], ['name', 'date_release'])
print(books_info)
'''