feat: restructure market app with per-market URL scoping
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 41s

- URL structure changes from /<route> to /<market_slug>/<route>
- Root / shows markets listing page
- app.py: url_value_preprocessor, url_defaults, hydrate_market (events app pattern)
- Browse queries (db_nav, db_products_nocounts, db_products_counts) accept market_id
- _productInfo reads g.market.id to scope all queries
- save_nav accepts market_id, sets on new NavTop rows
- API save_nav passes g.market.id
- Scraper default URLs point to /suma-market/ on port 8001

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-10 18:08:48 +00:00
parent 6a266bd94d
commit 9b2687b039
13 changed files with 224 additions and 48 deletions

View File

@@ -26,12 +26,16 @@ async def _productInfo(top_slug=None, sub_slug=None):
Shared query logic for home / category / subcategory pages.
Pulls filters from qs.decode(), queries products(), and orders brands/stickers/etc.
"""
q = decode()
page, search, sort = q.page, q.search, q.sort
selected_brands, selected_stickers, selected_labels = q.selected_brands, q.selected_stickers, q.selected_labels
liked = q.liked
# Get market_id from hydrated market context
market = getattr(g, "market", None)
market_id = market.id if market else None
if top_slug is not None and sub_slug is not None:
list_url = urljoin(config()["base_url"], f"/{top_slug}/{sub_slug}")
else:
@@ -50,6 +54,7 @@ async def _productInfo(top_slug=None, sub_slug=None):
sort=sort,
user_id=g.user.id if g.user else None,
liked = liked,
market_id=market_id,
)
brands_ordered = _order_brands_selected_first(brands, selected_brands)
@@ -82,6 +87,7 @@ async def _productInfo(top_slug=None, sub_slug=None):
sort=sort,
user_id=g.user.id if g.user else None,
liked = liked,
market_id=market_id,
)
return {
"products": items,