from fastapi import APIRouter, Form, Request, status from fastapi.templating import Jinja2Templates from fastapi.responses import RedirectResponse from src.apis.utils import SessionDep from src.db.models.comic import Comic, Publisher, Issue from typing import AnyStr from src.core.log_conf import logger from src.db.repository.comics.comic import update_comic from src.schema.comics.comic import ComicSchema from src.webapps.comic.forms.comic import ValidateComicForm templates = Jinja2Templates(directory="src/templates") router = APIRouter(include_in_schema=True, prefix="/comic") @router.get("/comics") def get_comics(db: SessionDep, request: Request, msg: str | None = None): params = request.query_params query = params.get("query") filter = {} completed = params.get('completed') == "on" if completed: filter['completed'] = True order = params.get("order") == "on" if order: filter['current_order'] = True if query is not None and len(query) > 0: filter['title'] = query if len(filter) > 0: if "title" in filter: comics = db.query(Comic).filter(Comic.title.ilike(f'%{query}%')) else: comics = db.query(Comic).filter_by(**filter).all() else: 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("/comic/edit/{comic_id}") def edit_comic(db: SessionDep, request: Request, comic_id: str): comic = db.get(Comic, comic_id) return templates.TemplateResponse("comic/comic_edit.html", {"request": request, "comic_title": comic.title, "comic_weblink": comic.weblink}) @router.post("/comic/edit/{comic_id}") async def validate_comic(request: Request, db: SessionDep, comic_id: str, action: str = Form(...), completed: bool = Form(False), current_order: bool = Form(False)): if action == "cancel": return RedirectResponse(f"/comic/comics/{comic_id}", status_code=status.HTTP_303_SEE_OTHER) form = ValidateComicForm(request, comic_id, completed, current_order) logger.info(f"request: {repr(request)}") await form.load_data() logger.info(f"form: {form}") if form.is_valid(): try: comic = ComicSchema(**form.__dict__) comic = update_comic(new_comic=comic, comic_id=comic_id, db=db) return RedirectResponse(f"/comic/comics/{comic.id}", status_code=status.HTTP_303_SEE_OTHER) except Exception as e: print(e) form.__dict__.get("errors").append("comic already added") return templates.TemplateResponse("comic/comic_edit.html", form.__dict__) return templates.TemplateResponse("comic/comic_edit.html", form.__dict__) @router.get("/publishers") def get_publishers(db: SessionDep, request: Request, msg: str | None = 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 = 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})