add simple entry listing command `list-entries`

master
Maximilian Zettler 4 years ago
parent 1e62be011c
commit 7a82a0e893
  1. 66
      timebot.py

@ -1,9 +1,9 @@
import argparse import argparse
import configparser import configparser
import datetime
import getpass import getpass
import logging import logging
import sys import sys
from datetime import datetime
import requests as requests import requests as requests
@ -17,12 +17,18 @@ logging.basicConfig(level=logging.INFO)
class TimeBot: class TimeBot:
def __init__(self, baseurl: str, user: str, password: str): def __init__(self, baseurl: str, user: str, password: str):
self.logger = logging.getLogger(self.__class__.__name__) self.logger = logging.getLogger(self.__class__.__name__)
self.baseurl = baseurl self.baseurl = self._sanitize_baseurl(baseurl)
self.user = user self.user = user
self.password = password self.password = password
self._session = None self._session = None
self._current_user = None self._current_user = None
@staticmethod
def _sanitize_baseurl(baseurl: str):
if baseurl.endswith("/"):
return baseurl
return baseurl + "/"
@property @property
def session(self): def session(self):
""" """
@ -113,6 +119,41 @@ class TimeBot:
""" """
return self.current_user["employee"]["id"] 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): def punch_in(self, punch_in_date: str, punch_in_time: str):
""" """
:param str punch_in_date: date string in format: ``DD.MM.YYYY`` :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") parser.add_argument("-c", help="config file", default="timebot.ini")
subparsers = parser.add_subparsers(help='sub-command help', dest='subparser_name') subparsers = parser.add_subparsers(help='sub-command help', dest='subparser_name')
# subparser command: `punch`
parser_punch = subparsers.add_parser("punch", parser_punch = subparsers.add_parser("punch",
help="use this command to punch in, punch out, or create break entries") help="use this command to punch in, punch out, or create break entries")
parser_punch.add_argument("-t", parser_punch.add_argument("-t",
@ -162,6 +204,14 @@ if __name__ == '__main__':
choices=PUNCH_COMMANDS) choices=PUNCH_COMMANDS)
parser_punch.add_argument("-s", help="timestamp in format `DD.MM.YYYY_hh:mm` or `now`", default="now") 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() args = parser.parse_args()
if args.v: if args.v:
@ -177,7 +227,7 @@ if __name__ == '__main__':
tb = TimeBot(baseurl=config["general"]["baseurl"], user=args.u, password=password) tb = TimeBot(baseurl=config["general"]["baseurl"], user=args.u, password=password)
if args.subparser_name == "punch": if args.subparser_name == "punch":
if args.s == "now": if args.s == "now":
now = datetime.now() now = datetime.datetime.now()
punch_date = now.strftime("%d.%m.%Y") punch_date = now.strftime("%d.%m.%Y")
punch_time = now.strftime("%H:%M") punch_time = now.strftime("%H:%M")
else: else:
@ -185,6 +235,16 @@ if __name__ == '__main__':
punch_time = args.s.split("_")[1] punch_time = args.s.split("_")[1]
logger.info("running `{}` with date `{}` and time `{}`".format(args.t, punch_date, punch_time)) logger.info("running `{}` with date `{}` and time `{}`".format(args.t, punch_date, punch_time))
getattr(tb, 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: else:
logger.error("Noting done... dunno what you want!") logger.error("Noting done... dunno what you want!")
sys.exit(1) sys.exit(1)

Loading…
Cancel
Save