soyailabs / app /__init__.py
SOY NV AI
feat: Add webnovel continue upload feature and improve RAG
9fa456d
raw
history blame
4.8 kB
from flask import Flask
from flask_login import LoginManager
from app.database import db, User
import os
import sqlite3
from pathlib import Path
login_manager = LoginManager()
login_manager.login_view = 'main.login'
login_manager.login_message = '๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.'
login_manager.login_message_category = 'info'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
def create_app():
# ํ…œํ”Œ๋ฆฟ ํด๋” ๊ฒฝ๋กœ ๋ช…์‹œ์  ์„ค์ •
template_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'templates')
app = Flask(__name__, template_folder=template_folder)
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production')
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///finance_analysis.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024 # 100MB ํŒŒ์ผ ํฌ๊ธฐ ์ œํ•œ
db.init_app(app)
login_manager.init_app(app)
from app.routes import main_bp
app.register_blueprint(main_bp)
with app.app_context():
db.create_all()
# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (nickname ์ปฌ๋Ÿผ ์ถ”๊ฐ€)
migrate_database(app)
# ์ดˆ๊ธฐ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ
create_admin_user()
return app
def migrate_database(app):
"""๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜"""
try:
# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URI์—์„œ ๊ฒฝ๋กœ ์ถ”์ถœ
db_uri = app.config['SQLALCHEMY_DATABASE_URI']
if db_uri.startswith('sqlite:///'):
db_path = db_uri.replace('sqlite:///', '')
# ์ƒ๋Œ€ ๊ฒฝ๋กœ์ธ ๊ฒฝ์šฐ instance ํด๋” ๊ธฐ์ค€์œผ๋กœ ์ฒ˜๋ฆฌ
if not os.path.isabs(db_path):
db_path = os.path.join(app.instance_path, db_path)
if not os.path.exists(db_path):
print(f"[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค: {db_path}")
return
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# user ํ…Œ์ด๋ธ”์— nickname ์ปฌ๋Ÿผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
cursor.execute("PRAGMA table_info(user)")
user_columns = [column[1] for column in cursor.fetchall()]
if 'nickname' not in user_columns:
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] user ํ…Œ์ด๋ธ”์— nickname ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์ค‘...")
cursor.execute("ALTER TABLE user ADD COLUMN nickname VARCHAR(80)")
conn.commit()
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] user.nickname ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์™„๋ฃŒ")
# uploaded_file ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='uploaded_file'")
if cursor.fetchone():
# uploaded_file ํ…Œ์ด๋ธ”์— uploaded_by ์ปฌ๋Ÿผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
cursor.execute("PRAGMA table_info(uploaded_file)")
uploaded_file_columns = [column[1] for column in cursor.fetchall()]
if 'uploaded_by' not in uploaded_file_columns:
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] uploaded_file ํ…Œ์ด๋ธ”์— uploaded_by ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์ค‘...")
cursor.execute("ALTER TABLE uploaded_file ADD COLUMN uploaded_by INTEGER")
conn.commit()
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] uploaded_file.uploaded_by ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์™„๋ฃŒ")
# uploaded_file ํ…Œ์ด๋ธ”์— parent_file_id ์ปฌ๋Ÿผ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
if 'parent_file_id' not in uploaded_file_columns:
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] uploaded_file ํ…Œ์ด๋ธ”์— parent_file_id ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์ค‘...")
cursor.execute("ALTER TABLE uploaded_file ADD COLUMN parent_file_id INTEGER")
conn.commit()
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] uploaded_file.parent_file_id ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์™„๋ฃŒ")
conn.close()
print("[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์™„๋ฃŒ")
except Exception as e:
print(f"[๋งˆ์ด๊ทธ๋ ˆ์ด์…˜] ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
import traceback
traceback.print_exc()
def create_admin_user():
"""์ดˆ๊ธฐ ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ"""
admin_username = 'soymedia'
admin_password = 's0ymedi@1@34'
admin = User.query.filter_by(username=admin_username).first()
if not admin:
admin = User(username=admin_username, is_admin=True, is_active=True)
admin.set_password(admin_password)
db.session.add(admin)
db.session.commit()
print(f'๊ด€๋ฆฌ์ž ๊ณ„์ •์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: {admin_username}')