"""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, PlainTextResponse 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 '')}