# app/main.py from flask import Blueprint, render_template, flash, redirect, url_for, abort, send_from_directory, request from flask_login import login_required, current_user from sqlalchemy import desc, func from app.utils.image_importer import import_images_task from app.models import ImageRecord from app import db import os main = Blueprint('main', __name__) @main.route('/') def index(): return render_template('index.html') @main.route('/gallery') @login_required def gallery(): recent_images = 21 images = ImageRecord.query.order_by( desc(func.coalesce(ImageRecord.taken_at, ImageRecord.imported_at)) ).limit(recent_images).all() return render_template('gallery.html', images=images) @main.route('/static/images/') def serve_image(filename): return send_from_directory('/images', filename) @main.route('/artist/') def artist_gallery(artist_name): per_page=49 page = request.args.get('page', 1, type=int) images = ImageRecord.query.filter_by(artist=artist_name).order_by( desc(func.coalesce(ImageRecord.taken_at, ImageRecord.imported_at)) ).paginate(page=page, per_page=per_page) return render_template('artist_gallery.html', images=images, artist=artist_name) @main.route('/settings') @login_required def settings(): if not current_user.is_admin: abort(403) return render_template('settings.html') @main.route('/import-images') @login_required def trigger_image_import(): if not current_user.is_admin: abort(403) source_dir = '/import' dest_dir = '/images' result = import_images_task(source_dir, dest_dir) flash(f"Image import completed: {result}") return redirect(url_for('main.settings')) @main.route('/reset-db', methods=['POST']) @login_required def reset_db(): if not current_user.is_admin: abort(403) ImageRecord.query.delete() db.session.commit() flash("Database has been reset. All image records removed.", "info") return redirect(url_for('main.settings'))