karl 4fe4e3ecbf Display hours as a number rather than formatted days
This is useful because the total time is usually not sensibly interpreted as days. Also negatives times were really odd.

Includes some autoformating.
2021-07-11 20:03:07 +02:00

93 lines
3.2 KiB
Python
Executable File

#!/usr/bin/env python3
from datetime import date, datetime, timedelta
import argparse
import os
def get_current_date():
return date.today().strftime("%Y-%m-%d")
def get_timefile_line(date, time, desc):
return date + " " + time + " " + desc + "\n"
def get_total(filename):
with open(filename, 'r') as time_file:
total_time = timedelta()
for line in time_file:
date_time_description = line.split(" ", 2)
hours, minutes = date_time_description[1].split(':', 1)
# Parse the time to integers
hours_int = int(hours)
minutes_int = int(minutes)
# Make sure that both the hours and the minutes are negative if there's a "-" before the time
if hours_int < 0:
minutes_int *= -1
delta = timedelta(hours=hours_int, minutes=minutes_int)
total_time += delta
return "{} hours".format(str(total_time.total_seconds() / 60 / 60))
# Parse command line arguments
parser = argparse.ArgumentParser(prog='time.txt', description="simple plain-text time tracking.")
subparsers = parser.add_subparsers(help='Commands', dest='mode')
parser.add_argument("-f", "--file", help="a file in the time.txt format. default: ./time.txt")
# create the parser for the "a" command
parser_total = subparsers.add_parser('total', help='print the total unbilled time. (default)')
# create the parser for the "b" command
parser_add = subparsers.add_parser('add', help='add a time entry.')
parser_add.add_argument(
"date", nargs='?', default=get_current_date(),
help="date in the format 2020-12-30. defaults to the current date.")
parser_add.add_argument("time", help="time in the format 19:20.")
parser_add.add_argument("description", help="short description of how the time was spent.")
parser_bill = subparsers.add_parser('bill', help='add a bill entry (a negative time entry).')
parser_bill.add_argument(
"date", nargs='?', default=get_current_date(),
help="date in the format 2020-12-30. defaults to the current date.")
parser_bill.add_argument("time", help="time in the format 19:20.")
parser_bill.add_argument("description", help="short description of how the time was spent.")
parser_create = subparsers.add_parser('create', help='create a new time.txt file.')
args = parser.parse_args()
filename = args.file if args.file else 'time.txt'
if not args.mode or args.mode == "total":
print("Total time:", get_total(filename))
elif args.mode == "add":
with open(filename, 'a') as time_file:
# TODO: Validate date and time
time_file.write(get_timefile_line(args.date, args.time, args.description))
print("New total:", get_total(filename))
elif args.mode == "bill":
with open(filename, 'a') as time_file:
# TODO: Validate date and time
time_file.write(get_timefile_line(args.date, "-" + args.time, args.description))
print("New total:", get_total(filename))
elif args.mode == "create":
if (os.path.exists(filename)):
print("Error: File", filename, "already exists, can't create a new one!")
else:
with open(filename, 'w') as time_file:
time_file.write(get_timefile_line(get_current_date(), "00:01", "Setup time.txt"))