47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
import enum
|
|
|
|
from sqlalchemy import Column, Integer, String, TIMESTAMP, Text, ForeignKey, Enum, UniqueConstraint, func, DECIMAL,Boolean
|
|
from sqlalchemy.orm import relationship
|
|
|
|
from .base_model 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)
|
|
price = Column(DECIMAL(5, 2), nullable=False, default=0)
|
|
is_damaged = Column(Boolean, nullable=False, default=False)
|
|
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"]
|