release nouri 0.6.0 polish backup and pwa

This commit is contained in:
2026-04-12 17:46:18 +02:00
parent 9ff7a6d57c
commit 555fddab80
31 changed files with 1257 additions and 164 deletions
+71 -3
View File
@@ -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: