fix: Nightscout API silently truncated multi-day fetches to ~3-4 days
_entries_since/_treatments_since requested a single page via `count`, but Nightscout's /api/v1/entries and /api/v1/treatments ignore a large `count` and cap the response around ~1150/~700 documents regardless of how far back the requested period goes. Every report page relying on fetch_entries_range/fetch_treatments_range (7/14/30/90-day selectors) was silently only getting the most recent ~3-4 days, no matter the selected period. Fixed by paginating with `find[date][$lte]` cursors in a new _paginated_get(), walking back until the requested `since` boundary is reached or the server returns a short/empty page (= genuinely no more data, confirmed by manually paginating against the real instance: entries go back 50+ days, treatments only ~4 days on this install). Also added reporting.completeness_warning(), shared by the interactive pages (via ui_common.render_completeness_warning) and the PDF export, that distinguishes "a structural gap at the start of the period" (data wasn't fetched/available) from "scattered gaps below the clinical AGP coverage threshold" (Danne et al. 2017) — the previous single generic "X% sensor coverage" message read as a CGM/sensor problem even when the real cause was this fetch bug.
This commit is contained in:
+13
-1
@@ -15,7 +15,7 @@ import plotly.graph_objects as go
|
||||
import streamlit as st
|
||||
|
||||
from nightscout_client import fetch_entries_range, fetch_treatments_range
|
||||
from reporting import detect_events, summarize_events
|
||||
from reporting import completeness_warning, detect_events, summarize_events
|
||||
|
||||
MMOL_HOVERTEMPLATE = "%{x|%d-%m %H:%M} · %{y:.1f} mmol/L<extra></extra>"
|
||||
|
||||
@@ -98,6 +98,18 @@ def load_range_data(start: date, end: date):
|
||||
return glucose, treatments
|
||||
|
||||
|
||||
def render_completeness_warning(glucose: pd.DataFrame, start: date, end: date) -> None:
|
||||
"""Toon reporting.completeness_warning()'s oordeel als st.warning, indien nodig.
|
||||
|
||||
Gebruikt door elke rapportagepagina, direct na de load_range_data-call.
|
||||
De beoordelingslogica zelf staat in reporting.py (pure functie) zodat het
|
||||
PDF-rapport (pdf_export.py) exact dezelfde disclaimer kan hergebruiken.
|
||||
"""
|
||||
message = completeness_warning(glucose, start, end)
|
||||
if message:
|
||||
st.warning(message)
|
||||
|
||||
|
||||
def render_event_level(
|
||||
glucose: pd.DataFrame,
|
||||
threshold: float,
|
||||
|
||||
Reference in New Issue
Block a user