def set_attendance_status_daily(date=""): """ A function that runs once a day, in order to set user's attendance attendance If user has checked out, set_attendance_status_on_check_out should be called. So this function should deal with illegal attendance, such as no_check_out, no_attendance_today, etc. """ if not date: date = datetime.datetime.now().strftime("%Y-%m-%d") the_date = datetime.datetime.strptime(date, "%Y-%m-%d") default_check_time = datetime.datetime.strptime("{date}".format(date=date), "%Y-%m-%d") session = DB_Session() users = session.query(User).filter( User.is_present == 1, User.is_admin == 0 ).order_by(User.id).all() for user in users: try: # 用户当天有打卡记录,说明来打过上班卡 attendance = session.query(Attendance).filter( Attendance.userid == user.id, Attendance.date == date ).one() if attendance.attendance_status == 1: # 状态为待定,说明还没打下班卡 attendance.check_out = default_check_time attendance.is_maintainable = 2 if the_date.weekday() in [5, 6]: # 周末加班忘打下班卡…… # 只能算作没加班了…… # ╮(╯▽╰)╭ attendance.attendance_status = 2 else: attendance.attendance_status = 9 else: # 用户的状态已经计算过了,忽略 pass except sqlalchemy.orm.exc.NoResultFound: # 没有找到用户当天的打卡记录 # 需要强势插入一条记录! legal_check_in = datetime.datetime.strptime( "{date} {time}".format(date=date, time=user.banci), "%Y-%m-%d %H:%M" ) legal_check_out = legal_check_in + datetime.timedelta(hours=9) attendance = Attendance( userid=user.id, legal_check_in=legal_check_in, legal_check_out=legal_check_out, date=date, check_in=default_check_time, check_out=default_check_time, updatetime=datetime.datetime.now() ) if the_date.weekday() in [5, 6]: # 周末未打卡,正常 attendance.is_maintainable = 1 attendance.attendance_status = 2 else: # 工作日未打卡,得多大心啊... attendance.is_maintainable = 2 attendance.attendance_status = 9 session.add(attendance) except sqlalchemy.orm.exc.MultipleResultsFound: # 找到当天有多条打卡记录 # todo pass session.commit() session.close()