fix(enterprise): migrate device_code model to SQLAlchemy 2.0 [2/13] (#13848)

Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
Rohit Malhotra
2026-04-10 05:13:31 +00:00
committed by GitHub
co-authored by openhands
parent f274d5e90f
commit fa4afa9412
+23 -10
View File
@@ -3,7 +3,8 @@
from datetime import datetime, timezone
from enum import Enum
from sqlalchemy import Column, DateTime, Integer, String
from sqlalchemy import DateTime, String
from sqlalchemy.orm import Mapped, mapped_column
from storage.base import Base
@@ -25,21 +26,33 @@ class DeviceCode(Base):
__tablename__ = 'device_codes'
id = Column(Integer, primary_key=True, autoincrement=True)
device_code = Column(String(128), unique=True, nullable=False, index=True)
user_code = Column(String(16), unique=True, nullable=False, index=True)
status = Column(String(32), nullable=False, default=DeviceCodeStatus.PENDING.value)
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
device_code: Mapped[str] = mapped_column(
String(128), unique=True, nullable=False, index=True
)
user_code: Mapped[str] = mapped_column(
String(16), unique=True, nullable=False, index=True
)
status: Mapped[str] = mapped_column(
String(32), nullable=False, default=DeviceCodeStatus.PENDING.value
)
# Keycloak user ID who authorized the device (set during verification)
keycloak_user_id = Column(String(255), nullable=True)
keycloak_user_id: Mapped[str | None] = mapped_column(String(255), nullable=True)
# Timestamps
expires_at = Column(DateTime(timezone=True), nullable=False)
authorized_at = Column(DateTime(timezone=True), nullable=True)
expires_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), nullable=False
)
authorized_at: Mapped[datetime | None] = mapped_column(
DateTime(timezone=True), nullable=True
)
# Rate limiting fields for RFC 8628 section 3.5 compliance
last_poll_time = Column(DateTime(timezone=True), nullable=True)
current_interval = Column(Integer, nullable=False, default=5)
last_poll_time: Mapped[datetime | None] = mapped_column(
DateTime(timezone=True), nullable=True
)
current_interval: Mapped[int] = mapped_column(nullable=False, default=5)
def __repr__(self) -> str:
return f"<DeviceCode(user_code='{self.user_code}', status='{self.status}')>"