# -*- coding: utf-8 -*- from odoo import api, fields, models, tools from odoo.exceptions import UserError, ValidationError class IssueLibrary(models.Model): _name = "issue.library" _description = '议题库' _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin'] _rec_name = 'name' name = fields.Char(string='议题名称') name_text = fields.Text(string='议题名称', compute='_compute_name', readonly=False) depart_opinions = fields.Text(string='部门意见') topic_content = fields.Text(string='议题详细描述') will_based = fields.Text(string='上会依据') code = fields.Char(string='编号', required=True, copy=False, default=lambda self: self.env['ir.sequence'].next_by_code('issue_library_code')) issue_state = fields.Selection([('draft', '待提交'), ('approval', '审批中'), ('on_approval', '已审批'), ('will', '待上会'), ('on_meet', '已上会'), ('cancel', '已取消')], default='draft', string="议题状态") is_party = fields.Boolean(string="党支委会", store=True) is_general_branch = fields.Boolean(string="党总支", store=True) is_class = fields.Boolean(string="班子会", store=True) is_boss = fields.Boolean(string="董事会", store=True) is_note = fields.Boolean(string="上级单位", compute='_compute_issue_library_line_ids', store=True) is_district_state = fields.Boolean(string="区国资局", compute='_compute_issue_library_line_ids', store=True) is_district_government = fields.Boolean(string="区政府", compute='_compute_issue_library_line_ids', store=True) is_district_party = fields.Boolean(string="区委组织部", compute='_compute_issue_library_line_ids', store=True) creart_datetime = fields.Date(string="创建日期", default=fields.Datetime.now) documents_ids = fields.Many2many('ir.attachment', string='议题附件') issue_type_id = fields.Many2one('issue.type', string="议题类型") relevancy_type = fields.Selection([('none', '无')], string="关联流程类型") issue_approval_id = fields.Many2one('issue.approval', string="关联议题审批") issue_library_line_ids = fields.One2many('issue.library.line', 'issue_library_id', string="决策明细") issue_library_approval_line_ids = fields.One2many('issue.library.approval.line', 'issue_library_id', string='流程记录') approval_decision_sequence = fields.Char(string="决策清单事项") is_booking = fields.Boolean(string="是否上会") issues_result = fields.Html(string="会议结果") cs_party = fields.Char(string='党支委') cs_class = fields.Char(string='班子会') cs_boss = fields.Char(string='董事会') issue_library_room_line_ids = fields.One2many('issue.library.room.line', 'issue_library_id', string="关联会议明细行") # 权限相关隐藏字段 employee_id = fields.Many2one('hr.employee', string='创建人', default=lambda self: self.env.user.employee_id) department_id = fields.Many2one('hr.department', string='部门', related='employee_id.department_id') users_role_ids = fields.Many2many('soong.user.role', string='角色范围', related='employee_id.user_role_ids') company_id = fields.Many2one('res.company', string='公司', related='employee_id.company_id', stroe=True) approval_name = fields.Char(string="审批标题") meeting_place = fields.Char(string="会议地点") meeting_name = fields.Char(string="会议名称") active = fields.Boolean('Active', default=True, tracking=True) urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', default='normal') work_end = fields.Boolean(string="结束") member_of_department = fields.Boolean("是否是本部门数据", compute='_compute_part_of_department', search='_search_part_of_department') @api.depends_context('uid', 'company') @api.depends('department_id') def _compute_part_of_department(self): user_employee = self._get_valid_employee_for_user() active_department = user_employee.department_id for employee in self: employee.member_of_department = employee.department_id == active_department def _get_valid_employee_for_user(self): user = self.env.user employee = user.employee_ids if not employee: user_employees = user.employee_id.sudo().search([ ('user_id', '=', user.id) ]) employee = user_employees.filtered(lambda r: r.company_id == user.company_id) or user_employees[:1] return employee # def _search_part_of_department(self, operator, value): user_employee = self._get_valid_employee_for_user() return (['!'] if operator == '!=' else []) + [('department_id', '=', user_employee.department_id.id)] def _get_default_name_title(self): return self._description if self._description else self._name name_title = fields.Char(default=_get_default_name_title) def read_number(self): return self.search_count([ ('issue_state', '=', 'draft'), ('employee_id.user_id', '=', self.env.user.id) ]) @api.onchange('issue_library_line_ids') def onchange_approval_decision_sequence(self): for dec in self: specifics_list = [] for line in dec.issue_library_line_ids: if line.issue_approval_decision_id: specifics_list.append(line.issue_approval_decision_id.specifics) dec.approval_decision_sequence = ';'.join(specifics_list) if specifics_list else '' def all_issue_pull(self): issue_active_ids = self.env["issue.library"].browse(self._context.get('active_ids', self._context.get('active_id'))) if not issue_active_ids: if self.issue_state != 'draft': raise UserError("当前状态不允许提交") else: for i in issue_active_ids: if i.issue_state != 'draft': raise UserError("当前状态不允许提交") form_id = self.env.ref("yuthon_issue.issue_library_approval_form").id issue_decision_lines = [] specifics_list = [] if not issue_active_ids: issue_active_ids = self for issue_record in issue_active_ids: specifics_list.append(issue_record.name) issue_record.write({"issue_state": "approval"}) issue_decision_lines.append((0, 0, { 'issue_library_id': issue_record.id, 'approval_decision_sequence': issue_record.approval_decision_sequence, 'is_party': issue_record.is_party, 'is_class': issue_record.is_class, 'is_boss': issue_record.is_boss, 'is_note': issue_record.is_note, 'employee_id': issue_record.employee_id.id })) if len(specifics_list)>1: name = ','.join(specifics_list) else: name = self.name issue_approval_id = self.env['issue.approval'].create({ 'issue_approval_ids': issue_decision_lines, 'name': name, 'employee_id': self.employee_id.id, }) self.issue_approval_id = issue_approval_id return { "type": "ir.actions.act_window", "name": "批量提交", "res_model": "issue.approval", "views": [[form_id, "form"]], "res_id": issue_approval_id.id, "context": { "id": issue_approval_id.id, "is_issue": True, } } def single_issue_pull(self): # 检查当前记录状态是否允许提交 if self.issue_state != 'draft': raise UserError("当前状态不允许提交") form_id = self.env.ref("yuthon_issue.issue_library_approval_form").id issue_decision_lines = [(0, 0, { 'issue_library_id': self.id, 'approval_decision_sequence': self.approval_decision_sequence, 'is_party': self.is_party, 'is_class': self.is_class, 'is_boss': self.is_boss, 'is_note': self.is_note, 'employee_id': self.employee_id.id })] issue_approval_id = self.env['issue.approval'].create({ 'issue_approval_ids': issue_decision_lines, 'name': self.name, 'employee_id': self.employee_id.id, }) self.write({"issue_state": "approval"}) self.issue_approval_id = issue_approval_id return { "type": "ir.actions.act_window", "name": "提交审批", "res_model": "issue.approval", "views": [[form_id, "form"]], "res_id": issue_approval_id.id, "context": { "id": issue_approval_id.id, "is_issue": True, } } def issue_cancel(self): self.write({"issue_state": "cancel"}) def all_meeting_issue(self): issue_active_ids = self.env["issue.library"].browse(self._context.get('active_ids', self._context.get('active_id'))) # for record in issue_active_ids: # if record.state != 'will': # raise UserError("当前状态不允许上会") for meet in self: meet.write({"issue_state": "on_meet"}) issue_details = [] for issue in issue_active_ids: issue_details.append((0, 0, { 'issue_library_id': issue.id, })) form_id = self.env.ref("room.room_booking_view_form").id return { "type": "ir.actions.act_window", "name": "批量上会", "res_model": "room.booking", "views": [[form_id, "form"]], "context": { 'default_is_issue': True, 'default_issue_meeting_line_ids': issue_details, } } def single_meeting_issue(self): issue = self.env["issue.library"].browse(self.id) if issue.state != 'will': raise UserError("当前状态不允许上会") self.write({"issue_state": "on_meet"}) issue_details = [(0, 0, { 'issue_library_id': issue.id, })] form_id = self.env.ref("room.room_booking_view_form").id return { "type": "ir.actions.act_window", "name": "单个上会", "res_model": "room.booking", "views": [[form_id, "form"]], "context": { 'default_is_issue': True, 'default_issue_meeting_line_ids': issue_details, } } def approval_details(self): self.ensure_one() for record in self: if not record.issue_approval_id: raise UserError('请提交审批后查看') form_id = self.env.ref("yuthon_issue.issue_library_approval_form").id return{ "type": "ir.actions.act_window", "name": "审批详情", "res_model": "issue.approval", "views": [[form_id, "form"]], "res_id": self.issue_approval_id.id } @api.depends('issue_library_line_ids') def _compute_issue_library_line_ids(self): for record in self: # 判断issue_library_line_ids记录集中是否存在关联了issue.library.type的记录 record.is_party = bool(record.issue_library_line_ids.filtered(lambda rec: rec.council_id)) record.is_class = bool(record.issue_library_line_ids.filtered(lambda rec: rec.team_meet_id)) record.is_boss = bool(record.issue_library_line_ids.filtered(lambda rec: rec.board_meet_id)) record.is_district_state = bool(record.issue_library_line_ids.filtered(lambda rec: rec.district_state_id)) record.is_district_government = bool( record.issue_library_line_ids.filtered(lambda rec: rec.district_government_id)) record.is_district_party = bool(record.issue_library_line_ids.filtered(lambda rec: rec.district_party_id)) record.is_note = any([ bool(record.issue_library_line_ids.filtered( lambda rec: rec.issue_approval_decision_id and rec.issue_approval_decision_id.district_state_id)), bool(record.issue_library_line_ids.filtered( lambda rec: rec.issue_approval_decision_id and rec.issue_approval_decision_id.district_government_id)), bool(record.issue_library_line_ids.filtered( lambda rec: rec.issue_approval_decision_id and rec.issue_approval_decision_id.district_party_id)) ]) def unlink(self): for i in self: if i.issue_state == 'on_meet': raise UserError('议题已上会,不能删除') return super().unlink() @api.depends('name') def _compute_name(self): for record in self: record.name_text = record.name @api.onchange('issue_library_room_line_ids') def _onchange_issue_library_room_line_ids(self): for record in self.issue_library_room_line_ids: if record.meeting_type_id.name == '党委会': self.cs_party = record.room_booking_id.name elif record.meeting_type_id.name == '班子会': self.cs_class = record.room_booking_id.name elif record.meeting_type_id.name == '董事会': self.cs_boss = record.room_booking_id.name @api.onchange('is_booking') def _onchange_is_booking(self): if self.is_booking: issue_id = self.env['issue.library'].create({'name': self.name}) self.related_issues_id = issue_id.id workflow_record_id = self.env["soong.workflow.record"].search( [("res_model", "=", self._name), ("res_id", "=", self.id)]) self.env['issue.library.approval.line'].create({ 'issue_library_id': issue_id.id, 'workflow_record_id': workflow_record_id.id, 'approval_type': workflow_record_id.workflow_id.id, 'code': self.code, 'approval_date': fields.Datetime.now(), }) elif self.related_issues_id: raise UserError("已经创建了相关的上会记录,不能取消勾选") class IssueLibraryLine(models.Model): _name = "issue.library.line" _description = '决策清单明细' issue_library_id = fields.Many2one('issue.library') issue_approval_decision_id = fields.Many2one('issue.approval.decision', string="决策清单") council_id = fields.Many2one(related='issue_approval_decision_id.council_id', string='党总委员会') team_meet_id = fields.Many2one(related='issue_approval_decision_id.team_meet_id', string='经营班子会') board_meet_id = fields.Many2one(related='issue_approval_decision_id.board_meet_id', string='董事会') district_state_id = fields.Many2one(related='issue_approval_decision_id.district_state_id', string="区国资局") district_government_id = fields.Many2one(related='issue_approval_decision_id.district_government_id', string="区政府") district_party_id = fields.Many2one(related='issue_approval_decision_id.district_party_id', string="区委组织部") ordinal = fields.Char(related='issue_approval_decision_id.sequence', string='序号') class IssueLibraryApprovalLine(models.Model): _name = "issue.library.approval.line" _description = '关联流程明细' issue_library_id = fields.Many2one('issue.library', string="关联议题") workflow_record_id = fields.Many2one('soong.workflow.record', string="标题") code = fields.Char(string="流程编号") approval_type = fields.Many2one(related="workflow_record_id.workflow_id", string="类型") approval_date = fields.Datetime(string="创建日期") def open_record(self): return { "type": "ir.actions.act_window", "res_model": self.workflow_record_id.res_model, "res_id": self.workflow_record_id.res_id, "name": self.workflow_record_id.name, "view_mode": "form", } class IssueLibraryRoomLine(models.Model): _name = "issue.library.room.line" _description = '关联会议明细' issue_library_id = fields.Many2one('issue.library', string="关联议题") room_booking_id = fields.Many2one('room.booking', string="会议名称") room_id = fields.Many2one('room.room', string="会议地点") meeting_type_id = fields.Many2one('room.meeting.type', string="会议类型") approval_date = fields.Datetime(string="创建日期")