import uuid from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from app.config.database import Base class User(Base): __tablename__ = "users" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True) email = Column(String, unique=True, index=True, nullable=False) password = Column(String, nullable=False) first_name = Column(String, nullable=False) last_name = Column(String, nullable=True) phone_number = Column(String, nullable=True) preferred_language = Column(String, default="en", nullable=True) status = Column(String, default="active", nullable=False) failed_login_attempts = Column(Integer, default=0, nullable=False) locked_until = Column(DateTime(timezone=True), nullable=True) last_failed_login_at = Column(DateTime(timezone=True), nullable=True) is_superadmin = Column(Boolean, default=False, nullable=False) tenant_id = Column(UUID(as_uuid=True), ForeignKey("tenants.id"), nullable=True, index=True) role_id = Column(UUID(as_uuid=True), ForeignKey("roles.id"), nullable=True, index=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now(), server_default=func.now()) password_updated_at = Column(DateTime(timezone=True), server_default=func.now()) deleted_at = Column(DateTime(timezone=True), nullable=True) deleted_by_id = Column(UUID(as_uuid=True), nullable=True) deleted_email = Column(String, nullable=True) @property def is_deleted(self) -> bool: return self.deleted_at is not None tenant = relationship("Tenant", back_populates="users") role = relationship("Role", back_populates="users") def __repr__(self): return f""