Files
Stride/scripts/preview-fixture.py
T

87 lines
2.5 KiB
Python

"""Disposable UI fixture on port 5001. Synthetic friend-shared data; never reads Garmin files."""
import math
import sys
from datetime import UTC, datetime, timedelta
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from waitress import serve
from app import create_app
from app.display import persist_analysis
from app.extensions import db
from app.models import Activity, User
from app.records import persist_efforts
app = create_app(
{
"SQLALCHEMY_DATABASE_URI": "sqlite://",
"SECRET_KEY": "disposable-ui-fixture",
"LOCAL_SETUP": False,
"RATELIMIT_ENABLED": False,
}
)
with app.app_context():
db.create_all()
user = User(
username="preview",
display_name="Preview Runner",
email="preview@example.test",
password_hash="disabled",
)
db.session.add(user)
db.session.flush()
for i in range(5):
samples = [
{
"point": [51.507 + 0.007 * math.sin(n / 70), -0.14 + n / 25000],
"distance": n * 20,
"time": n * 5,
"speed": 2.8 + 0.3 * math.sin(n / 20),
"heart_rate": 140 + 12 * math.sin(n / 30),
"elevation": 10 + n / 30,
}
for n in range(300)
]
db.session.add(
Activity(
owner_id=user.id,
source_key=f"fixture:{i}",
title=[
"Morning miles",
"A little further",
"Easy Sunday",
"Tempo session",
"Evening loop",
][i],
started_at=datetime.now(UTC) - timedelta(days=i * 5),
distance_m=6000 + i * 700,
duration_s=2100 + i * 200,
elevation_m=38 + i * 7,
avg_hr=145,
sport="running",
visibility="friends",
samples=samples,
laps=[{"distance": 1000, "duration": 350, "pace": 350, "heart_rate": 145}] * 6,
)
)
for row in list(db.session.new):
if isinstance(row, Activity):
persist_efforts(row)
persist_analysis(row)
db.session.commit()
# Test-only auto-login, isolated to this ephemeral process/database.
from flask_login import login_user
@app.before_request
def preview_login():
login_user(db.session.get(User, 1))
if __name__ == "__main__":
serve(app, host="127.0.0.1", port=5001)