149 lines
2.8 KiB
Python
149 lines
2.8 KiB
Python
"""Pydantic schemas for API request/response shapes."""
|
|
|
|
from datetime import date, datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
from ten31portal.models import UserRole, EntityType, EntityStatus, RoundStatus
|
|
|
|
|
|
# --- Auth ---
|
|
|
|
class LoginRequest(BaseModel):
|
|
email: str
|
|
password: str
|
|
|
|
|
|
class UserResponse(BaseModel):
|
|
id: int
|
|
name: str
|
|
email: str
|
|
role: UserRole
|
|
is_active: bool
|
|
created_at: datetime
|
|
|
|
|
|
# --- Entity ---
|
|
|
|
class EntityCreate(BaseModel):
|
|
name: str
|
|
type: EntityType
|
|
vintage_year: int | None = None
|
|
fund_size_cents: int | None = None
|
|
|
|
|
|
class EntityUpdate(BaseModel):
|
|
name: str | None = None
|
|
type: EntityType | None = None
|
|
vintage_year: int | None = None
|
|
fund_size_cents: int | None = None
|
|
status: EntityStatus | None = None
|
|
|
|
|
|
class EntityResponse(BaseModel):
|
|
id: int
|
|
name: str
|
|
type: EntityType
|
|
vintage_year: int | None
|
|
fund_size_cents: int | None
|
|
status: EntityStatus
|
|
created_at: datetime
|
|
|
|
|
|
# --- Holding ---
|
|
|
|
class HoldingCreate(BaseModel):
|
|
company_name: str
|
|
|
|
|
|
class HoldingUpdate(BaseModel):
|
|
company_name: str | None = None
|
|
|
|
|
|
class HoldingResponse(BaseModel):
|
|
id: int
|
|
entity_id: int
|
|
company_name: str
|
|
created_at: datetime
|
|
|
|
|
|
# --- Position ---
|
|
|
|
class PositionCreate(BaseModel):
|
|
security_name: str
|
|
investment_date: date
|
|
shares: str | None = None
|
|
cost_dollars: float # Accept dollars at API boundary, store as cents
|
|
|
|
|
|
class PositionUpdate(BaseModel):
|
|
security_name: str | None = None
|
|
investment_date: date | None = None
|
|
shares: str | None = None
|
|
cost_dollars: float | None = None
|
|
|
|
|
|
class PositionResponse(BaseModel):
|
|
id: int
|
|
holding_id: int
|
|
security_name: str
|
|
investment_date: date
|
|
shares: str | None
|
|
cost_cents: int
|
|
created_at: datetime
|
|
|
|
|
|
# --- Valuation Round ---
|
|
|
|
class RoundCreate(BaseModel):
|
|
quarter_end: date
|
|
|
|
|
|
class ValuationBulkItem(BaseModel):
|
|
position_id: int
|
|
value_cents: int
|
|
|
|
|
|
class ValuationBulkUpdate(BaseModel):
|
|
valuations: list[ValuationBulkItem]
|
|
|
|
|
|
class ReturnNote(BaseModel):
|
|
note: str
|
|
|
|
|
|
class ValuationResponse(BaseModel):
|
|
id: int
|
|
round_id: int
|
|
position_id: int
|
|
value_cents: int
|
|
created_at: datetime
|
|
|
|
|
|
class RoundResponse(BaseModel):
|
|
id: int
|
|
entity_id: int
|
|
quarter_end: date
|
|
status: RoundStatus
|
|
submitted_by: int | None
|
|
submitted_at: datetime | None
|
|
approved_by: int | None
|
|
approved_at: datetime | None
|
|
return_note: str | None
|
|
is_seed: bool
|
|
created_at: datetime
|
|
valuations: list[ValuationResponse] = []
|
|
|
|
|
|
# --- Audit ---
|
|
|
|
class AuditLogResponse(BaseModel):
|
|
id: int
|
|
actor_user_id: int | None
|
|
action: str
|
|
object_type: str
|
|
object_id: int | None
|
|
detail: dict | list | str | None
|
|
created_at: datetime
|