Stream GWR walk-on fares client-side instead of blocking page render
Walk-on fares are now always fetched in the browser via WALKON_API_URLS rather than synchronously on the server. This means the page renders immediately with timetable and Eurostar prices, and NR fares fill in shortly after without delaying the initial load. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b184e27a63
commit
03d2a53961
3 changed files with 16 additions and 21 deletions
17
app.py
17
app.py
|
|
@ -497,22 +497,7 @@ def _results(station_crs, slug, travel_date, journey_type, return_date):
|
|||
)
|
||||
|
||||
fare_direction = "to_paddington" if direction == "outbound" else "from_paddington"
|
||||
gwr_fares = get_cached(gwr_cache_key, ttl=30 * 24 * 3600)
|
||||
if gwr_fares is not None:
|
||||
from_cache_parts.append(gwr_cache_key)
|
||||
elif nr_provisional or es_provisional:
|
||||
gwr_fares = {}
|
||||
else:
|
||||
gwr_fares = cached_fetch(
|
||||
gwr_cache_key,
|
||||
30 * 24 * 3600,
|
||||
(
|
||||
(lambda: gwr_fares_scraper.fetch(station_crs, section_date))
|
||||
if fare_direction == "to_paddington"
|
||||
else (lambda: gwr_fares_scraper.fetch(station_crs, section_date, direction=fare_direction))
|
||||
),
|
||||
"GWR fares",
|
||||
)
|
||||
gwr_fares = {}
|
||||
cached_advance = get_cached(advance_cache_key, ttl=24 * 3600)
|
||||
|
||||
if direction == "outbound":
|
||||
|
|
|
|||
|
|
@ -351,9 +351,21 @@
|
|||
});
|
||||
}
|
||||
|
||||
function loadWalkonFares() {
|
||||
for (var sectionId in WALKON_API_URLS) {
|
||||
(function(id, url) {
|
||||
fetch(url).then(function(r) { return r.json(); }).then(function(fares) {
|
||||
mergeWalkonFares(id, fares);
|
||||
updateDisplay();
|
||||
});
|
||||
})(sectionId, WALKON_API_URLS[sectionId]);
|
||||
}
|
||||
}
|
||||
|
||||
function initialiseResultsPage() {
|
||||
if (currentNrClass === 'advance_std' || currentNrClass === 'advance_1st') loadMissingAdvanceFares();
|
||||
updateDisplay();
|
||||
loadWalkonFares();
|
||||
startTimetableRefresh();
|
||||
}
|
||||
|
||||
|
|
@ -500,7 +512,6 @@
|
|||
{% set row_class = '' %}
|
||||
{% endif %}
|
||||
<tr class="{{ row_class }}" data-row-key="{{ row.row_key }}"
|
||||
{% if row.ticket_price is not none %}data-walkon="{{ row.ticket_price }}"{% endif %}
|
||||
{% if row.eurostar_price is not none %}data-es-std="{{ row.eurostar_price }}"{% endif %}>
|
||||
{% if row.row_type == 'trip' %}
|
||||
{% if section.direction == 'inbound' %}
|
||||
|
|
|
|||
|
|
@ -374,11 +374,10 @@ def test_results_shows_eurostar_price_and_total(monkeypatch):
|
|||
html = resp.get_data(as_text=True)
|
||||
|
||||
assert resp.status_code == 200
|
||||
assert '£59' in html # Eurostar Standard price
|
||||
assert '£138.70' in html # Walk-on price shown in NR cell
|
||||
# Total (£197.70) is computed client-side; verify data attributes carry the right values
|
||||
assert 'data-walkon="138.7"' in html
|
||||
assert '£59' in html # Eurostar Standard price in initial render
|
||||
assert '£138.70' not in html # Walk-on price is streamed, not server-rendered
|
||||
assert 'data-es-std="59"' in html
|
||||
assert '/api/walkon_fares/BRI/' in html # client will fetch walk-on fares
|
||||
|
||||
|
||||
def test_results_uses_unique_row_keys_for_same_eurostar(monkeypatch):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue