119 lines
4.4 KiB
Python
119 lines
4.4 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
from typing import List, Optional
|
|
from sqlalchemy import Column, ForeignKey, Integer, String, Boolean, func
|
|
from sqlalchemy.orm import relationship, Mapped, mapped_column
|
|
|
|
from db.models.base import Base, BaseMixin
|
|
|
|
|
|
class Publisher(Base):
|
|
__tablename__ = "publisher"
|
|
id: Mapped[str] = mapped_column(primary_key=True, default=uuid.uuid4)
|
|
created_date: Mapped[datetime] = mapped_column(default=func.now())
|
|
last_modified_date: Mapped[datetime] = mapped_column(default=func.now())
|
|
version: Mapped[int] = mapped_column(default=0)
|
|
name = Column(String, unique=True)
|
|
parent_publisher_id: Mapped[Optional[str]] = mapped_column(ForeignKey('publisher.id'))
|
|
parent_publisher: Mapped[Optional['Publisher']] = relationship("Publisher", back_populates="imprints", remote_side=[id])
|
|
imprints: Mapped[List['Publisher']] = relationship('Publisher', back_populates="parent_publisher")
|
|
comics = relationship("Comic")
|
|
|
|
def __repr__(self):
|
|
return f'Publisher({self.id} {self.name})'
|
|
|
|
def __str__(self):
|
|
return self.__repr__()
|
|
|
|
|
|
class Comic(Base, BaseMixin):
|
|
__tablename__ = 'comic'
|
|
title = Column(String, unique=True)
|
|
publisher_id = Column(String, ForeignKey('publisher.id'), nullable=False)
|
|
publisher = relationship("Publisher", back_populates="comics")
|
|
current_order = Column(Boolean)
|
|
completed = Column(Boolean)
|
|
weblink = Column(String, nullable=True)
|
|
issues = relationship("Issue")
|
|
story_arcs = relationship("StoryArc")
|
|
trade_paperbacks = relationship("TradePaperback")
|
|
volumes = relationship("Volume")
|
|
comic_works = relationship("ComicWork")
|
|
|
|
def __repr__(self):
|
|
return f'Comic({self.id} {self.version} {self.title} {self.publisher.name})'
|
|
|
|
def __str__(self):
|
|
return f'{self.title}({self.id})'
|
|
|
|
|
|
class Volume(Base, BaseMixin):
|
|
__tablename__ = "volume"
|
|
name = Column(String, nullable=False)
|
|
comic_id = Column(String, ForeignKey("comic.id"), nullable=False)
|
|
comic = relationship("Comic", back_populates="volumes")
|
|
story_arcs = relationship("StoryArc")
|
|
issues = relationship("Issue")
|
|
|
|
|
|
class TradePaperback(Base, BaseMixin):
|
|
__tablename__ = "trade_paperback"
|
|
name = Column(String, nullable=False)
|
|
issue_start = Column(Integer)
|
|
issue_end = Column(Integer)
|
|
comic_id = Column(String, ForeignKey("comic.id"), nullable=False)
|
|
comic = relationship("Comic", back_populates="trade_paperbacks")
|
|
|
|
|
|
class StoryArc(Base, BaseMixin):
|
|
__tablename__ = "story_arc"
|
|
name = Column(String, nullable=False)
|
|
comic_id = Column(String, ForeignKey("comic.id"), nullable=False)
|
|
comic = relationship("Comic", back_populates="story_arcs")
|
|
volume_id = Column(String, ForeignKey("volume.id"), nullable=True)
|
|
volume = relationship("Volume", back_populates="story_arcs")
|
|
issues = relationship("Issue")
|
|
|
|
|
|
class Issue(Base, BaseMixin):
|
|
__tablename__ = "issue"
|
|
issue_number = Column(String)
|
|
in_stock = Column(Boolean)
|
|
is_read = Column(Boolean)
|
|
comic_id = Column(String, ForeignKey("comic.id"), nullable=False)
|
|
comic = relationship("Comic", back_populates="issues")
|
|
volume_id = Column(String, ForeignKey("volume.id"), nullable=True)
|
|
volume = relationship("Volume", back_populates="issues")
|
|
story_arc_id = Column(String, ForeignKey("story_arc.id"), nullable=True)
|
|
story_arc = relationship("StoryArc", back_populates="issues")
|
|
|
|
|
|
class Artist(Base, BaseMixin):
|
|
__tablename__ = "artist"
|
|
name = Column(String, nullable=False)
|
|
weblink = Column(String, nullable=True)
|
|
comic_works = relationship("ComicWork")
|
|
|
|
|
|
class WorkType(Base, BaseMixin):
|
|
__tablename__ = "worktype"
|
|
name = Column(String, nullable=False, unique=True)
|
|
comic_works = relationship("ComicWork")
|
|
|
|
def __repr__(self):
|
|
return f'Worktype({self.id} {self.version} {self.name} {len(self.comic_works)})'
|
|
|
|
def __str__(self):
|
|
return f'{self.name}({self.id})'
|
|
|
|
|
|
class ComicWork(Base, BaseMixin):
|
|
__tablename__ = "comic_work"
|
|
comic_id = Column(String, ForeignKey("comic.id"), nullable=False)
|
|
comic = relationship("Comic", back_populates="comic_works")
|
|
artist_id = Column(String, ForeignKey("artist.id"), nullable=False)
|
|
artist = relationship("Artist", back_populates="comic_works")
|
|
work_type_id = Column(String, ForeignKey("worktype.id"), nullable=False)
|
|
work_type = relationship("WorkType", back_populates="comic_works")
|
|
|