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:
1 parent
b351c216b3
commit
0a8489a89c
1 file changed
+1
-77
+1
-77
@@ -1,77 +1 @@
|
||||
"""
|
||||
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()
|
||||
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKRGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gc2NyaXB0IGZvciBGYW1pbHkgSHViLgpDcmVhdGVzIHRhYmxlcyBhbmQgcG9wdWxhdGVzIHdpdGggZGVtbyBkYXRhLgoiIiIKCmltcG9ydCBzeXMKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lZGVsdGEKCiMgQWRkIHBhcmVudCBkaXJlY3RvcnkgdG8gcGF0aCB0byBpbXBvcnQgZnJvbSBhcHAKc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpKQoKZnJvbSBhcHAuY29yZS5kYXRhYmFzZSBpbXBvcnQgZW5naW5lLCBTZXNzaW9uTG9jYWwsIEJhc2UKZnJvbSBhcHAubW9kZWxzIGltcG9ydCBVc2VyLCBDaG9yZQpmcm9tIHBhc3NsaWIuY29udGV4dCBpbXBvcnQgQ3J5cHRDb250ZXh0Cgpwd2RfY29udGV4dCA9IENyeXB0Q29udGV4dChzY2hlbWVzPVsiYmNyeXB0Il0sIGRlcHJlY2F0ZWQ9ImF1dG8iKQoKZGVmIGluaXRfZGIoKToKICAgICIiIkluaXRpYWxpemUgdGhlIGRhdGFiYXNlIHdpdGggdGFibGVzIGFuZCBkZW1vIGRhdGEuIiIiCiAgICBwcmludCgi8J+agCBJbml0aWFsaXppbmcgRmFtaWx5IEh1YiBkYXRhYmFzZS4uLiIpCiAgICAKICAgICMgQ3JlYXRlIGFsbCB0YWJsZXMKICAgIHByaW50KCLwn5SnIENyZWF0aW5nIGRhdGFiYXNlIHRhYmxlcy4uLiIpCiAgICBCYXNlLm1ldGFkYXRhLmNyZWF0ZV9hbGwoYmluZD1lbmdpbmUpCiAgICAKICAgIGRiID0gU2Vzc2lvbkxvY2FsKCkKICAgIAogICAgdHJ5OgogICAgICAgICMgQ2hlY2sgaWYgZGF0YSBhbHJlYWR5IGV4aXN0cwogICAgICAgIGV4aXN0aW5nX3VzZXJzID0gZGIucXVlcnkoVXNlcikuY291bnQoKQogICAgICAgIGlmIGV4aXN0aW5nX3VzZXJzID4gMDoKICAgICAgICAgICAgcHJpbnQoZiLimqDvuI8gIERhdGFiYXNlIGFscmVhZHkgaGFzIHtleGlzdGluZ191c2Vyc30gdXNlcnMuIFNraXBwaW5nIGluaXRpYWxpemF0aW9uLiIpCiAgICAgICAgICAgIHByaW50KCIgICBUbyByZXNldCB0aGUgZGF0YWJhc2UsIGRlbGV0ZSB0aGUgZmlsZSBhbmQgcnVuIHRoaXMgc2NyaXB0IGFnYWluLiIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIAogICAgICAgICMgQ3JlYXRlIGRlbW8gdXNlcnMKICAgICAgICBwcmludCgiXG7wn5GlIENyZWF0aW5nIGRlbW8gdXNlcnMuLi4iKQogICAgICAgIHVzZXJzX2RhdGEgPSBbCiAgICAgICAgICAgIHsidXNlcm5hbWUiOiAiamVzcyIsICJlbWFpbCI6ICJqZXNzQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiSmVzcyIsICJpc19hZG1pbiI6IFRydWV9LAogICAgICAgICAgICB7InVzZXJuYW1lIjogImxvdSIsICJlbWFpbCI6ICJsb3VAZmFtaWx5LmxvY2FsIiwgImZ1bGxfbmFtZSI6ICJMb3UiLCAiaXNfYWRtaW4iOiBGYWxzZX0sCiAgICAgICAgICAgIHsidXNlcm5hbWUiOiAid2lsbGlhbSIsICJlbWFpbCI6ICJ3aWxsaWFtQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiV2lsbGlhbSIsICJpc19hZG1pbiI6IEZhbHNlfSwKICAgICAgICAgICAgeyJ1c2VybmFtZSI6ICJ4YW5kZXIiLCAiZW1haWwiOiAieGFuZGVyQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiWGFuZGVyIiwgImlzX2FkbWluIjogRmFsc2V9LAogICAgICAgICAgICB7InVzZXJuYW1lIjogImJlbGxhIiwgImVtYWlsIjogImJlbGxhQGZhbWlseS5sb2NhbCIsICJmdWxsX25hbWUiOiAiQmVsbGEiLCAiaXNfYWRtaW4iOiBGYWxzZX0sCiAgICAgICAgXQogICAgICAgIAogICAgICAgIHVzZXJzID0gW10KICAgICAgICBmb3IgdXNlcl9kYXRhIGluIHVzZXJzX2RhdGE6CiAgICAgICAgICAgIHVzZXIgPSBVc2VyKAogICAgICAgICAgICAgICAgdXNlcm5hbWU9dXNlcl9kYXRhWyJ1c2VybmFtZSJdLAogICAgICAgICAgICAgICAgZW1haWw9dXNlcl9kYXRhWyJlbWFpbCJdLAogICAgICAgICAgICAgICAgZnVsbF9uYW1lPXVzZXJfZGF0YVsiZnVsbF9uYW1lIl0sCiAgICAgICAgICAgICAgICBoYXNoZWRfcGFzc3dvcmQ9cHdkX2NvbnRleHQuaGFzaCgicGFzc3dvcmQxMjMiKSwKICAgICAgICAgICAgICAgIGlzX2FkbWluPXVzZXJfZGF0YVsiaXNfYWRtaW4iXSwKICAgICAgICAgICAgICAgIGlzX2FjdGl2ZT1UcnVlCiAgICAgICAgICAgICkKICAgICAgICAgICAgZGIuYWRkKHVzZXIpCiAgICAgICAgICAgIHVzZXJzLmFwcGVuZCh1c2VyKQogICAgICAgICAgICBhZG1pbl9iYWRnZSA9ICIg8J+RkSIgaWYgdXNlci5pc19hZG1pbiBlbHNlICIiCiAgICAgICAgICAgIHByaW50KGYiICDinJMge3VzZXIuZnVsbF9uYW1lfSAoe3VzZXIudXNlcm5hbWV9KXthZG1pbl9iYWRnZX0iKQogICAgICAgIAogICAgICAgIGRiLmZsdXNoKCkgICMgRmx1c2ggdG8gZ2V0IHVzZXIgSURzCiAgICAgICAgCiAgICAgICAgIyBDcmVhdGUgZGVtbyBjaG9yZXMKICAgICAgICBwcmludCgiXG7wn6e5IENyZWF0aW5nIGRlbW8gY2hvcmVzLi4uIikKICAgICAgICAKICAgICAgICAjIEdldCB1c2VyIElEcyBmb3IgYXNzaWdubWVudAogICAgICAgIGplc3MgPSBuZXh0KHUgZm9yIHUgaW4gdXNlcnMgaWYgdS51c2VybmFtZSA9PSAiamVzcyIpCiAgICAgICAgbG91ID0gbmV4dCh1IGZvciB1IGluIHVzZXJzIGlmIHUudXNlcm5hbWUgPT0gImxvdSIpCiAgICAgICAgd2lsbGlhbSA9IG5leHQodSBmb3IgdSBpbiB1c2VycyBpZiB1LnVzZXJuYW1lID09ICJ3aWxsaWFtIikKICAgICAgICB4YW5kZXIgPSBuZXh0KHUgZm9yIHUgaW4gdXNlcnMgaWYgdS51c2VybmFtZSA9PSAieGFuZGVyIikKICAgICAgICBiZWxsYSA9IG5leHQodSBmb3IgdSBpbiB1c2VycyBpZiB1LnVzZXJuYW1lID09ICJiZWxsYSIpCiAgICAgICAgCiAgICAgICAgZGVtb19jaG9yZXMgPSBbCiAgICAgICAgICAgICMgRGFpbHkgY2hvcmVzCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJGZWVkIHRoZSBwZXRzIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGZWVkIGNhdHMgaW4gdGhlIG1vcm5pbmcgYW5kIGV2ZW5pbmciLAogICAgICAgICAgICAgICAgImZyZXF1ZW5jeSI6ICJEQUlMWSIsCiAgICAgICAgICAgICAgICAicG9pbnRzIjogNSwKICAgICAgICAgICAgICAgICJyb29tIjogIktpdGNoZW4iLAogICAgICAgICAgICAgICAgImFzc2lnbmVkX3RvX2lkIjogYmVsbGEuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUYWtlIG91dCB0cmFzaCIsCiAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1wdHkga2l0Y2hlbiBhbmQgYmF0aHJvb20gYmlucyIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIkRBSUxZIiwKICAgICAgICAgICAgICAgICJwb2ludHMiOiAzLAogICAgICAgICAgICAgICAgInJvb20iOiAiS2l0Y2hlbiIsCiAgICAgICAgICAgICAgICAiYXNzaWduZWRfdG9faWQiOiB4YW5kZXIuaWQsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogIlBFTkRJTkciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJUaWR5IGxpdmluZyByb29tIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQaWNrIHVwIHRveXMsIHN0cmFpZ2h0ZW4gY3VzaGlvbnMsIGNsZWFyIGNvZmZlZSB0YWJsZSIsCiAgICAgICAgICAgICAgICAiZnJlcXVlbmN5IjogIkRBSUxZIiwKICAgICALine truncated
|
||||
Reference in new issue
Block a user