From cb0fa3f7286ae02061cd2055a229a601d173d48e Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Wed, 23 Apr 2025 22:54:37 +0200 Subject: [PATCH] change schema --- kontor-api/src/models/comics/comic.py | 8 ++++ kontor-api/src/models/media/file.py | 21 +++++++++- kontor-api/src/routers/comic.py | 9 +++-- kontor-api/src/routers/media.py | 45 +++++---------------- kontor-schema/src/kontor_schema/admin.py | 11 ++--- kontor-schema/src/kontor_schema/base.py | 7 ++-- kontor-schema/src/kontor_schema/comic.py | 11 ++--- kontor-schema/src/kontor_schema/media.py | 5 ++- kontor-schema/src/kontor_schema/metadata.py | 7 ++-- kontor-schema/src/kontor_schema/tysc.py | 7 ++-- 10 files changed, 69 insertions(+), 62 deletions(-) diff --git a/kontor-api/src/models/comics/comic.py b/kontor-api/src/models/comics/comic.py index c84cee1..f93e26a 100644 --- a/kontor-api/src/models/comics/comic.py +++ b/kontor-api/src/models/comics/comic.py @@ -19,6 +19,14 @@ class ComicDetailsResponse(BaseModel): volumes: List[str] works: Dict[str, List[str]] +def get_short_info(comic: Comic) -> ComicResponse: + reponse = ComicResponse( + id=comic.id, + title=comic.title, + completed=(comic.completed == 1) + ) + return reponse + def get_comic_details(comic: Comic) -> ComicDetailsResponse | None: volumes = [] diff --git a/kontor-api/src/models/media/file.py b/kontor-api/src/models/media/file.py index af01717..cb6fc52 100644 --- a/kontor-api/src/models/media/file.py +++ b/kontor-api/src/models/media/file.py @@ -1,3 +1,4 @@ +from datetime import datetime from uuid import UUID from src.schema.media import MediaFile @@ -22,7 +23,23 @@ def get_file_details(mediafile: MediaFile) -> MediaFileResponse | None: file_name=mediafile.file_name, cloud_link=mediafile.cloud_link, url=str(mediafile.url), - review=mediafile.review, - should_download=mediafile.should_download) + review=(mediafile.review == 1), + should_download=(mediafile.should_download == 1)) + print(f"id: {mediafile.id}: review: {response.review} <- {mediafile.review}") + print(f"id: {mediafile.id}: download: {response.should_download} <- {mediafile.should_download}") return response +def set_file(model: MediaFileResponse, mediafile: MediaFile) -> None: + mediafile.file_name = model.file_name + mediafile.cloud_link = model.cloud_link + mediafile.url = model.url + mediafile.title = model.title + mediafile.last_modified_date = datetime.now() + if model.review: + mediafile.review = 1 + else: + mediafile.review = 0 + if model.should_download: + mediafile.should_download = 1 + else: + mediafile.should_download = 0 diff --git a/kontor-api/src/routers/comic.py b/kontor-api/src/routers/comic.py index 583df7b..0504f5d 100644 --- a/kontor-api/src/routers/comic.py +++ b/kontor-api/src/routers/comic.py @@ -3,7 +3,7 @@ from typing import List from fastapi import APIRouter, HTTPException, status from sqlalchemy import select -from src.models.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details +from src.models.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details, get_short_info from src.models.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse, get_artist_details from src.routers import SessionDep from src.schema.comic import Comic, Artist @@ -16,11 +16,12 @@ router = APIRouter( @router.get("/comics") -def get_all_comics(db: SessionDep) -> list[ComicResponse]: - results: list[ComicResponse] = [] +def get_all_comics(db: SessionDep) -> List[ComicResponse]: + results: List[ComicResponse] = [] comics = db.scalars(select(Comic)).all() for comic in comics: - results.append(ComicResponse(id=comic.id, title=comic.title, completed=(comic.completed == 1))) + response = get_short_info(comic) + results.append(response) return results @router.get("/comics/{comic_id}", response_model=ComicDetailsResponse) diff --git a/kontor-api/src/routers/media.py b/kontor-api/src/routers/media.py index a933325..63bcd1f 100644 --- a/kontor-api/src/routers/media.py +++ b/kontor-api/src/routers/media.py @@ -1,11 +1,10 @@ -from datetime import datetime from typing import List -from uuid import uuid4, UUID +from uuid import UUID from fastapi import APIRouter, status, HTTPException from sqlalchemy import select, Sequence -from src.models.media.file import MediaFileResponse, Link, get_file_details +from src.models.media.file import MediaFileResponse, Link, get_file_details, set_file from src.routers import SessionDep from src.schema.media import MediaFile @@ -21,13 +20,7 @@ def update_titles(db: SessionDep) -> list[MediaFileResponse]: for mediafile in files: mediafile.update_title() db.add(mediafile) - response = MediaFileResponse(id=mediafile.id, - title=mediafile.title, - file_name=mediafile.file_name, - cloud_link=mediafile.cloud_link, - url=str(mediafile.url), - review=mediafile.review, - should_download=mediafile.should_download) + response = get_file_details(mediafile) results.append(response) db.commit() return results @@ -38,19 +31,13 @@ def get_all_files(db: SessionDep, review: bool = False, download: bool = False) results: list[MediaFileResponse] = [] files: Sequence[MediaFile] if review: - files = db.query(MediaFile).filter(MediaFile.review == review).all() + files = db.query(MediaFile).filter(MediaFile.review == 1).all() elif download: - files = db.query(MediaFile).filter(MediaFile.should_download == download).all() + files = db.query(MediaFile).filter(MediaFile.should_download == 1).all() else: files = db.scalars(select(MediaFile)).all() for mediafile in files: - response = MediaFileResponse(id=mediafile.id, - title=mediafile.title, - file_name=mediafile.file_name, - cloud_link=mediafile.cloud_link, - url=str(mediafile.url), - review=mediafile.review, - should_download=mediafile.should_download) + response = get_file_details(mediafile) results.append(response) return results @@ -67,13 +54,7 @@ def update_file(file_id: UUID, db: SessionDep, info: MediaFileResponse) -> Media mediaFile = db.get(MediaFile, file_id) if not mediaFile: raise HTTPException(status_code=404, detail="MediaFile could not be found") - mediaFile.file_name = info.file_name - mediaFile.cloud_link = info.cloud_link - mediaFile.url = info.url - mediaFile.title = info.title - mediaFile.last_modified_date = datetime.now() - mediaFile.review = info.review - mediaFile.should_download = info.should_download + set_file(info, mediaFile) db.add(mediaFile) db.commit() return info @@ -85,17 +66,11 @@ def add_file(new_link: Link, db: SessionDep) -> MediaFileResponse: try: mediaFile: MediaFile = MediaFile() setattr(mediaFile, "url", new_link.url) - setattr(mediaFile, "review", True) - setattr(mediaFile, "should_download", True) + setattr(mediaFile, "review", 1) + setattr(mediaFile, "should_download", 1) db.add(mediaFile) db.commit() except: raise HTTPException(status_code=409, detail="Link duplicate") - response = MediaFileResponse(id=uuid4(), - title=mediaFile.title, - file_name=mediaFile.file_name, - cloud_link=mediaFile.cloud_link, - url=new_link.url, - review=mediaFile.review, - should_download=mediaFile.should_download) + response = get_file_details(mediaFile) return response diff --git a/kontor-schema/src/kontor_schema/admin.py b/kontor-schema/src/kontor_schema/admin.py index 2cbfff4..c5b3e99 100644 --- a/kontor-schema/src/kontor_schema/admin.py +++ b/kontor-schema/src/kontor_schema/admin.py @@ -1,6 +1,7 @@ from datetime import datetime -from sqlalchemy import Column, ForeignKey, Integer, String, Boolean +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship, mapped_column, Mapped from .base import Base, BaseMixin @@ -13,7 +14,7 @@ class User(Base, BaseMixin): user_name = Column(String(255), nullable=False) email = Column(String(255)) password = Column(String(255)) - enabled = Column(Boolean) + enabled = Column(BIT(1)) matrix = relationship("AuthorizationMatrix") tokens = relationship("Token") @@ -33,7 +34,7 @@ class Token(Base, BaseMixin): token = Column(String(255), nullable=False, unique=True) name = Column(String(255)) last_used_date: Mapped[datetime] = mapped_column() - enabled = Column(Boolean) + enabled = Column(BIT(1)) user_id = Column(String(255), ForeignKey("user.id"), nullable=False) user = relationship("User", back_populates="tokens") @@ -55,7 +56,7 @@ class AuthorizationMatrix(Base, BaseMixin): class ModuleData(Base, BaseMixin): __tablename__ = "module_data" module_name = Column(String(255), nullable=False) - import_data = Column(Boolean) + import_data = Column(BIT(1)) class MailAccount(Base, BaseMixin): @@ -65,7 +66,7 @@ class MailAccount(Base, BaseMixin): protocol = Column(String(255)) user_name = Column(String(255)) password = Column(String(255)) - start_tls = Column(Boolean) + start_tls = Column(BIT(1)) class Mail(Base, BaseMixin): diff --git a/kontor-schema/src/kontor_schema/base.py b/kontor-schema/src/kontor_schema/base.py index 5ef8183..4a354e7 100644 --- a/kontor-schema/src/kontor_schema/base.py +++ b/kontor-schema/src/kontor_schema/base.py @@ -1,7 +1,8 @@ import uuid from datetime import datetime -from sqlalchemy import func, Column, String, Boolean +from sqlalchemy import func, Column, String +from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column @@ -24,7 +25,7 @@ class BaseVideoMixin: cloud_link = Column(String(255)) file_name = Column(String(255)) path = Column(String(255)) - review = Column(Boolean) + review = Column(BIT(1)) title = Column(String(255)) url = Column(String(255), unique=True) - should_download = Column(Boolean) + should_download = Column(BIT(1)) diff --git a/kontor-schema/src/kontor_schema/comic.py b/kontor-schema/src/kontor_schema/comic.py index 45cb8c3..1052d79 100644 --- a/kontor-schema/src/kontor_schema/comic.py +++ b/kontor-schema/src/kontor_schema/comic.py @@ -1,4 +1,5 @@ -from sqlalchemy import Column, ForeignKey, Integer, String, Boolean +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship from .base import Base, BaseMixin @@ -21,8 +22,8 @@ class Comic(Base, BaseMixin): title = Column(String(length=255), unique=True) publisher_id = Column(String, ForeignKey('publisher.id'), nullable=False) publisher = relationship("Publisher", back_populates="comics") - current_order = Column(Boolean) - completed = Column(Boolean) + current_order = Column(BIT(1)) + completed = Column(BIT(1)) issues = relationship("Issue") story_arcs = relationship("StoryArc") trade_paperbacks = relationship("TradePaperback") @@ -63,8 +64,8 @@ class StoryArc(Base, BaseMixin): class Issue(Base, BaseMixin): __tablename__ = "issue" issue_number = Column(String(255)) - in_stock = Column(Boolean) - is_read = Column(Boolean) + in_stock = Column(BIT(1)) + is_read = Column(BIT(1)) comic_id = Column(String, ForeignKey("comic.id"), nullable=False) comic = relationship("Comic", back_populates="issues") volume_id = Column(String, ForeignKey("volume.id"), nullable=True) diff --git a/kontor-schema/src/kontor_schema/media.py b/kontor-schema/src/kontor_schema/media.py index d3a9723..a22be99 100644 --- a/kontor-schema/src/kontor_schema/media.py +++ b/kontor-schema/src/kontor_schema/media.py @@ -5,7 +5,8 @@ from pathlib import Path import requests from bs4 import BeautifulSoup -from sqlalchemy import Column, String, ForeignKey, Boolean +from sqlalchemy import Column, String, ForeignKey +from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship from .base import Base, BaseMixin, BaseVideoMixin @@ -83,7 +84,7 @@ class MediaActorFile(Base, BaseMixin): class MediaArticle(Base, BaseMixin): __tablename__ = 'media_article' - review = Column(Boolean) + review = Column(BIT(1)) title = Column(String(255)) url = Column(String(255), unique=True) diff --git a/kontor-schema/src/kontor_schema/metadata.py b/kontor-schema/src/kontor_schema/metadata.py index 9ac5aa4..950cebe 100644 --- a/kontor-schema/src/kontor_schema/metadata.py +++ b/kontor-schema/src/kontor_schema/metadata.py @@ -1,4 +1,5 @@ -from sqlalchemy import Column, String, ForeignKey, Integer, Boolean +from sqlalchemy import Column, String, ForeignKey, Integer +from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship from .base import Base, BaseMixin @@ -27,8 +28,8 @@ class MetaDataColumn(Base, BaseMixin): table = relationship("MetaDataTable", back_populates="table_columns") column_label = Column(String(255)) filter_label = Column(String(255)) - is_shown = Column(Boolean) - show_filter = Column(Boolean) + is_shown = Column(BIT(1)) + show_filter = Column(BIT(1)) ref_column = Column(String, nullable=True) def __repr__(self): diff --git a/kontor-schema/src/kontor_schema/tysc.py b/kontor-schema/src/kontor_schema/tysc.py index 5ab4baa..32c88f1 100644 --- a/kontor-schema/src/kontor_schema/tysc.py +++ b/kontor-schema/src/kontor_schema/tysc.py @@ -1,4 +1,5 @@ -from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Boolean +from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint +from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship from .base import Base, BaseMixin @@ -77,8 +78,8 @@ class CardSet(Base, BaseMixin): UniqueConstraint("name", "vendor_id"), ) name = Column(String(255), index=True) - parallel_set = Column(Boolean) - insert_set = Column(Boolean) + parallel_set = Column(BIT(1)) + insert_set = Column(BIT(1)) vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False, index=True) vendor = relationship("Vendor", back_populates="card_sets") cards = relationship("Card")