File size: 3,966 Bytes
0a40ab8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# 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/<int:source_id>")
@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/<int:event_id>")
@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"))
|