From 7a82a0e89365c216e229c628a00b31e6392e6752 Mon Sep 17 00:00:00 2001 From: Maximilian Zettler Date: Tue, 23 Nov 2021 16:28:19 +0100 Subject: [PATCH] add simple entry listing command `list-entries` --- timebot.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/timebot.py b/timebot.py index 6ac68a8..794a83f 100644 --- a/timebot.py +++ b/timebot.py @@ -1,9 +1,9 @@ import argparse import configparser +import datetime import getpass import logging import sys -from datetime import datetime import requests as requests @@ -17,12 +17,18 @@ logging.basicConfig(level=logging.INFO) class TimeBot: def __init__(self, baseurl: str, user: str, password: str): self.logger = logging.getLogger(self.__class__.__name__) - self.baseurl = baseurl + self.baseurl = self._sanitize_baseurl(baseurl) self.user = user self.password = password self._session = None self._current_user = None + @staticmethod + def _sanitize_baseurl(baseurl: str): + if baseurl.endswith("/"): + return baseurl + return baseurl + "/" + @property def session(self): """ @@ -113,6 +119,41 @@ class TimeBot: """ return self.current_user["employee"]["id"] + def get_entries(self, entries: int = 10, + start_date: datetime.datetime = None, + end_date: datetime.datetime = None): + """ + List time entries. + + :param int entries: number of entries to return + :param datetime.datetime start_date: start date of request; by default ``end_date`` - 10 days + :param datetime.datetime end_date: end date of request; usually the more recent date + :return: + """ + if not end_date: + end_date = datetime.datetime.now() + if not start_date: + start_date = end_date - datetime.timedelta(days=10) + filters = {"take": entries, "skip": 0, "page": 1, "pageSize": entries, + "sort": [{"field": "dateTime", "dir": "desc"}], + "filter": {"logic": "and", + "filters": [ + {"field": "employeeId", "operator": "eq", "value": self.get_current_user_id()}, + {"field": "errorText", "operator": "eq", "value": "all"}]}} + filters["filter"]["filters"].append({ + "field": "startDate", + "operator": "gte", + "value": start_date.strftime("%Y-%m-%dT%H:%M:%S"), + }) + filters["filter"]["filters"].append({ + "field": "endDate", + "operator": "lte", + "value": end_date.strftime("%Y-%m-%dT%H:%M:%S"), + }) + request = self.session.post(self.baseurl + "Entry/GetEntries", json=filters) + request.raise_for_status() + return request.json()["data"] + def punch_in(self, punch_in_date: str, punch_in_time: str): """ :param str punch_in_date: date string in format: ``DD.MM.YYYY`` @@ -154,6 +195,7 @@ if __name__ == '__main__': parser.add_argument("-c", help="config file", default="timebot.ini") subparsers = parser.add_subparsers(help='sub-command help', dest='subparser_name') + # subparser command: `punch` parser_punch = subparsers.add_parser("punch", help="use this command to punch in, punch out, or create break entries") parser_punch.add_argument("-t", @@ -162,6 +204,14 @@ if __name__ == '__main__': choices=PUNCH_COMMANDS) parser_punch.add_argument("-s", help="timestamp in format `DD.MM.YYYY_hh:mm` or `now`", default="now") + # subparser command: `list-entries` + parser_list_entries = subparsers.add_parser("list-entries", help="use this command to list your time entries") + parser_list_entries.add_argument("--start-date", + help="start date filter in format `DD.MM.YYYY_hh:mm` (default: now - 10days; unset for default)") + parser_list_entries.add_argument("--end-date", + help="end date filter in format `DD.MM.YYYY_hh:mm` (default: now; unset for default)") + parser_list_entries.add_argument("--items", help="max items to request per page", default=20, type=int) + args = parser.parse_args() if args.v: @@ -177,7 +227,7 @@ if __name__ == '__main__': tb = TimeBot(baseurl=config["general"]["baseurl"], user=args.u, password=password) if args.subparser_name == "punch": if args.s == "now": - now = datetime.now() + now = datetime.datetime.now() punch_date = now.strftime("%d.%m.%Y") punch_time = now.strftime("%H:%M") else: @@ -185,6 +235,16 @@ if __name__ == '__main__': punch_time = args.s.split("_")[1] logger.info("running `{}` with date `{}` and time `{}`".format(args.t, punch_date, punch_time)) getattr(tb, args.t)(punch_date, punch_time) + elif args.subparser_name == "list-entries": + end_date = None + if args.end_date: + end_date = datetime.datetime.strptime(args.end_date, "%d.%m.%Y_%H:%M") + start_date = None + if args.start_date: + start_date = datetime.datetime.strptime(args.start_date, "%d.%m.%Y_%H:%M") + data = tb.get_entries(entries=args.items, start_date=start_date, end_date=end_date) + for i in data: + print("Entry: {} - DateTime: {} - Note: {}".format(i["entryName"], i["dateTime"], i["note"])) else: logger.error("Noting done... dunno what you want!") sys.exit(1)