feat(portfolios): allow unassigned strategy creation

This commit is contained in:
2026-08-22 21:21:24 +09:00
parent 6e17a53b17
commit 5d6a0ad013
13 changed files with 49 additions and 46 deletions
+9 -7
View File
@@ -186,11 +186,13 @@ def create_portfolio_v1(
)
name = body.name or f"{body.broker}-{body.asset_id[:8]}"
strategy_set = repo.get_strategy_set(body.strategy_id)
if strategy_set is None:
raise StrategyNotFoundError(f"strategy not found: {body.strategy_id}")
if strategy_set.status != "active":
raise StrategyInactiveError(f"strategy is inactive: {body.strategy_id}")
strategy_set = None
if body.strategy_id is not None:
strategy_set = repo.get_strategy_set(body.strategy_id)
if strategy_set is None:
raise StrategyNotFoundError(f"strategy not found: {body.strategy_id}")
if strategy_set.status != "active":
raise StrategyInactiveError(f"strategy is inactive: {body.strategy_id}")
_require_valid_daemon_uuid(body.managed_by_daemon_id)
@@ -205,8 +207,8 @@ def create_portfolio_v1(
asset_quantity=body.asset_quantity,
asset_price=body.asset_price,
profit_buffer=body.profit_buffer,
active_strategy_id=strategy_set.id,
avabile_strategies=[strategy_set.id],
active_strategy_id=strategy_set.id if strategy_set is not None else None,
avabile_strategies=[strategy_set.id] if strategy_set is not None else None,
managed_by_daemon_id=body.managed_by_daemon_id,
)
except HTTPException:
+1 -1
View File
@@ -18,7 +18,7 @@ if env_file.exists():
class Settings(BaseSettings):
app_name: str = "PortfolioHub"
app_version: str = "0.2.0"
app_version: str = "0.2.1"
environment: str = "development"
allowed_origins_raw: str = Field(default="http://localhost:3000", validation_alias="PORTFOLIOHUB_ALLOWED_ORIGINS")
bootstrap_username: str = Field(default="", validation_alias="PORTFOLIOHUB_BOOTSTRAP_USERNAME")
+1 -1
View File
@@ -283,7 +283,7 @@ class PortfolioCreateRequest(BaseModel):
asset_quantity: float = Field(default=0.0, ge=0.0)
asset_price: float = Field(default=0.0, ge=0.0)
profit_buffer: float = Field(default=0.0, ge=0.0)
strategy_id: str = Field(..., min_length=1)
strategy_id: str | None = Field(default=None, min_length=1)
managed_by_daemon_id: str | None = None
user_id: str | None = None # admin-only: override owner