- coop_url() → blog_url(), AUTH_APP default → "blog" - Session cookie: coop_session → blog_session - Config keys: coop_root/coop_title → market_root/market_title - All Jinja templates: coop_url → blog_url, coop_title → market_title - Template blocks: coop-child-header → blog-child-header Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
83 lines
2.3 KiB
Python
83 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from urllib.parse import quote
|
|
|
|
from shared.config import config
|
|
|
|
|
|
def _get_app_url(app_name: str) -> str:
|
|
env_key = f"APP_URL_{app_name.upper()}"
|
|
env_val = os.getenv(env_key)
|
|
if env_val:
|
|
return env_val.rstrip("/")
|
|
return config()["app_urls"][app_name].rstrip("/")
|
|
|
|
|
|
def app_url(app_name: str, path: str = "/") -> str:
|
|
base = _get_app_url(app_name)
|
|
if not path.startswith("/"):
|
|
path = "/" + path
|
|
return base + path
|
|
|
|
|
|
def blog_url(path: str = "/") -> str:
|
|
return app_url("blog", path)
|
|
|
|
|
|
def market_url(path: str = "/") -> str:
|
|
return app_url("market", path)
|
|
|
|
|
|
def cart_url(path: str = "/") -> str:
|
|
return app_url("cart", path)
|
|
|
|
|
|
def events_url(path: str = "/") -> str:
|
|
return app_url("events", path)
|
|
|
|
|
|
def federation_url(path: str = "/") -> str:
|
|
return app_url("federation", path)
|
|
|
|
|
|
def page_cart_url(page_slug: str, path: str = "/") -> str:
|
|
if not path.startswith("/"):
|
|
path = "/" + path
|
|
return cart_url(f"/{page_slug}{path}")
|
|
|
|
|
|
def market_product_url(product_slug: str, suffix: str = "", market_place=None) -> str:
|
|
"""Build a market product URL with the correct page/market prefix.
|
|
|
|
Resolves the prefix from:
|
|
- market app context: g.post_slug + g.market_slug
|
|
- cart app context: g.page_slug + market_place.slug
|
|
"""
|
|
from quart import g
|
|
|
|
page_slug = getattr(g, "post_slug", None) or getattr(g, "page_slug", None)
|
|
ms = getattr(g, "market_slug", None) or (
|
|
getattr(market_place, "slug", None) if market_place else None
|
|
)
|
|
prefix = f"/{page_slug}/{ms}" if page_slug and ms else ""
|
|
tail = f"/{suffix}" if suffix else "/"
|
|
return market_url(f"{prefix}/product/{product_slug}{tail}")
|
|
|
|
|
|
def login_url(next_url: str = "") -> str:
|
|
# Auth lives in blog for now. Set AUTH_APP=federation to switch.
|
|
from quart import session as qsession
|
|
auth_app = os.getenv("AUTH_APP", "blog")
|
|
base = app_url(auth_app, "/auth/login/")
|
|
params: list[str] = []
|
|
if next_url:
|
|
params.append(f"next={quote(next_url, safe='')}")
|
|
# Pass anonymous cart session so the auth app can adopt it on login
|
|
cart_sid = qsession.get("cart_sid")
|
|
if cart_sid:
|
|
params.append(f"cart_sid={quote(cart_sid, safe='')}")
|
|
if params:
|
|
return f"{base}?{'&'.join(params)}"
|
|
return base
|