ltx/app/tracker.py
2023-05-02 11:29:10 -07:00

77 lines
2.5 KiB
Python

from app import db
from app.models import Day, Hour, Activity
import csv
import datetime
class Tracker():
def __init__(self, codes_path=None, sheets_path=None):
self.codes_path = codes_path
self.sheets_path = sheets_path
def __repr__(self):
return "<Tracker: {}>".format(self.__hash__())
def parse_activity(self, str):
try:
return int(str)
except ValueError:
try:
return float(str)
except:
return -1
def import_codes(self):
with open(self.codes_path) as csv_file:
data = csv_file.readlines()
lines = csv.reader(data)
for line in lines:
[code_str, name] = line
code = self.parse_activity(code_str)
exists = db.session.query(Activity).filter(
Activity.code == code).first()
if exists:
pass
else:
activity = Activity(
code=code, name=name.strip())
db.session.add(activity)
db.session.commit()
def import_csv(self):
with open(self.sheets_path) as csv_file:
# Skip the header row
data = csv_file.readlines()[1:]
lines = csv.reader(data)
for line in lines:
# Parse each row
date_str = line[0]
hours_str = line[2:26]
note = line[27]
# Create the right date
[month, day] = date_str.split("/")
date = datetime.datetime(2023, int(month), int(day))
# Initialize the Day
try:
entry = db.session.execute(
db.select(Day).filter_by(date=date.strftime("%F"))).scalar_one()
except:
entry = Day(date=date, note=note)
db.session.add(entry)
db.session.commit()
print("Parsed {}".format(entry.date))
# Create an Hour for each hour
for t in range(len(hours_str)):
activity_code = self.parse_activity(hours_str[t])
activity = db.session.query(Activity).filter(
Activity.code == activity_code).first()
hour = Hour(
time=t, activity_code=activity.code, day_id=entry.day_id)
db.session.add(hour)
db.session.commit()