diff --git a/awesome_theme/static/src/components/sidebar/awesome_sidebar.scss b/awesome_theme/static/src/components/sidebar/awesome_sidebar.scss index 6bba2fa64..1a28068f6 100644 --- a/awesome_theme/static/src/components/sidebar/awesome_sidebar.scss +++ b/awesome_theme/static/src/components/sidebar/awesome_sidebar.scss @@ -247,7 +247,7 @@ &.active { position: relative; - background: #eee; + background: #b8d7f3 !important; &:after { content: ''; @@ -576,7 +576,7 @@ body { margin-left: 0px !important; } } - +body.white .sidebar_menu .menu_container ul > li > a.active body.white { .app_item:hover, .app_item.active { diff --git a/list_view_sticky_header_and_column/static/src/scss/list_view_sticky_header_and_column.scss b/list_view_sticky_header_and_column/static/src/scss/list_view_sticky_header_and_column.scss index 7c0c6cc48..2d22a5a77 100644 --- a/list_view_sticky_header_and_column/static/src/scss/list_view_sticky_header_and_column.scss +++ b/list_view_sticky_header_and_column/static/src/scss/list_view_sticky_header_and_column.scss @@ -27,6 +27,13 @@ .o_list_view .table-responsive .table thead { z-index: 5; } +.o_form_view:not(.o_field_highlight) .o_field_widget:not(.o_field_invalid):not(.o_field_highlight) .o_input:not(:hover):not(:focus) { + --o-input-border-color: transparent; + border-style: solid; + border-color: #000; + border-width: 0px; + border-bottom-width: 1px; +} body.white .table { width: -webkit-fill-available !important; } diff --git a/room/views/inherit_calendar_event_views.xml b/room/views/inherit_calendar_event_views.xml index 15bd484b1..e802b3da1 100644 --- a/room/views/inherit_calendar_event_views.xml +++ b/room/views/inherit_calendar_event_views.xml @@ -66,7 +66,7 @@ inherit.calender.view.form calendar.event -
+
diff --git a/soong_workflow/__manifest__.py b/soong_workflow/__manifest__.py index 3e48abaca..d4bc1fe3f 100644 --- a/soong_workflow/__manifest__.py +++ b/soong_workflow/__manifest__.py @@ -11,7 +11,6 @@ "security/soong_workflow_security.xml", "security/ir.model.access.csv", "views/kklw_workflow_approval_views.xml", - "views/menuitem.xml", "views/soong_approval_users_views.xml", "views/soong_note_views.xml", "views/soong_hr_employee_views.xml", @@ -22,6 +21,8 @@ "views/soong_workflow_record.xml", "views/soong_approval_group.xml", "views/trans_link_views.xml", + "views/soong_workflow_entrust_views.xml", + "views/menuitem.xml", 'wizard/approval_notice_wizard_views.xml', "wizard/soong_workflow_comment_wizard_view.xml", "templates/soong_workflow_templates.xml", diff --git a/soong_workflow/models/__init__.py b/soong_workflow/models/__init__.py index 0a79550a9..1cc856685 100644 --- a/soong_workflow/models/__init__.py +++ b/soong_workflow/models/__init__.py @@ -13,3 +13,4 @@ from . import soong_note from . import soong_workflow_log from . import soong_approval_group from . import trans_link +from . import soong_workflow_entrust diff --git a/soong_workflow/models/ir_model.py b/soong_workflow/models/ir_model.py index 65104478f..255a53e01 100644 --- a/soong_workflow/models/ir_model.py +++ b/soong_workflow/models/ir_model.py @@ -11,11 +11,7 @@ _logger = logging.getLogger(__name__) class IrModel(models.Model): _inherit = "ir.model" - is_workflow = fields.Boolean( - string="is Workflow", - default=False, - help="Whether the model supports workflow approval", - ) + is_workflow = fields.Boolean(string="is Workflow", default=False, help="Whether the model supports workflow approval") def _reflect_model_params(self, model): vals = super(IrModel, self)._reflect_model_params(model) diff --git a/soong_workflow/models/soong_workflow.py b/soong_workflow/models/soong_workflow.py index 08240eb8a..860cea02e 100644 --- a/soong_workflow/models/soong_workflow.py +++ b/soong_workflow/models/soong_workflow.py @@ -165,6 +165,7 @@ class SoongWorkflow(models.Model): "sequence": 99, "node_name": "end", "flow_end": True, + "is_visible": False, },), ] return super().create(values) diff --git a/soong_workflow/models/soong_workflow_entrust.py b/soong_workflow/models/soong_workflow_entrust.py new file mode 100644 index 000000000..b2f73d676 --- /dev/null +++ b/soong_workflow/models/soong_workflow_entrust.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +import logging +import datetime +from odoo import models, fields, api, _, modules +from odoo.exceptions import ValidationError, UserError + +_logger = logging.getLogger(__name__) + +MODEL_DOMAIN = """[ + ('is_workflow', '=', True), + ('state', '=', 'base'), + ('transient', '=', False), + '!', + '|', + '|', + '|', + '|', + '|', + '|', + '|', + ('model', '=ilike', 'res.%'), + ('model', '=ilike', 'ir.%'), + ('model', '=ilike', 'soong.workflow%'), + ('model', '=ilike', 'bus.%'), + ('model', '=ilike', 'base.%'), + ('model', '=ilike', 'base_%'), + ('model', '=', 'base'), + ('model', '=', '_unknown'), + ]""" + + +class SoongWorkflowEntrust(models.Model): + _name = "soong.workflow.entrust" + _description = "工作流委托" + + name = fields.Many2one("ir.model", string="名称", domain=MODEL_DOMAIN, default=lambda self: self.env['ir.model'].search([('model', '=', 'entrust.all')])) + entrust_user_id = fields.Many2one('res.users', string='委托人') + entrust_user_id2 = fields.Many2one('res.users', string='被委托人') + is_expiration_date = fields.Boolean(string="一直有效", default=True) + start_time = fields.Datetime(string="生效日期", copy=False, default=fields.Datetime.now) + end_time = fields.Datetime(string="失效日期", copy=False) + is_enable = fields.Boolean(string="是否启用", default=False, compute="compute_is_enable", store=True) + entrust_notice = fields.Boolean(string="发送事务提醒消息", default=True) + + @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() or rec.is_enable: + rec.is_enable = True + else: + rec.is_enable = False + else: + rec.is_enable = False + + +class EntrustAll(models.Model): + _name = "entrust.all" + _inherit = 'soong.workflow.mixin' + _description = "全部流程" + + name = fields.Char(string='name') \ No newline at end of file diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 75df25d99..4e319e468 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -194,21 +194,20 @@ class SoongWorkflowMixin(models.AbstractModel): @api.constrains("state") def _update_wkf_records(self): for rec in self: - record_obj = self.env["soong.workflow.record"].search( - [("res_model", "=", rec._name), ("res_id", "=", rec.id)] - ) + record_obj = self.env["soong.workflow.record"].search([("res_model", "=", rec._name), ("res_id", "=", rec.id)]) + current_user_id = self.env.user.id if not record_obj: - record_obj = self.env["soong.workflow.record"].create( - { + record_obj = self.env["soong.workflow.record"].create({ "res_model": rec._name, "res_id": rec.id, "workflow_id": rec.workflow_id.id, "node_id": rec.node_id.id, - } - ) - record_obj.update( - {"workflow_id": rec.workflow_id.id, "node_id": rec.node_id.id} - ) + "users_ids": [(4, current_user_id)], + }) + record_obj.update({"workflow_id": rec.workflow_id.id, + "node_id": rec.node_id.id, + "users_ids": [(4, current_user_id)], + }) def unlink(self): self.mapped("log_ids").unlink() diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py index 7dad1ad01..cf0d248a1 100644 --- a/soong_workflow/models/soong_workflow_record.py +++ b/soong_workflow/models/soong_workflow_record.py @@ -22,22 +22,10 @@ class SoongWorkflowRecord(models.Model): name = fields.Char(string="Name", compute="compute_name", store=True) res_model = fields.Char(string="Res Model", required=True) res_id = fields.Integer(string="Res ID", required=True) - workflow_id = fields.Many2one( - comodel_name="soong.workflow", string="Workflow Ref.", ondelete="restrict" - ) - node_id = fields.Many2one( - comodel_name="soong.workflow.node", string="Workflow Node Ref." - ) - approve_state = fields.Selection( - [ - ("start", "Start"), - ("pending", "Pending"), - ("end", "End"), - ], - default="start", - string="Approve Status", - compute="_compute_node_id", - ) + users_ids = fields.Many2many('res.users', string="用户") + workflow_id = fields.Many2one(comodel_name="soong.workflow", string="审批类型", ondelete="restrict") + node_id = fields.Many2one(comodel_name="soong.workflow.node", string="当前节点") + approve_state = fields.Selection([("start", "开始"), ("pending", "审批中"), ("end", "结束")], default="start", string="审批状态", compute="_compute_node_id",) @api.depends("node_id") def _compute_node_id(self): diff --git a/soong_workflow/security/ir.model.access.csv b/soong_workflow/security/ir.model.access.csv index 59aca108f..fc11f8e25 100644 --- a/soong_workflow/security/ir.model.access.csv +++ b/soong_workflow/security/ir.model.access.csv @@ -24,4 +24,6 @@ access_soong_approval_notice_wizard,soong_approval_notice_wizard,model_soong_app access_soong_workflow_log_user,soong_workflow_log_user,model_soong_workflow_log,soong_workflow.group_soong_workflow_user,1,1,1,1 access_soong_workflow_comment_wizard_user,soong_workflow_comment_wizard_user,model_soong_workflow_comment_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1 -access_trans_link,trans_link,model_trans_link,soong_workflow.group_soong_workflow_user,1,1,1,1 \ No newline at end of file +access_trans_link,trans_link,model_trans_link,soong_workflow.group_soong_workflow_user,1,1,1,1 +access_soong_workflow_entrust,soong_workflow_entrust,model_soong_workflow_entrust,soong_workflow.group_soong_workflow_user,1,1,1,1 +access_entrust_all,entrust_all,model_entrust_all,soong_workflow.group_soong_workflow_user,1,1,1,1 \ No newline at end of file diff --git a/soong_workflow/templates/soong_workflow_templates.xml b/soong_workflow/templates/soong_workflow_templates.xml index bbacc6d2b..00a646d49 100644 --- a/soong_workflow/templates/soong_workflow_templates.xml +++ b/soong_workflow/templates/soong_workflow_templates.xml @@ -9,8 +9,8 @@ style="width:100%%; margin-top: 10px;" > - - + + diff --git a/soong_workflow/views/menuitem.xml b/soong_workflow/views/menuitem.xml index 04f5077a6..62f1103dc 100644 --- a/soong_workflow/views/menuitem.xml +++ b/soong_workflow/views/menuitem.xml @@ -20,13 +20,42 @@ name="新的请求" parent="menu_workflow_approval_request" action="action_kklw_workflow_approval_request" - sequence="200"/> + sequence="1"/> + action="soong_workflow_record_action" + sequence="3"/> + + + + + + + + + \ No newline at end of file diff --git a/soong_workflow/views/soong_approval_group.xml b/soong_workflow/views/soong_approval_group.xml index bc2326d2e..2606a9aea 100644 --- a/soong_workflow/views/soong_approval_group.xml +++ b/soong_workflow/views/soong_approval_group.xml @@ -31,10 +31,4 @@ tree,form - \ No newline at end of file diff --git a/soong_workflow/views/soong_note_views.xml b/soong_workflow/views/soong_note_views.xml index 9e3d00a56..da75ef87c 100644 --- a/soong_workflow/views/soong_note_views.xml +++ b/soong_workflow/views/soong_note_views.xml @@ -32,15 +32,4 @@ {'search_default_type': True,} - - - diff --git a/soong_workflow/views/soong_workflow_entrust_views.xml b/soong_workflow/views/soong_workflow_entrust_views.xml new file mode 100644 index 000000000..29ac3b0a9 --- /dev/null +++ b/soong_workflow/views/soong_workflow_entrust_views.xml @@ -0,0 +1,70 @@ + + + + soong.workflow.entrust.tree + soong.workflow.entrust + + + + + + + + + + + + + + soong.workflow.entrust.form + soong.workflow.entrust + + + + + + + + + + + + + + + + + + + + + + 工作委托 + soong.workflow.entrust + tree,form + + + + + entrust.all.tree + entrust.all + + + + + + + + entrust.all.form + entrust.all + +
+ + + + + +
+
+
+
\ No newline at end of file diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml index df7295121..4beef8ad0 100644 --- a/soong_workflow/views/soong_workflow_record.xml +++ b/soong_workflow/views/soong_workflow_record.xml @@ -1,7 +1,6 @@ - +entrust - soong.workflow.record.search soong.workflow.record @@ -21,11 +20,9 @@ - - - - - + + +
@@ -36,13 +33,13 @@ ir.actions.act_window soong.workflow.record tree,form + [('users_ids', 'in', [uid])] - - + + + + + diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index 3cbd4485f..231769ae3 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -37,10 +37,10 @@ class SoongWorkflowCommentWizard(models.TransientModel): # 转交逻辑--单线 if not self.node_link_len and self.node_btn_name == '转交': state = self.node_btn_id.node_id.out_link_ids.name.split('-> ')[-1] - record_id.write({'state': state}) + record_id.write({'state': 'end' if state == '结束' else state}) # 转交逻辑--多线 if self.node_link_len: - record_id.write({'state': self.trans_link_id.name}) + record_id.write({'state': 'end' if self.trans_link_id.name == '结束' else self.trans_link_id.name}) if self.node_btn_name == '退回': record_id.write({'state': 'start' if self.return_link_id.name == '经办人' else self.return_link_id.name}) # 填写审批记录 diff --git a/yuthon_notice/models/yuthon_notice.py b/yuthon_notice/models/yuthon_notice.py index 7c7d6f98d..8a9a3f6e4 100644 --- a/yuthon_notice/models/yuthon_notice.py +++ b/yuthon_notice/models/yuthon_notice.py @@ -20,12 +20,11 @@ class YuthonNotice(models.Model): company_page = fields.Selection([('tz', '天河投资'), ('wg', '天河物管'), ('lc', '天河粮储')], string="公司", compute="_compute_company", store=True) notice_type_id = fields.Many2one('yuthon.notice.type', string="公告类型") create_date = fields.Date(string="发布日期") - start_date = fields.Date(string="生效日期") + start_date = fields.Date(string="生效日期", default=fields.Date.today()) end_date = fields.Date(string="终止日期") sequence = fields.Integer(string="顺序", default=1) - statu = fields.Selection([('new', '草稿'), ('approval', '审批中'), ('done', '已通过'), - ('stop', '已拒绝'), ('no', '未发布'), ('yes', '已发布')], default='new', string="公告状态") - notice_documents_ids = fields.Many2many('documents.document', string="通知公告文件") + notice_state = fields.Selection([('no', '未发布'), ('yes', '已发布'), ('stop', '已终止')], default='no', string="公告状态") + notice_documents_ids = fields.Many2many('documents.document', string="附件") is_notice_roger = fields.Selection([('yes', '已读'), ('no', '未读')], default='no', string="确认状态") is_change_notice = fields.Boolean(string="是否发送通知", default=True) notice_text = fields.Html(string="正文") @@ -111,7 +110,7 @@ class YuthonNotice(models.Model): # 关联待办和不关联待办 # partner_ids = self.sudo().env['res.users'].search([('id', 'in', publish_user_list)]).mapped('partner_id').ids # self.sudo().with_context(lang=self.env.lang)._message_auto_subscribe_notify(partner_ids, 'yuthon_notice.message_yuthon_confirm_users_data') - self.write({"statu": 'yes'}) + self.write({"notice_state": 'yes'}) def look_up_notice_users(self): return { @@ -127,6 +126,6 @@ class YuthonNotice(models.Model): def stop_notice(self): self.write({ - 'statu': 'stop', - 'end_date': fields.Datetime.now(), + 'notice_state': 'stop', + 'end_date': fields.Date.today(), }) diff --git a/yuthon_notice/views/yuthon_notice_views.xml b/yuthon_notice/views/yuthon_notice_views.xml index e2a798b92..84d0d9a68 100644 --- a/yuthon_notice/views/yuthon_notice_views.xml +++ b/yuthon_notice/views/yuthon_notice_views.xml @@ -13,7 +13,6 @@ -