fixes #4 - adds modular analyses system using plugins
This commit is contained in:
61
app/views.py
61
app/views.py
@@ -5,9 +5,10 @@ from flask import render_template, Blueprint, current_app, request
|
||||
from app.forms import ScrapingForm
|
||||
from app.util import get_size
|
||||
from app.config import load_config
|
||||
from app.api import scraper as scraper# Import the scraper instance
|
||||
from app.api import scraper as scraper
|
||||
from app.logging_config import get_logger
|
||||
from app.analysis import load_data, generate_statistics, plot_activity_distribution
|
||||
|
||||
from app.analysis import load_data, load_analysis_modules
|
||||
|
||||
|
||||
from app.state import log_file_name
|
||||
@@ -29,10 +30,6 @@ def register_views(app):
|
||||
def results():
|
||||
return render_template('results.html')
|
||||
|
||||
@app.route('/analyze')
|
||||
def analyze():
|
||||
return render_template('analyze.html')
|
||||
|
||||
@app.route('/log_viewer')
|
||||
def log_viewer():
|
||||
return render_template('log_viewer.html')
|
||||
@@ -87,42 +84,44 @@ def register_views(app):
|
||||
|
||||
views_bp = Blueprint("views", __name__)
|
||||
|
||||
@views_bp.route("/data-visualization", methods=["GET", "POST"])
|
||||
def data_visualization():
|
||||
"""Route to display activity statistics with a visualization."""
|
||||
data_dir = current_app.config["DATA"]["DATA_DIR"]
|
||||
@views_bp.route("/analyze", methods=["GET", "POST"])
|
||||
def analyze():
|
||||
analysis_modules = load_analysis_modules() # Load available analyses
|
||||
data_dir = current_app.config.get("DATA", {}).get("DATA_DIR")
|
||||
|
||||
selected_file = None
|
||||
selected_analyses = []
|
||||
|
||||
# Find all available CSV files
|
||||
data_files = sorted(
|
||||
glob.glob(os.path.join(data_dir, "*.csv")),
|
||||
key=os.path.getmtime,
|
||||
reverse=True
|
||||
)
|
||||
) if data_dir else []
|
||||
|
||||
if not data_files:
|
||||
return render_template("data_visualization.html", error="No data files found.", data_files=[])
|
||||
context = {
|
||||
"data_files": data_files,
|
||||
"analyses": analysis_modules,
|
||||
"selected_file": selected_file,
|
||||
"selected_analyses": selected_analyses
|
||||
}
|
||||
|
||||
# Get the selected file from the dropdown (default to the latest file)
|
||||
selected_file = request.form.get("data_file", data_files[0] if data_files else None)
|
||||
if request.method == "POST":
|
||||
selected_analyses = request.form.getlist("analyses")
|
||||
selected_file = request.form.get("data_file")
|
||||
|
||||
if not selected_file:
|
||||
context["error"] = "No file selected."
|
||||
return render_template("analyze.html", **context)
|
||||
|
||||
if selected_file and os.path.exists(selected_file):
|
||||
df = load_data(selected_file)
|
||||
statistics = generate_statistics(df)
|
||||
|
||||
# ✅ Generate the plot and get the correct URL path
|
||||
# remove app/ from the base URL
|
||||
plot_url = plot_activity_distribution(df).replace("app/", "")
|
||||
|
||||
else:
|
||||
return render_template("data_visualization.html", error="Invalid file selection.", data_files=data_files)
|
||||
results = {}
|
||||
|
||||
return render_template(
|
||||
"data_visualization.html",
|
||||
plot_url=plot_url,
|
||||
statistics=statistics.to_dict(),
|
||||
data_files=data_files,
|
||||
selected_file=selected_file
|
||||
)
|
||||
for analysis in analysis_modules:
|
||||
if analysis.name in selected_analyses:
|
||||
results[analysis.name] = analysis.execute(df) # Some may return HTML
|
||||
|
||||
context["results"] = results
|
||||
|
||||
return render_template("analyze.html", **context)
|
||||
app.register_blueprint(views_bp)
|
||||
|
||||
Reference in New Issue
Block a user