Odoo RPC

测试

# 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)
'''
原文地址:https://www.cnblogs.com/dengz/p/14582175.html