add issue display
This commit is contained in:
@@ -2,10 +2,11 @@ from typing import List, AnyStr
|
|||||||
from fastapi import APIRouter, HTTPException, status
|
from fastapi import APIRouter, HTTPException, status
|
||||||
|
|
||||||
from src.apis.utils import SessionDep
|
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.comic import ComicResponse, ComicDetailsResponse, get_comic_details, get_short_info
|
||||||
from src.schema.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse
|
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(
|
router = APIRouter(
|
||||||
prefix="/comic",
|
prefix="/comic",
|
||||||
@@ -59,3 +60,11 @@ def add_artist(db: SessionDep, artist_creation: ArtistCreation) -> ArtistRespons
|
|||||||
response = ArtistResponse(id=artist.id, name=artist.name)
|
response = ArtistResponse(id=artist.id, name=artist.name)
|
||||||
return response
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,9 @@ from typing import List, Type
|
|||||||
|
|
||||||
from sqlalchemy.orm import Session
|
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.artist import ArtistDetailResponse
|
||||||
|
from src.schema.comics.issue import IssueDetailsResponse
|
||||||
|
|
||||||
|
|
||||||
def get_artist_details(artist: Artist) -> ArtistDetailResponse:
|
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]]:
|
def list_comics(db: Session) -> List[Type[Comic]]:
|
||||||
comics = db.query(Comic).all()
|
comics = db.query(Comic).all()
|
||||||
return comics
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<ul>
|
<ul>
|
||||||
{% for issue in comic.sorted_issues() %}
|
{% for issue in comic.sorted_issues() %}
|
||||||
<li><a href="comic/issues/{{issue.id}}">{{issue.issue_number}}</a></li>
|
<li><a href="/comic/issues/{{issue.id}}">{{issue.issue_number}}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
{% extends "shared/base.html" %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
<title>Issue Detail</title>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h1 class="display-5">Issue Detail</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<table class="table table-striped table-hover">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Issue Number</th>
|
||||||
|
<td colspan="2">{{issue.issue_number}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Auf Lager</th>
|
||||||
|
<td colspan="2">
|
||||||
|
{% with check=issue.in_stock %}
|
||||||
|
{% include "components/check.html" %}
|
||||||
|
{% endwith %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Gelesen</th>
|
||||||
|
<td colspan="2">
|
||||||
|
{% with check=issue.is_read %}
|
||||||
|
{% include "components/check.html" %}
|
||||||
|
{% endwith %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Comic</th>
|
||||||
|
<td colspan="2">
|
||||||
|
<a href="/comic/comics/{{issue.comic_id}}">{{issue.comic.title}}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Volume</th>
|
||||||
|
<td colspan="2">
|
||||||
|
<a href="/comic/comics/{{issue.volume_id}}">{{issue.volume.name}}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Data Created</th>
|
||||||
|
<td colspan="2">{{issue.created_date}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Data Modified</th>
|
||||||
|
<td colspan="2">{{issue.last_modified_date}}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
from fastapi import APIRouter, Request
|
from fastapi import APIRouter, Request
|
||||||
from fastapi.templating import Jinja2Templates
|
from fastapi.templating import Jinja2Templates
|
||||||
from src.apis.utils import SessionDep
|
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
|
from typing import AnyStr
|
||||||
|
|
||||||
templates = Jinja2Templates(directory="src/templates")
|
templates = Jinja2Templates(directory="src/templates")
|
||||||
@@ -38,3 +38,13 @@ def publisher_details(publisher_id: AnyStr, request: Request, db: SessionDep, ms
|
|||||||
if publisher is None:
|
if publisher is None:
|
||||||
msg = "Could not find Publisher"
|
msg = "Could not find Publisher"
|
||||||
return templates.TemplateResponse("comic/publisher_detail.html", {"request": request, "msg": msg, "publisher": 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})
|
||||||
|
|||||||
Reference in New Issue
Block a user