Fix: Update init_db.py to use correct import paths

- Changed imports to use app.core.database and app.models structure
- Added Base import from app.core.database (not app.models)
- Fixed imports to match actual project structure
- Added comprehensive demo data with 5 users and 12 chores
- Fixes ModuleNotFoundError when running database initialization
This commit is contained in:
jessikitty committed 2026-01-31 23:00:59 +11:00
1 parent b351c216b3
commit 0a8489a89c
1 file changed
+1 -77
+1 -77
View File
@@ -1,77 +1 @@
""" IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKRGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gc2NyaXB0IGZvciBGYW1pbHkgSHViLgpDcmVhdGVzIHRhYmxlcyBhbmQgcG9wdWxhdGVzIHdpdGggZGVtbyBkYXRhLgoiIiIKCmltcG9ydCBzeXMKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKCiMgQWRkIHBhcmVudCBkaXJlY3RvcnkgdG8gcGF0aCB0byBpbXBvcnQgZnJvbSBhcHAKc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpKQoKZnJvbSBhcHAuY29yZS5kYXRhYmFzZSBpbXBvcnQgZW5naW5lLCBTZXNzaW9uTG9jYWwsIEJhc2UKZnJvbSBhcHAubW9kZWxzIGltcG9ydCBVc2VyLCBDaG9yZQpmcm9tIHBhc3NsaWIuY29udGV4dCBpbXBvcnQgQ3J5cHRDb250ZXh0Cgpwd2RfY29udGV4dCA9IENyeXB0Q29udGV4dChzY2hlbWVzPVsiYmNyeXB0Il0sIGRlcHJlY2F0ZWQ9ImF1dG8iKQoKZGVmIGluaXRfZGIoKToKICAgICIiIkluaXRpYWxpemUgdGhlIGRhdGFiYXNlIHdpdGggdGFibGVzIGFuZCBkZW1vIGRhdGEuIiIiCiAgICBwcmludCgi8J+agCBJbml0aWFsaXppbmcgRmFtaWx5IEh1YiBkYXRhYmFzZS4uLiIpCiAgICAKICAgICMgQ3JlYXRlIGFsbCB0YWJsZXMKICAgIHByaW50KCLwn5SnIENyZWF0aW5nIGRhdGFiYXNlIHRhYmxlcy4uLiIpCiAgICBCYXNlLm1ldGFkYXRhLmNyZWF0ZV9hbGwoYmluZD1lbmdpbmUpCiAgICAKICAgIGRiID0gU2Vzc2lvbkxvY2FsKCkKICAgIAogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgaWYgZGF0YSBhbHJlYWR5IGV4aXN0cwogICAgICAgIGV4aXN0aW5nX3VzZXJzID0gZGIucXVlcnkoVXNlcikuY291bnQoKQogICAgICAgIGlmIGV4aXN0aW5nX3VzZXJzID4gMDoKICAgICAgICAgICAgcHJpbnQoZiLimqDvuI8gIERhdGFiYXNlIGFscmVhZHkgaGFzIHtleGlzdGluZ191c2Vyc30gdXNlcnMuIFNraXBwaW5nIGluaXRpYWxpemF0aW9uLiIpCiAgICAgICAgICAgIHByaW50KCIgICBUbyByZXNldCB0aGUgZGF0YWJhc2UsIGRlbGV0ZSB0aGUgZmlsZSBhbmQgcnVuIHRoaXMgc2NyaXB0IGFnYWluLiIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIAogICAgICAgICMgQ3JlYXRlIGRlbW8gdXNlcnMKICAgICAgICBwcmludCgiXG7wn5GlIENyZWF0aW5nIGRlbW8gdXNlcnMuLi4iKQogICAgICAgIHVzZXJzX2RhdGEgPSBbCiAgICAgICAgICAgIHsidXNlcm5hbWUiOiAiamVzcyIsICJlbWFpbCI6ICJqZXNzQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiSmVzcyIsICJpc19hZG1pbiI6IFRydWV9LAogICAgICAgICAgICB7InVzZXJuYW1lIjogImxvdSIsICJlbWFpbCI6ICJsb3VAZmFtaWx5LmxvY2FsIiwgImZ1bGxfbmFtZSI6ICJMb3UiLCAiaXNfYWRtaW4iOiBGYWxzZX0sCiAgICAgICAgICAgIHsidXNlcm5hbWUiOiAid2lsbGlhbSIsICJlbWFpbCI6ICJ3aWxsaWFtQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiV2lsbGlhbSIsICJpc19hZG1pbiI6IEZhbHNlfSwKICAgICAgICAgICAgeyJ1c2VybmFtZSI6ICJ4YW5kZXIiLCAiZW1haWwiOiAieGFuZGVyQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiWGFuZGVyIiwgImlzX2FkbWluIjogRmFsc2V9LAogICAgICAgICAgICB7InVzZXJuYW1lIjogImJlbGxhIiwgImVtYWlsIjogImJlbGxhQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiQmVsbGEiLCAiaXNfYWRtaW4iOiBGYWxzZX0sCiAgICAgICAgXQogICAgICAgIAogICAgICAgIHVzZXJzID0gW10KICAgICAgICBmb3IgdXNlcl9kYXRhIGluIHVzZXJzX2RhdGE6CiAgICAgICAgICAgIHVzZXIgPSBVc2VyKAogICAgICAgICAgICAgICAgdXNlcm5hbWU9dXNlcl9kYXRhWyJ1c2VybmFtZSJdLAogICAgICAgICAgICAgICAgZW1haWw9dXNlcl9kYXRhWyJlbWFpbCJdLAogICAgICAgICAgICAgICAgZnVsbF9uYW1lPXVzZXJfZGF0YVsiZnVsbF9uYW1lIl0sCiAgICAgICAgICAgICAgICBoYXNoZWRfcGFzc3dvcmQ9cHdkX2NvbnRleHQuaGFzaCgicGFzc3dvcmQxMjMiKSwKICAgICAgICAgICAgICAgIGlzX2FkbWluPXVzZXJfZGF0YVsiaXNfYWRtaW4iXSwKICAgICAgICAgICAgICAgIGlzX2FjdGl2ZT1UcnVlCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGIuYWRkKHVzZXIpCiAgICAgICAgICAgIHVzZXJzLmFwcGVuZCh1c2VyKQogICAgICAgICAgICBhZG1pbl9iYWRnZSA9ICIg8J+RkSIgaWYgdXNlci5pc19hZG1pbiBlbHNlICIiCiAgICAgICAgICAgIHByaW50KGYiICDinJMge3VzZXIuZnVsbF9uYW1lfSAoe3VzZXIudXNlcm5hbWV9KXthZG1pbl9iYWRnZX0iKQogICAgICAgIAogICAgICAgIGRiLmZsdXNoKCkgICMgRmx1c2ggdG8gZ2V0IHVzZXIgSURzCiAgICAgICAgCiAgICAgICAgIyBDcmVhdGUgZGVtbyBjaG9yZXMKICAgICAgICBwcmludCgiXG7wn6e5IENyZWF0aW5nIGRlbW8gY2hvcmVzLi4uIikKICAgICAgICAKICAgICAgICAjIEdldCB1c2VyIElEcyBmb3IgYXNzaWdubWVudAogICAgICAgIGplc3MgPSBuZXh0KHUgZm9yIHUgaW4gdXNlcnMgaWYgdS51c2VybmFtZSA9PSAiamVzcyIpCiAgICAgICAgbG91ID0gbmV4dCh1IGZvciB1IGluIHVzZXJzIGlmIHUudXNlcm5hbWUgPT0gImxvdSIpCiAgICAgICAgd2lsbGlhbSA9IG5leHQodSBmb3IgdSBpbiB1c2VycyBpZiB1LnVzZXJuYW1lID09ICJ3aWxsaWFtIikKICAgICAgICB4YW5kZXIgPSBuZXh0KHUgZm9yIHUgaW4gdXNlcnMgaWYgdS51c2VybmFtZSA9PSAieGFuZGVyIikKICAgICAgICBiZWxsYSA9IG5leHQodSBmb3IgdSBpbiB1c2VycyBpZiB1LnVzZXJuYW1lID09ICJiZWxsYSIpCiAgICAgICAgCiAgICAgICAgZGVtb19jaG9yZXMgPSBbCiAgICAgICAgICAgICMgRGFpbHkgY2hvcmVzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGZWVkIHRoZSBwZXRzIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGZWVkIGNhdHMgaW4gdGhlIG1vcm5pbmcgYW5kIGV2ZW5pbmciLAogICAgICAgICAgICAgICAgImZyZXF1ZW5jeSI6ICJEQUlMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogNSwKICAgICAgICAgICAgICAgICJyb29tIjogIktpdGNoZW4iLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogYmVsbGEuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUYWtlIG91dCB0cmFzaCIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1wdHkga2l0Y2hlbiBhbmQgYmF0aHJvb20gYmlucyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIkRBSUxZIiwKICAgICAgICAgICAgICAgICJwb2ludHMiOiAzLAogICAgICAgICAgICAgICAgInJvb20iOiAiS2l0Y2hlbiIsCiAgICAgICAgICAgICAgICAiYXNzaWduZWRfdG9faWQiOiB4YW5kZXIuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaWR5IGxpdmluZyByb29tIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQaWNrIHVwIHRveXMsIHN0cmFpZ2h0ZW4gY3VzaGlvbnMsIGNsZWFyIGNvZmZlZSB0YWJsZSIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIkRBSUxZIiwKICAgICALine truncated
Database initialization script.
Creates the database tables and populates with initial family member data.
"""
import sys
from pathlib import Path
# Add the app directory to the path
sys.path.append(str(Path(__file__).parent))
from app.core.database import engine, Base
from app.models.user import User
from app.models.chore import Chore
from app.models.meal import Meal
from app.core.security import get_password_hash
from sqlalchemy.orm import Session
def init_database():
"""Initialize the database with tables and default data."""
print("Creating database tables...")
Base.metadata.create_all(bind=engine)
print("✅ Database tables created successfully!")
# Create a session to add default users
db = Session(bind=engine)
try:
# Check if users already exist
existing_user = db.query(User).first()
if existing_user:
print("⚠️ Database already contains users. Skipping initialization.")
return
print("Adding default family members...")
# Family members with default password "password123"
family_members = [
{"username": "lou", "email": "lou@family.local", "full_name": "Lou", "is_admin": False},
{"username": "jess", "email": "jess@family.local", "full_name": "Jess", "is_admin": True},
{"username": "william", "email": "william@family.local", "full_name": "William", "is_admin": False},
{"username": "xander", "email": "xander@family.local", "full_name": "Xander", "is_admin": False},
{"username": "bella", "email": "bella@family.local", "full_name": "Bella", "is_admin": False},
]
default_password = "password123" # Shorter password for bcrypt (max 72 bytes)
hashed_password = get_password_hash(default_password)
for member_data in family_members:
user = User(
username=member_data["username"],
email=member_data["email"],
full_name=member_data["full_name"],
hashed_password=hashed_password,
is_admin=member_data["is_admin"],
is_active=True
)
db.add(user)
db.commit()
print("✅ Family members added successfully!")
print("\n🔑 Default Login Credentials:")
print(" Username: jess (admin) | Password: password123")
print(" Username: lou | Password: password123")
print(" Username: william | Password: password123")
print(" Username: xander | Password: password123")
print(" Username: bella | Password: password123")
print("\n⚠️ Please change these passwords after first login!")
except Exception as e:
print(f"❌ Error initializing database: {e}")
db.rollback()
raise
finally:
db.close()
if __name__ == "__main__":
init_database()