from flask import Blueprint, flash, redirect, render_template, request, url_for from flask_login import login_required from app.extensions import db from app.guides import GUIDES from app.models import Mirror, Profile, ProfileItem, TestResult from app.services.tester import test_all_enabled, test_mirror mirrors_bp = Blueprint("mirrors", __name__, url_prefix="/mirrors") @mirrors_bp.route("/") @login_required def list_mirrors(): category = request.args.get("category") query = Mirror.query.order_by(Mirror.category, Mirror.priority) if category: query = query.filter_by(category=category) mirrors = query.all() categories = Mirror.CATEGORIES return render_template( "mirrors/list.html", mirrors=mirrors, categories=categories, category_labels=Mirror.CATEGORY_LABELS, current_category=category, guides=GUIDES, ) @mirrors_bp.route("/create", methods=["GET", "POST"]) @login_required def create(): if request.method == "POST": mirror = Mirror( category=request.form["category"], name=request.form["name"].strip(), url=request.form.get("url", "").strip() or None, ips=request.form.get("ips", "").strip() or None, priority=int(request.form.get("priority", 100)), enabled=request.form.get("enabled") == "on", notes=request.form.get("notes", "").strip() or None, ) meta_prefix = request.form.get("instead_prefix", "").strip() if meta_prefix: mirror.set_meta({"instead_prefix": meta_prefix}) db.session.add(mirror) db.session.commit() flash("میرور با موفقیت ایجاد شد.", "success") return redirect(url_for("mirrors.list_mirrors")) return render_template( "mirrors/form.html", mirror=None, categories=Mirror.CATEGORIES, category_labels=Mirror.CATEGORY_LABELS, ) @mirrors_bp.route("//edit", methods=["GET", "POST"]) @login_required def edit(mirror_id): mirror = Mirror.query.get_or_404(mirror_id) if request.method == "POST": mirror.category = request.form["category"] mirror.name = request.form["name"].strip() mirror.url = request.form.get("url", "").strip() or None mirror.ips = request.form.get("ips", "").strip() or None mirror.priority = int(request.form.get("priority", 100)) mirror.enabled = request.form.get("enabled") == "on" mirror.notes = request.form.get("notes", "").strip() or None meta_prefix = request.form.get("instead_prefix", "").strip() if meta_prefix: mirror.set_meta({"instead_prefix": meta_prefix}) db.session.commit() flash("میرور به‌روزرسانی شد.", "success") return redirect(url_for("mirrors.list_mirrors")) return render_template( "mirrors/form.html", mirror=mirror, categories=Mirror.CATEGORIES, category_labels=Mirror.CATEGORY_LABELS, ) @mirrors_bp.route("//delete", methods=["POST"]) @login_required def delete(mirror_id): mirror = Mirror.query.get_or_404(mirror_id) db.session.delete(mirror) db.session.commit() flash("میرور حذف شد.", "warning") return redirect(url_for("mirrors.list_mirrors")) @mirrors_bp.route("//test", methods=["POST"]) @login_required def test_one(mirror_id): mirror = Mirror.query.get_or_404(mirror_id) results = test_mirror(mirror) ok = all(r.success for r in results) flash( f"تست {mirror.name}: {'موفق' if ok else 'ناموفق'}", "success" if ok else "danger", ) return redirect(url_for("mirrors.list_mirrors", category=mirror.category)) @mirrors_bp.route("/test-all", methods=["POST"]) @login_required def test_all(): category = request.form.get("category") or None test_all_enabled(category) flash("تست همه میرورها انجام شد.", "info") return redirect(url_for("mirrors.list_mirrors", category=category)) @mirrors_bp.route("/results") @login_required def results(): category = request.args.get("category") query = TestResult.query.join(Mirror).order_by(TestResult.tested_at.desc()) if category: query = query.filter(Mirror.category == category) results_list = query.limit(100).all() return render_template( "mirrors/results.html", results=results_list, category_labels=Mirror.CATEGORY_LABELS, current_category=category, categories=Mirror.CATEGORIES, )