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"))