97 lines
3.7 KiB
Python
97 lines
3.7 KiB
Python
|
|
"""
|
||
|
|
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="<h1>Welcome</h1><p>This is the home page.</p>",
|
||
|
|
)
|
||
|
|
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="<p>Welcome to our blog.</p>",
|
||
|
|
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())
|