habitmove/loop/repetitions.py

72 lines
2.0 KiB
Python

import sqlite3
import re
def migrate(db, habitlist, events):
c = db.cursor()
habitlist = simple_habits_list(c, habitlist)
for event in events:
text = event["note"]
tags = extract_tags(text)
for habit in habitlist:
for tag in tags:
if habit["description"] in tag[0]:
print(
f"register event: {habit['name']} in {text} at {event['end']}"
)
add_to_database(c, habit["id"], event["end"])
def extract_tags(text, tagmarker="#"):
"""Returns lists of tuples of all event tags found in text.
Parameters:
text (str): The text to search through.
tagmarker (str): Optional character marking beginning of tag, defaults to '#'.
Returns:
tags (list): List of tuples in the form [('tag', '3'), ('anothertag', '')].
"""
found_tags = re.findall(rf"{tagmarker}(\w+)(?:\((\d+)\))?", text)
return found_tags
def simple_habits_list(c, habitlist):
simple = []
for h in habitlist:
simple.append(
{
"name": h["name"],
"description": h["description"],
"id": fetch_habit_id(c, h["uuid"]),
}
)
return simple
def fetch_habit_id(c, uuid):
c.execute("select id from Habits where uuid = ?", ([uuid]))
id = c.fetchone()
if id is not None:
return id[0]
# does not do:
# ranges in habits (should check for habit being range, then taking #habit(3) number into account)
# also, range trackers: multiply value by 1,000
# non-range habits but still #habit(3) number included, adding multiple?
def add_to_database(cursor, habit_id, timestamp, value=2):
try:
cursor.execute(
"""
INSERT INTO
Repetitions(id, habit, timestamp, value)
VALUES (NULL, ?, ?, ?)
""",
(habit_id, timestamp, value),
)
except sqlite3.IntegrityError:
# TODO better error handling
print("fail to register: not unique")
pass