|
|
|
|
|
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 |
|
|
|
monitoring_bp = Blueprint("monitoring", __name__, url_prefix="/monitoring", template_folder="../templates/monitoring") |
|
|
|
|
|
|
|
@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) |
|
|
|
|
|
if frequency_minutes < 1: |
|
frequency_minutes = 1 |
|
|
|
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") |
|
|
|
|
|
return render_template("add_source.html", frequency_minutes=1440, is_active=True) |
|
|
|
@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) |
|
|
|
return render_template("view_source.html", source=source) |
|
|
|
|
|
|
|
@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) |
|
|
|
return render_template("view_event.html", event=event) |
|
|
|
|
|
|
|
|
|
|
|
|
|
@monitoring_bp.route("/") |
|
@login_required |
|
def index(): |
|
"""Redirects the base monitoring URL to the list of sources.""" |
|
return redirect(url_for("monitoring.list_sources")) |
|
|
|
|