79b37d1891
Co-authored-by: Cursor <cursoragent@cursor.com>
66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
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} ТБ"
|