You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
6.3 KiB
133 lines
6.3 KiB
import argparse
|
|
import configparser
|
|
import datetime
|
|
import logging
|
|
import os
|
|
import signal
|
|
import sys
|
|
|
|
from timebot.constants import PUNCH_COMMANDS, DateFormats
|
|
from timebot.timebot import MobatimeApi, TimeBot, parse_user_time_input
|
|
|
|
logger = logging.getLogger()
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
|
|
def run():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-v", help="enable debug logging", action="store_true")
|
|
parser.add_argument("-u", help="mobatime login user", default=None)
|
|
parser.add_argument("-p", help="mobatime login user password", default=None)
|
|
parser.add_argument("-c", help="config file", default="timebot.ini")
|
|
parser.add_argument("-a", "--use-system-ca-store", help="use system ca store for ssl connections",
|
|
action="store_true")
|
|
parser.add_argument("--save-cookies", help="save auth cookies to `./.kekse`", action="store_true", default=False)
|
|
subparsers = parser.add_subparsers(help='sub-command help', dest='subparser_name')
|
|
|
|
# subparser command: `status`
|
|
subparsers.add_parser("status", help="show your current tracking status")
|
|
|
|
# subparser command: `gui`
|
|
subparsers.add_parser("gui", help="start qt5 gui")
|
|
|
|
# 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=f"start date filter in format `{DateFormats.SIMPLE_DATETIME.evalue}` "
|
|
f"(default: now - 10days; unset for default)")
|
|
parser_list_entries.add_argument("--end-date",
|
|
help=f"end date filter in format `{DateFormats.SIMPLE_DATETIME.evalue}` "
|
|
f"(default: now; unset for default)")
|
|
parser_list_entries.add_argument("--items", help="max items to request per page", default=20, type=int)
|
|
|
|
# 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",
|
|
help=f"type of time entry; this can be {', '.join(PUNCH_COMMANDS)}",
|
|
default="punch_in",
|
|
choices=PUNCH_COMMANDS)
|
|
parser_punch.add_argument("-s",
|
|
help=f"timestamp in format `{DateFormats.SIMPLE_DATETIME.evalue}`, "
|
|
f"`{DateFormats.SIMPLE_TIME.evalue}` or `now`", default="now")
|
|
|
|
# subparser command: `smart-punch`
|
|
parser_smart_punch = subparsers.add_parser("smart-punch",
|
|
help="use this command to auto punch in, punch out and create break "
|
|
"entries; this command tries to detect your last action and will "
|
|
"create entries in to following order: "
|
|
"punch_in -> break_start -> break_end -> punch_out")
|
|
parser_smart_punch.add_argument("-s", help=f"timestamp in format `{DateFormats.SIMPLE_DATETIME.evalue}`,"
|
|
f" `{DateFormats.SIMPLE_TIME.evalue}` or `now`", default="now")
|
|
|
|
args = parser.parse_args()
|
|
|
|
if args.v:
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
config = configparser.ConfigParser()
|
|
config.read(args.c)
|
|
|
|
if args.use_system_ca_store or config.get(section="general", option="use_system_ca_store", fallback="no") == "yes":
|
|
os.environ["REQUESTS_CA_BUNDLE"] = config["general"]["system_ca_store"] \
|
|
if "system_ca_store" in config["general"] else "/etc/ssl/certs/ca-certificates.crt"
|
|
|
|
user = args.u if args.u is not None else config.get(section="general", option="mobatime_user", fallback=None)
|
|
if user is None:
|
|
logger.fatal("could not get username for mobatime...")
|
|
sys.exit(1)
|
|
|
|
save_cookies = True if args.save_cookies is True else config.get(section="general", option="save_cookies",
|
|
fallback="no") == "yes"
|
|
|
|
ma = MobatimeApi(baseurl=config["general"]["baseurl"], user=user, password=args.p, ask_for_password=True,
|
|
save_session=save_cookies)
|
|
tb = TimeBot(mobatime_api=ma)
|
|
if args.subparser_name == "punch":
|
|
if args.s == "now":
|
|
punch_datetime = datetime.datetime.now()
|
|
else:
|
|
punch_datetime = parse_user_time_input(args.s)
|
|
logger.info("running `{}` with date `{}` and time `{}`".format(
|
|
args.t,
|
|
punch_datetime.strftime(DateFormats.SIMPLE_DATE.value),
|
|
punch_datetime.strftime(DateFormats.SIMPLE_TIME.value),
|
|
))
|
|
getattr(tb, args.t)(punch_datetime)
|
|
elif args.subparser_name == "smart-punch":
|
|
if args.s == "now":
|
|
tb.smart_punch()
|
|
else:
|
|
tb.smart_punch(parse_user_time_input(args.s))
|
|
elif args.subparser_name == "list-entries":
|
|
end_date = None
|
|
if args.end_date:
|
|
end_date = parse_user_time_input(args.end_date)
|
|
start_date = None
|
|
if args.start_date:
|
|
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:
|
|
print("Entry: {} - DateTime: {} - Note: {}".format(i["entryName"], i["dateTime"], i["note"]))
|
|
elif args.subparser_name == "status":
|
|
print(tb.status())
|
|
elif args.subparser_name == "gui":
|
|
from PySide6.QtWidgets import QApplication
|
|
from timebot.gui import MainWindow
|
|
signal.signal(signal.SIGINT, lambda *_args: QApplication.quit())
|
|
app = QApplication(sys.argv)
|
|
main_window = MainWindow(timebot=tb, refresh_interval=config.get(section="gui",
|
|
option="refresh_interval",
|
|
fallback="1m"))
|
|
main_window.show()
|
|
sys.exit(app.exec())
|
|
else:
|
|
logger.error("Noting done... dunno what you want!")
|
|
sys.exit(1)
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run()
|
|
|