edh-elo/app/sql/models.py
2024-11-18 19:47:40 -08:00

76 lines
2.5 KiB
Python

from typing import List
from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, String
from sqlalchemy.orm import relationship, Mapped
from .database import Base
class Player(Base):
__tablename__ = "players"
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
decks = relationship("Deck", back_populates="owner")
class Deck(Base):
__tablename__ = "decks"
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
description = Column(String)
owner_id = Column(Integer, ForeignKey("players.id"))
owner = relationship("Player", back_populates="decks")
class WinType(Base):
__tablename__ = "win_types"
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
class Format(Base):
__tablename__ = "formats"
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
class Game(Base):
__tablename__ = "games"
id = Column(Integer, primary_key=True)
date = Column(DateTime, nullable=False)
deck_id_1 = Column(Integer, ForeignKey("decks.id"), nullable=False)
deck_id_2 = Column(Integer, ForeignKey("decks.id"), nullable=False)
deck_id_3 = Column(Integer, ForeignKey("decks.id"))
deck_id_4 = Column(Integer, ForeignKey("decks.id"))
deck_id_5 = Column(Integer, ForeignKey("decks.id"))
deck_id_6 = Column(Integer, ForeignKey("decks.id"))
winning_deck_id = Column(Integer, ForeignKey("decks.id"), nullable=False)
number_of_turns = Column(Integer, nullable=False)
first_player_out_turn = Column(Integer, nullable=False)
win_type_id = Column(Integer, ForeignKey("win_types.id"), nullable=False)
format_id = Column(Integer, ForeignKey("formats.id"), nullable=False)
description = Column(String)
elo_scores: Mapped[List["EloScore"]] = relationship()
# In support of ties, we allow a Game to have a (comma-separated) set of (other) winning Deck Ids, all of which will
# be used for ELO calculation.
# Is this the best approach? Probably not!
# Does it work (without having to migrate existing data to a new format)? Yes!
other_winning_deck_ids = Column(String)
class EloScore(Base):
__tablename__ = "elo_scores"
id = Column(Integer, primary_key=True)
# This Elo Score was calculated after this game
after_game_id: Mapped[int] = Column(Integer, ForeignKey("games.id"))
deck_id = Column(Integer, ForeignKey("decks.id"))
score = Column(Float(asdecimal=True, decimal_return_scale=3))