Yeah reworked the entire thing so that the checked, count and streak value is stored in the Habit Table
357 lines
10 KiB
Python
357 lines
10 KiB
Python
from datetime import datetime, timedelta
|
|
import hashlib
|
|
import sqlite3
|
|
import os
|
|
import shutil
|
|
|
|
|
|
def con3():
|
|
conn = sqlite3.connect('db/db.sqlite')
|
|
return conn
|
|
|
|
|
|
### User ###
|
|
def create_user_profile_image(user_id):
|
|
script_directory = os.path.dirname(os.path.abspath(__file__))
|
|
source_path = os.path.join(script_directory, '../static/profile_images/no_avatar/user.jpg')
|
|
destination_directory = os.path.join(script_directory, '../static/profile_images/')
|
|
new_filename = f'user{user_id}-profile.jpg'
|
|
|
|
destination_path = os.path.join(destination_directory, new_filename)
|
|
shutil.copyfile(source_path, destination_path)
|
|
|
|
# Just save the part after static
|
|
static_index = destination_path.find('static')
|
|
relative_destination_path = destination_path[static_index:]
|
|
|
|
return relative_destination_path
|
|
|
|
|
|
def create_user(name: str, email: str, password: str, profile_image: str = None):
|
|
password = hashlib.sha256(password.encode()).hexdigest()
|
|
now = datetime.now().isoformat()
|
|
query = (f"INSERT INTO users (name, email, password, profile_image, created_at, updated_at) VALUES "
|
|
f"('{name}', '{email}', '{password}', '{profile_image}', '{now}', '{now}');")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
|
|
id = cursor.lastrowid
|
|
profile_image = create_user_profile_image(id)
|
|
query2 = f"UPDATE users SET profile_image = '{profile_image}' WHERE id = '{id}';"
|
|
cursor.execute(query2)
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
return id, profile_image
|
|
|
|
|
|
def get_user(id: int):
|
|
query = f"SELECT * FROM users WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
user = cursor.fetchone()
|
|
conn.close()
|
|
return user
|
|
|
|
|
|
def get_user_by_email(email: str):
|
|
query = f"SELECT * FROM users WHERE email = '{email}';"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
user = cursor.fetchone()
|
|
conn.close()
|
|
return user
|
|
|
|
|
|
def update_user(id: int, name: str, email: str, password: str):
|
|
now = datetime.now().isoformat()
|
|
if password:
|
|
query = (f"UPDATE users SET name = '{name}', email = '{email}', password = '{password}', updated_at = '{now}' "
|
|
f"WHERE id = {id};")
|
|
else:
|
|
query = f"UPDATE users SET name = '{name}', email = '{email}', updated_at = '{now}' WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def delete_user(id: int):
|
|
query = f"DELETE FROM users WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
### Habit ###
|
|
def create_habit(list_id: int, name: str, note: str, times: int, unit: int, slot: int, checked: bool, count:int, streak: int):
|
|
now = datetime.now().isoformat()
|
|
query = (f"INSERT INTO habits (list_id, name, note, times, unit, slot, checked, count, streak, created_at, updated_at) "
|
|
f"VALUES ('{list_id}', '{name}', '{note}', '{times}', '{unit}', '{slot}', '{checked}', '{count}', '{streak}', '{now}', '{now}');")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def get_habit(id: int):
|
|
query = f"SELECT * FROM habits WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
habit = cursor.fetchone()
|
|
conn.close()
|
|
return habit
|
|
|
|
|
|
def get_habits(list_id: int):
|
|
query = f"SELECT * FROM habits WHERE list_id = {list_id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
habits = cursor.fetchall()
|
|
conn.close()
|
|
return habits
|
|
|
|
|
|
def get_heatmap_value(user_id: int, days: int):
|
|
date = (datetime.now() - timedelta(days=days)).date()
|
|
|
|
# Uses JOINs to get all Habits
|
|
query = (f"SELECT habits.id FROM habits "
|
|
f"JOIN habit_lists ON habits.list_id = habit_lists.id "
|
|
f"JOIN habit_users ON habit_lists.id = habit_users.list_id "
|
|
f"WHERE habit_users.user_id = {user_id};")
|
|
|
|
# Uses JOINs to get all checked Habits on a specific date
|
|
query2 = (f"SELECT habits.id FROM habits "
|
|
f"JOIN habit_lists ON habits.list_id = habit_lists.id "
|
|
f"JOIN habit_users ON habit_lists.id = habit_users.list_id "
|
|
f"JOIN habit_trackings ON habits.id = habit_trackings.habit_id "
|
|
f"WHERE habit_users.user_id = {user_id} AND DATE(habit_trackings.created_at) = '{date}';")
|
|
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
all_habits = cursor.fetchall()
|
|
cursor.execute(query2)
|
|
checked_habits = cursor.fetchall()
|
|
conn.close()
|
|
|
|
# Calculate the percentage of checked Habits
|
|
count = len(all_habits)
|
|
count2 = len(checked_habits)
|
|
if count > 0:
|
|
return int(count2 / count * 100)
|
|
else:
|
|
return 0
|
|
|
|
|
|
def get_next_slot(list_id: int):
|
|
query = f"SELECT slot FROM habits WHERE list_id = {list_id} ORDER BY slot DESC LIMIT 1;"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
slot = cursor.fetchone()
|
|
conn.close()
|
|
return slot[0] + 1 if slot else 1
|
|
|
|
|
|
def get_slots(list_id: int):
|
|
query = f"SELECT id, slot FROM habits WHERE list_id = {list_id} ORDER BY slot;"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
slots = cursor.fetchall()
|
|
conn.close()
|
|
return slots
|
|
|
|
|
|
def update_slot(id: int, slot: int):
|
|
now = datetime.now().isoformat()
|
|
query = f"UPDATE habits SET slot = {slot}, updated_at = '{now}' WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def update_habit(id: int, name: str, note: str, times: int, unit: int):
|
|
now = datetime.now().isoformat()
|
|
query = (f"UPDATE habits SET name = {name}, note = {note}, times = {times}, unit = {unit}, updated_at = '{now}' "
|
|
f"WHERE id = {id};")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def update_habit_statistics(id: int, checked: bool, count: int, streak: int):
|
|
now = datetime.now().isoformat()
|
|
query = (f"UPDATE habits SET checked = {checked}, count = {count}, streak = {streak}, updated_at = '{now}' "
|
|
f"WHERE id = {id};")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def delete_habit(id: int):
|
|
query = f"DELETE FROM habits WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
### HabitTracking ###
|
|
def create_habitTracking(habit_id: int):
|
|
now = datetime.now().isoformat()
|
|
query = f"INSERT INTO habit_trackings (habit_id, created_at) VALUES ('{habit_id}','{now}');"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def get_habitTracking(id: int):
|
|
query = f"SELECT * FROM habit_trackings WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
habit_tracking = cursor.fetchone()
|
|
conn.close()
|
|
return habit_tracking
|
|
|
|
|
|
def get_habitTrackings(habit_id: int):
|
|
query = f"SELECT * FROM habit_trackings WHERE habit_id = {habit_id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
habit_trackings = cursor.fetchall()
|
|
conn.close()
|
|
return habit_trackings
|
|
|
|
|
|
def delete_habitTracking(id: int):
|
|
query = f"DELETE FROM habit_trackings WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
### HabitList ###
|
|
def create_habitList(user_id: int, name: str, description: str):
|
|
now = datetime.now().isoformat()
|
|
query = (f"INSERT INTO habit_lists (name, description, created_at, updated_at) "
|
|
f"VALUES ('{name}', '{description}', '{now}', '{now}');")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
query2 = (f"INSERT INTO habit_users (user_id, list_id, created_at, updated_at)"
|
|
f" VALUES ('{user_id}', '{cursor.lastrowid}', '{now}', '{now}');")
|
|
cursor.execute(query2)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def get_habitList(id: int):
|
|
query = f"SELECT * FROM habit_lists WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
habit_list = cursor.fetchone()
|
|
conn.close()
|
|
return habit_list
|
|
|
|
|
|
def get_habitLists(user_id: int):
|
|
query = (f"SELECT habit_lists.* FROM habit_lists JOIN habit_users ON habit_lists.id = habit_users.list_id "
|
|
f"WHERE habit_users.user_id = {user_id};")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
habit_lists = cursor.fetchall()
|
|
conn.close()
|
|
return habit_lists
|
|
|
|
|
|
def get_users(list_id: int):
|
|
query = (f"SELECT users.* FROM users JOIN habit_users ON users.id = habit_users.user_id WHERE "
|
|
f"habit_users.list_id = {list_id};")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
users = cursor.fetchall()
|
|
conn.close()
|
|
return users
|
|
|
|
|
|
def add_user(list_id: int, user_id: int):
|
|
now = datetime.now().isoformat()
|
|
query = (f"INSERT INTO habit_users (user_id, list_id, created_at, updated_at)"
|
|
f" VALUES ('{user_id}', '{list_id}', '{now}', '{now}');")
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
def remove_user(list_id: int, user_id: int):
|
|
query = f"DELETE FROM habit_lists WHERE user_id = {user_id} AND list_id = {list_id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
def update_habitList(id: int, name: str, description: str):
|
|
now = datetime.now().isoformat()
|
|
query = f"UPDATE habit_lists SET name = {name}, description = {description}, updated_at = '{now}' WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
return cursor.lastrowid
|
|
|
|
|
|
def delete_habitList(id: int):
|
|
query = f"DELETE FROM habit_lists WHERE id = {id};"
|
|
conn = con3()
|
|
cursor = conn.cursor()
|
|
cursor.execute(query)
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
habits = get_habits(1)
|
|
for habit in habits:
|
|
print(habit[6])
|