Appointment.appoint.jobs 源代码
from datetime import datetime, timedelta
from Appointment.models import Appoint
from Appointment.utils.log import logger
from Appointment.appoint.status_control import start_appoint, finish_appoint
from Appointment.extern.jobs import remove_appoint_reminder
from scheduler.adder import ScheduleAdder
from scheduler.cancel import remove_job
[文档]
@logger.secure_func('设置预约定时任务出错', fail_value=False)
def set_scheduler(appoint: Appoint) -> bool:
'''
设置预约状态变更的定时任务,可在任何时候调用,不抛出异常
Args:
appoint (Appoint): 预约对象,尚未结束且开始结束顺序正常
Returns:
bool: 是否设置成功,当不符合条件时返回False
'''
start = appoint.Astart
finish = appoint.Afinish
current_time = datetime.now() + timedelta(seconds=5)
if finish < start: # 开始晚于结束,预约不合规
logger.error(f'预约{appoint.pk}时间为{start}<->{finish},未能设置定时任务')
return False # 直接返回,预约不需要设置
if finish < current_time: # 预约已经结束
logger.error(f'预约{appoint.pk}在设置定时任务时已经结束')
return False # 直接返回,预约不需要设置
has_started = start < current_time
if has_started: # 临时预约或特殊情况下设置任务时预约可能已经开始
start = current_time # 改为立刻执行
if not (has_started and appoint.Astatus == Appoint.Status.PROCESSING):
ScheduleAdder(start_appoint, id=f'{appoint.pk}_start',
run_time=start)(appoint.pk)
ScheduleAdder(finish_appoint, id=f'{appoint.pk}_finish',
run_time=finish)(appoint.pk)
return True
[文档]
def cancel_scheduler(appoint: Appoint | int, record_miss: bool = False) -> bool:
'''
取消预约的定时任务,不抛出异常
Hint:
如果结束任务不存在,则不会处理其它任务
'''
aid = appoint.pk if isinstance(appoint, Appoint) else appoint
if not remove_job(f'{aid}_finish'):
if record_miss:
logger.warning(f"预约{aid}取消时未发现计时器")
return False
if not remove_job(f'{aid}_start') and record_miss:
logger.warning(f"预约{aid}取消时未发现开始计时器")
if not remove_appoint_reminder(aid) and record_miss:
logger.info(f"预约{aid}取消时未发现微信提醒")
return True