76 lines
2.3 KiB
Python
76 lines
2.3 KiB
Python
"""User model for WealthWise.
|
|
|
|
This module defines the User database model for self-hosted authentication.
|
|
Users can have multiple portfolios and are authenticated via JWT tokens.
|
|
"""
|
|
|
|
from typing import TYPE_CHECKING, List, Optional
|
|
from uuid import UUID
|
|
|
|
from sqlalchemy import Boolean, Column, String
|
|
from sqlmodel import Field, Relationship, SQLModel
|
|
|
|
from app.models.base import BaseModel
|
|
|
|
if TYPE_CHECKING:
|
|
from app.models.portfolio import Portfolio
|
|
|
|
|
|
class UserBase(SQLModel):
|
|
"""Base User model with common attributes.
|
|
|
|
Attributes:
|
|
email: User's unique email address (indexed)
|
|
is_active: Whether the user account is active
|
|
is_superuser: Whether user has admin privileges
|
|
"""
|
|
|
|
email: str = Field(
|
|
sa_column=Column(String, unique=True, index=True, nullable=False),
|
|
description="User's unique email address",
|
|
)
|
|
is_active: bool = Field(
|
|
default=True,
|
|
sa_column=Column(Boolean, default=True, nullable=False),
|
|
description="Whether the user account is active",
|
|
)
|
|
is_superuser: bool = Field(
|
|
default=False,
|
|
sa_column=Column(Boolean, default=False, nullable=False),
|
|
description="Whether user has admin privileges",
|
|
)
|
|
|
|
|
|
class User(BaseModel, UserBase, table=True):
|
|
"""User database model.
|
|
|
|
This model stores user information including authentication credentials
|
|
and account status. Passwords are stored as bcrypt hashes.
|
|
|
|
Attributes:
|
|
id: UUID primary key (inherited from BaseModel)
|
|
email: Unique email address
|
|
hashed_password: Bcrypt hashed password
|
|
is_active: Account status
|
|
is_superuser: Admin flag
|
|
portfolios: Relationship to user's portfolios
|
|
created_at: Timestamp (inherited from BaseModel)
|
|
updated_at: Timestamp (inherited from BaseModel)
|
|
"""
|
|
|
|
__tablename__ = "users"
|
|
|
|
hashed_password: str = Field(
|
|
sa_column=Column(String, nullable=False),
|
|
description="Bcrypt hashed password",
|
|
)
|
|
|
|
# Relationships
|
|
portfolios: List["Portfolio"] = Relationship(
|
|
back_populates="user",
|
|
sa_relationship_kwargs={"cascade": "all, delete-orphan"},
|
|
)
|
|
|
|
class Config:
|
|
"""Pydantic configuration."""
|
|
arbitrary_types_allowed = True |