87 lines
2.5 KiB
Python
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, threads=1)
|