import os from datetime import datetime, timezone from flask import Flask from flask_sqlalchemy import SQLAlchemy from dotenv import load_dotenv load_dotenv() db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config["SECRET_KEY"] = os.getenv("SECRET_KEY", "dev-secret-change-me") app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv( "DATABASE_URL", "postgresql://photohost:photohost_secret@localhost:5432/photohost", ) app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False app.config["UPLOAD_FOLDER"] = os.getenv("UPLOAD_FOLDER", "uploads") app.config["MAX_CONTENT_LENGTH"] = int(os.getenv("MAX_UPLOAD_MB", "10")) * 1024 * 1024 app.config["ALLOWED_EXTENSIONS"] = {"png", "jpg", "jpeg", "gif", "webp", "bmp"} os.makedirs(app.config["UPLOAD_FOLDER"], exist_ok=True) db.init_app(app) from .routes import bp app.register_blueprint(bp) with app.app_context(): db.create_all() return app class Photo(db.Model): __tablename__ = "photos" id = db.Column(db.Integer, primary_key=True) filename = db.Column(db.String(255), nullable=False) original_name = db.Column(db.String(255), nullable=False) file_size = db.Column(db.Integer, nullable=False, default=0) mime_type = db.Column(db.String(100), nullable=False, default="image/jpeg") created_at = db.Column( db.DateTime, nullable=False, default=lambda: datetime.now(timezone.utc), ) @property def url(self): return f"/uploads/{self.filename}" @property def size_human(self): size = self.file_size for unit in ("Б", "КБ", "МБ", "ГБ"): if size < 1024: return f"{size:.0f} {unit}" if unit == "Б" else f"{size:.1f} {unit}" size /= 1024 return f"{size:.1f} ТБ"