waterdb / analytics.py
github-actions[bot]
Add all files with LFS support
4c46ca1
import json
import uuid
from datetime import datetime
from pathlib import Path
from typing import Any, Dict, Optional
import streamlit as st
def init_analytics_state() -> None:
"""Initialize analytics-related session state variables"""
if "logged_visit" not in st.session_state:
st.session_state.logged_visit = False
if "visitor_id" not in st.session_state:
st.session_state.visitor_id = str(uuid.uuid4())
def log_visit(current_section: Optional[str] = None) -> None:
"""Log visitor analytics including timestamp, user agent, and page info"""
if st.session_state.get("admin_authenticated", False):
return
log_file = Path("analytics.json")
now = datetime.now()
today = now.strftime("%Y-%m-%d")
try:
user_agent = st.context.headers.get("User-Agent", "Unknown")
except Exception:
user_agent = "Unknown"
visit_type = (
"initial" if not st.session_state.get("logged_visit") else "section_change"
)
visit_data = {
"timestamp": now.isoformat(),
"date": today,
"user_agent": user_agent,
"visitor_id": st.session_state.visitor_id,
"page_section": current_section
or st.session_state.get("current_section", "Overall Summary"),
"visit_type": visit_type,
"query_params": dict(st.query_params),
}
# Initialize default data structure
data = {
"visits": [],
"daily_counts": {},
"section_counts": {},
"daily_visitors": {},
}
# Try to load existing data, fallback to default if corrupted
if log_file.exists():
try:
with open(log_file, "r") as f:
data = json.load(f)
if "visits" not in data:
data["visits"] = []
if "daily_counts" not in data:
data["daily_counts"] = {}
if "section_counts" not in data:
data["section_counts"] = {}
if "daily_visitors" not in data:
data["daily_visitors"] = {}
except json.JSONDecodeError:
# If file is corrupted, backup the old file and start fresh
if log_file.exists():
backup_file = log_file.with_suffix(".json.bak")
log_file.rename(backup_file)
if today not in data["daily_visitors"]:
data["daily_visitors"][today] = []
if st.session_state.visitor_id not in data["daily_visitors"][today]:
data["daily_visitors"][today].append(st.session_state.visitor_id)
data["daily_counts"][today] = len(data["daily_visitors"][today])
data["visits"].append(visit_data)
current_section = visit_data["page_section"]
data["section_counts"][current_section] = (
data["section_counts"].get(current_section, 0) + 1
)
with open(log_file, "w") as f:
json.dump(data, f, indent=2)
def get_analytics_data() -> Dict[str, Any]:
"""Load and return analytics data from file"""
log_file = Path("analytics.json")
if not log_file.exists():
return {}
with open(log_file, "r") as f:
return json.load(f)