From 4936d8c861e93684e5e64d67f6d9973fe1f6f4e6 Mon Sep 17 00:00:00 2001 From: maxDorninger <97409287+maxDorninger@users.noreply.github.com> Date: Sun, 22 Jun 2025 19:44:37 +0200 Subject: [PATCH] edit db schema to add support for movies --- media_manager/movies/models.py | 68 +++++++++++++++++++++++++++++++++ media_manager/torrent/models.py | 1 + 2 files changed, 69 insertions(+) create mode 100644 media_manager/movies/models.py diff --git a/media_manager/movies/models.py b/media_manager/movies/models.py new file mode 100644 index 0000000..5544e35 --- /dev/null +++ b/media_manager/movies/models.py @@ -0,0 +1,68 @@ +from uuid import UUID + +from sqlalchemy import ForeignKey, PrimaryKeyConstraint, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from media_manager.auth.db import User +from media_manager.database import Base +from media_manager.torrent.models import Quality + + +class Movie(Base): + __tablename__ = "movie" + __table_args__ = (UniqueConstraint("external_id", "metadata_provider"),) + + id: Mapped[UUID] = mapped_column(primary_key=True) + external_id: Mapped[int] + metadata_provider: Mapped[str] + name: Mapped[str] + overview: Mapped[str] + year: Mapped[int | None] + movie_requests: Mapped[list["MovieRequest"]] = relationship( + "MovieRequest", back_populates="movie", cascade="all, delete-orphan" + ) + + +class MovieFile(Base): + __tablename__ = "movie_file" + __table_args__ = (PrimaryKeyConstraint("movie_id", "file_path_suffix"),) + + movie_id: Mapped[UUID] = mapped_column( + ForeignKey(column="movie.id", ondelete="CASCADE"), + ) + file_path_suffix: Mapped[str] + + quality: Mapped[Quality] + torrent_id: Mapped[UUID | None] = mapped_column( + ForeignKey(column="torrent.id", ondelete="SET NULL"), + ) + + torrent = relationship("Torrent", back_populates="movie_files", uselist=False) + + +class MovieRequest(Base): + __tablename__ = "movie_request" + __table_args__ = (UniqueConstraint("season_id", "wanted_quality"),) + id: Mapped[UUID] = mapped_column(primary_key=True) + movie_id: Mapped[UUID] = mapped_column( + ForeignKey(column="movie.id", ondelete="CASCADE"), + ) + wanted_quality: Mapped[Quality] + min_quality: Mapped[Quality] + + authorized: Mapped[bool] = mapped_column(default=False) + + requested_by_id: Mapped[UUID | None] = mapped_column( + ForeignKey(column="user.id", ondelete="SET NULL"), + ) + authorized_by_id: Mapped[UUID | None] = mapped_column( + ForeignKey(column="user.id", ondelete="SET NULL"), + ) + + requested_by: Mapped["User|None"] = relationship( + foreign_keys=[requested_by_id], uselist=False + ) + authorized_by: Mapped["User|None"] = relationship( + foreign_keys=[authorized_by_id], uselist=False + ) + movie = relationship("Movie", back_populates="movie_requests", uselist=False) diff --git a/media_manager/torrent/models.py b/media_manager/torrent/models.py index e9b8780..1107593 100644 --- a/media_manager/torrent/models.py +++ b/media_manager/torrent/models.py @@ -16,3 +16,4 @@ class Torrent(Base): hash: Mapped[str] season_files = relationship("SeasonFile", back_populates="torrent") + movie_files = relationship("MovieFile", back_populates="torrent") \ No newline at end of file