| from app.database import db |
| from datetime import datetime |
|
|
| class Webtoon(db.Model): |
| """분석할 웹툰 정보를 담는 모델""" |
| __tablename__ = 'webtoon' |
| |
| id = db.Column(db.Integer, primary_key=True) |
| title = db.Column(db.String(255), nullable=False) |
| synopsis = db.Column(db.Text, nullable=True) |
| summary = db.Column(db.Text, nullable=True) |
| characters_info = db.Column(db.Text, nullable=True) |
| world_info = db.Column(db.Text, nullable=True) |
| genre = db.Column(db.String(100), nullable=True) |
| analysis_prompt = db.Column(db.Text, nullable=True) |
| analysis_content = db.Column(db.Text, nullable=True) |
| analysis_model = db.Column(db.String(100), nullable=True) |
| analysis_updated_at = db.Column(db.DateTime, nullable=True) |
| is_public = db.Column(db.Boolean, default=False, nullable=False) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) |
| updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) |
| user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) |
| parent_chunk = db.Column(db.Text, nullable=True) |
| tags = db.Column(db.Text, nullable=True) |
|
|
| user = db.relationship('User', backref='webtoons') |
|
|
| def to_dict(self): |
| return { |
| 'id': self.id, |
| 'title': self.title, |
| 'synopsis': self.synopsis, |
| 'summary': self.summary, |
| 'characters_info': self.characters_info, |
| 'world_info': self.world_info, |
| 'genre': self.genre, |
| 'analysis_prompt': self.analysis_prompt, |
| 'analysis_content': self.analysis_content, |
| 'analysis_model': self.analysis_model, |
| 'analysis_updated_at': self.analysis_updated_at.isoformat() if self.analysis_updated_at else None, |
| 'is_public': self.is_public, |
| 'created_at': self.created_at.isoformat() if self.created_at else None, |
| 'updated_at': self.updated_at.isoformat() if self.updated_at else None, |
| 'user_id': self.user_id, |
| 'parent_chunk': self.parent_chunk, |
| 'tags': self.tags |
| } |
|
|
|
|
| class WebtoonEpisode(db.Model): |
| """웹툰 회차 등록 및 분석 모델""" |
| __tablename__ = 'webtoon_episode' |
|
|
| id = db.Column(db.Integer, primary_key=True) |
| webtoon_id = db.Column(db.Integer, db.ForeignKey('webtoon.id'), nullable=False) |
| episode_number = db.Column(db.Integer, nullable=False) |
| title = db.Column(db.String(200), nullable=False) |
| content = db.Column(db.Text, nullable=True) |
| analysis_content = db.Column(db.Text, nullable=True) |
| final_analysis_content = db.Column(db.Text, nullable=True) |
| final_dialogues_short_json = db.Column(db.Text, nullable=True) |
| final_dialogues_full_json = db.Column(db.Text, nullable=True) |
| novel_content = db.Column(db.Text, nullable=True) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) |
| updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) |
|
|
| webtoon = db.relationship('Webtoon', backref=db.backref('episodes', cascade='all, delete-orphan', order_by='WebtoonEpisode.episode_number')) |
|
|
| __table_args__ = ( |
| db.UniqueConstraint('webtoon_id', 'episode_number', name='uq_webtoon_episode_number'), |
| ) |
|
|
| def to_dict(self): |
| return { |
| 'id': self.id, |
| 'webtoon_id': self.webtoon_id, |
| 'episode_number': self.episode_number, |
| 'title': self.title, |
| 'content': self.content, |
| 'analysis_content': self.analysis_content, |
| 'final_analysis_content': self.final_analysis_content, |
| 'final_dialogues_short_json': self.final_dialogues_short_json, |
| 'final_dialogues_full_json': self.final_dialogues_full_json, |
| 'novel_content': self.novel_content, |
| 'created_at': self.created_at.isoformat() if self.created_at else None, |
| 'updated_at': self.updated_at.isoformat() if self.updated_at else None |
| } |
|
|
|
|
| class WebtoonEpisodeImage(db.Model): |
| """웹툰 회차 이미지 및 분석 결과""" |
| __tablename__ = 'webtoon_episode_image' |
|
|
| id = db.Column(db.Integer, primary_key=True) |
| episode_id = db.Column(db.Integer, db.ForeignKey('webtoon_episode.id'), nullable=False) |
| sequence_index = db.Column(db.Integer, nullable=False) |
| image_path = db.Column(db.String(500), nullable=False) |
| analysis_content = db.Column(db.Text, nullable=True) |
| dialogues_json = db.Column(db.Text, nullable=True) |
| dialogues_short_json = db.Column(db.Text, nullable=True) |
| dialogues_full_json = db.Column(db.Text, nullable=True) |
| created_at = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) |
| updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) |
|
|
| episode = db.relationship('WebtoonEpisode', backref=db.backref('images', cascade='all, delete-orphan', order_by='WebtoonEpisodeImage.sequence_index')) |
|
|
| __table_args__ = ( |
| db.UniqueConstraint('episode_id', 'sequence_index', name='uq_webtoon_episode_image_sequence'), |
| ) |
|
|
| def to_dict(self): |
| return { |
| 'id': self.id, |
| 'episode_id': self.episode_id, |
| 'sequence_index': self.sequence_index, |
| 'image_path': self.image_path, |
| 'analysis_content': self.analysis_content, |
| 'dialogues_json': self.dialogues_json, |
| 'dialogues_short_json': self.dialogues_short_json, |
| 'dialogues_full_json': self.dialogues_full_json, |
| 'created_at': self.created_at.isoformat() if self.created_at else None, |
| 'updated_at': self.updated_at.isoformat() if self.updated_at else None |
| } |
|
|