Marty Oehme
bea6c0eca5
Program can now be invoked through poetry for development purposes, invoke as follows from main directory: `poetry run move`. Alternatively, can still be invoked via `python run.py <nomie-json>` and now via `./run.py <nomie-json>` which uses system default python installation. For now both commands are only mainly useful from the poetry development virtual environment itself.
68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
def migrate(db, trackers):
|
|
c = db.cursor()
|
|
habits = trackers_to_habits(trackers)
|
|
for habit in habits:
|
|
existing_habit = check_habit_duplicate(c, habit)
|
|
if not existing_habit:
|
|
add_to_database(c, habit)
|
|
else:
|
|
print(f"Found duplicate Habit: {existing_habit} - skipping.")
|
|
return habits
|
|
|
|
|
|
NOMIE_MAX_TO_TARGET_VALUE_RATIO = 2
|
|
|
|
|
|
def trackers_to_habits(trackers):
|
|
habits = []
|
|
for tracker_name in trackers.keys():
|
|
t = trackers[tracker_name]
|
|
habits.append(
|
|
{
|
|
"archived": 0 if t["hidden"] == False else 1,
|
|
"color": 11 if t.get("score", 0) != "-1" else 0,
|
|
"description": t["tag"],
|
|
"freq_den": 1,
|
|
"freq_num": 1,
|
|
"highlight": 0,
|
|
"name": f"{t['emoji']} {t['label']}",
|
|
"question": "",
|
|
"position": 0,
|
|
"unit": "" if t["uom"] == "num" else t["uom"],
|
|
"uuid": t["id"],
|
|
}
|
|
)
|
|
if t["type"] == "range" and len(habits) > 0:
|
|
habits[-1]["type"] = 1
|
|
# nomie only has concept of max value,
|
|
# use a percentage of it for Loop range target
|
|
habits[-1]["target_value"] = (
|
|
int(t["max"]) // NOMIE_MAX_TO_TARGET_VALUE_RATIO
|
|
)
|
|
return habits
|
|
|
|
|
|
def check_habit_duplicate(cursor, habit):
|
|
cursor.execute("select name from Habits where uuid = ?", [habit["uuid"]])
|
|
name = cursor.fetchone()
|
|
if name:
|
|
return name[0]
|
|
return False
|
|
|
|
|
|
def add_to_database(cursor, habit):
|
|
"""Takes a habit in the form of a dictionary and inserts it into the Habits table.
|
|
Parameters:
|
|
cursor (db.cursor): SQL executing cursor
|
|
habit (dict): A Loop habit to be added to the database. Must contain a minimum of
|
|
'archived','color','description','freq_den','freq_num','highlight','name',
|
|
'question','position','unit','uuid' as keys.
|
|
"""
|
|
|
|
placeholder = ", ".join("?" * len(habit))
|
|
columns = ", ".join(habit.keys())
|
|
sql = "insert into `{table}` ({columns}) values ({values});".format(
|
|
table="Habits", columns=columns, values=placeholder
|
|
)
|
|
values = list(habit.values())
|
|
cursor.execute(sql, values)
|