60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
from typing import Optional, List
|
|
from uuid import UUID
|
|
from datetime import datetime
|
|
|
|
from sqlmodel import SQLModel, Field, Relationship
|
|
|
|
|
|
class User(SQLModel, table=True):
|
|
__tablename__ = 'user'
|
|
|
|
id: int = Field(primary_key=True)
|
|
uuid: UUID = Field(nullable=False, unique=True)
|
|
user_role_id: int = Field(foreign_key="user_role.id", nullable=False)
|
|
shop_id: Optional[int] = Field(foreign_key="shop.id")
|
|
username: str = Field(max_length=64, nullable=False, unique=True)
|
|
email: str = Field(max_length=128, nullable=False, unique=True)
|
|
password: str = Field(max_length=60, nullable=False)
|
|
first_name: Optional[str] = Field(max_length=64)
|
|
last_name: Optional[str] = Field(max_length=64)
|
|
phone_number: str = Field(max_length=15, nullable=False)
|
|
profile_picture: Optional[str] = Field(max_length=100)
|
|
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
|
|
updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
|
|
last_login: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
|
|
|
owned_shops: List["Shop"] = Relationship(back_populates="owner")
|
|
registered_shop: List["Shop"] = Relationship(back_populates="registered_users")
|
|
|
|
role: Optional["UserRole"] = Relationship(back_populates="users")
|
|
preferences: Optional["UserPreferences"] = Relationship(back_populates="user")
|
|
statistics: Optional["UserStatistics"] = Relationship(back_populates="user_statistics")
|
|
|
|
|
|
class UserPreferences(SQLModel, table=True):
|
|
__tablename__ = 'user_preferences'
|
|
|
|
user_id: int = Field(foreign_key="user.id", primary_key=True)
|
|
|
|
user: Optional["User"] = Relationship(back_populates="preferences")
|
|
|
|
|
|
class UserRole(SQLModel, table=True):
|
|
__tablename__ = 'user_role'
|
|
|
|
id: int = Field(primary_key=True)
|
|
name: str = Field(nullable=False, unique=True, max_length=50)
|
|
|
|
users = Relationship(back_populates="role")
|
|
|
|
|
|
class UserStatistics(SQLModel, table=True):
|
|
__tablename__ = "user_statistics"
|
|
|
|
user_id: int = Field(foreign_key="user.id", primary_key=True)
|
|
total_spend: Optional[float] = Field(default=None)
|
|
|
|
user: Optional["User"] = Relationship(back_populates="statistics")
|
|
|
|
__all__ = ["User", "UserPreferences", "UserRole"]
|