from contextlib import asynccontextmanager from typing import Union, Annotated from models import Event from fastapi import FastAPI, Request, Depends from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles from sqlmodel import Field, Session, SQLModel, create_engine, select sqlite_file_name = "database.db" sqlite_url = f"sqlite:///{sqlite_file_name}" connect_args = {"check_same_thread": False} engine = create_engine(sqlite_url, connect_args=connect_args) def get_session(): with Session(engine) as session: yield session def create_db_and_tables(): SQLModel.metadata.create_all(engine) @asynccontextmanager async def on_startup(app_: FastAPI): create_db_and_tables() yield app = FastAPI(lifespan=on_startup) app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") SessionDep = Annotated[Session, Depends(get_session)] @app.get("/") async def read_root(request: Request, session: SessionDep): statement = select(Event).order_by(Event.event_time) events = session.exec(statement).all() return templates.TemplateResponse( request=request, name="index.html", context={"events": events} ) @app.get("/event/{event_id}") async def read_event(request: Request, event_id: int, session: SessionDep): statement = select(Event).where(Event.id == event_id) event = session.exec(statement).one() return templates.TemplateResponse( request=request, name="event.html", context={"event": event} )