import enum from sqlalchemy import Column, Integer, String, TIMESTAMP, Text, ForeignKey, Enum, UniqueConstraint, func from sqlalchemy.orm import relationship from .base import Base class BookStatusEnum(enum.Enum): available = 'available' borrowed = 'borrowed' reserved = 'reserved' class Book(Base): __tablename__ = 'book' __table_args__ = (UniqueConstraint('isbn'),) id = Column(Integer, primary_key=True, autoincrement=True) author_id = Column(Integer, ForeignKey('author.id'), nullable=False) title = Column(String(100), nullable=False) description = Column(Text, nullable=False) year_published = Column(String(4), nullable=False) isbn = Column(String(13), nullable=False, unique=True) status = Column(Enum(BookStatusEnum), nullable=False, default=BookStatusEnum.available) created_at = Column(TIMESTAMP, nullable=False, server_default=func.now()) last_updated = Column(TIMESTAMP, nullable=False, server_default=func.now()) author = relationship('Author', back_populates='books') categories = relationship('BookCategory',secondary='book_category_link',back_populates='books') def to_dict(self): book_dict = {col.name: getattr(self, col.name) for col in self.__table__.columns} book_dict['author'] = { 'first_name': self.author.first_name, 'last_name': self.author.last_name } book_dict['categories'] = [category.name for category in self.categories] return book_dict __all__ = ["Book", "BookStatusEnum"]