From 158c436f3200dbe366350811654f84aa2bc1d6b5 Mon Sep 17 00:00:00 2001 From: Maximilian Zettler Date: Tue, 15 Feb 2022 10:42:25 +0100 Subject: [PATCH] allow timestamp option to be only time in format HH:MM --- timebot/app.py | 16 +++++++--------- timebot/timebot.py | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/timebot/app.py b/timebot/app.py index 907b891..d135b95 100644 --- a/timebot/app.py +++ b/timebot/app.py @@ -5,9 +5,8 @@ import logging import os import sys -from timebot.constants import SIMPLE_DATETIME_FORMAT_HUMAN, PUNCH_COMMANDS, SIMPLE_DATETIME_FORMAT, \ - SIMPLE_DATE_FORMAT, SIMPLE_TIME_FORMAT -from timebot.timebot import MobatimeApi, TimeBot +from timebot.constants import SIMPLE_DATETIME_FORMAT_HUMAN, PUNCH_COMMANDS, SIMPLE_DATE_FORMAT, SIMPLE_TIME_FORMAT +from timebot.timebot import MobatimeApi, TimeBot, parse_user_time_input logger = logging.getLogger() logging.basicConfig(level=logging.INFO) @@ -65,7 +64,7 @@ def run(): config.read(args.c) if args.use_system_ca_store: - os.environ["REQUESTS_CA_BUNDLE"] = config["general"]["system_ca_store"]\ + os.environ["REQUESTS_CA_BUNDLE"] = config["general"]["system_ca_store"] \ if "system_ca_store" in config["general"] else "/etc/ssl/certs/ca-certificates.crt" ma = MobatimeApi(baseurl=config["general"]["baseurl"], user=args.u, password=args.p, ask_for_password=True, @@ -75,7 +74,7 @@ def run(): if args.s == "now": punch_datetime = datetime.datetime.now() else: - punch_datetime = datetime.datetime.strptime(args.s, SIMPLE_DATETIME_FORMAT) + punch_datetime = parse_user_time_input(args.s) logger.info("running `{}` with date `{}` and time `{}`".format( args.t, punch_datetime.strftime(SIMPLE_DATE_FORMAT), @@ -86,15 +85,15 @@ def run(): if args.s == "now": punch_datetime = datetime.datetime.now() else: - punch_datetime = datetime.datetime.strptime(args.s, SIMPLE_DATETIME_FORMAT) + punch_datetime = parse_user_time_input(args.s) tb.smart_punch(punch_datetime) elif args.subparser_name == "list-entries": end_date = None if args.end_date: - end_date = datetime.datetime.strptime(args.end_date, SIMPLE_DATETIME_FORMAT) + end_date = parse_user_time_input(args.end_date) start_date = None if args.start_date: - start_date = datetime.datetime.strptime(args.start_date, SIMPLE_DATETIME_FORMAT) + start_date = parse_user_time_input(args.start_date) data = tb.mobatime_api.get_entries(entries=args.items, start_date=start_date, end_date=end_date) data.reverse() for i in data: @@ -118,4 +117,3 @@ def run(): if __name__ == "__main__": run() - diff --git a/timebot/timebot.py b/timebot/timebot.py index a99ded4..1fa9834 100644 --- a/timebot/timebot.py +++ b/timebot/timebot.py @@ -11,6 +11,33 @@ from timebot.constants import COMING_ENTRY_CODE_ID, LEAVING_ENTRY_CODE_ID, BREAK USER_AGENT +package_logger = logging.getLogger(__name__) + + +class TimeParseError(Exception): + pass + + +def parse_user_time_input(stamp: str) -> datetime.datetime: + errors = [] + try: + package_logger.debug(f"trying to parse date with format \"{SIMPLE_DATETIME_FORMAT}\"") + return datetime.datetime.strptime(stamp, SIMPLE_DATETIME_FORMAT) + except ValueError as e: + errors.append(e) + try: + package_logger.debug(f"trying to parse date with format \"{SIMPLE_TIME_FORMAT}\"") + t = datetime.datetime.strptime(stamp, SIMPLE_TIME_FORMAT) + dt = datetime.datetime.now() + dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) + dt += datetime.timedelta(hours=t.hour, minutes=t.minute) + return dt + except ValueError as e: + errors.append(e) + package_logger.error(f"could not parse date with format \"{SIMPLE_DATETIME_FORMAT}\" or \"{SIMPLE_TIME_FORMAT}\"") + raise TimeParseError(errors) + + class MobatimeApi: def __init__(self, baseurl: str, user: str, password: str = None, ask_for_password: bool = False, save_session: bool = False, cookie_store: str = ".kekse"):