# -*- coding: utf-8 -*- import json from odoo import api, fields, models from odoo.addons.sf_wxwork_approval.models import wx_work_api class WxSettings(models.Model): _name = 'wxwork.settings' _description = '企业微信设置' wx_work_app = fields.Char(string='企业微信应用名称') wx_work_corp_id = fields.Char(string='企业微信CorpID') wx_work_secret = fields.Char(string='企业微信Secret') wx_work_template_ids = fields.Many2many('wxwork.template.settings', string='审批模板') def update_template(self): template_dict = {} template_list = [] print(self.wx_work_template_ids) for template in self.wx_work_template_ids: # template_dict[template.sp_name] = template.template_id template_list.append(template.template_id) # template_dict = {} # print(template_list) wx = wx_work_api.WxWorkAPI(self.wx_work_corp_id, self.wx_work_secret) # print(wx) # 获取模型中的所有记录 all_records = self.env['wxwork.approval.template'].search([]) all_records1 = self.env['wxwork.approval.template.controls'].search([]) # 删除所有记录 all_records.unlink() all_records1.unlink() content_data_list = [] template_data = {} controls_data = [] for template in template_list: print('====================') temp_dict = {'template_id': template} # print(json.dumps(temp_dict)) # aa = json.dumps(temp_dict) template_detail = wx.get_template_detail(temp_dict) print('template_detail%s' % template_detail) # # # 准备用于创建记录的字段值 # values = { # 'process_code': template, # 'name': template_detail['template_names'][0]['text'], # # 如果需要设置content_ids,请按照正确格式添加关联数据 # } # # 使用create方法创建记录 # new_record = self.env['wxwork.approval.template'].create(values) # 解析template_detail中的内容数据 # print('jjjjjjjj', template_detail['template_content']) # print('jjjjjjjjjj', template_detail['template_content']['controls']) for control_data in template_detail['template_content']['controls']: # print('control_data', control_data) property_data = control_data['property'] # print('property_data', property_data) config_values = {} if 'config' in control_data: config_data = control_data['config'] print('config_data', config_data) # 先提取table_children数据 table_children_data = config_data.get('table', {}).get('children', []) # 创建一个空列表用于存储table_children记录 table_children_records = [] # 遍历table_children_data并为每个子控件创建记录 for child_data in table_children_data: print('child_data====================', child_data) # 提取property相关数据 child_property_data = { # 'control_type': child_data.get('property', {}).get('control', None), # 'unique_control_id': child_data.get('property', {}).get('id', None), # 'title': child_data.get('property', {}).get('title', [{}])[0].get('text', None), # 'placeholder': child_data.get('property', {}).get('placeholder', [{}])[0]. # get('text', None), # 'require': child_data.get('property', {}).get('require', None), # 'un_print': child_data.get('property', {}).get('un_print', None), # 'un_replace': child_data.get('property', {}).get('un_replace', None), # 'display': child_data.get('property', {}).get('display', None), 'control_type': child_data.get('property', {}).get('control', None), 'unique_control_id': child_data.get('property', {}).get('id', None), 'title': child_data.get('property', {}).get('title', [{}])[0].get('text', None), 'placeholder': child_data.get('property', {}).get('placeholder', [{}])[0].get('text', None), 'require': child_data.get('property', {}).get('require', None), 'un_print': child_data.get('property', {}).get('un_print', None), 'un_replace': child_data.get('property', {}).get('un_replace', None), 'display': child_data.get('property', {}).get('display', None), } # 在这里根据控件类型为每个子控件创建相应的config_id数据 # 例如: config_id_data = { 'date_type': [(0, 0, {'date_type': child_data.get('config', {}).get('date', {}).get('type', None)})] if 'date' in child_data.get( 'config', {}) else [], 'selector_type': [(0, 0, { 'selector_type': 'single', 'options': [(0, 0, {'key': 'opt1', 'text': '选项1'})], })] if 'selector' in child_data.get('config', {}) else [], 'contact_type': [ (0, 0, {'contact_type': config_data.get('contact', {}).get('type', None), 'contact_mode': config_data.get('contact', {}).get('mode', None)})] if 'contact' in child_data.get( 'config', {}).get('contact', {}) else [], 'file_type': [ (0, 0, {'is_only_photo': config_data.get('file', {}).get('is_only_photo', None)})] if 'file' in child_data.get( 'config', {}).get('file', {}) else [], } # 将config_id_data添加到property_data中(如果有的话) if config_id_data: child_property_data['child_control_id'] = config_id_data # 将property_data添加到table_children_records中 table_children_records.append((0, 0, child_property_data)) # 创建一个包含多个wxwork.approval.template.controls的字典列表 controls_data = [ (0, 0, { 'property_id': [(0, 0, { 'control_type': property_data.get('control', ''), 'unique_control_id': property_data.get('id', ''), 'title': property_data['title'][0]['text'] if 'title' in property_data else '', 'placeholder': property_data['placeholder'][0][ 'text'] if 'placeholder' in property_data else '', 'require': property_data.get('require', None), 'un_print': property_data.get('un_print', None), 'un_replace': property_data.get('un_replace', None), 'display': property_data.get('display', None), })], 'config_id': [(0, 0, { 'date_type': [(0, 0, {'date_type': config_data.get('date', {}).get( 'type', None)})] if 'date' in config_data else [], 'selector_type': [ (0, 0, { 'selector_type': child.get('config', {}).get('selector', {}).get('type', None), 'options': [ (0, 0, {'key': option['key'], 'text': option['value'][0]['text']}) for option in child.get('config', {}).get('selector', {}).get('options', []) ], }) for child in config_data.get('table', {}).get('children', []) if 'selector' in child.get('config', {}) ], 'contact_type': [ (0, 0, {'contact_type': config_data.get('contact', {}).get('type', None), 'contact_mode': config_data.get('contact', {}).get('mode', None)})] if 'contact' in config_data else [], 'file_type': [ (0, 0, {'is_only_photo': config_data.get('file', {}).get('is_only_photo', None)})] if 'file' in config_data else [], 'table_type': [(0, 0, { 'table_children': table_children_records, })] if 'table' in config_data else [], # 'contact_type': [ # (0, 0, {'contact_type': config_data.get('contact', {}).get('type', None)})], # 'contact_mode': [ # (0, 0, {'contact_mode': config_data.get('contact', {}).get('mode', None)})], # 'table_type': [(0, 0, { # 'table_children': [ # (0, 0, # {'control_type': 'Text', 'unique_control_id': 'text_2', 'title': '文本框2'})], # })], # # [ # # (0, 0, {'control_type': config_data.get('table', {}).get('children', {})[0]. # # get('property', {}).get('control', None), 'unique_control_id': 'text_2', # # 'title': '文本框2'})] 'attendance_type': [(0, 0, {'attendance_type': '1', 'attendance_date_range_type': 'hour'})] if 'attendance' in config_data else [], })], }), # 在这里添加更多的控件数据 ] else: # 创建一个包含多个wxwork.approval.template.controls的字典列表 controls_data = [ (0, 0, { 'property_id': [(0, 0, { 'control_type': property_data.get('control', ''), 'unique_control_id': property_data.get('id', ''), 'title': property_data['title'][0]['text'] if 'title' in property_data else '', 'placeholder': property_data['placeholder'][0][ 'text'] if 'placeholder' in property_data else '', 'require': property_data.get('require', None), 'un_print': property_data.get('un_print', None), 'un_replace': property_data.get('un_replace', None), 'display': property_data.get('display', None), })], }), # 在这里添加更多的控件数据 ] # 从vacation_list中提取假期类型数据 vacation_items = [] vacation_items_data = template_detail.get('vacation_list', []) # 将假期类型数据转换为适用于vacation_items字段的格式 if vacation_items_data and 'item' in vacation_items_data: items = [] for item in vacation_items_data['item']: id = item.get('id') name = item.get('name')[0].get('text') items.append({'id': id, 'name': name}) print(items) # if vacation_items_data: # print('vacation_items_data', vacation_items_data) # print('vacation_items_data', type(vacation_items_data)) # print('vacation_items_data', vacation_items_data['items']) # print('vacation_items_data', vacation_items_data[0]) vacation_items = [(0, 0, { 'vacation_id': item['id'], 'name': item['name'], 'lang': 'zh_CN', }) for item in items] # 创建一个包含WxWorkApprovalTemplate和关联记录数据的字典 template_data = { 'process_code': template, 'name': template_detail['template_names'][0]['text'], 'content_ids': controls_data, # 'vacation_config_id': [(0, 0, { # # 在这里添加wxwork.approval.vacation.config模型的字段数据 # 'vacation_id': template_detail.get('vacation_id', None), # 'name': template_detail.get('vacation_name', None), # 'lang': template_detail.get('vacation_lang', None), # # ... # })], 'vacation_config_id': vacation_items } # 检查数据库中是否已经存在具有相同process_code的模板 existing_template = self.env['wxwork.approval.template'].search( [('process_code', '=', template)], limit=1) if existing_template: # 如果模板已经存在,更新其content_ids字段(即添加控件记录) existing_template.write({'content_ids': controls_data}) else: # 如果模板不存在,创建一个新的模板及其关联记录 # 调用create方法创建记录 template_record = self.env['wxwork.approval.template'].create(template_data) # # print(property_data) # # 准备用于创建记录的字段值 # property_values = { # 'control_type': property_data.get('control', ''), # 'unique_control_id': property_data.get('id', ''), # 'title': property_data['title'][0]['text'] if 'title' in property_data else '', # 'placeholder': property_data['placeholder'][0]['text'] if 'placeholder' in property_data else '', # 'require': property_data.get('require', None), # 'un_print': property_data.get('un_print', None), # 'un_replace': property_data.get('un_replace', None), # 'display': property_data.get('display', None), # # 'un_replace': template_detail['template_names'][0]['text'], # # 如果需要设置content_ids,请按照正确格式添加关联数据 # } # # print('property_values', property_values) # # config_data = None # # if 'config' in control_data: # # config_data = control_data['config'] # # print('config_data===', config_data) # if '"date":' in config_data: # # config_values = { # # 'date_type': config_data.get('type', ''), # # } # config_values['date_type'] = config_data.get('type', '') # if '"selector":' in config_data: # # config_values = { # # 'selector_type': config_data.get('type', ''), # # # 'options': config_data['title'][0]['text'] if 'title' in property_data else '', # # } # config_values['selector_type'] = config_data.get('type', '') # if '"contact":' in config_data: # # config_values = { # # 'contact_type': config_data.get('type', ''), # # 'contact_mode': config_data.get('mode', ''), # # # # } # config_values['contact_type'] = config_data.get('type', '') # config_values['contact_mode'] = config_data.get('mode', '') # if '"table":' in config_data: # pass # # config_values = { # # 'table_children': config_data.get('un_print', None), # # } # if '"attendance":' in config_data: # pass # # config_values = { # # 'attendance_type': config_data.get('un_replace', None), # # 'attendance_date_range_type': config_data.get('display', None), # # # 如果需要设置content_ids,请按照正确格式添加关联数据 # # } # if '"vacation_list":' in config_data: # pass # # config_values = { # # 'vacation_list': config_data['template_names'][0]['text'], # # # 如果需要设置content_ids,请按照正确格式添加关联数据 # # } # # content_data_list.append((0, 0, { # 'property_id': [(0, 0, property_values)], # 'config_id': [(0, 0, config_values)], # })) # else: # content_data_list.append((0, 0, { # 'property_id': [(0, 0, property_values)], # # 'config_id': [(0, 0, config_values)], # })) # # 准备用于创建记录的字段值 # property_values = { # 'control_type': property_data.get('control', ''), # 'unique_control_id': property_data.get('id', ''), # 'title': property_data['title'][0]['text'] if 'title' in property_data else '', # 'placeholder': property_data['placeholder'][0]['text'] if 'placeholder' in property_data else '', # 'require': property_data.get('require', None), # 'un_print': property_data.get('un_print', None), # 'un_replace': property_data.get('un_replace', None), # 'display': property_data.get('display', None), # } # # if 'config' in control_data: # config_data = control_data['config'] # # # 根据config_data为config.model的One2many字段(如options和table_children)构建命令列表 # option_vals = [ # (0, 0, {'key': 'option_key_1', 'text': 'option_text_1', 'lang': 'zh_CN'}), # (0, 0, {'key': 'option_key_2', 'text': 'option_text_2', 'lang': 'zh_CN'}) # ] # vacation_vals = [{'key': 'vacation_key_1', 'text': 'vacation_text_1', 'lang': 'zh_CN'}, # {'key': 'vacation_key_2', 'text': 'vacation_text_2', 'lang': 'zh_CN'}] # table_children_vals = [ # (0, 0, { # 'control_type': 'Text', # 'unique_control_id': 'control_id_1', # 'title': '控件名称1', # 'placeholder': '控件说明1', # 'require': True # }), # (0, 0, { # 'control_type': 'Number', # 'unique_control_id': 'control_id_2', # 'title': '控件名称2', # 'placeholder': '控件说明2', # 'require': False # }) # ] # # # property_vals = [ # # (0, 0, { # # 'control_type': 'Text', # # 'unique_control_id': 'control_id_1', # # 'title': '控件名称1', # # 'placeholder': '控件说明1', # # 'require': True # # }), # # (0, 0, { # # 'control_type': 'Number', # # 'unique_control_id': 'control_id_2', # # 'title': '控件名称2', # # 'placeholder': '控件说明2', # # 'require': False # # }) # # ] # # config_values = { # 'date_type': config_data.get('type', '') if '"date":' in config_data else '', # 'selector_type': config_data.get('type', '') if '"selector":' in config_data else '', # 'contact_type': config_data.get('type', '') if '"contact":' in config_data else '', # 'contact_mode': config_data.get('mode', '') if '"contact":' in config_data else '', # 'options': option_vals if '"selector":' in config_data else [(6, 0, [])], # 使用示例中的option_vals # 'table_children': table_children_vals if '"table":' in config_data else [(6, 0, [])], # # 使用示例中的property_vals # 'vacation_list': vacation_vals if '"vacation_list":' in config_data else [] # 添加vacation_vals # } # # content_data_list.append((0, 0, { # 'property_id': [(0, 0, property_values)], # 'config_id': [(0, 0, config_values)] if 'config' in control_data else [(6, 0, [])], # })) # # # 准备用于创建记录的字段值,包括content_ids数据 # values = { # 'process_code': template, # 'name': template_detail['template_names'][0]['text'], # 'content_ids': content_data_list, # } # # # 使用create方法创建记录 # new_record = self.env['wxwork.approval.template'].create(values) class WxTemplateSettings(models.Model): _name = 'wxwork.template.settings' _description = '企业微信模板设置' sp_name = fields.Char(string='审批模板名称') template_id = fields.Char(string='审批模板ID') # wxwork_id = fields.Many2one('wxwork.settings', string='企业微信')