61 lines
2.9 KiB
Python
61 lines
2.9 KiB
Python
# -*- 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,
|
|
}) |