Limit order discovery and Open Food Facts searches

This commit is contained in:
Edward Betts 2026-10-07 11:16:50 +01:00
parent 628e5c3823
commit 41772b4d1a
5 changed files with 185 additions and 78 deletions

View file

@ -66,7 +66,9 @@ def wait_for_orders(page, timeout, echo):
raise ImportError("Timed out waiting for order history; rerun to reuse the saved browser session")
def discover_orders(page, echo):
def discover_orders(page, echo, *, completed=(), order_ids=()):
completed = set(completed)
requested = set(order_ids)
last_count = -1
stable = 0
for _ in range(500):
@ -76,8 +78,17 @@ def discover_orders(page, echo):
else:
stable = 0
echo(f"Loaded {count} order links...")
links = order_links(page.content())
visible = {link.order_id for link in links}
# Ocado lists newest orders first. Keep the whole visible batch so
# incomplete orders alongside the completion boundary remain eligible.
if requested:
if requested <= visible:
return links
elif completed & visible:
return links
if page.locator('[data-test="order-list-no-more-orders-label"]').count():
return order_links(page.content())
return links
if stable >= 10:
raise ImportError("Order history stopped loading before Ocado's end-of-list marker; retry after checking the browser")
last_count = count
@ -109,8 +120,8 @@ def download_orders(profile, archive, *, since=None, limit=None, login_only=Fals
if login_only:
echo("Signed-in browser session saved.")
return [], []
links = discover_orders(page, echo)
private_json(archive / "orders.json", [asdict(link) for link in links])
links = discover_orders(page, echo, completed=completed, order_ids=order_ids)
links = save_order_manifest(archive, links)
links = select_orders(links, since, limit, order_ids, completed)
receipts, failures = [], []
for index, link in enumerate(links,1):
@ -161,6 +172,17 @@ def download_orders(profile, archive, *, since=None, limit=None, login_only=Fals
context.close()
def save_order_manifest(archive, links):
"""Retain older history and pending imports after an incremental scan."""
path = archive / "orders.json"
saved = [OrderLink(**row) for row in json.loads(path.read_text())] if path.exists() else []
merged = {link.order_id: link for link in saved}
merged.update((link.order_id, link) for link in links)
links = sorted(merged.values(), key=lambda link: (link.purchased_date, link.order_id), reverse=True)
private_json(path, [asdict(link) for link in links])
return links
def select_orders(links, since=None, limit=None, order_ids=(), completed=()):
missing = set(order_ids) - {link.order_id for link in links}
if missing: