Issue 1: repo scaffold and project structure
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user