Coverage for polar/models/login_code.py: 88%
15 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from datetime import datetime
2from typing import TYPE_CHECKING
3from uuid import UUID
5from sqlalchemy import CHAR, TIMESTAMP, ForeignKey, String, Uuid
6from sqlalchemy.orm import Mapped, mapped_column, relationship
8from polar.kit.db.models import RecordModel
10if TYPE_CHECKING: 10 ↛ 11line 10 didn't jump to line 11 because the condition on line 10 was never true
11 from polar.models import User
14class LoginCode(RecordModel):
15 __tablename__ = "login_codes"
17 code_hash: Mapped[str] = mapped_column(
18 CHAR(64), nullable=False, index=True, unique=True
19 )
20 expires_at: Mapped[datetime] = mapped_column(
21 TIMESTAMP(timezone=True), nullable=False, index=True
22 )
23 email: Mapped[str] = mapped_column(String(320), nullable=False, index=True)
25 user_id: Mapped[UUID | None] = mapped_column(
26 Uuid,
27 ForeignKey("users.id", ondelete="cascade"),
28 nullable=True,
29 index=True,
30 )
31 user: Mapped["User | None"] = relationship("User", lazy="raise")