Files
bracket/backend/bracket/schema.py
2024-02-28 08:41:19 +01:00

207 lines
7.8 KiB
Python

from sqlalchemy import Column, ForeignKey, Integer, String, Table
from sqlalchemy.orm import declarative_base # type: ignore[attr-defined]
from sqlalchemy.sql.sqltypes import BigInteger, Boolean, DateTime, Enum, Float, Text
Base = declarative_base()
metadata = Base.metadata
DateTimeTZ = DateTime(timezone=True)
clubs = Table(
"clubs",
metadata,
Column("id", BigInteger, primary_key=True, index=True, autoincrement=True),
Column("name", String, nullable=False, index=True),
Column("created", DateTimeTZ, nullable=False),
)
tournaments = Table(
"tournaments",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", String, nullable=False, index=True),
Column("created", DateTimeTZ, nullable=False, server_default="now()"),
Column("start_time", DateTimeTZ, nullable=False),
Column("club_id", BigInteger, ForeignKey("clubs.id"), index=True, nullable=False),
Column("dashboard_public", Boolean, nullable=False),
Column("logo_path", String, nullable=True),
Column("dashboard_endpoint", String, nullable=True, index=True, unique=True),
Column("players_can_be_in_multiple_teams", Boolean, nullable=False, server_default="f"),
Column("auto_assign_courts", Boolean, nullable=False, server_default="f"),
Column("duration_minutes", Integer, nullable=False, server_default="15"),
Column("margin_minutes", Integer, nullable=False, server_default="5"),
)
stages = Table(
"stages",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", String, nullable=False, index=True),
Column("created", DateTimeTZ, nullable=False),
Column("tournament_id", BigInteger, ForeignKey("tournaments.id"), index=True, nullable=False),
Column("is_active", Boolean, nullable=False, server_default="false"),
)
stage_items = Table(
"stage_items",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", Text, nullable=False),
Column("created", DateTimeTZ, nullable=False, server_default="now()"),
Column("stage_id", BigInteger, ForeignKey("stages.id"), index=True, nullable=False),
Column("team_count", Integer, nullable=False),
Column(
"type",
Enum(
"SINGLE_ELIMINATION",
"SWISS",
"ROUND_ROBIN",
name="stage_type",
),
nullable=False,
),
)
stage_item_inputs = Table(
"stage_item_inputs",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("slot", Integer, nullable=False),
Column("tournament_id", BigInteger, ForeignKey("tournaments.id"), index=True, nullable=False),
Column(
"stage_item_id",
BigInteger,
ForeignKey("stage_items.id", ondelete="CASCADE"),
index=True,
nullable=False,
),
Column("team_id", BigInteger, ForeignKey("teams.id"), nullable=True),
Column("winner_from_stage_item_id", BigInteger, ForeignKey("stage_items.id"), nullable=True),
Column("winner_position", Integer, nullable=True),
)
rounds = Table(
"rounds",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", Text, nullable=False),
Column("created", DateTimeTZ, nullable=False),
Column("is_draft", Boolean, nullable=False),
Column("is_active", Boolean, nullable=False, server_default="false"),
Column("stage_item_id", BigInteger, ForeignKey("stage_items.id"), nullable=False),
)
matches = Table(
"matches",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("created", DateTimeTZ, nullable=False),
Column("start_time", DateTimeTZ, nullable=True),
Column("duration_minutes", Integer, nullable=True),
Column("margin_minutes", Integer, nullable=True),
Column("custom_duration_minutes", Integer, nullable=True),
Column("custom_margin_minutes", Integer, nullable=True),
Column("round_id", BigInteger, ForeignKey("rounds.id"), nullable=False),
Column("team1_id", BigInteger, ForeignKey("teams.id"), nullable=True),
Column("team2_id", BigInteger, ForeignKey("teams.id"), nullable=True),
Column(
"team1_winner_from_stage_item_id", BigInteger, ForeignKey("stage_items.id"), nullable=True
),
Column(
"team2_winner_from_stage_item_id", BigInteger, ForeignKey("stage_items.id"), nullable=True
),
Column("team1_winner_position", Integer, nullable=True),
Column("team2_winner_position", Integer, nullable=True),
Column("team1_winner_from_match_id", BigInteger, ForeignKey("matches.id"), nullable=True),
Column("team2_winner_from_match_id", BigInteger, ForeignKey("matches.id"), nullable=True),
Column("court_id", BigInteger, ForeignKey("courts.id"), nullable=True),
Column("team1_score", Integer, nullable=False),
Column("team2_score", Integer, nullable=False),
Column("position_in_schedule", Integer, nullable=True),
)
teams = Table(
"teams",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", String, nullable=False, index=True),
Column("created", DateTimeTZ, nullable=False),
Column("tournament_id", BigInteger, ForeignKey("tournaments.id"), index=True, nullable=False),
Column("active", Boolean, nullable=False, index=True, server_default="t"),
Column("elo_score", Float, nullable=False, server_default="0"),
Column("swiss_score", Float, nullable=False, server_default="0"),
Column("wins", Integer, nullable=False, server_default="0"),
Column("draws", Integer, nullable=False, server_default="0"),
Column("losses", Integer, nullable=False, server_default="0"),
Column("logo_path", String, nullable=True),
)
players = Table(
"players",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", String, nullable=False, index=True),
Column("created", DateTimeTZ, nullable=False),
Column("tournament_id", BigInteger, ForeignKey("tournaments.id"), index=True, nullable=False),
Column("elo_score", Float, nullable=False),
Column("swiss_score", Float, nullable=False),
Column("wins", Integer, nullable=False),
Column("draws", Integer, nullable=False),
Column("losses", Integer, nullable=False),
Column("active", Boolean, nullable=False, index=True, server_default="t"),
)
users = Table(
"users",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("email", String, nullable=False, index=True, unique=True),
Column("name", String, nullable=False),
Column("password_hash", String, nullable=False),
Column("created", DateTimeTZ, nullable=False),
Column(
"account_type",
Enum(
"REGULAR",
"DEMO",
name="account_type",
),
nullable=False,
),
)
users_x_clubs = Table(
"users_x_clubs",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("club_id", BigInteger, ForeignKey("clubs.id", ondelete="CASCADE"), nullable=False),
Column("user_id", BigInteger, ForeignKey("users.id", ondelete="CASCADE"), nullable=False),
Column(
"relation",
Enum(
"OWNER",
"COLLABORATOR",
name="user_x_club_relation",
),
nullable=False,
default="OWNER",
),
)
players_x_teams = Table(
"players_x_teams",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("player_id", BigInteger, ForeignKey("players.id", ondelete="CASCADE"), nullable=False),
Column("team_id", BigInteger, ForeignKey("teams.id", ondelete="CASCADE"), nullable=False),
)
courts = Table(
"courts",
metadata,
Column("id", BigInteger, primary_key=True, index=True),
Column("name", Text, nullable=False),
Column("created", DateTimeTZ, nullable=False),
Column("tournament_id", BigInteger, ForeignKey("tournaments.id"), nullable=False, index=True),
)