import os from werkzeug.utils import secure_filename from functools import wraps from flask import current_app, request, redirect, url_for, session, send_file import markdown from markupsafe import Markup from app.extensions import db from app.models import Image import io def markdown_to_html(text): return Markup(markdown.markdown(text, extensions=['fenced_code', 'tables'])) def allowed_file(filename): """Check if uploaded file has allowed extension""" return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in current_app.config['ALLOWED_EXTENSIONS'] def handle_image_upload(file): """Handle image upload and store in database""" if file and allowed_file(file.filename): filename = secure_filename(file.filename) image = Image( filename=filename, data=file.read(), mime_type=file.content_type ) db.session.add(image) db.session.commit() return f'/api/images/{image.id}' return None def login_required(f): """Decorator to require login for admin routes""" @wraps(f) def decorated_function(*args, **kwargs): if not session.get('logged_in'): return redirect(url_for('admin.login')) return f(*args, **kwargs) return decorated_function def check_auth(username, password): """Check if username and password match environment variables""" return (username == current_app.config['ADMIN_USERNAME'] and password == current_app.config['ADMIN_PASSWORD'])