""" SQLAlchemy model for user_predictions. This module defines the database model for tracking which predictions each user has viewed and their accuracy. """ from datetime import datetime from sqlalchemy import Column, Integer, DateTime, Boolean, ForeignKey, Index, UniqueConstraint from sqlalchemy.orm import relationship from app.database import Base class UserPrediction(Base): """ Model for tracking predictions viewed by users. This table tracks: - Which predictions each user has viewed - When they viewed them - Whether the prediction was correct (when match result is known) Attributes: id: Primary key user_id: Foreign key to users table prediction_id: Foreign key to predictions table viewed_at: Timestamp when user viewed the prediction was_correct: True if prediction was correct, False if incorrect, NULL if match not completed """ __tablename__ = "user_predictions" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) prediction_id = Column(Integer, ForeignKey("predictions.id", ondelete="CASCADE"), nullable=False, index=True) viewed_at = Column(DateTime, nullable=False, index=True) was_correct = Column(Boolean, nullable=True, comment='True if prediction was correct, False if incorrect, NULL if match not completed') # Relationships user = relationship("User", back_populates="user_predictions") prediction = relationship("Prediction", back_populates="user_predictions") # Constraints and indexes __table_args__ = ( Index('idx_user_predictions_user_id', 'user_id'), Index('idx_user_predictions_prediction_id', 'prediction_id'), Index('idx_user_predictions_viewed_at', 'viewed_at'), UniqueConstraint('user_id', 'prediction_id', name='uq_user_predictions_user_prediction'), ) def __repr__(self) -> str: return f"" def to_dict(self) -> dict: """Convert user prediction model to dictionary.""" return { 'id': self.id, 'user_id': self.user_id, 'prediction_id': self.prediction_id, 'viewed_at': self.viewed_at.isoformat() if self.viewed_at else None, 'was_correct': self.was_correct }