Files
TornActivityTracker/app/views.py

127 lines
4.2 KiB
Python

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
from datetime import datetime
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)
@views_bp.route('/server_time')
def server_time():
current_time = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
return {'server_time': current_time}
app.register_blueprint(views_bp)