def deal_confirm_out(account_id, create_time, callback): pos = callback.find("time=") str_time = callback[pos+5:] user_time = int(str_time) end_time = local_date_time(user_time) current_date = datetime.strftime(end_time, '%Y-%m-%d') info = get_schedule_by_user(account_id, current_date) if info is None: raise HTTPError(500, "Internal data error") schedule_id = info[0] begin_time_st = info[1] cur_time = local_date_time(create_time) begin_time = local_date_time(begin_time_st) modify_schedule(schedule_id, cur_time, end_time, begin_time, account_id) modify_schedule_by_user(schedule_id, user_time) if user_time < begin_time_st: yield asyncio.sleep(1) set_status_by_user_date(account_id, current_date, status="wait_out") return number_message(), False hours = int((user_time - begin_time_st)/3600) min = int(((user_time - begin_time_st) % 3600)/60) return [confirm_out_message(user_time, hours, min)], True
def confirm_out(account_id, current_date, create_time, callback): contents, success = yield deal_confirm_out(account_id, create_time, callback) yield push_messages(account_id, contents) if success: set_status_by_user_date(account_id, current_date, status="out_done", process="sign_out_done")
def manual_sign_out_content(account_id, current_date): yield asyncio.sleep(1) content = get_status_by_user(account_id, current_date) if content is None or content[1] is None or content[1] != "sign_in_done": return [invalid_message()] set_status_by_user_date(account_id, current_date, "wait_out") return manual_sign_out_message()
def sign_out_content(account_id, current_date): content = get_status_by_user(account_id, current_date) process = None if content is not None: status = content[0] process = content[1] if status == "wait_out": set_status_by_user_date(account_id, current_date, status="in_done") if process is None or process != "sign_in_done": return reminder_message(None) return sign_out_message()
def manual_sign_out_content(account_id, current_date): """ Update user status and generate manual check-out message. :param account_id: user account id :param current_date: current date by local time. :return: message content list """ yield asyncio.sleep(1) content = get_status_by_user(account_id, current_date) if content is None or content[1] is None or content[1] != "sign_in_done": return [invalid_message()] set_status_by_user_date(account_id, current_date, "wait_out") return manual_sign_out_message()
def confirm_out(account_id, current_date, create_time, callback): """ This function is triggered when the user clicks confirm check-out. will be linked with the calendar internally. :param account_id: user account id. :param current_date: current date by local time. :param create_time: Time the request arrived at the server. :param callback: User triggered callback. :return: None """ contents, success = yield deal_confirm_out(account_id, create_time, callback) yield push_messages(account_id, contents) if success: set_status_by_user_date(account_id, current_date, status="out_done", process="sign_out_done")
def deal_confirm_out(account_id, create_time, callback): """ will be linked with the calendar internally, Check out time of registered user. Check also: calendar_bot/externals/calendar_req.py :param account_id: user account id. :param create_time: current date by local time. :param callback: The message content of the callback, include the user's check-out time :return: Prompt message of successful check out. """ pos = callback.find("time=") str_time = callback[pos+5:] user_time = int(str_time) end_time = local_date_time(user_time) current_date = datetime.strftime(end_time, '%Y-%m-%d') info = get_schedule_by_user(account_id, current_date) if info is None: raise HTTPError(500, "Internal data error") schedule_id = info[0] begin_time_st = info[1] cur_time = local_date_time(create_time) begin_time = local_date_time(begin_time_st) title = "[{account}]'s working hours on {date}".\ format(account=account_id, date=datetime.strftime(end_time, '%A, %B %d')) modify_schedule(schedule_id, cur_time, end_time, begin_time, account_id, title) modify_schedule_by_user(schedule_id, user_time) if user_time < begin_time_st: yield asyncio.sleep(1) set_status_by_user_date(account_id, current_date, status="wait_out") return number_message(), False hours = int((user_time - begin_time_st)/3600) min = int(((user_time - begin_time_st) % 3600)/60) return [confirm_out_message(user_time, hours, min)], True
def sign_out_content(account_id, current_date): """ Update user status and generate check-out message. :param account_id: user account id :param current_date: current date by local time. :return: button type message content """ content = get_status_by_user(account_id, current_date) process = None if content is not None: status = content[0] process = content[1] if status == "wait_out": set_status_by_user_date(account_id, current_date, status="in_done") if process is None or process != "sign_in_done": return reminder_message(None) return sign_out_message()