pengyuthon
This commit is contained in:
@@ -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():
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user