import os # 导入os模块,用于操作文件和目录 import base64 # 导入base64模块,用于编码和解码数据 from xmlrpc.client import ServerProxy # 导入ServerProxy类,用于创建XML-RPC客户端代理 # 定义Odoo服务器的URL,这里使用的是实际的URL url = 'https://dis.dt-ok.cn:8888' # 如果需要在本地开发环境中测试,可以取消注释下面的url行 # url = 'http://127.0.0.1:8069' # Odoo数据库的名称、用户名和密码 db = 'dis' username = 'jack' password = 'aaaAAA111!!!' # 创建一个指向Odoo服务器通用接口的代理 common = ServerProxy(f'{url}/xmlrpc/2/common') # 使用数据库名、用户名、密码和空的附加参数进行认证,获取用户ID uid = common.authenticate(db, username, password, {}) # 定义存放图片的本地文件夹路径 base_dir = 'picture_dir' # 创建一个指向Odoo服务器对象接口的代理 models = ServerProxy(f'{url}/xmlrpc/2/object') # 在Odoo中搜索所有的png图片,获取它们的ID列表 image_ids = models.execute_kw(db, uid, password, 'qy_io.resource', 'search', [[['type', '=', 'png']]]) # 创建一个集合,用于存储系统中已存在的图片名称 existing_image_names = set() # 读取搜索到的图片记录,将它们的名称添加到集合中 for image in models.execute_kw(db, uid, password, 'qy_io.resource', 'read', [image_ids, ['name']]): existing_image_names.add(image['name']) # 获取本地文件夹中的所有文件列表,并构造完整的文件路径 files = [os.path.join(base_dir, file) for file in os.listdir(base_dir)] # 遍历本地文件夹中的每个文件 for filename in os.listdir(base_dir): # 如果文件不是png格式的图片,则跳过 if not filename.endswith('.png'): continue # 打开图片文件进行读取 fb = open(os.path.join(base_dir, filename), 'rb') # 获取图片的原始名称(不包含扩展名) name = filename[:-4] # 检查Odoo中是否已存在同名的图片 if name in existing_image_names: # 如果存在,根据业务逻辑决定是替换图片还是更新其他信息 # 这里选择替换图片 # 搜索Odoo中同名的图片,获取它们的ID列表 image_ids = models.execute_kw(db, uid, password, 'qy_io.resource', 'search', [[['name', '=', name]]]) # 如果找到了图片,则取第一个ID进行更新操作 if image_ids: image_id = image_ids[0] # 读取图片内容并进行base64编码,然后更新图片数据 models.execute_kw(db, uid, password, 'qy_io.resource', 'write', [image_id, { 'data': base64.b64encode(fb.read()).decode() }]) print(f'Updated image: {name}') # 打印更新图片的信息 else: # 如果Odoo中不存在同名的图片,则创建新的图片记录 ext = filename[-3:] # 获取图片文件的扩展名 # 创建新的图片记录,包括名称、类型和base64编码后的数据 id = models.execute_kw(db, uid, password, 'qy_io.resource', 'create', [{ 'name': name, 'type': ext, 'data': base64.b64encode(fb.read()).decode() }]) print(f'Created new image: {name}') # 打印创建新图片的信息