upload_picture.py 3.2 KB

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