aboutsummaryrefslogtreecommitdiff
path: root/app/model.py
blob: 3ec663e7d4b9a5fdd7a8a81e20066f3923af8a8b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from app import app, db
from sqlalchemy.orm import Mapped
from datetime import date, datetime
from typing import Optional, Annotated
from sqlalchemy.orm import mapped_column as mc
from sqlalchemy import String, Boolean, Integer, ForeignKey


class User(db.Model):
    id: Mapped[int] = mc(primary_key=True)
    username: Mapped[str] = mc(String(64), index=True, unique=True)
    password_hash: Mapped[Optional[str]] = mc(String(256))

    def __repr__(self):
        return f"User {self.username}"


class Court(db.Model):
    id: Mapped[int] = mc(primary_key=True)
    status: Mapped[bool] = mc(Boolean, default=True)

    def __repr__(self):
        return f"Court {self.id} is {"active" if self.status else "inactive"}"


class Player(db.Model):
    id: Mapped[int] = mc(primary_key=True)
    first_name: Mapped[str] = mc(String(64), index=True)
    last_name: Mapped[str] = mc(String(64), index=True)
    team: Mapped[int] = mc(Integer, index=True)
    status: Mapped[bool] = mc(Boolean)
    level: Mapped[int] = mc(Integer)

    def __init__(
        self,
        id,
        first_name,
        last_name,
        team=0,
        status=False,
        level=int(app.config["MIN_PLAYER_LEVEL"]),
    ):
        self.id = id
        self.first_name = first_name
        self.last_name = last_name
        self.team = team
        self.status = status
        self.level = level

    def __repr__(self):
        return f"{self.first_name} {self.last_name} is {"active" if self.status else "inactive"}"


class Game(db.Model):
    id: Mapped[int] = mc(primary_key=True)
    round_id: Mapped[int] = mc(Integer, index=True)
    court_id: Mapped[int] = mc(ForeignKey(Court.id), index=True)
    player_1: Mapped[int] = mc(ForeignKey(Player.id), index=True)
    player_2: Mapped[int] = mc(ForeignKey(Player.id), index=True)
    player_3: Mapped[int] = mc(ForeignKey(Player.id), index=True)
    player_4: Mapped[int] = mc(ForeignKey(Player.id), index=True)
    date: Mapped[datetime] = mc(index=True, default=lambda: date.today())

    def __init__(
        self,
        round_id: Optional[int],
        court_id: int,
        player_1: int,
        player_2: int,
        player_3: int,
        player_4: int,
    ):
        if round_id is not None:
            self.round_id = round_id
        self.court_id = court_id
        self.player_1 = player_1
        self.player_2 = player_2
        self.player_3 = player_3
        self.player_4 = player_4


class DisplayGame:
    court: Court
    team_1: Annotated[list[Player], 2]
    team_2: Annotated[list[Player], 2]

    def __init__(self, game: Game):
        court = db.session.get(Court, game.court_id)
        if court is None:
            raise ValueError(f"Unknown court")
        self.court = court
        players = []
        for i in range(4):
            player_id = getattr(game, f"player_{i+1}")
            p = db.session.get(Player, player_id)
            if p is None:
                raise ValueError(f"Player ID: {player_id} mismatch.")
            players.append(p)
        self.team_1 = players[:2]
        self.team_2 = players[2:]

    def to_game(self, round_id) -> Game:
        return Game(
            round_id,
            self.court.id,
            self.team_1[0].id,
            self.team_1[1].id,
            self.team_2[0].id,
            self.team_2[1].id,
        )