pengyuthon

This commit is contained in:
李鹏宇
2024-09-05 18:48:10 +08:00
parent 94bb59eb12
commit 9746063da9
5 changed files with 103 additions and 20 deletions
+5 -1
View File
@@ -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():
+95 -8
View File
@@ -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
-1
View File
@@ -2,7 +2,6 @@
<odoo>
<data>
<!--
Root Menu
-->
@@ -25,21 +25,14 @@
<field name="name" required="1"/>
<field name="model_id" required="1" options="{'no_open': True, 'no_create': True}"/>
<field name="current_stage_highlight_color" widget="color"/>
<field name="remove_default_btn_until_end"/>
<field name="is_enable_return_button"/>
</group>
<group>
<field name="start_time"/>
<field name="end_time" required="1"/>
<field name="is_enable"/>
</group>
<div>
<div>
<!-- <label for="remove_default_attrs_mod"/>-->
<!-- <field name="remove_default_attrs_mod" class="oe_inline"/>-->
<label for="remove_default_btn_until_end"/>
<field name="remove_default_btn_until_end" class="oe_inline"/>
</div>
<br/>
</div>
</group>
<notebook>
<page string="Nodes">
+1 -1
View File
@@ -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'