-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
99 lines (83 loc) · 2.48 KB
/
models.py
File metadata and controls
99 lines (83 loc) · 2.48 KB
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
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime
from typing import Any
@dataclass
class Card:
card_id: str
front: str
back: str
def to_dict(self) -> dict:
return {"card_id": self.card_id, "front": self.front, "back": self.back}
@classmethod
def from_dict(cls, d: dict) -> Card:
return cls(card_id=d["card_id"], front=d["front"], back=d["back"])
@dataclass
class Deck:
name: str
cards: list[Card]
_id: Any = None
def to_dict(self) -> dict:
return {"name": self.name, "cards": [c.to_dict() for c in self.cards]}
@classmethod
def from_dict(cls, d: dict) -> Deck:
return cls(
name=d["name"],
cards=[Card.from_dict(c) for c in d.get("cards", [])],
_id=d.get("_id"),
)
@dataclass
class Room:
room_code: str
deck_id: Any
status: str # waiting | active | finished
players: list[str] # usernames, max 2
created_at: datetime = field(default_factory=datetime.utcnow)
_id: Any = None
def to_dict(self) -> dict:
return {
"room_code": self.room_code,
"deck_id": self.deck_id,
"status": self.status,
"players": self.players,
"created_at": self.created_at,
}
@classmethod
def from_dict(cls, d: dict) -> Room:
return cls(
room_code=d["room_code"],
deck_id=d["deck_id"],
status=d["status"],
players=d.get("players", []),
created_at=d.get("created_at", datetime.utcnow()),
_id=d.get("_id"),
)
@dataclass
class PlayerCardStats:
room_id: Any
player_username: str
card_id: str
attempts: int = 0
correct: int = 0
mastered: bool = False
_id: Any = None
def to_dict(self) -> dict:
return {
"room_id": self.room_id,
"player_username": self.player_username,
"card_id": self.card_id,
"attempts": self.attempts,
"correct": self.correct,
"mastered": self.mastered,
}
@classmethod
def from_dict(cls, d: dict) -> PlayerCardStats:
return cls(
room_id=d["room_id"],
player_username=d["player_username"],
card_id=d["card_id"],
attempts=d.get("attempts", 0),
correct=d.get("correct", 0),
mastered=d.get("mastered", False),
_id=d.get("_id"),
)