soyailabs / app /models /webtoon.py
GitHub Actions
Auto-deploy from GitHub Actions - 2026-02-10 02:16:26
f4313a6
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) # Parent Chunk 정보 추가
tags = db.Column(db.Text, nullable=True) # 태그 정보 추가 (JSON)
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
}