generateur_v3/backend/api/database/room/models.py

327 lines
7.5 KiB
Python
Raw Normal View History

2022-09-16 21:50:55 +02:00
from typing import List, Optional, TYPE_CHECKING
2023-02-23 17:11:57 +01:00
from uuid import UUID, uuid4
from pydantic import BaseModel
2023-02-22 12:43:39 +01:00
from sqlmodel import SQLModel, Field, Relationship, JSON, Column, ForeignKeyConstraint
2022-10-10 01:34:38 +02:00
2023-02-23 17:11:57 +01:00
from database.exercices.models import Example
2023-02-22 12:43:39 +01:00
2022-09-16 21:50:55 +02:00
if TYPE_CHECKING:
from database.auth.models import User
2023-02-22 12:43:39 +01:00
2022-09-16 21:50:55 +02:00
class RoomBase(SQLModel):
2023-02-22 12:43:39 +01:00
name: str = Field(max_length=20)
public: bool = Field(default=False)
global_results: bool = Field(default=False)
2022-09-18 22:43:04 +02:00
2022-09-16 21:50:55 +02:00
class RoomCreate(RoomBase):
2023-02-22 12:43:39 +01:00
pass
2022-09-16 21:50:55 +02:00
class Room(RoomBase, table=True):
2023-02-22 12:43:39 +01:00
id: Optional[int] = Field(default=None, primary_key=True)
id_code: str = Field(index=True)
members: List['Member'] = Relationship(back_populates="room")
parcours: List['Parcours'] = Relationship(back_populates="room")
2022-09-16 21:50:55 +02:00
class AnonymousBase(SQLModel):
2023-02-22 12:43:39 +01:00
username: str = Field(max_length=20)
2022-09-16 21:50:55 +02:00
class AnonymousCreate(AnonymousBase):
2023-02-22 12:43:39 +01:00
pass
2022-09-16 21:50:55 +02:00
class Anonymous(AnonymousBase, table=True):
2023-02-22 12:43:39 +01:00
id: Optional[int] = Field(default=None, primary_key=True)
reconnect_code: str = Field(index=True)
clientId: Optional[UUID] = Field(default=uuid4(), index=True)
member: 'Member' = Relationship(back_populates="anonymous")
class Member(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
id_code: str = Field(index=True)
user_id: Optional[int] = Field(foreign_key="user.id", default=None)
user: Optional["User"] = Relationship(back_populates='members')
anonymous_id: Optional[int] = Field(
foreign_key="anonymous.id", default=None)
anonymous: Optional[Anonymous] = Relationship(back_populates="member")
room_id: int = Field(foreign_key="room.id")
room: Room = Relationship(back_populates='members')
challengers: List["Challenger"] = Relationship(back_populates="member")
is_admin: bool = False
waiting: bool = False
online: bool = False
waiter_code: Optional[str] = Field(default=None)
corrections: List['TmpCorrection'] = Relationship(back_populates="member")
2022-10-10 01:34:38 +02:00
class ExercicesCreate(SQLModel):
2023-02-22 12:43:39 +01:00
exercice_id: str
quantity: int = 10
2022-10-10 01:34:38 +02:00
class Exercices(ExercicesCreate):
2023-02-22 12:43:39 +01:00
name: str
examples: Example
class Challenger(SQLModel, table=True):
member_id: int = Field(foreign_key="member.id", primary_key=True)
parcours_id: int = Field(foreign_key="parcours.id", primary_key=True)
2022-10-10 01:34:38 +02:00
2023-02-22 12:43:39 +01:00
parcours: "Parcours" = Relationship(back_populates="challengers")
member: "Member" = Relationship(back_populates="challengers")
#challenges: list["Challenge"] = Relationship(back_populates="challenger")
avg: Optional[float] = Field(default=None)
best: Optional[int] = Field(default=None)
best_time: Optional[int] = Field(default=None)
validated: bool = Field(default=False)
2022-10-10 01:34:38 +02:00
class Parcours(SQLModel, table=True):
2023-02-22 12:43:39 +01:00
id: Optional[int] = Field(default=None, primary_key=True)
id_code: str = Field(index=True, unique=True)
room_id: int = Field(foreign_key="room.id")
room: Room = Relationship(back_populates='parcours')
challengers: list[Challenger] = Relationship(back_populates="parcours")
name: str
time: int
max_mistakes: int
exercices: List[Exercices] = Field(sa_column=Column(JSON))
challenges: List["Challenge"] = Relationship(back_populates="parcours")
corrections: List["TmpCorrection"] = Relationship(
back_populates="parcours")
2022-10-10 01:34:38 +02:00
class Note(BaseModel):
2023-02-22 12:43:39 +01:00
value: int
total: int
2022-10-10 01:34:38 +02:00
class TimedNote(Note):
2023-02-22 12:43:39 +01:00
time: int
2022-10-10 01:34:38 +02:00
class ParcoursReadShort(SQLModel):
2023-02-22 12:43:39 +01:00
name: str
best_note: str | None = None
validated: bool = False
id_code: str
2023-02-23 17:11:57 +01:00
avg: float | None = None
2023-02-22 12:43:39 +01:00
class ParcoursReadUpdate(SQLModel):
id_code: str
name: str
time: int
max_mistakes: int
exercices: List[Exercices]
update_challenges: bool = False
class ChallengerInfo(BaseModel):
name: str
id_code: str
class ChallengerAverage(ChallengerInfo):
avg: float
2022-10-10 01:34:38 +02:00
class Challenges(SQLModel):
2023-02-22 12:43:39 +01:00
id_code: str
mistakes: int
time: int
isCorriged: bool
canCorrige: bool = True
validated: bool = False
class ChallengeInfo(BaseModel):
challenger: ChallengerInfo
challenges: list[Challenges]
#total: int
class Tops(BaseModel):
challenger: ChallengerInfo
mistakes: int
time: int
2022-10-10 01:34:38 +02:00
class ParcoursRead(SQLModel):
2023-02-22 12:43:39 +01:00
tops: list[Tops]
name: str
time: int
max_mistakes: int
id_code: str
exercices: List[Exercices]
challenges: dict[str, ChallengeInfo]
rank: int | None
pb: dict[str, int] | None
memberRank: int | None
validated: bool
ranking: list[ChallengerAverage]
#avg: float | None
2022-10-10 01:34:38 +02:00
class ParcoursCreate(SQLModel):
2023-02-22 12:43:39 +01:00
name: str
time: int
max_mistakes: int
exercices: List[ExercicesCreate]
2022-10-10 01:34:38 +02:00
class NotCorrigedInput(BaseModel):
2023-02-22 12:43:39 +01:00
index: int
value: str
2022-10-10 01:34:38 +02:00
class CorrigedInput(NotCorrigedInput):
2023-02-22 12:43:39 +01:00
correction: str | None
valid: bool | None
2022-09-18 22:43:04 +02:00
2022-10-10 01:34:38 +02:00
class ParsedGeneratorOut(BaseModel):
2023-02-22 12:43:39 +01:00
calcul: str
inputs: List[NotCorrigedInput]
2022-10-10 01:34:38 +02:00
class CorrigedGeneratorOut(BaseModel):
2023-02-22 12:43:39 +01:00
calcul: str
inputs: List[CorrigedInput]
2022-10-10 01:34:38 +02:00
class Challenge(SQLModel, table=True):
2023-02-22 12:43:39 +01:00
id: Optional[int] = Field(default=None, primary_key=True)
id_code: str = Field(index=True, unique=True)
''' challenger_id: int = Field(foreign_key="member.id")
challenger: Member = Relationship(back_populates="challenges") '''
parcours_id: int = Field(foreign_key="parcours.id_code")
parcours: Parcours = Relationship(back_populates="challenges")
challenger_pid: int
challenger_mid: int
__table_args__ = (ForeignKeyConstraint(["challenger_pid", "challenger_mid"],
["challenger.parcours_id","challenger.member_id"]),
{})
#challenger: "Challenger" = Relationship(back_populates="challenges")
data: Optional[List] = Field(
sa_column=Column(JSON), default=[])
time: int
''' note: Note = Field(
sa_column=Column(JSON)) '''
mistakes: int
#note_value: int
validated: bool
isCorriged: bool
class ExoInfo(BaseModel):
id_code: str
name: str
consigne: str | None
class CorrigedData(BaseModel):
exo: ExoInfo
data: List[CorrigedGeneratorOut]
class CorrectionData(BaseModel):
exo: ExoInfo
data: List[ParsedGeneratorOut]
2022-10-10 01:34:38 +02:00
class ChallengeRead(SQLModel):
id_code: str
2023-02-22 12:43:39 +01:00
data: Optional[List[CorrigedData]] = []
2022-10-10 01:34:38 +02:00
time: int
2023-02-22 12:43:39 +01:00
mistakes: int
2022-10-10 01:34:38 +02:00
validated: bool
isCorriged: bool
2023-02-22 12:43:39 +01:00
2022-10-10 01:34:38 +02:00
class TmpCorrection(SQLModel, table=True):
2023-02-22 12:43:39 +01:00
id: Optional[int] = Field(default=None, primary_key=True)
id_code: str = Field(index=True)
parcours_id: str = Field(foreign_key="parcours.id_code")
parcours: Parcours = Relationship(back_populates="corrections")
member_id: int = Field(foreign_key="member.id")
member: Member = Relationship(back_populates="corrections")
data: List = Field(sa_column=Column(JSON))
2022-09-18 22:43:04 +02:00
class AnonymousRead(AnonymousBase):
2023-02-22 12:43:39 +01:00
reconnect_code: str
2022-09-18 22:43:04 +02:00
class Username(SQLModel):
2023-02-22 12:43:39 +01:00
username: str
2022-09-18 22:43:04 +02:00
class MemberRead(SQLModel):
2023-02-22 12:43:39 +01:00
username: str
reconnect_code: str = ''
isUser: bool
isAdmin: bool
id_code: str
clientId: str = ""
online: bool
2022-09-21 22:31:50 +02:00
2022-10-10 01:34:38 +02:00
class RoomRead(RoomBase):
2023-02-22 12:43:39 +01:00
id_code: str
2022-09-26 10:04:02 +02:00
class RoomAndMember(BaseModel):
room: RoomRead
member: MemberRead
2023-02-22 12:43:39 +01:00
2022-09-26 10:04:02 +02:00
class Waiter(BaseModel):
username: str
waiter_id: str
2022-10-10 01:34:38 +02:00
2023-02-22 12:43:39 +01:00
class RoomInfo(RoomRead):
public: bool
name: str
members: List[MemberRead | Waiter]
parcours: List[ParcoursReadShort]
2022-10-10 01:34:38 +02:00
class RoomConnectionInfos(BaseModel):
2023-02-22 12:43:39 +01:00
room: str
member: str | None = None