| | 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']) |