Initial commit: WealthWise financial analytics platform
This commit is contained in:
76
backend/app/models/portfolio.py
Normal file
76
backend/app/models/portfolio.py
Normal file
@@ -0,0 +1,76 @@
|
||||
"""Portfolio model for WealthWise.
|
||||
|
||||
This module defines the Portfolio database model. Portfolios belong to users
|
||||
and contain multiple transactions. Users can have multiple portfolios for
|
||||
different investment strategies or purposes.
|
||||
"""
|
||||
|
||||
from typing import TYPE_CHECKING, List, Optional
|
||||
from uuid import UUID
|
||||
|
||||
from sqlalchemy import Column, ForeignKey, String, Text
|
||||
from sqlmodel import Field, Relationship, SQLModel
|
||||
|
||||
from app.models.base import BaseModel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from app.models.transaction import Transaction
|
||||
from app.models.user import User
|
||||
|
||||
|
||||
class PortfolioBase(SQLModel):
|
||||
"""Base Portfolio model with common attributes.
|
||||
|
||||
Attributes:
|
||||
name: Portfolio name
|
||||
description: Optional portfolio description
|
||||
"""
|
||||
|
||||
name: str = Field(
|
||||
sa_column=Column(String(255), nullable=False),
|
||||
description="Portfolio name",
|
||||
)
|
||||
description: Optional[str] = Field(
|
||||
default=None,
|
||||
sa_column=Column(Text, nullable=True),
|
||||
description="Optional portfolio description",
|
||||
)
|
||||
|
||||
|
||||
class Portfolio(BaseModel, PortfolioBase, table=True):
|
||||
"""Portfolio database model.
|
||||
|
||||
Portfolios represent collections of financial transactions owned by a user.
|
||||
Each portfolio tracks investments, expenses, or savings for a specific purpose.
|
||||
|
||||
Attributes:
|
||||
id: UUID primary key (inherited from BaseModel)
|
||||
user_id: Foreign key to users table
|
||||
name: Portfolio name
|
||||
description: Optional description
|
||||
user: Relationship to owner
|
||||
transactions: Relationship to portfolio transactions
|
||||
created_at: Timestamp (inherited from BaseModel)
|
||||
updated_at: Timestamp (inherited from BaseModel)
|
||||
"""
|
||||
|
||||
__tablename__ = "portfolios"
|
||||
|
||||
user_id: UUID = Field(
|
||||
sa_column=Column(
|
||||
ForeignKey("users.id", ondelete="CASCADE"),
|
||||
nullable=False,
|
||||
),
|
||||
description="Owner user ID",
|
||||
)
|
||||
|
||||
# Relationships
|
||||
user: "User" = Relationship(back_populates="portfolios")
|
||||
transactions: List["Transaction"] = Relationship(
|
||||
back_populates="portfolio",
|
||||
sa_relationship_kwargs={"cascade": "all, delete-orphan"},
|
||||
)
|
||||
|
||||
class Config:
|
||||
"""Pydantic configuration."""
|
||||
arbitrary_types_allowed = True
|
||||
Reference in New Issue
Block a user