zoukankan      html  css  js  c++  java
  • 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)
    '''
    
  • 相关阅读:
    思念
    Matlab与C++混合编程,添加OpenCV库
    重新启用此博客
    将博客搬至CSDN
    unity探索者之ILRuntime代码热更新
    unity探索者之UGUI圆形图片组件
    unity探索者之UGUI图片描边
    unity探索者之iOS微信登录、分享
    unity探索者之复制内容到剪贴板
    unity探索者之获取设备当前电量
  • 原文地址:https://www.cnblogs.com/dengz/p/14582175.html
Copyright © 2011-2022 走看看