|
|
|
@ -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) |
|
|
|
|