Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
import uuid
|
|
from datetime import datetime, timezone
|
|
|
|
from sqlalchemy import (
|
|
Boolean,
|
|
Column,
|
|
DateTime,
|
|
ForeignKey,
|
|
Integer,
|
|
String,
|
|
)
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.types import JSON
|
|
|
|
from models import Base
|
|
|
|
|
|
class Game(Base):
|
|
__tablename__ = "games"
|
|
|
|
id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
|
|
category_id = Column(Integer, ForeignKey("categories.id"), nullable=False)
|
|
board_size = Column(Integer, nullable=False, default=10)
|
|
grid = Column(JSON, nullable=False)
|
|
status = Column(String(20), nullable=False, default="in_progress")
|
|
started_at = Column(
|
|
DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)
|
|
)
|
|
completed_at = Column(DateTime, nullable=True)
|
|
|
|
category = relationship("Category")
|
|
words = relationship("Word", back_populates="game")
|
|
|
|
|
|
class Word(Base):
|
|
__tablename__ = "words"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
game_id = Column(String(36), ForeignKey("games.id"), nullable=False)
|
|
text = Column(String(20), nullable=False)
|
|
start_row = Column(Integer, nullable=False)
|
|
start_col = Column(Integer, nullable=False)
|
|
direction = Column(String(2), nullable=False)
|
|
found = Column(Boolean, nullable=False, default=False)
|
|
found_at = Column(DateTime, nullable=True)
|
|
|
|
game = relationship("Game", back_populates="words")
|