"""Integration outbox routes and actions. Moved from app.admin_dashboard in v4.7.2. v4.7.4 adds a dedicated HTMX table partial so filters and operator actions can refresh the outbox without replacing the full page. """ from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse import app.admin_dashboard as legacy from app.admin_dashboard import * # noqa: F401,F403 from app.admin_ui.guidance import outbox_operator_message router = APIRouter() def _outbox_tab_url(status: str = "all", target_system: str = "all") -> str: parts = [] if status and status != "all": parts.append(f"status={esc(status)}") if target_system and target_system != "all": parts.append(f"target_system={esc(target_system)}") return "/outbox" + ("?" + "&".join(parts) if parts else "") def _outbox_partial_url(status: str = "all", target_system: str = "all") -> str: href = _outbox_tab_url(status=status, target_system=target_system) return "/outbox/partials/table" + (href[href.find("?"):] if "?" in href else "") def _outbox_items(status: str = "all", target_system: str = "all", limit: int = 100) -> list[dict]: query_status = None if status == "all" else status query_target = None if target_system == "all" else target_system return list_outbox(status=query_status, target_system=query_target, limit=limit) def render_outbox_table_partial(items: list[dict], status: str = "all", target_system: str = "all") -> str: rows = "" for item in items: payload = item.get("payload") or {} if isinstance(payload, str): try: payload = json.loads(payload) except Exception: payload = {} opp_id = payload.get("opportunity_id") or "" conv = payload.get("conversation_id") or "" err = str(item.get("last_error") or "") human_error = outbox_operator_message(item) short_err = err[:220] + "…" if len(err) > 220 else err origin = f'Oportunidade' if opp_id else '—' conv_html = f'Conversa #{esc(conv)}' if conv else '' item_id = str(item.get("id") or "") oid = esc(item_id) rows += f'''
{oid}{esc(item.get('action_type'))}| Criado / ID | Estado | Sistema / Ação | Origem | Erro | Ações |
|---|
Não encontrado.
", "outbox") payload = item.get("payload") or {} if isinstance(payload, str): try: payload = json.loads(payload) except Exception: payload = {} opp_id = payload.get("opportunity_id") or "" origin_href = ("/opportunities/" + esc(opp_id)) if opp_id else "/outbox" origin_label = "Oportunidade" if opp_id else "—" human_error = outbox_operator_message(item) fix_href = origin_href if opp_id else "/outbox" body = f'''{esc(pretty_json(payload))}
{esc(item.get('last_error') or '')}