diff --git a/sf_wxwork_approval/models/__init__.py b/sf_wxwork_approval/models/__init__.py index c97e010b..795635d9 100644 --- a/sf_wxwork_approval/models/__init__.py +++ b/sf_wxwork_approval/models/__init__.py @@ -5,5 +5,7 @@ from . import wxwork_approval_template_controls from . import wxwork_settings from . import wxwork_approval_template_summary from . import we_approval_record +from . import wx_work_api + from . import wxwork_approval # from . import res_config_setting diff --git a/sf_wxwork_approval/models/wx_work_api.py b/sf_wxwork_approval/models/wx_work_api.py index eb1b4130..c07c2a3f 100644 --- a/sf_wxwork_approval/models/wx_work_api.py +++ b/sf_wxwork_approval/models/wx_work_api.py @@ -19,6 +19,17 @@ class WxWorkAPI: else: raise Exception(f"获取AccessToken失败: {result}") + def get_template_detail(self, template_data): + url = f"https://qyapi.weixin.qq.com/cgi-bin/oa/gettemplatedetail?access_token={self.access_token}" + headers = {'Content-Type': 'application/json'} + response = requests.post(url, json=template_data, headers=headers) + result = response.json() + if result['errcode'] == 0: + # print(result) + return result + else: + raise Exception(f"获取模板详情请求失败: {result}") + def create_approval_request(self, approval_data): url = f"https://qyapi.weixin.qq.com/cgi-bin/oa/applyevent?access_token={self.access_token}" headers = {'Content-Type': 'application/json'} @@ -60,89 +71,89 @@ class WxWorkAPI: return result['media_id'] -template_id_dict = {"test": "ZvmJBAt7U2iUju9JLePxfkfuN22meQMVTAHymA"} -creator_userid = "MaGuangWei" -corid = 'wweaf7f1caab27a136' -secret = 'L6z-kjrUBOWfhBiLOmX_fNSY3jydDkLUNNWnemafn00' -wx = WxWorkAPI(corid, secret) -media_id = wx.upload_temp_file() -print(media_id) -# access = wx.get_access_token() -approval_datas = { - "creator_userid": creator_userid, - "template_id": template_id_dict['test'], - "use_template_approver": 0, - # "choose_department": 2, - "approver": [ - { - "attr": 2, - "userid": ["MaGuangWei", "YangJinLing"] - }, - { - "attr": 1, - "userid": ["MaGuangWei"] - } - ], - "notifyer": ["MaGuangWei", "PengYuBo"], - # "notifyer": ["MaGuangWei"], - "notify_type": 1, - "apply_data": { - "contents": [ - # 申请事项 - { - "control": "Text", - "id": "Text-1640339319582", - "value": { - "text": "测试测试测试测试测试" - } - }, - # 申请内容 - { - "control": "Textarea", - "id": "Textarea-1640339335659", - "value": { - "text": "odoo>>>企业微信审批" - } - }, - # 附件 - { - "control": "File", - "id": "File-1640339381728", - "value": { - "files": [ - { - "file_id": media_id - } - ] - } - - }, - - ] - }, - "summary_list": [ - { - "summary_info": [{ - "text": "测试附件上传", - "lang": "zh_CN" - }] - }, - # { - # "summary_info": [{ - # "text": "摘要第2行", - # "lang": "zh_CN" - # }] - # }, - # { - # "summary_info": [{ - # "text": "摘要第3行", - # "lang": "zh_CN" - # }] - # } - ] -} -wx.create_approval_request(approval_datas) -print('创建成功') +# template_id_dict = {"test": "ZvmJBAt7U2iUju9JLePxfkfuN22meQMVTAHymA"} +# creator_userid = "MaGuangWei" +# corid = 'wweaf7f1caab27a136' +# secret = 'L6z-kjrUBOWfhBiLOmX_fNSY3jydDkLUNNWnemafn00' +# wx = WxWorkAPI(corid, secret) +# media_id = wx.upload_temp_file() +# print(media_id) +# # access = wx.get_access_token() +# approval_datas = { +# "creator_userid": creator_userid, +# "template_id": template_id_dict['test'], +# "use_template_approver": 0, +# # "choose_department": 2, +# "approver": [ +# { +# "attr": 2, +# "userid": ["MaGuangWei", "YangJinLing"] +# }, +# { +# "attr": 1, +# "userid": ["MaGuangWei"] +# } +# ], +# "notifyer": ["MaGuangWei", "PengYuBo"], +# # "notifyer": ["MaGuangWei"], +# "notify_type": 1, +# "apply_data": { +# "contents": [ +# # 申请事项 +# { +# "control": "Text", +# "id": "Text-1640339319582", +# "value": { +# "text": "测试测试测试测试测试" +# } +# }, +# # 申请内容 +# { +# "control": "Textarea", +# "id": "Textarea-1640339335659", +# "value": { +# "text": "odoo>>>企业微信审批" +# } +# }, +# # 附件 +# { +# "control": "File", +# "id": "File-1640339381728", +# "value": { +# "files": [ +# { +# "file_id": media_id +# } +# ] +# } +# +# }, +# +# ] +# }, +# "summary_list": [ +# { +# "summary_info": [{ +# "text": "测试附件上传", +# "lang": "zh_CN" +# }] +# }, +# # { +# # "summary_info": [{ +# # "text": "摘要第2行", +# # "lang": "zh_CN" +# # }] +# # }, +# # { +# # "summary_info": [{ +# # "text": "摘要第3行", +# # "lang": "zh_CN" +# # }] +# # } +# ] +# } +# wx.create_approval_request(approval_datas) +# print('创建成功') aa = {"errcode": 0, "errmsg": "ok", "template_names": [{"text": "对接开发测试", "lang": "zh_CN"}], "template_content": { "controls": [{"property": {"control": "Text", "id": "Text-1640339319582", diff --git a/sf_wxwork_approval/models/wxwork_approval_template.py b/sf_wxwork_approval/models/wxwork_approval_template.py index f60663c0..2757188b 100644 --- a/sf_wxwork_approval/models/wxwork_approval_template.py +++ b/sf_wxwork_approval/models/wxwork_approval_template.py @@ -14,12 +14,15 @@ class WxWorkApprovalTemplate(models.Model): name = fields.Char(string='模板名称') # content_ids = fields.Many2many('wxwork.approval.template.controls', string='模板内容') content_ids = fields.One2many('wxwork.approval.template.controls', 'template_id', string='模板内容') + # 增加一个与wxwork.approval.vacation.config的关联字段 + vacation_config_id = fields.One2many('wxwork.approval.vacation.config', 'template_id', string='控件配置') + company_id = fields.Many2one('res.company', '公司', default=lambda self: self.env.user.company_id.id) creator_userid = fields.Many2one('res.users', '创建者', default=lambda self: self.env.user.id) use_template_approver = fields.Selection([ ('0', '自选审批人'), ('1', '预设审批人') - ], string='审批人模式', default='0') + ], string='审批人模式', default='1') choose_department = fields.Char(string='提单部门') approver = fields.One2many('wxwork.approval.approver_line', 'main_id', string='审批流程') notifyer = fields.Many2many('res.users', string='抄送人userid列表') diff --git a/sf_wxwork_approval/models/wxwork_approval_template_controls.py b/sf_wxwork_approval/models/wxwork_approval_template_controls.py index cc5e4273..bfdc5873 100644 --- a/sf_wxwork_approval/models/wxwork_approval_template_controls.py +++ b/sf_wxwork_approval/models/wxwork_approval_template_controls.py @@ -6,97 +6,196 @@ from odoo.exceptions import UserError _logger = logging.getLogger(__name__) +# 控件模型 class WxWorkApprovalTemplate(models.Model): _name = 'wxwork.approval.template.controls' _description = "企业微信审批模板控件" + + template_id = fields.Many2one('wxwork.approval.template', string='模板') + property_id = fields.One2many('property.model', 'control_id', string='控件属性') + config_id = fields.One2many('config.model', 'control_id', string='控件配置') + + +# 控件属性模型 +class PropertyModel(models.Model): + _name = 'property.model' _rec_name = "title" - SELECTION_RELATION = { - '申请事项': {'id': 'Text-1640339319582', 'control': 'Text', 'value': '{"text": "文本填写的内容"}'}, - '申请内容': {'id': 'Textarea-1640339335659', 'control': 'Textarea', 'value': '{"text": "文本填写的内容"}'}, - '多行文本': {'id': 'Textarea-1684823453770', 'control': 'Textarea', 'value': '{"text": "文本填写的内容"}'}, - '金额': {'id': 'Money-1684823460232', 'control': 'Money', 'value': '{"new_money": "0"}'}, - '部门': {'id': 'Contact-1684823477216', 'control': 'Contact', - 'value': '{"departments":[{"openapi_id":"2","name":"销售部"},{"openapi_id":"3","name":"生产部"}]}'}, - '成员': {'id': 'Contact-1684823465317', 'control': 'Contact', - 'value': '{"members":[{"userid":"WuJunJie","name":"Jackie"},{"userid":"WangXiaoMing","name":"Tom"}]}'}, - '明细': {'id': 'Table-1684823492261', 'control': 'Table', - 'value': '{"children":[{"list":[' - '{"control":"Text","id":"Text-15111111111","title":' - '[{"text":"明细内文本控件","lang":"zh_CN"}],"value":{"text":"明细文本1"}},' - '{"control":"Money","id":"Text-15111111112","title":[{"text":"明细内金额控件","lang":"zh_CN"}],' - '"value":{"new_money":"700"}}]},' - '{"list":[{"control":"Text","id":"Text-15111111111",' - '"title":[{"text":"明细内文本控件","lang":"zh_CN"}],"value":{"text":"明细文本2"}},' - '{"control":"Money","id":"Text-15111111112","title":[{"text":"明细内金额控件","lang":"zh_CN"}],' - '"value":{"new_money":"900"}}]}]}'}, - '关联申请单': {'id': 'RelatedApproval-1684823485883', 'control': 'RelatedApproval', - 'value': '{"related_approval":[{"sp_no":"202011180001"}]}'}, - '附件': {'id': 'File-1640339381728', 'control': 'File', - 'value': '{"files":[{"file_id":"1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K1aaa"}]}'}, - '数字': {'id': 'File-1640339381728', 'control': 'Number', 'value': '{"new_number": "700"}'}, - '日期/日期+时间': {'id': 'File-1640339381728', 'control': 'Date', - 'value': '{"date": {"type": "day","s_timestamp": "1569859200"}}'}, - '单选/多选': {'id': 'File-1640339381728', 'control': 'Selector', - 'value': '{"selector": ' - '{"type": "multi","options": [{"key": "option-15111111111"},{"key": "option-15222222222"}]}}' - }, - '说明文字': {'id': 'File-1640339381728', 'control': 'Tips'}, - '位置': {'id': 'File-1640339381728', 'control': 'Location', - 'value': '{"location":{"latitude":"30.547239","longitude":"104.063291",' - '"title":"腾讯科技(成都)有限公司(腾讯成都大厦)",' - '"address":"四川省成都市武侯区天府三街198号腾讯成都大厦A座","time":1605690460}}'}, - '公式': {'id': 'File-1640339381728', 'control': 'Formula', 'value': '{"formula":{"value":"5.0"}}'}, - '时长': {'id': 'File-1640339381728', 'control': 'DateRange', - 'value': '{"date_range":{"new_begin":1570550400,"new_end":1570593600,"new_duration":86400}}'}, - '请假组件': {'id': 'File-1640339381728', 'control': 'Vacation', - 'value': '{"vacation":{"selector":{"type":"single","options":[{"key":"3",' - '"value":[{"text":"病假","lang":"zh_CN"}]}],"exp_type":0},' - '"attendance":{"date_range":{"type":"hour","new_begin":1568077200,' - '"new_end":1568368800,"new_duration":291600},"type":1}}}'}, - '出差/外出/加班组件': {'id': 'File-1640339381728', 'control': 'Attendance', - 'value': '{"attendance":{"date_range":{"type":"halfday","new_begin":1570550400,' - '"new_end":1570593600,"new_duration":86400},"type":4}}'}, - - } - - title = fields.Selection( - selection=[(key, key) for key in SELECTION_RELATION.keys()], - string='控件名称', - ) - template_id = fields.Many2one('wxwork.approval.template', string='模板名称') - control_id = fields.Char(string='控件ID') - control = fields.Char(string='控件类型') - value = fields.Char(string='内容') - - placeholder = fields.Char(string='占位符') - require = fields.Boolean(string='必填', compute='_compute_require') - un_print = fields.Boolean(string='不打印') + CONTROL_TYPE_SELECTION = [ + ('Text', '文本'), + ('Textarea', '多行文本'), + ('Number', '数字'), + ('Money', '金额'), + ('Date', '日期/日期+时间'), + ('Selector', '单选/多选'), + ('Contact', '成员/部门'), + ('Tips', '说明文字'), + ('File', '附件'), + ('Table', '明细'), + ('Attendance', '假勤控件'), + ('Vacation', '请假控件'), + ('Location', '位置'), + ('RelatedApproval', '关联审批单'), + ('Formula', '公式'), + ('DateRange', '时长') + ] + control_type = fields.Selection(CONTROL_TYPE_SELECTION, string='控件类型') + control_id = fields.Many2one('wxwork.approval.template.controls', string='控件') + unique_control_id = fields.Char(string='控件ID') + title = fields.Char(string='控件名称', translate=True) + placeholder = fields.Char(string='控件说明', translate=True) + require = fields.Boolean(string='是否必填') + un_print = fields.Boolean(string='是否参与打印') un_replace = fields.Boolean(string='不替换') - display = fields.Boolean(string='显示', compute='_compute_display') + display = fields.Boolean(string='显示') + child_control_id = fields.Many2one('wxwork.approval.table.config', string='明细子控件') - @api.onchange('title') - def _onchange_title(self): - if self.title: - related_values = WxWorkApprovalTemplate.SELECTION_RELATION[self.title] - self.control_id = related_values['id'] - self.control = related_values['control'] - # 特殊处理:对于"说明文字",将"value"设置为空字符串 - if self.control == 'Tips': - self.value = '' - else: - self.value = related_values['value'] +# 控件配置模型 +class ConfigModel(models.Model): + _name = 'config.model' - @api.depends('title') - def _compute_require(self): - for record in self: - record.require = record.title in ['申请事项', '申请内容'] + control_id = fields.Many2one('wxwork.approval.template.controls', string='控件') + # # 在此添加其他字段以存储不同控件类型的附加类型和属性 + # date_type = fields.Selection([('day', '日期'), ('hour', '日期+时间')], string='日期类型') + # + # selector_type = fields.Selection([('single', '单选'), ('multi', '多选')], string='选择器类型') + # options = fields.One2many('config.option', 'config_id', string='选项') + # + # contact_type = fields.Selection( + # [('single', '单选'), ('multi', '多选')], + # string='联系人类型') + # contact_mode = fields.Selection( + # [('user', '成员'), ('department', '部门')], + # string='联系人模式') + # + # # table_children = fields.One2many('config.child', 'config_id', string='明细子控件') + # table_children = fields.One2many('property.model', 'child_control_id', string='明细子控件') + # + # attendance_type = fields.Selection([('1', '请假'), ('3', '出差'), ('4', '外出'), ('5', '加班')], string='假勤组件类型') + # attendance_date_range_type = fields.Selection([('hour', '分钟'), ('halfday', '上午/下午')], string='假勤时间刻度') + # + # vacation_list = fields.One2many('config.option', 'config_id', string='假期类型列表') + # 增加一个wxwork.approval.date.config的关联字段 + date_type = fields.One2many('wxwork.approval.date.config', 'config_id', string='日期控件配置') + # 增加一个与wxwork.approval.selector.config的关联字段 + selector_type = fields.One2many('wxwork.approval.selector.config', 'config_id', string='选择器控件配置') + # 增加一个与wxwork.approval.contact.config的关联字段 + contact_type = fields.One2many('wxwork.approval.contact.config', 'config_id', string='联系人控件配置') + # 增加一个与wxwork.approval.table.config的关联字段 + table_type = fields.One2many('wxwork.approval.table.config', 'config_id', string='明细控件配置') + # 增加一个与wxwork.approval.attendance.config的关联字段 + attendance_type = fields.One2many('wxwork.approval.attendance.config', 'config_id', string='假勤控件配置') + # 增加一个与wxwork.approval.file.config的关联字段 + file_type = fields.One2many('wxwork.approval.file.config', 'config_id', string='附件控件配置') + # 增加一个与wxwork.approval.table.config的Many2one关联字段 + table_child = fields.Many2one('wxwork.approval.table.config', string='明细子控件配置') - @api.depends('title') - def _compute_display(self): - for record in self: - record.display = record.title in ['申请事项', '申请内容'] + +class ConfigOption(models.Model): + _name = 'config.option' + + key = fields.Char(string='选项Key') + text = fields.Char(string='选项Text') + lang = fields.Char(string='语言') + config_id = fields.Many2one('config.model', string='配置') + + +class ConfigChild(models.Model): + _name = 'config.child' + + control = fields.Char(string='控件类型') + control_id = fields.Char(string='控件ID') + # 其他属性... + + +# Date控件config +class DateConfig(models.Model): + _name = 'wxwork.approval.date.config' + + # 增加一个与config.model的关联字段 + config_id = fields.Many2one('config.model', string='控件') + date_type = fields.Selection([('day', '日期'), ('hour', '日期+时间')], string='日期类型') + + +# Selector控件(单选/多选控件)config +class SelectorConfig(models.Model): + _name = 'wxwork.approval.selector.config' + + # 增加一个与config.model的关联字段 + config_id = fields.Many2one('config.model', string='控件') + selector_type = fields.Selection([('single', '单选'), ('multi', '多选')], string='选择器类型') + selector_exp_type = fields.Integer(string='选择器表达式类型', default=0) + options = fields.One2many('selector.option', 'config_id', string='选项') + + +# Selector控件(单选/多选控件)选项 +class SelectorOption(models.Model): + _name = 'selector.option' + + key = fields.Char(string='选项Key') + text = fields.Char(string='选项Text') + lang = fields.Char(string='语言') + config_id = fields.Many2one('wxwork.approval.selector.config', string='配置') + + +# Contact控件(成员/部门控件)config +class ContactConfig(models.Model): + _name = 'wxwork.approval.contact.config' + + # 增加一个与config.model的关联字段 + config_id = fields.Many2one('config.model', string='控件') + contact_type = fields.Selection([('single', '单选'), ('multi', '多选')], string='选择器类型') + contact_mode = fields.Selection([('user', '成员'), ('department', '部门')], string='联系人类型') + + +# Table控件(明细控件)config +class TableConfig(models.Model): + _name = 'wxwork.approval.table.config' + + # 增加一个与config.model的关联字段 + config_id = fields.Many2one('config.model', string='控件') + # table_children = fields.One2many('config.child', 'config_id', string='明细子控件') + table_children = fields.One2many('property.model', 'child_control_id', string='明细属性控件') + # 增加一个与config.model的One2many关联字段 + table_children_config = fields.One2many('config.model', 'table_child', string='明细配置控件') + # stat_field = fields.Many2one('config.model', string='统计字段') + + +# Attendance控件(假勤控件)config +class AttendanceConfig(models.Model): + _name = 'wxwork.approval.attendance.config' + + # 增加一个与config.model的关联字段 + config_id = fields.Many2one('config.model', string='控件') + attendance_type = fields.Selection([('1', '请假'), ('3', '出差'), ('4', '外出'), ('5', '加班')], string='假勤组件类型') + attendance_date_range_type = fields.Selection([('hour', '分钟'), ('halfday', '上午/下午')], string='假勤时间刻度') + + +# Vacation控件(假勤控件)config +class VacationConfig(models.Model): + _name = 'wxwork.approval.vacation.config' + + # 增加一个与wxwork.approval.template的关联字段 + template_id = fields.Many2one('wxwork.approval.template', string='模板') + # control_id = fields.Many2one('wxwork.approval.template.controls', string='控件') + # vacation_list = fields.One2many('config.option', 'config_id', string='假期类型列表') + vacation_id = fields.Integer(string='假期ID') + name = fields.Char(string='假期名称') + lang = fields.Char(string='语言') + +# file控件(文件控件)config +class FileConfig(models.Model): + _name = 'wxwork.approval.file.config' + + # 增加一个与config.model的关联字段 + config_id = fields.Many2one('config.model', string='控件') + # control_id = fields.Many2one('wxwork.approval.template.controls', string='控件') + # vacation_list = fields.One2many('config.option', 'config_id', string='假期类型列表') + # file_id = fields.Integer(string='文件ID') + # name = fields.Char(string='文件名称') + # lang = fields.Char(string= + is_only_photo = fields.Boolean(string='是否只能上传图片') class ApproverLine(models.Model): diff --git a/sf_wxwork_approval/models/wxwork_settings.py b/sf_wxwork_approval/models/wxwork_settings.py index 4e048263..1be0f354 100644 --- a/sf_wxwork_approval/models/wxwork_settings.py +++ b/sf_wxwork_approval/models/wxwork_settings.py @@ -1,6 +1,8 @@ # -*- 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): @@ -10,3 +12,422 @@ class WxSettings(models.Model): 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 [], + # 'table_type': [(0, 0, { + # 'table_children': [ + # (0, 0, {'control_type': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('control', None), + # 'unique_control_id': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('id', None), + # 'title': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('title', None)[0].get('text', None), + # 'placeholder': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('placeholder', None)[0].get('text', None), + # 'require': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('require', None), + # 'un_print': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('un_print', None), + # 'un_replace': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('un_replace', None), + # 'display': config_data.get('table', {}).get('children', None)[0].get('property', {}).get('display', None), + # })], + # })] if 'table' in config_data else [], + # 'attendance_type': [(0, 0, {'attendance_type': '1', + # 'attendance_date_range_type': 'hour'})] if 'attendance' in config_data 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': config_data['table']['children'][0].get('config', {}).get( + # 'selector', {}).get('type', None), + # 'options': [ + # (0, 0, {'key': option['key'], 'text': option['value'][0]['text']}) + # for option in config_data['table']['children'][0].get('config', {}).get('selector', {}).get('options', []) + # ], + # })] if 'selector' 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='企业微信') diff --git a/sf_wxwork_approval/security/ir.model.access.csv b/sf_wxwork_approval/security/ir.model.access.csv index a5ea9e77..92e890d5 100644 --- a/sf_wxwork_approval/security/ir.model.access.csv +++ b/sf_wxwork_approval/security/ir.model.access.csv @@ -6,6 +6,18 @@ access_wxwork_approval_template_controls,wxwork.approval.template.controls,model access_wxwork_approval_approver_line,wxwork.approval.approver_line,model_wxwork_approval_approver_line,base.group_user,1,1,1,1 access_wxwork_settings,wxwork.settings,model_wxwork_settings,base.group_user,1,1,1,1 access_wxwork_approval_template_summary,wxwork.approval.template.summary,model_wxwork_approval_template_summary,base.group_user,1,1,1,1 +access_wxwork_template_settings,wxwork.template.settings,model_wxwork_template_settings,base.group_user,1,1,1,1 +access_property_model,property.model,model_property_model,base.group_user,1,1,1,1 +access_config_model,config.model,model_config_model,base.group_user,1,1,1,1 +access_config_option,config.option,model_config_option,base.group_user,1,1,1,1 +access_wxwork_approval_vacation_config,wxwork.approval.vacation.config,model_wxwork_approval_vacation_config,base.group_user,1,1,1,1 +access_wxwork_approval_date_config,wxwork.approval.date.config,model_wxwork_approval_date_config,base.group_user,1,1,1,1 +access_wxwork_approval_selector_config,wxwork.approval.selector.config,model_wxwork_approval_selector_config,base.group_user,1,1,1,1 +access_selector_option,selector.option,model_selector_option,base.group_user,1,1,1,1 +access_wxwork_approval_contact_config,wxwork.approval.contact.config,model_wxwork_approval_contact_config,base.group_user,1,1,1,1 +access_wxwork_approval_table_config,wxwork.approval.table.config,model_wxwork_approval_table_config,base.group_user,1,1,1,1 +access_wxwork_approval_attendance_config,wxwork.approval.attendance.config,model_wxwork_approval_attendance_config,base.group_user,1,1,1,1 +access_wxwork_approval_file_config,wxwork.approval.file.config,model_wxwork_approval_file_config,base.group_user,1,1,1,1 access_wxwork_approval,wxwork.approval,model_wxwork_approval,base.group_user,1,1,1,1 diff --git a/sf_wxwork_approval/views/wxwork_approval_template_view.xml b/sf_wxwork_approval/views/wxwork_approval_template_view.xml index 175ab1dc..9d00ab6f 100644 --- a/sf_wxwork_approval/views/wxwork_approval_template_view.xml +++ b/sf_wxwork_approval/views/wxwork_approval_template_view.xml @@ -10,8 +10,8 @@ - + @@ -23,17 +23,19 @@
- + - - + + + + - +
@@ -57,7 +59,7 @@ - + @@ -72,15 +74,8 @@ - - - - - - - - - + + @@ -91,10 +86,40 @@
+ + + +
+
+ + + + 审批模板控件属性 + property.model + + - - - + + + + + + + + + + + + + 审批模板控件属性 + property.model + +
+ + + + + @@ -105,6 +130,394 @@ + + + 审批模板控件配置 + config.model + + + + + + + + + + + + + + + + + + + + + + 审批模板控件配置 + config.model + + + + + + + + + + + + + + + + + + + + + + + + + + + 审批模板控件Date控件config配置 + wxwork.approval.date.config + + + + + + + + 审批模板控件Date控件config配置 + wxwork.approval.date.config + +
+ + + +
+
+
+ + + 审批模板控件Selector控件(单选/多选控件)config配置 + wxwork.approval.selector.config + + + + + + + + + + 审批模板控件Selector控件(单选/多选控件)config配置 + wxwork.approval.selector.config + +
+ + + + + +
+
+
+ + + 审批模板控件Selector控件(单选/多选控件)选项配置 + selector.option + + + + + + + + + + 审批模板控件Selector控件(单选/多选控件)选项配置 + selector.option + +
+ + + + + +
+
+
+ + + 审批模板控件Contact控件(成员/部门/标签控件)config配置 + wxwork.approval.contact.config + + + + + + + + + 审批模板控件Contact控件(成员/部门/标签控件)config配置 + wxwork.approval.contact.config + +
+ + + + +
+
+
+ + + 审批模板控件Table控件(明细控件)config配置 + wxwork.approval.table.config + + + + + + + + + 审批模板控件Table控件(明细控件)config配置 + wxwork.approval.table.config + +
+ + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 审批模板控件Attendance控件(假勤控件)config配置 + wxwork.approval.attendance.config + + + + + + + + + 审批模板控件Attendance控件(假勤控件)config配置 + wxwork.approval.attendance.config + +
+ + + + +
+
+
+ + + 审批模板控件Vacation控件(假勤控件)config配置 + wxwork.approval.vacation.config + + + + + + + + + + 审批模板控件Vacation控件(假勤控件)config配置 + wxwork.approval.vacation.config + +
+ + + + + +
+
+
+ + + 审批模板控件file控件(文件控件)config配置 + wxwork.approval.file.config + + + + + + + + + 审批模板控件file控件(文件控件)config配置 + wxwork.approval.file.config + +
+ + + +
+
+
+ + + + + + + + 审批模板 wxwork.approval.template diff --git a/sf_wxwork_approval/views/wxwork_settings_view.xml b/sf_wxwork_approval/views/wxwork_settings_view.xml index 904fd019..82808008 100644 --- a/sf_wxwork_approval/views/wxwork_settings_view.xml +++ b/sf_wxwork_approval/views/wxwork_settings_view.xml @@ -9,6 +9,7 @@ + @@ -21,6 +22,37 @@ + + +
+