release nouri 0.6.0 polish backup and pwa
This commit is contained in:
+71
-3
@@ -10,6 +10,8 @@ from werkzeug.security import generate_password_hash
|
||||
|
||||
from .constants import DAYPARTS, DEFAULT_CATEGORIES, DEFAULT_CATEGORY_BUILDERS
|
||||
|
||||
CURRENT_SCHEMA_VERSION = "0.6.0"
|
||||
|
||||
|
||||
def get_db() -> sqlite3.Connection:
|
||||
if "db" not in g:
|
||||
@@ -47,7 +49,36 @@ def add_column_if_missing(database: sqlite3.Connection, table_name: str, definit
|
||||
database.execute(f"ALTER TABLE {table_name} ADD COLUMN {definition}")
|
||||
|
||||
|
||||
def ensure_meta_table(database: sqlite3.Connection) -> None:
|
||||
database.execute(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS app_meta (
|
||||
key TEXT PRIMARY KEY,
|
||||
value TEXT,
|
||||
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
)
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def get_meta(database: sqlite3.Connection, key: str) -> str | None:
|
||||
row = database.execute("SELECT value FROM app_meta WHERE key = ?", (key,)).fetchone()
|
||||
return row["value"] if row else None
|
||||
|
||||
|
||||
def set_meta(database: sqlite3.Connection, key: str, value: str) -> None:
|
||||
database.execute(
|
||||
"""
|
||||
INSERT INTO app_meta (key, value, updated_at)
|
||||
VALUES (?, ?, CURRENT_TIMESTAMP)
|
||||
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP
|
||||
""",
|
||||
(key, value),
|
||||
)
|
||||
|
||||
|
||||
def bootstrap_legacy_schema(database: sqlite3.Connection) -> None:
|
||||
ensure_meta_table(database)
|
||||
database.execute(
|
||||
"""
|
||||
CREATE TABLE IF NOT EXISTS households (
|
||||
@@ -211,6 +242,41 @@ def first_user_id(database: sqlite3.Connection) -> int | None:
|
||||
|
||||
def sync_default_categories(database: sqlite3.Connection) -> None:
|
||||
for household_id in household_ids(database):
|
||||
legacy = database.execute(
|
||||
"""
|
||||
SELECT id
|
||||
FROM household_categories
|
||||
WHERE household_id = ? AND name = 'Brot & Getreide'
|
||||
LIMIT 1
|
||||
""",
|
||||
(household_id,),
|
||||
).fetchone()
|
||||
updated = database.execute(
|
||||
"""
|
||||
SELECT id
|
||||
FROM household_categories
|
||||
WHERE household_id = ? AND name = 'Kohlenhydrate'
|
||||
LIMIT 1
|
||||
""",
|
||||
(household_id,),
|
||||
).fetchone()
|
||||
if legacy and not updated:
|
||||
database.execute(
|
||||
"""
|
||||
UPDATE household_categories
|
||||
SET name = 'Kohlenhydrate', builder_key = 'carb'
|
||||
WHERE id = ?
|
||||
""",
|
||||
(legacy["id"],),
|
||||
)
|
||||
database.execute(
|
||||
"""
|
||||
UPDATE items
|
||||
SET category = 'Kohlenhydrate'
|
||||
WHERE household_id = ? AND category = 'Brot & Getreide'
|
||||
""",
|
||||
(household_id,),
|
||||
)
|
||||
for sort_order, name in enumerate(DEFAULT_CATEGORIES, start=10):
|
||||
database.execute(
|
||||
"""
|
||||
@@ -230,6 +296,7 @@ def sync_default_categories(database: sqlite3.Connection) -> None:
|
||||
|
||||
|
||||
def ensure_schema_upgrades(database: sqlite3.Connection) -> None:
|
||||
ensure_meta_table(database)
|
||||
add_column_if_missing(database, "users", "household_id INTEGER")
|
||||
add_column_if_missing(database, "users", "email TEXT")
|
||||
add_column_if_missing(database, "users", "role TEXT NOT NULL DEFAULT 'member'")
|
||||
@@ -237,10 +304,10 @@ def ensure_schema_upgrades(database: sqlite3.Connection) -> None:
|
||||
add_column_if_missing(database, "users", "updated_at TEXT")
|
||||
|
||||
default_household_id = ensure_default_household(database)
|
||||
database.execute("UPDATE households SET shopping_weekday = COALESCE(shopping_weekday, 5)")
|
||||
database.execute("UPDATE households SET shopping_prep_days = COALESCE(shopping_prep_days, 1)")
|
||||
database.execute("UPDATE households SET shopping_weekday = 5 WHERE shopping_weekday IS NULL")
|
||||
database.execute("UPDATE households SET shopping_prep_days = 1 WHERE shopping_prep_days IS NULL")
|
||||
database.execute(
|
||||
"UPDATE households SET shopping_reminder_time = COALESCE(NULLIF(shopping_reminder_time, ''), '18:00')"
|
||||
"UPDATE households SET shopping_reminder_time = '18:00' WHERE shopping_reminder_time IS NULL OR shopping_reminder_time = ''"
|
||||
)
|
||||
database.execute(
|
||||
"UPDATE users SET household_id = ? WHERE household_id IS NULL",
|
||||
@@ -349,6 +416,7 @@ def ensure_schema_upgrades(database: sqlite3.Connection) -> None:
|
||||
ON shopping_needs (household_id, activation_date, is_activated)
|
||||
"""
|
||||
)
|
||||
set_meta(database, "schema_version", CURRENT_SCHEMA_VERSION)
|
||||
|
||||
|
||||
def apply_schema(database: sqlite3.Connection) -> None:
|
||||
|
||||
Reference in New Issue
Block a user