from fastapi import APIRouter, Request, responses, status from fastapi.templating import Jinja2Templates from src.apis.utils import SessionDep from src.db.models.comic import Comic, Artist, Publisher, Issue, WorkType from typing import AnyStr from src.db.repository.comic import create_new_worktype from src.schema.comics.worktype import AddWorkType from src.webapps.comic.forms import AddWorktypeForm templates = Jinja2Templates(directory="src/templates") router = APIRouter(include_in_schema=False, prefix="/comic") @router.get("/comics") def get_comics(db: SessionDep, request: Request, msg: str = None): comics = db.query(Comic).all() return templates.TemplateResponse("comic/comics.html", {"request": request, "msg": msg, "comics": comics}) @router.get("/comics/{comic_id}") def comic_details(comic_id: AnyStr, request: Request, db: SessionDep): comic = db.get(Comic, comic_id) return templates.TemplateResponse("comic/comic_detail.html", {"request": request, "comic":comic}) @router.get("/artists") def get_artists(db: SessionDep, request: Request, msg: str = None): artists = db.query(Artist).all() return templates.TemplateResponse("comic/artists.html", {"request": request, "msg": msg, "artists": artists}) @router.get("/artists/{artist_id}") def artist_detail(artist_id: AnyStr, request: Request, db: SessionDep): artist = db.get(Artist, str(artist_id)) return templates.TemplateResponse("comic/artist_detail.html", {"request": request, "artist": artist}) @router.get("/publishers") def get_publishers(db: SessionDep, request: Request, msg: str = None): publishers = db.query(Publisher).all() return templates.TemplateResponse("comic/publishers.html", {"request": request, "publishers": publishers}) @router.get("/publishers/{publisher_id}") def publisher_details(publisher_id: AnyStr, request: Request, db: SessionDep, msg: str = None): publisher = db.get(Publisher, publisher_id) if publisher is None: msg = "Could not find Publisher" return templates.TemplateResponse("comic/publisher_detail.html", {"request": request, "msg": msg, "publisher": publisher}) @router.get("/issues") def get_issues(db: SessionDep, request: Request, msg: str = None): issues = db.query(Issue).all() return templates.TemplateResponse("comic/issues.html", {"request": request, "msg": msg, "issues": issues}) @router.get("/issues/{issue_id}") def issue_details(issue_id: AnyStr, request: Request, db: SessionDep): issue = db.get(Issue, issue_id) return templates.TemplateResponse("comic/issue_detail.html", {"request": request, "issue": issue}) @router.get("/worktypes") def get_worktypes(db: SessionDep, request: Request, msg: str = None): worktypes = db.query(WorkType).all() return templates.TemplateResponse("comic/worktypes.html", {"request": request, "msg": msg, "worktypes": worktypes}) @router.get("/worktypes/{worktype_id}") def worktype_detail(worktype_id: AnyStr, request: Request, db: SessionDep): worktype = db.get(WorkType, worktype_id) return templates.TemplateResponse("comic/worktype_detail.html", {"request": request, "worktype": worktype}) @router.get("/add-worktype") def add_worktype(request: Request, db: SessionDep): return templates.TemplateResponse("comic/add_worktype.html", {"request": request}) @router.post("/add-worktype") async def post_worktype(request: Request, db: SessionDep): form = AddWorktypeForm(request) await form.load_data() if form.is_valid(): try: work = AddWorkType(**form.__dict__) worktype = create_new_worktype(work=work, db=db) return responses.RedirectResponse(f"/comic/worktypes/{worktype.id}", status_code=status.HTTP_302_FOUND) except Exception as e: print(e) form.__dict__.get("errors").append("worktype already added") return templates.TemplateResponse("comic/add_worktype.html", form.__dict__) return templates.TemplateResponse("comic/add_worktype.html", form.__dict__)