from __future__ import annotations from sqlalchemy import Enum as SAEnum, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column, relationship from .base import Base, TimestampMixin, UserRole class User(Base, TimestampMixin): __tablename__ = "users" id: Mapped[int] = mapped_column(primary_key=True) dataset_id: Mapped[int | None] = mapped_column( ForeignKey("datasets.id"), nullable=True, index=True ) name: Mapped[str] = mapped_column(String(120)) email: Mapped[str] = mapped_column(String(255), unique=True, index=True) phone: Mapped[str | None] = mapped_column(String(40), nullable=True) zip: Mapped[str] = mapped_column(String(10)) # null for anonymous-only / finders without a usable login password_hash: Mapped[str | None] = mapped_column(String(255), nullable=True) role: Mapped[UserRole] = mapped_column( SAEnum(UserRole, native_enum=False), default=UserRole.owner ) dogs: Mapped[list["KnownDog"]] = relationship( # noqa: F821 back_populates="owner", cascade="all, delete-orphan" )