39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
"""Run once at container start: creates the first admin and the default categories and sites."""
|
|||
|
|
from sqlalchemy import func, select
|
||
|
|
|
||
|
|
from .config import settings
|
||
|
|
from .db import SessionLocal
|
||
|
|
from .models import Category, Department, Site, User
|
||
|
|
from .security import hash_password
|
||
|
|
from .seed import CATEGORIES, SITES
|
||
|
|
|
||
|
|
DEFAULT_DEPARTMENT = "IT"
|
||
|
|
|
||
|
|
|
||
|
|
def seed_categories(db, department: Department) -> None:
|
||
|
|
for i, (en, pt, section) in enumerate(CATEGORIES):
|
||
|
|
db.add(Category(department_id=department.id, name_en=en, name_pt=pt, section=section, sort_order=(i + 1) * 10))
|
||
|
|
|
||
|
|
|
||
|
|
def bootstrap() -> None:
|
||
|
|
with SessionLocal() as db:
|
||
|
|
if not db.scalar(select(func.count(Department.id))):
|
||
|
|
dept = Department(name=DEFAULT_DEPARTMENT)
|
||
|
|
db.add(dept)
|
||
|
|
db.flush()
|
||
|
|
seed_categories(db, dept)
|
||
|
|
if not db.scalar(select(func.count(User.id))):
|
||
|
|
db.add(User(email=settings.admin_email.lower(), name=settings.admin_name,
|
||
|
|
password_hash=hash_password(settings.admin_password), role="admin",
|
||
|
|
language=settings.default_language,
|
||
|
|
department_id=db.scalar(select(Department.id).order_by(Department.id))))
|
||
|
|
print(f"Created admin user {settings.admin_email}")
|
||
|
|
if not db.scalar(select(func.count(Site.id))):
|
||
|
|
for name in SITES:
|
||
|
|
db.add(Site(name=name))
|
||
|
|
db.commit()
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
bootstrap()
|