from datetime import datetime from flask import Blueprint, render_template, request from flask_login import login_required from app.extensions import db from app.forms import LogFilterForm from app.models import ApiCallLog, ApiConfig logs_bp = Blueprint("logs", __name__, url_prefix="/logs") @logs_bp.route("", methods=["GET"]) @login_required def list_logs(): form = LogFilterForm(request.args) form.api_id.choices = [(-1, "All APIs")] + [(api.id, api.name) for api in ApiConfig.query.order_by(ApiConfig.name)] query = ApiCallLog.query.join(ApiConfig) if form.api_id.data and form.api_id.data != -1: query = query.filter(ApiCallLog.api_id == form.api_id.data) if form.success.data in {"1", "0"}: query = query.filter(ApiCallLog.success == (form.success.data == "1")) start = form.parse_date(form.start_date.data or "") end = form.parse_date(form.end_date.data or "") if start: query = query.filter(ApiCallLog.request_time >= start) if end: end_dt = datetime(end.year, end.month, end.day, 23, 59, 59) query = query.filter(ApiCallLog.request_time <= end_dt) page = int(request.args.get("page", 1)) per_page = int(request.args.get("per_page", 10)) pagination = query.order_by(ApiCallLog.request_time.desc()).paginate(page=page, per_page=per_page, error_out=False) return render_template("logs/list.html", form=form, pagination=pagination, logs=pagination.items) @logs_bp.route("/", methods=["GET"]) @login_required def log_detail(log_id: int): log_entry = ApiCallLog.query.get_or_404(log_id) return render_template("logs/detail.html", log=log_entry)