From 9746063da9036986794cf21c1bb4644f96e1b091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Thu, 5 Sep 2024 18:48:10 +0800 Subject: [PATCH] pengyuthon --- soong_workflow/models/soong_workflow.py | 6 +- soong_workflow/models/soong_workflow_mixin.py | 103 ++++++++++++++++-- soong_workflow/views/menuitem.xml | 1 - soong_workflow/views/soong_workflow_views.xml | 11 +- yuthon_official/models/yuthon_official.py | 2 +- 5 files changed, 103 insertions(+), 20 deletions(-) diff --git a/soong_workflow/models/soong_workflow.py b/soong_workflow/models/soong_workflow.py index f2a97e490..3e9a6c682 100644 --- a/soong_workflow/models/soong_workflow.py +++ b/soong_workflow/models/soong_workflow.py @@ -52,7 +52,10 @@ class SoongWorkflow(models.Model): comodel_name="soong.workflow.link", inverse_name="workflow_id", string="Links" ) remove_default_btn_until_end = fields.Boolean( - string="是否覆盖表头按钮状态", default=True + string="是否覆盖表头按钮状态", default=False + ) + is_enable_return_button = fields.Boolean( + string="是否启用收回", default=True ) current_stage_highlight_color = fields.Char( @@ -114,6 +117,7 @@ class SoongWorkflow(models.Model): @api.depends('start_time', 'end_time') def compute_is_enable(self): + # 逻辑调整修改时间的时候判断有无要启用的,只准一个不能冲突 for rec in self: if rec.start_time and rec.end_time: if rec.start_time < datetime.datetime.now() and rec.end_time > datetime.datetime.now(): diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 10cdac5a5..2a8c90990 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -63,7 +63,9 @@ class SoongWorkflowMixin(models.AbstractModel): compute="_compute_workflow_id", ) - approval_users_ids = fields.One2many("soong.approval.users", "res_id", domain=lambda self: [('res_model', '=', self._name)], auto_join=True, string="审批明细") + approval_users_ids = fields.One2many("soong.approval.users", "res_id", + domain=lambda self: [('res_model', '=', self._name)], auto_join=True, + string="审批明细") @api.depends("state") def _compute_workflow_id(self): @@ -202,9 +204,9 @@ class SoongWorkflowMixin(models.AbstractModel): return { "name": _("Workflow: %(name)s") - % { - "name": self.display_name, - }, + % { + "name": self.display_name, + }, "res_model": "soong.workflow", "type": "ir.actions.act_window", "res_id": self.workflow_id.id, @@ -240,8 +242,92 @@ class SoongWorkflowMixin(models.AbstractModel): res = self._update_fields_view(view_type, res) # res = self._add_state_tree_view(view_type, res) res = self._add_soong_workflow_log(view_type, res, params) + # 收回 + res = self._add_return_button(view_type, res) return res + def _add_return_button(self, view_type, res): + model = self._name + wkf_obj = self.env["soong.workflow"] + wkf_rec = wkf_obj.search([("model_id", "=", model)]) + + if not wkf_rec.is_enable_return_button: + return res + + arch = etree.fromstring(res["arch"]) + if view_type == "form": + header_el = arch.xpath("//form/header") + header_el = header_el[0] if header_el else False + if header_el: + button = etree.Element("button", { + "name": "action_return", # 这里定义了按钮执行的服务器端动作 + "type": "object", # 触发自定义对象动作 + "string": "收回", # 按钮显示的名称 + "class": "btn-primary", # 按钮的样式 + # "icon": "fa-undo", # 按钮图标 (如果需要) + }) + header_el.append(button) + res["arch"] = etree.tostring(arch, encoding="unicode").replace("\t", "") + return res + + def action_return(self): + # 收回目前只支持指定用户和指定角色 + for record in self: + # 角色 + employee_id = self.env['hr.employee'] + result_dict = {} + # 获得到每一条记录的按钮权限 + i = 1 + for user in record.workflow_id.node_ids: + user_list = [] + transmitted = user.button_ids.search([('name', '=', '转交'), ('node_id', '=', user.id)]) + if transmitted.review_type == 'individual': # 指定用户 + user_list.append(transmitted.reviewer_id.id) + if transmitted.review_type == 'user_role': # 指定角色 + # 全局角色 + if transmitted.users_role_id.user_type == 'system_global_user': + # 所有的部门经理(全局角色) + role_user_ids = employee_id.search([('user_role_id', '=', transmitted.users_role_id.id)]) + for role_user in role_user_ids: + if self.env.user.employee_id.department_id.id == role_user.department_id.id: + user_list.append(role_user.user_id.id) # 角色的用户id + else: # 部门私有角色 + user_id = employee_id.search([('users_role_id.id', '=', transmitted.users_role_id)]).user_id.id + user_list.append(user_id) + user_name_i = f"{user.name}_{i}" + if user.name in result_dict: + result_dict[user_name_i].extend(user_list) + else: + result_dict[user_name_i] = user_list + i += 1 + # 判断当前用户所在节点,与现在单据所在节点的位置,只有在等于1的时候,返回上一个状态,否则禁止操作 + for key in result_dict: + if key.startswith(self.state): + # 当前单据状态所在的位置 + record_number = key.split('_')[1] + for key, values in result_dict.items(): + if self.env.user.id in values: + # 当前用户所在节点 + user_number = key.split('_')[1] + user_key = key + number = int(record_number) - int(user_number) + if number == 1: + self.write({'state': user_key.split('_')[0]}) + else: + raise UserError('不可收回') + + + + + + + + # for button in header_el.iter("button"): + # btn_invisible = "state != 'end'" + # if "invisible" in button.attrib: + # btn_invisible = btn_invisible + " or " + button.attrib["invisible"] + # button.set("invisible", btn_invisible) + def _remove_default_header(self, view_type, res): """ Removes default header element from form view. @@ -500,7 +586,8 @@ class SoongWorkflowMixin(models.AbstractModel): # Create the field element for the one2many field field_el = etree.Element("field") field_el.set("name", "approval_users_ids") - field_el_context = {'tree_view_ref': 'soong_workflow.soong_approval_users_search', 'default_res_model_id': self.env['ir.model']._get(self._name).id} + field_el_context = {'tree_view_ref': 'soong_workflow.soong_approval_users_search', + 'default_res_model_id': self.env['ir.model']._get(self._name).id} field_el.set("context", str(field_el_context)) # Append the field element to the new page @@ -562,8 +649,8 @@ class SoongWorkflowMixin(models.AbstractModel): for field_attrs in node.field_ids: # Record all states for each attribute if ( - field_inst is not False - and field_attrs.name.name == field_inst.attrib["name"] + field_inst is not False + and field_attrs.name.name == field_inst.attrib["name"] ): flag_show = True if field_attrs.readonly: @@ -586,7 +673,7 @@ class SoongWorkflowMixin(models.AbstractModel): if not has_group: flag_show = False if not flag_show and ( - field_attrs.group_ids or field_attrs.user_ids + field_attrs.group_ids or field_attrs.user_ids ): invisible_arr.append(node.node_name) # Set Attributes diff --git a/soong_workflow/views/menuitem.xml b/soong_workflow/views/menuitem.xml index cf9913708..04f5077a6 100644 --- a/soong_workflow/views/menuitem.xml +++ b/soong_workflow/views/menuitem.xml @@ -2,7 +2,6 @@ - diff --git a/soong_workflow/views/soong_workflow_views.xml b/soong_workflow/views/soong_workflow_views.xml index dafc99623..ca069047d 100644 --- a/soong_workflow/views/soong_workflow_views.xml +++ b/soong_workflow/views/soong_workflow_views.xml @@ -25,21 +25,14 @@ + + -
-
- - -
-
-
diff --git a/yuthon_official/models/yuthon_official.py b/yuthon_official/models/yuthon_official.py index 1e88867f6..935c11f91 100644 --- a/yuthon_official/models/yuthon_official.py +++ b/yuthon_official/models/yuthon_official.py @@ -5,7 +5,7 @@ from odoo.exceptions import ValidationError, UserError class YuthonOfficial(models.Model): _name = 'yuthon.official' - _description = '收发文管理' + _description = '行政收文' _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin', 'soong.workflow.mixin'] _rec_name = 'name'