feat: add portfolio daemon assignment and improve list rendering
- Add --daemon-id option to portfolio update command for daemon assignment - Update managed_by_daemon_id field in portfolio updates - Refactor print_portfolio_table() to print_portfolio_list() for better readability - Display daemon_id in portfolio list output when assigned - Show portfolio tags and managed daemon information in CLI list view - Add daemon_id support to portfolio repository and service layers - Update schemas to include managed_by_daemon_id field in responses
This commit is contained in:
+16
-24
@@ -39,30 +39,22 @@ def to_plain_data(value: Any) -> Any:
|
||||
return value
|
||||
|
||||
|
||||
def print_portfolio_table(console: Console, portfolios: list[PortfolioListItem]) -> None:
|
||||
table = Table(title="Portfolios", expand=True)
|
||||
table.add_column("ID", style="cyan", no_wrap=True)
|
||||
table.add_column("Broker")
|
||||
table.add_column("Status", no_wrap=True)
|
||||
table.add_column("Symbol", no_wrap=True)
|
||||
table.add_column("Cash", justify="right")
|
||||
table.add_column("Qty", justify="right")
|
||||
table.add_column("Price", justify="right")
|
||||
table.add_column("Buffer", justify="right")
|
||||
table.add_column("Total", justify="right")
|
||||
for item in portfolios:
|
||||
table.add_row(
|
||||
item.portfolio_id,
|
||||
item.broker,
|
||||
item.status,
|
||||
item.symbol,
|
||||
format_currency(item.cash_balance),
|
||||
f"{item.asset_quantity:g}",
|
||||
format_currency(item.price),
|
||||
format_currency(item.profit_buffer),
|
||||
format_currency(item.total_value),
|
||||
def print_portfolio_list(console: Console, portfolios: list[PortfolioListItem]) -> None:
|
||||
for i, item in enumerate(portfolios):
|
||||
if i:
|
||||
console.print()
|
||||
tags_str = f" [{', '.join(item.tags)}]" if item.tags else ""
|
||||
console.print(f"[bold]{item.name}[/bold] {item.symbol} [dim]{item.status}[/dim] {item.broker}{tags_str}")
|
||||
console.print(
|
||||
f" cash {format_currency(item.cash_balance)}"
|
||||
f" qty {item.asset_quantity:g}"
|
||||
f" price {format_currency(item.price)}"
|
||||
f" buffer {format_currency(item.profit_buffer)}"
|
||||
f" total {format_currency(item.total_value)}"
|
||||
)
|
||||
console.print(table)
|
||||
console.print(f" [dim]{item.portfolio_id}[/dim]")
|
||||
if item.managed_by_daemon_id:
|
||||
console.print(f" daemon {item.managed_by_daemon_id}")
|
||||
|
||||
|
||||
def print_portfolio_detail(console: Console, detail: PortfolioDetailResponse) -> None:
|
||||
@@ -279,7 +271,7 @@ def render_output(console: Console, output_format: str, payload: Any, *, empty_m
|
||||
print_daemon_table(console, payload)
|
||||
return
|
||||
if all(isinstance(item, PortfolioListItem) for item in payload):
|
||||
print_portfolio_table(console, payload)
|
||||
print_portfolio_list(console, payload)
|
||||
return
|
||||
if all(isinstance(item, UserResponse) for item in payload):
|
||||
print_user_table(console, payload)
|
||||
|
||||
Reference in New Issue
Block a user