import os import glob 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 from app.analysis import load_data, load_analysis_modules views_bp = Blueprint("views", __name__) def register_views(app): @app.route('/') def index(): form = ScrapingForm() return render_template('index.html', form=form) @app.route('/results') def results(): return render_template('results.html') @app.route('/log_viewer') def log_viewer(): return render_template('log_viewer.html') @app.route('/download_results') def download_results(): log_file_name = os.path.abspath(app.config['LOG_FILE_NAME']) scraper = app.config.get('SCRAPER') if scraper: print(scraper.data_file_name) if not scraper: print("Scraper not initialized") data_dir = os.path.abspath(current_app.config['DATA']['DATA_DIR']) log_dir = os.path.abspath(current_app.config['LOGGING']['LOG_DIR']) data_files = glob.glob(os.path.join(data_dir, "*.csv")) log_files = glob.glob(os.path.join(log_dir, "*.log")) def get_file_info(file_path): return { "name": file_path, "name_display": os.path.basename(file_path), "last_modified": os.path.getmtime(file_path), "created": os.path.getctime(file_path), "size": get_size(file_path) } data_files_info = [get_file_info(file) for file in data_files] log_files_info = [get_file_info(file) for file in log_files] if scraper and scraper.scraping_active: for data_file in data_files_info: if os.path.abspath(scraper.data_file_name) == data_file['name']: data_file['active'] = True else: data_file['active'] = False for log_file in log_files_info: if log_file_name == os.path.abspath(log_file['name']): log_file['active'] = True else: log_file['active'] = False data_files_info.sort(key=lambda x: x['last_modified'], reverse=True) log_files_info.sort(key=lambda x: x['last_modified'], reverse=True) files = {"data": data_files_info, "log": log_files_info} return render_template('download_results.html', files=files) views_bp = Blueprint("views", __name__) @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 [] context = { "data_files": data_files, "analyses": analysis_modules, "selected_file": selected_file, "selected_analyses": selected_analyses } 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) df = load_data(selected_file) results = {} 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)