Files
evo-sync/web/models/user.py

51 lines
1.9 KiB
Python
Raw Normal View History

import enum
from sqlalchemy import Boolean, Column, DateTime, Enum, Index, Integer, JSON, String, UniqueConstraint, func
from web.database import Base
class UserRoleEnum(str, enum.Enum):
system = "system"
admin = "admin"
user = "user"
class UserStatusEnum(str, enum.Enum):
pending = "pending"
active = "active"
suspended = "suspended"
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True)
first_name = Column(String(100), nullable=False)
last_name = Column(String(100), nullable=False)
email = Column(String(255), nullable=False)
phone = Column(String(20), nullable=False)
password_hash = Column(String(255), nullable=True)
is_email_confirmed = Column(Boolean, nullable=False, default=False)
email_confirm_token = Column(String(255), nullable=True)
password_reset_token = Column(String(255), nullable=True)
password_reset_expires = Column(DateTime, nullable=True)
role = Column(Enum(UserRoleEnum), nullable=False, default=UserRoleEnum.user)
status = Column(Enum(UserStatusEnum), nullable=False, default=UserStatusEnum.pending)
evotor_user_id = Column(String(255), nullable=True)
evotor_meta = Column(JSON, nullable=True)
invite_token = Column(String(255), nullable=True)
invite_expires = Column(DateTime, nullable=True)
phone_otp = Column(String(10), nullable=True)
phone_otp_expires = Column(DateTime, nullable=True)
created_at = Column(DateTime, nullable=False, server_default=func.now())
updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now())
__table_args__ = (
UniqueConstraint("email", name="ix_users_email"),
UniqueConstraint("phone", name="ix_users_phone"),
UniqueConstraint("evotor_user_id", name="ix_users_evotor_user_id"),
Index("ix_users_role", "role"),
Index("ix_users_status", "status"),
)