# src/routes/monitoring.py from flask import Blueprint, render_template, request, redirect, url_for, flash, session from src.extensions import db from src.decorators import login_required from src.models.monitoring import MonitoringSource, MonitoredEvent from src.models.legislation import Legislation # For linking events monitoring_bp = Blueprint("monitoring", __name__, url_prefix="/monitoring", template_folder="../templates/monitoring") # --- Monitoring Sources Routes --- @monitoring_bp.route("/sources") @login_required def list_sources(): """Lists all monitoring sources.""" sources = MonitoringSource.query.order_by(MonitoringSource.name).all() return render_template("list_sources.html", sources=sources) @monitoring_bp.route("/sources/add", methods=["GET", "POST"]) @login_required def add_source(): """Handles adding a new monitoring source.""" if request.method == "POST": name = request.form.get("name") url = request.form.get("url") source_type = request.form.get("source_type") frequency_minutes = request.form.get("frequency_minutes", type=int, default=1440) is_active = "is_active" in request.form if not name or not url or not source_type: flash("Name, URL, and Type are required for a monitoring source.", "warning") return render_template("add_source.html", name=name, url=url, source_type=source_type, frequency_minutes=frequency_minutes, is_active=is_active) # Basic validation (more can be added) if frequency_minutes < 1: frequency_minutes = 1 # Minimum frequency existing_source = MonitoringSource.query.filter_by(url=url).first() if existing_source: flash(f"A source with URL '{url}' already exists.", "warning") return render_template("add_source.html", name=name, url=url, source_type=source_type, frequency_minutes=frequency_minutes, is_active=is_active) new_source = MonitoringSource( name=name, url=url, type=source_type, frequency_minutes=frequency_minutes, is_active=is_active ) try: db.session.add(new_source) db.session.commit() flash(f"Monitoring source '{name}' added successfully.", "success") return redirect(url_for("monitoring.list_sources")) except Exception as e: db.session.rollback() flash(f"Error adding source: {e}", "danger") # GET request: Show the form return render_template("add_source.html", frequency_minutes=1440, is_active=True) # Defaults @monitoring_bp.route("/sources/") @login_required def view_source(source_id): """Displays details of a single monitoring source.""" source = MonitoringSource.query.get_or_404(source_id) # Potentially add editing functionality later return render_template("view_source.html", source=source) # --- Monitored Events Routes --- @monitoring_bp.route("/events") @login_required def list_events(): """Lists all detected monitored events.""" events = MonitoredEvent.query.order_by(MonitoredEvent.detected_at.desc()).all() return render_template("list_events.html", events=events) @monitoring_bp.route("/events/") @login_required def view_event(event_id): """Displays details of a single monitored event.""" event = MonitoredEvent.query.get_or_404(event_id) # Potentially add actions like review/link to legislation later return render_template("view_event.html", event=event) # Note: Actual monitoring (fetching data, creating events) would likely be a separate background task/script. # This blueprint focuses on managing sources and viewing detected events. @monitoring_bp.route("/") @login_required def index(): """Redirects the base monitoring URL to the list of sources.""" return redirect(url_for("monitoring.list_sources"))