# -*- coding: utf-8 -*- from odoo import fields, models, api from odoo.exceptions import UserError, ValidationError from datetime import datetime, date, time, timedelta class SoongBouncedWizard(models.Model): _name = 'soong.bounced.wizard' _description = '收回弹窗' res_id = fields.Integer() res_model = fields.Char() def action_bounced(self): current_user = self.env.user record = self.env[self.res_model].search([('id', '=', self.res_id)]) is_admin = current_user.has_group('base.group_system') or current_user.has_group('base.group_admin') log_ids = record.log_ids.sorted('sequence') log_to_delete = log_ids.filtered(lambda log: log.name == record.state) if self.res_model == 'yuthon.official.incoming.normal': director_logs = log_ids.filtered(lambda log: '董事长' in (log.name or '')) if len(director_logs) == 2: log_to_delete = log_ids[-1:] if not is_admin: invalid_logs = log_to_delete.filtered( lambda log: log.approval_state in ['1', '2'] and log.node_btn_name != '1' ) if invalid_logs: raise UserError('当前状态不可以收回') total_log_count = len(log_ids) deleted_log_count = len(log_to_delete) prev_log_index = (total_log_count - deleted_log_count) - 1 other_log_index = total_log_count - deleted_log_count if prev_log_index < 0 or prev_log_index >= len(log_ids): raise UserError('无有效的上一级审批明细行,无法执行收回操作') prev_log = log_ids[prev_log_index] related_record = self.env[self.res_model].browse(self.res_id) done_by_list = [] for index in range(other_log_index): done_by_list.append(log_ids[index].done_by.id) if hasattr(related_record, 'self_users_ids'): related_record.self_users_ids = [(6, 0, [prev_log.done_by.id])] self.env['soong.workflow.record'].search([('code', '=', record.code)]).write({"employee_ids": [(6, 0, [prev_log.done_by.employee_ids.id])], "users_ids": [(6, 0, done_by_list)], 'soong_state': 'to_do' }) for log_delete in log_to_delete: self.sudo().env["wecom.apps"].back_message(log_delete.msg_id, category='approval') log_to_delete.unlink() if record.log_ids2: for log_id2 in record.log_ids2: self.sudo().env["wecom.apps"].back_message(log_id2.msg_id, category='approval') record.log_ids2.unlink() prev_log.write({'approval_state': '1'}) record.write({'state': prev_log.name, 'work_end': False, })