achievement.jobs 源代码
from datetime import date, timedelta
from scheduler.periodic import periodical
from achievement.models import Achievement
from achievement.utils import bulk_add_achievement_record, get_students_by_grade
from achievement.api import unlock_credit_achievements
from semester.api import current_semester
__all__ = [
'unlock_credit_achievements',
'new_school_year_achievements',
]
# 信用分相关成就激活判断 每月1日6点运行
[文档]
@periodical('cron', job_id='解锁信用分成就', day=1, hour=6, minute=0)
def unlock_credit_achievements():
semester = current_semester()
today = date.today()
last_month_lastday = today - timedelta(days=today.day)
last_month_firstday = last_month_lastday.replace(day=1)
DAYS_LIMIT = 21
# 如果当前日期位于学期中间,进行'当月没有扣除信用分'成就的触发
if semester.start_date <= today < semester.end_date: # 注意end_date是指放假开始的当天
# 上月在学期内的天数超过阈值
if (today - semester.start_date).days >= DAYS_LIMIT:
unlock_credit_achievements(
last_month_firstday, last_month_lastday, '当月没有扣除信用分')
# 如果当前日期位于学期结束后
elif today >= semester.end_date:
# 进行'一学期没有扣除信用分'成就的触发
unlock_credit_achievements(
semester.start_date, semester.end_date-timedelta(days=1), '一学期没有扣除信用分')
# 进行'当月没有扣除信用分'成就的触发
if last_month_firstday < semester.end_date:
# 上月在学期内的天数超过阈值
if (semester.end_date - last_month_firstday).days >= DAYS_LIMIT:
unlock_credit_achievements(
last_month_firstday, last_month_lastday, '当月没有扣除信用分')
# 简单起见,不妨每年7月1日进行'一学年没有扣除信用分'成就触发
if today.month == 7:
unlock_credit_achievements(
today-timedelta(days=365), today, '一学年没有扣除信用分')
[文档]
def new_school_year_achievements():
'''触发 元气人生-开启大学第二、三、四年'''
for i, name in zip(range(2, 7), ['二', '三', '四', '五', '六']):
achievement = Achievement.objects.get(name=f'开启大学生活第{name}年')
bulk_add_achievement_record(get_students_by_grade(i), achievement)