77 lines
2.5 KiB
Python
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()
|