""" Seed script — creates default admin user, sample page, sample blog post, and site settings. Run once after running Alembic migrations. Usage: python seed.py """ import asyncio import sys import os sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from sqlalchemy import select from app.database import AsyncSessionLocal, engine from app.models.base import Base from app.models.user import User from app.models.page import Page from app.models.post import BlogPost from app.models.settings import SiteSettings from app.auth.password import hash_password async def seed(): async with AsyncSessionLocal() as session: # ── Admin user ──────────────────────────────────────────────────────── existing_user = await session.execute( select(User).where(User.email == "admin@example.com") ) if existing_user.scalars().first() is None: user = User( email="admin@example.com", hashed_password=hash_password("changeme123"), is_active=True, ) session.add(user) print("Created admin user: admin@example.com / changeme123") else: print("Admin user already exists, skipping.") # ── Sample Page ─────────────────────────────────────────────────────── existing_page = await session.execute( select(Page).where(Page.slug == "home") ) if existing_page.scalars().first() is None: page = Page( title="Home", slug="home", published=True, body="
This is the home page.
", ) session.add(page) print("Created sample page: Home") else: print("Home page already exists, skipping.") # ── Sample BlogPost ─────────────────────────────────────────────────── existing_post = await session.execute( select(BlogPost).where(BlogPost.slug == "hello-world") ) if existing_post.scalars().first() is None: post = BlogPost( title="Hello World", slug="hello-world", published=True, author="Admin", excerpt="Our first post", body="Welcome to our blog.
", tags=["news", "welcome"], ) session.add(post) print("Created sample blog post: Hello World") else: print("Hello World post already exists, skipping.") # ── SiteSettings ────────────────────────────────────────────────────── existing_settings = await session.execute(select(SiteSettings).limit(1)) if existing_settings.scalars().first() is None: site_settings = SiteSettings( site_name="Goodwalk", tagline="Dog walking in Auckland", logo_url="", footer_text="© 2025 Goodwalk", social_links={"facebook": "", "instagram": ""}, ) session.add(site_settings) print("Created site settings.") else: print("Site settings already exist, skipping.") await session.commit() print("\nSeed complete.") if __name__ == "__main__": asyncio.run(seed())