change schema

This commit is contained in:
Thomas Peetz
2025-04-23 22:54:37 +02:00
parent 4709e431b7
commit cb0fa3f728
10 changed files with 69 additions and 62 deletions
+8
View File
@@ -19,6 +19,14 @@ class ComicDetailsResponse(BaseModel):
volumes: List[str] volumes: List[str]
works: Dict[str, 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: def get_comic_details(comic: Comic) -> ComicDetailsResponse | None:
volumes = [] volumes = []
+19 -2
View File
@@ -1,3 +1,4 @@
from datetime import datetime
from uuid import UUID from uuid import UUID
from src.schema.media import MediaFile from src.schema.media import MediaFile
@@ -22,7 +23,23 @@ def get_file_details(mediafile: MediaFile) -> MediaFileResponse | None:
file_name=mediafile.file_name, file_name=mediafile.file_name,
cloud_link=mediafile.cloud_link, cloud_link=mediafile.cloud_link,
url=str(mediafile.url), url=str(mediafile.url),
review=mediafile.review, review=(mediafile.review == 1),
should_download=mediafile.should_download) 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 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
+5 -4
View File
@@ -3,7 +3,7 @@ from typing import List
from fastapi import APIRouter, HTTPException, status from fastapi import APIRouter, HTTPException, status
from sqlalchemy import select 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.models.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse, get_artist_details
from src.routers import SessionDep from src.routers import SessionDep
from src.schema.comic import Comic, Artist from src.schema.comic import Comic, Artist
@@ -16,11 +16,12 @@ router = APIRouter(
@router.get("/comics") @router.get("/comics")
def get_all_comics(db: SessionDep) -> list[ComicResponse]: def get_all_comics(db: SessionDep) -> List[ComicResponse]:
results: list[ComicResponse] = [] results: List[ComicResponse] = []
comics = db.scalars(select(Comic)).all() comics = db.scalars(select(Comic)).all()
for comic in comics: 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 return results
@router.get("/comics/{comic_id}", response_model=ComicDetailsResponse) @router.get("/comics/{comic_id}", response_model=ComicDetailsResponse)
+10 -35
View File
@@ -1,11 +1,10 @@
from datetime import datetime
from typing import List from typing import List
from uuid import uuid4, UUID from uuid import UUID
from fastapi import APIRouter, status, HTTPException from fastapi import APIRouter, status, HTTPException
from sqlalchemy import select, Sequence 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.routers import SessionDep
from src.schema.media import MediaFile from src.schema.media import MediaFile
@@ -21,13 +20,7 @@ def update_titles(db: SessionDep) -> list[MediaFileResponse]:
for mediafile in files: for mediafile in files:
mediafile.update_title() mediafile.update_title()
db.add(mediafile) db.add(mediafile)
response = MediaFileResponse(id=mediafile.id, response = get_file_details(mediafile)
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)
results.append(response) results.append(response)
db.commit() db.commit()
return results return results
@@ -38,19 +31,13 @@ def get_all_files(db: SessionDep, review: bool = False, download: bool = False)
results: list[MediaFileResponse] = [] results: list[MediaFileResponse] = []
files: Sequence[MediaFile] files: Sequence[MediaFile]
if review: if review:
files = db.query(MediaFile).filter(MediaFile.review == review).all() files = db.query(MediaFile).filter(MediaFile.review == 1).all()
elif download: elif download:
files = db.query(MediaFile).filter(MediaFile.should_download == download).all() files = db.query(MediaFile).filter(MediaFile.should_download == 1).all()
else: else:
files = db.scalars(select(MediaFile)).all() files = db.scalars(select(MediaFile)).all()
for mediafile in files: for mediafile in files:
response = MediaFileResponse(id=mediafile.id, response = get_file_details(mediafile)
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)
results.append(response) results.append(response)
return results return results
@@ -67,13 +54,7 @@ def update_file(file_id: UUID, db: SessionDep, info: MediaFileResponse) -> Media
mediaFile = db.get(MediaFile, file_id) mediaFile = db.get(MediaFile, file_id)
if not mediaFile: if not mediaFile:
raise HTTPException(status_code=404, detail="MediaFile could not be found") raise HTTPException(status_code=404, detail="MediaFile could not be found")
mediaFile.file_name = info.file_name set_file(info, mediaFile)
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
db.add(mediaFile) db.add(mediaFile)
db.commit() db.commit()
return info return info
@@ -85,17 +66,11 @@ def add_file(new_link: Link, db: SessionDep) -> MediaFileResponse:
try: try:
mediaFile: MediaFile = MediaFile() mediaFile: MediaFile = MediaFile()
setattr(mediaFile, "url", new_link.url) setattr(mediaFile, "url", new_link.url)
setattr(mediaFile, "review", True) setattr(mediaFile, "review", 1)
setattr(mediaFile, "should_download", True) setattr(mediaFile, "should_download", 1)
db.add(mediaFile) db.add(mediaFile)
db.commit() db.commit()
except: except:
raise HTTPException(status_code=409, detail="Link duplicate") raise HTTPException(status_code=409, detail="Link duplicate")
response = MediaFileResponse(id=uuid4(), response = get_file_details(mediaFile)
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)
return response return response
+6 -5
View File
@@ -1,6 +1,7 @@
from datetime import datetime 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 sqlalchemy.orm import relationship, mapped_column, Mapped
from .base import Base, BaseMixin from .base import Base, BaseMixin
@@ -13,7 +14,7 @@ class User(Base, BaseMixin):
user_name = Column(String(255), nullable=False) user_name = Column(String(255), nullable=False)
email = Column(String(255)) email = Column(String(255))
password = Column(String(255)) password = Column(String(255))
enabled = Column(Boolean) enabled = Column(BIT(1))
matrix = relationship("AuthorizationMatrix") matrix = relationship("AuthorizationMatrix")
tokens = relationship("Token") tokens = relationship("Token")
@@ -33,7 +34,7 @@ class Token(Base, BaseMixin):
token = Column(String(255), nullable=False, unique=True) token = Column(String(255), nullable=False, unique=True)
name = Column(String(255)) name = Column(String(255))
last_used_date: Mapped[datetime] = mapped_column() 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_id = Column(String(255), ForeignKey("user.id"), nullable=False)
user = relationship("User", back_populates="tokens") user = relationship("User", back_populates="tokens")
@@ -55,7 +56,7 @@ class AuthorizationMatrix(Base, BaseMixin):
class ModuleData(Base, BaseMixin): class ModuleData(Base, BaseMixin):
__tablename__ = "module_data" __tablename__ = "module_data"
module_name = Column(String(255), nullable=False) module_name = Column(String(255), nullable=False)
import_data = Column(Boolean) import_data = Column(BIT(1))
class MailAccount(Base, BaseMixin): class MailAccount(Base, BaseMixin):
@@ -65,7 +66,7 @@ class MailAccount(Base, BaseMixin):
protocol = Column(String(255)) protocol = Column(String(255))
user_name = Column(String(255)) user_name = Column(String(255))
password = Column(String(255)) password = Column(String(255))
start_tls = Column(Boolean) start_tls = Column(BIT(1))
class Mail(Base, BaseMixin): class Mail(Base, BaseMixin):
+4 -3
View File
@@ -1,7 +1,8 @@
import uuid import uuid
from datetime import datetime 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 from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
@@ -24,7 +25,7 @@ class BaseVideoMixin:
cloud_link = Column(String(255)) cloud_link = Column(String(255))
file_name = Column(String(255)) file_name = Column(String(255))
path = Column(String(255)) path = Column(String(255))
review = Column(Boolean) review = Column(BIT(1))
title = Column(String(255)) title = Column(String(255))
url = Column(String(255), unique=True) url = Column(String(255), unique=True)
should_download = Column(Boolean) should_download = Column(BIT(1))
+6 -5
View File
@@ -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 sqlalchemy.orm import relationship
from .base import Base, BaseMixin from .base import Base, BaseMixin
@@ -21,8 +22,8 @@ class Comic(Base, BaseMixin):
title = Column(String(length=255), unique=True) title = Column(String(length=255), unique=True)
publisher_id = Column(String, ForeignKey('publisher.id'), nullable=False) publisher_id = Column(String, ForeignKey('publisher.id'), nullable=False)
publisher = relationship("Publisher", back_populates="comics") publisher = relationship("Publisher", back_populates="comics")
current_order = Column(Boolean) current_order = Column(BIT(1))
completed = Column(Boolean) completed = Column(BIT(1))
issues = relationship("Issue") issues = relationship("Issue")
story_arcs = relationship("StoryArc") story_arcs = relationship("StoryArc")
trade_paperbacks = relationship("TradePaperback") trade_paperbacks = relationship("TradePaperback")
@@ -63,8 +64,8 @@ class StoryArc(Base, BaseMixin):
class Issue(Base, BaseMixin): class Issue(Base, BaseMixin):
__tablename__ = "issue" __tablename__ = "issue"
issue_number = Column(String(255)) issue_number = Column(String(255))
in_stock = Column(Boolean) in_stock = Column(BIT(1))
is_read = Column(Boolean) is_read = Column(BIT(1))
comic_id = Column(String, ForeignKey("comic.id"), nullable=False) comic_id = Column(String, ForeignKey("comic.id"), nullable=False)
comic = relationship("Comic", back_populates="issues") comic = relationship("Comic", back_populates="issues")
volume_id = Column(String, ForeignKey("volume.id"), nullable=True) volume_id = Column(String, ForeignKey("volume.id"), nullable=True)
+3 -2
View File
@@ -5,7 +5,8 @@ from pathlib import Path
import requests import requests
from bs4 import BeautifulSoup 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 sqlalchemy.orm import relationship
from .base import Base, BaseMixin, BaseVideoMixin from .base import Base, BaseMixin, BaseVideoMixin
@@ -83,7 +84,7 @@ class MediaActorFile(Base, BaseMixin):
class MediaArticle(Base, BaseMixin): class MediaArticle(Base, BaseMixin):
__tablename__ = 'media_article' __tablename__ = 'media_article'
review = Column(Boolean) review = Column(BIT(1))
title = Column(String(255)) title = Column(String(255))
url = Column(String(255), unique=True) url = Column(String(255), unique=True)
+4 -3
View File
@@ -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 sqlalchemy.orm import relationship
from .base import Base, BaseMixin from .base import Base, BaseMixin
@@ -27,8 +28,8 @@ class MetaDataColumn(Base, BaseMixin):
table = relationship("MetaDataTable", back_populates="table_columns") table = relationship("MetaDataTable", back_populates="table_columns")
column_label = Column(String(255)) column_label = Column(String(255))
filter_label = Column(String(255)) filter_label = Column(String(255))
is_shown = Column(Boolean) is_shown = Column(BIT(1))
show_filter = Column(Boolean) show_filter = Column(BIT(1))
ref_column = Column(String, nullable=True) ref_column = Column(String, nullable=True)
def __repr__(self): def __repr__(self):
+4 -3
View File
@@ -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 sqlalchemy.orm import relationship
from .base import Base, BaseMixin from .base import Base, BaseMixin
@@ -77,8 +78,8 @@ class CardSet(Base, BaseMixin):
UniqueConstraint("name", "vendor_id"), UniqueConstraint("name", "vendor_id"),
) )
name = Column(String(255), index=True) name = Column(String(255), index=True)
parallel_set = Column(Boolean) parallel_set = Column(BIT(1))
insert_set = Column(Boolean) insert_set = Column(BIT(1))
vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False, index=True) vendor_id = Column(String, ForeignKey("vendor.id"), nullable=False, index=True)
vendor = relationship("Vendor", back_populates="card_sets") vendor = relationship("Vendor", back_populates="card_sets")
cards = relationship("Card") cards = relationship("Card")