#!/usr/bin/env python # -*- coding:utf-8 -*- # @FileName :planning_slot.py # @Time :2025/1/12 下午3:18 # @Author :zzw from odoo import models, fields, api, _ from typing import Dict, List from datetime import timedelta class TxPlanningSlot(models.Model): _inherit = "planning.slot" _order = 'resource_id' @api.model @api.returns('self') def search_fetch(self, domain, field_names, offset=0, limit=None, order=None): if self._context.get('show_job_title', False): if not order: order = 'resource_id' return super().search_fetch(domain, field_names, offset, limit, order) def web_read(self, specification: Dict[str, Dict]) -> List[Dict]: res = super().web_read(specification) if self._context.get('show_job_title', False): if res and res[0].get('resource_id', {}).get('id'): data_list = [r.get('resource_id', {}).get('id') for r in res if r.get('resource_id', {})] self.env['resource.resource'].search([('id', 'in', data_list)], order="sequence,name") return res def action_compensatory_leave(self): """ 补休按钮 - 打开假期分配表单,填写补休信息后验证写入考勤确认单台账 """ self.ensure_one() # 从排班资源获取员工 employee = self.resource_id.employee_id if self.resource_id else None if not employee: return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': '提示', 'message': '该排班未关联有效员工,无法创建补休申请', 'sticky': False, 'type': 'warning', } } # 获取排班日期 slot_date = (self.start_datetime + timedelta(hours=8)).date() if self.start_datetime else None # 获取"补休"假期类型 holiday_status_id = self.env['hr.leave.type'].search([('name', '=', '补休')]) # 获取 hr.leave.allocation 的 form 视图 form_id = self.env.ref('hr_holidays.hr_leave_allocation_view_form_manager').id return { 'type': 'ir.actions.act_window', 'name': '计划班调补休申请', 'res_model': 'hr.leave.allocation', 'view_mode': 'form', 'views': [(form_id, 'form')], 'target': 'current', 'context': { 'default_holiday_status_id': holiday_status_id.id, 'default_employee_ids': [(6, 0, [employee.id])], 'default_employee_id': employee.id, 'default_allocation_type': 'regular', 'default_name': '计划班调补休', 'default_number_of_days_display': 8, 'default_date_from': slot_date, }, } @api.depends('role_id', 'employee_id') def _compute_template_autocomplete_ids(self): domain = self._get_domain_template_slots() templates = self.env['planning.slot.template'].search(domain, order='start_time', limit=15) self.template_autocomplete_ids = templates + self.template_id