Limit order discovery and Open Food Facts searches
This commit is contained in:
parent
628e5c3823
commit
41772b4d1a
5 changed files with 185 additions and 78 deletions
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue