diff --git a/kontor-api/src/apis/version1/comic.py b/kontor-api/src/apis/version1/comic.py index 8feef55..7bd0c59 100644 --- a/kontor-api/src/apis/version1/comic.py +++ b/kontor-api/src/apis/version1/comic.py @@ -2,7 +2,8 @@ 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, get_issue_details +from src.db.repository.comics.artist import get_artist_details +from src.db.repository.comics.comic import 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, Issue diff --git a/kontor-api/src/core/log_conf.py b/kontor-api/src/core/log_conf.py index 68e2bbe..9a2335e 100644 --- a/kontor-api/src/core/log_conf.py +++ b/kontor-api/src/core/log_conf.py @@ -33,6 +33,7 @@ LOGGING_CONFIG: dict[str, Any] = { }, }, "loggers": { + "root": {"handlers": ["default"], "level": "INFO", "propagate": False}, "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False}, "uvicorn.error": {"level": "INFO"}, "uvicorn.access": {"handlers": ["default"], "level": "INFO", "propagate": False}, diff --git a/kontor-api/src/db/repository/comic.py b/kontor-api/src/db/repository/comic.py deleted file mode 100644 index a20fccc..0000000 --- a/kontor-api/src/db/repository/comic.py +++ /dev/null @@ -1,66 +0,0 @@ -import uuid -from datetime import datetime -from typing import List, Type, AnyStr - -from sqlalchemy.orm import Session - -from src.core.log_conf import logger -from src.db.models.comic import Artist, Comic, Issue, WorkType -from src.schema.comics.artist import ArtistDetailResponse -from src.schema.comics.issue import IssueDetailsResponse -from src.schema.comics.worktype import AddWorkType - - -def get_artist_details(artist: Artist) -> ArtistDetailResponse: - works = {} - for work in artist.comic_works: - work_type = work.work_type.name - comic_title = work.comic.title - if work_type in works: - works[work_type].append(comic_title) - else: - works[work_type] = [comic_title] - response = ArtistDetailResponse( - id=artist.id, - name=artist.name, - works=works - ) - return response - -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 - -def create_new_worktype(work: AddWorkType, db: Session) -> WorkType: - worktype = WorkType() - worktype.id = str(uuid.uuid4()) - worktype.created_date = datetime.now() - worktype.last_modified_date = datetime.now() - worktype.name = work.worktype - db.add(worktype) - db.commit() - db.refresh(worktype) - logger.info(f"create_new_worktype: {worktype}") - return worktype - - -def update_worktype(work: AddWorkType, worktype_id: AnyStr, db: Session) -> WorkType: - logger.info("update worktype") - worktype = db.get(WorkType, worktype_id) - worktype.name = work.worktype - db.add(worktype) - db.commit() - db.refresh(worktype) - return worktype diff --git a/kontor-api/src/db/repository/comics/__init__.py b/kontor-api/src/db/repository/comics/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kontor-api/src/db/repository/comics/artist.py b/kontor-api/src/db/repository/comics/artist.py new file mode 100644 index 0000000..8dda467 --- /dev/null +++ b/kontor-api/src/db/repository/comics/artist.py @@ -0,0 +1,19 @@ +from src.db.models.comic import Artist +from src.schema.comics.artist import ArtistDetailResponse + + +def get_artist_details(artist: Artist) -> ArtistDetailResponse: + works = {} + for work in artist.comic_works: + work_type = work.work_type.name + comic_title = work.comic.title + if work_type in works: + works[work_type].append(comic_title) + else: + works[work_type] = [comic_title] + response = ArtistDetailResponse( + id=artist.id, + name=artist.name, + works=works + ) + return response diff --git a/kontor-api/src/db/repository/comics/comic.py b/kontor-api/src/db/repository/comics/comic.py new file mode 100644 index 0000000..8f20431 --- /dev/null +++ b/kontor-api/src/db/repository/comics/comic.py @@ -0,0 +1,29 @@ +from typing import List, Type, AnyStr + +from sqlalchemy.orm import Session + +from src.core.log_conf import logger +from src.db.models.comic import Comic, Issue +from src.schema.comics.comic import ComicSchema +from src.schema.comics.issue import IssueDetailsResponse + + +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 + + +def update_comic(comic: ComicSchema, comic_id: AnyStr, db: Session): + logger.info(f"update_comic: {comic} with {comic_id}") diff --git a/kontor-api/src/db/repository/comics/worktype.py b/kontor-api/src/db/repository/comics/worktype.py new file mode 100644 index 0000000..cb545ad --- /dev/null +++ b/kontor-api/src/db/repository/comics/worktype.py @@ -0,0 +1,32 @@ +import uuid +from datetime import datetime +from typing import AnyStr + +from sqlalchemy.orm import Session + +from src.core.log_conf import logger +from src.db.models.comic import WorkType +from src.schema.comics.worktype import AddWorkType + + +def create_new_worktype(work: AddWorkType, db: Session) -> WorkType: + worktype = WorkType() + worktype.id = str(uuid.uuid4()) + worktype.created_date = datetime.now() + worktype.last_modified_date = datetime.now() + worktype.name = work.worktype + db.add(worktype) + db.commit() + db.refresh(worktype) + logger.info(f"create_new_worktype: {worktype}") + return worktype + + +def update_worktype(work: AddWorkType, worktype_id: AnyStr, db: Session) -> WorkType: + logger.info("update worktype") + worktype = db.get(WorkType, worktype_id) + worktype.name = work.worktype + db.add(worktype) + db.commit() + db.refresh(worktype) + return worktype diff --git a/kontor-api/src/schema/comics/comic.py b/kontor-api/src/schema/comics/comic.py index 168402a..1583417 100644 --- a/kontor-api/src/schema/comics/comic.py +++ b/kontor-api/src/schema/comics/comic.py @@ -1,6 +1,6 @@ -from typing import List, Dict +from typing import List, Dict, Optional -from pydantic import BaseModel +from pydantic import BaseModel, AnyUrl from src.db.models.comic import Comic @@ -21,6 +21,14 @@ class ComicDetailsResponse(BaseModel): volumes: List[str] works: Dict[str, List[str]] + +class ComicSchema(BaseModel): + title: str + weblink: Optional[AnyUrl] + completed: Optional[bool] + current_order: Optional[bool] + + def get_short_info(comic: Comic) -> ComicResponse: response = ComicResponse( id=comic.id, diff --git a/kontor-api/src/templates/comic/comic_edit.html b/kontor-api/src/templates/comic/comic_edit.html new file mode 100644 index 0000000..fb8edab --- /dev/null +++ b/kontor-api/src/templates/comic/comic_edit.html @@ -0,0 +1,44 @@ +{% extends "shared/base.html" %} + + +{% block title %} +