From 4cf1941f449834df31b2d0dfa8e9e2e72e9aa35b Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Fri, 2 May 2025 18:17:06 +0200 Subject: [PATCH] add issue display --- kontor-api/src/apis/version1/comic.py | 13 +++- kontor-api/src/db/repository/comic.py | 15 ++++- kontor-api/src/schema/comics/issue.py | 10 +++ .../src/templates/comic/comic_detail.html | 2 +- .../src/templates/comic/issue_detail.html | 63 +++++++++++++++++++ kontor-api/src/webapps/comic/route_comics.py | 12 +++- 6 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 kontor-api/src/schema/comics/issue.py create mode 100644 kontor-api/src/templates/comic/issue_detail.html diff --git a/kontor-api/src/apis/version1/comic.py b/kontor-api/src/apis/version1/comic.py index 2541f2b..5a70195 100644 --- a/kontor-api/src/apis/version1/comic.py +++ b/kontor-api/src/apis/version1/comic.py @@ -2,10 +2,11 @@ from typing import List, AnyStr from fastapi import APIRouter, HTTPException, status from src.apis.utils import SessionDep -from src.db.repository.comic import get_artist_details, list_comics +from src.db.repository.comic import get_artist_details, list_comics, get_issue_details from src.schema.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details, get_short_info from src.schema.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse -from src.db.models.comic import Comic, Artist +from src.db.models.comic import Comic, Artist, Issue +from src.schema.comics.issue import IssueDetailsResponse router = APIRouter( prefix="/comic", @@ -59,3 +60,11 @@ def add_artist(db: SessionDep, artist_creation: ArtistCreation) -> ArtistRespons response = ArtistResponse(id=artist.id, name=artist.name) return response +@router.get("/issues", response_model=List[IssueDetailsResponse]) +def get_issues(db: SessionDep) -> List[IssueDetailsResponse]: + results: List[IssueDetailsResponse] = [] + issues = db.query(Issue).all() + for issue in issues: + results.append(get_issue_details(issue)) + return results + diff --git a/kontor-api/src/db/repository/comic.py b/kontor-api/src/db/repository/comic.py index 3388bb4..a8774c5 100644 --- a/kontor-api/src/db/repository/comic.py +++ b/kontor-api/src/db/repository/comic.py @@ -2,8 +2,9 @@ from typing import List, Type from sqlalchemy.orm import Session -from src.db.models.comic import Artist, Comic +from src.db.models.comic import Artist, Comic, Issue from src.schema.comics.artist import ArtistDetailResponse +from src.schema.comics.issue import IssueDetailsResponse def get_artist_details(artist: Artist) -> ArtistDetailResponse: @@ -25,3 +26,15 @@ def get_artist_details(artist: Artist) -> ArtistDetailResponse: def list_comics(db: Session) -> List[Type[Comic]]: comics = db.query(Comic).all() return comics + + +def get_issue_details(issue: Issue) -> IssueDetailsResponse: + response = IssueDetailsResponse( + id=issue.id, + issue_number=issue.issue_number, + in_stock=issue.in_stock, + is_read=issue.is_read, + comic_id=issue.comic_id, + volume_id=issue.volume_id + ) + return response diff --git a/kontor-api/src/schema/comics/issue.py b/kontor-api/src/schema/comics/issue.py new file mode 100644 index 0000000..465085b --- /dev/null +++ b/kontor-api/src/schema/comics/issue.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel + + +class IssueDetailsResponse(BaseModel): + id: str + issue_number: str + in_stock: bool + is_read: bool + comic_id: str + volume_id: str | None diff --git a/kontor-api/src/templates/comic/comic_detail.html b/kontor-api/src/templates/comic/comic_detail.html index 7a903e9..76a5b79 100644 --- a/kontor-api/src/templates/comic/comic_detail.html +++ b/kontor-api/src/templates/comic/comic_detail.html @@ -59,7 +59,7 @@ diff --git a/kontor-api/src/templates/comic/issue_detail.html b/kontor-api/src/templates/comic/issue_detail.html new file mode 100644 index 0000000..bbaa42d --- /dev/null +++ b/kontor-api/src/templates/comic/issue_detail.html @@ -0,0 +1,63 @@ +{% extends "shared/base.html" %} + + +{% block title %} + Issue Detail +{% endblock %} + +{% block content %} +
+
+
+

Issue Detail

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Issue Number{{issue.issue_number}}
Auf Lager + {% with check=issue.in_stock %} + {% include "components/check.html" %} + {% endwith %} +
Gelesen + {% with check=issue.is_read %} + {% include "components/check.html" %} + {% endwith %} +
Comic + {{issue.comic.title}} +
Volume + {{issue.volume.name}} +
Data Created{{issue.created_date}}
Data Modified{{issue.last_modified_date}}
+
+
+{% endblock %} diff --git a/kontor-api/src/webapps/comic/route_comics.py b/kontor-api/src/webapps/comic/route_comics.py index eac1600..55f21b0 100644 --- a/kontor-api/src/webapps/comic/route_comics.py +++ b/kontor-api/src/webapps/comic/route_comics.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Request from fastapi.templating import Jinja2Templates from src.apis.utils import SessionDep -from src.db.models.comic import Comic, Artist, Publisher +from src.db.models.comic import Comic, Artist, Publisher, Issue from typing import AnyStr templates = Jinja2Templates(directory="src/templates") @@ -38,3 +38,13 @@ def publisher_details(publisher_id: AnyStr, request: Request, db: SessionDep, ms 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})