Database stores times in UTC but serialized without timezone info, causing frontend to misinterpret as local time. Now all datetime fields include 'Z' suffix to indicate UTC, enabling proper timezone conversion in the browser. - Add UTCDatetimeBaseModel base class for Pydantic schemas - Update model to_dict() methods to append 'Z' suffix - Affects: tasks, users, sessions, audit logs, translations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
"""
|
|
Tool_OCR - User Model v2.0
|
|
External API authentication with simplified schema
|
|
"""
|
|
|
|
from sqlalchemy import Column, Integer, String, DateTime, Boolean
|
|
from sqlalchemy.orm import relationship
|
|
from datetime import datetime
|
|
|
|
from app.core.database import Base
|
|
|
|
|
|
class User(Base):
|
|
"""
|
|
User model for external API authentication
|
|
|
|
Uses email as primary identifier from Azure AD.
|
|
No password storage - authentication via external API only.
|
|
"""
|
|
|
|
__tablename__ = "tool_ocr_users"
|
|
|
|
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
|
|
email = Column(String(255), unique=True, nullable=False, index=True,
|
|
comment="Primary identifier from Azure AD")
|
|
display_name = Column(String(255), nullable=True,
|
|
comment="Display name from API response")
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
last_login = Column(DateTime, nullable=True)
|
|
is_active = Column(Boolean, default=True, nullable=False, index=True)
|
|
|
|
# Relationships
|
|
tasks = relationship("Task", back_populates="user", cascade="all, delete-orphan")
|
|
sessions = relationship("Session", back_populates="user", cascade="all, delete-orphan")
|
|
audit_logs = relationship("AuditLog", back_populates="user")
|
|
translation_logs = relationship("TranslationLog", back_populates="user", cascade="all, delete-orphan")
|
|
|
|
def __repr__(self):
|
|
return f"<User(id={self.id}, email='{self.email}', display_name='{self.display_name}')>"
|
|
|
|
def to_dict(self):
|
|
"""Convert user to dictionary.
|
|
|
|
All datetime fields are serialized with 'Z' suffix to indicate UTC timezone.
|
|
"""
|
|
return {
|
|
"id": self.id,
|
|
"email": self.email,
|
|
"display_name": self.display_name,
|
|
"created_at": self.created_at.isoformat() + 'Z' if self.created_at else None,
|
|
"last_login": self.last_login.isoformat() + 'Z' if self.last_login else None,
|
|
"is_active": self.is_active
|
|
}
|