availabili.tf/backend-flask/models/player_event.py

69 lines
2.5 KiB
Python

from typing import Optional
from sqlalchemy.orm import mapped_column, relationship
from sqlalchemy.orm.attributes import Mapped
from sqlalchemy.orm.properties import ForeignKey
from sqlalchemy.types import Boolean
import app_db
import spec
class PlayerEvent(app_db.BaseModel):
__tablename__ = "players_events"
event_id: Mapped[int] = mapped_column(ForeignKey("events.id"), primary_key=True)
player_id: Mapped[int] = mapped_column(ForeignKey("players.steam_id"), primary_key=True)
player_team_role_id: Mapped[int | None] = mapped_column(ForeignKey("players_teams_roles.id"), nullable=True)
has_confirmed: Mapped[bool] = mapped_column(Boolean, default=False)
event: Mapped["Event"] = relationship("Event", back_populates="players")
player: Mapped["Player"] = relationship("Player", back_populates="events")
player_team: Mapped["PlayerTeam"] = relationship(
"PlayerTeam",
secondary="players",
primaryjoin="PlayerEvent.player_id == Player.steam_id",
secondaryjoin="(PlayerTeam.player_id == Player.steam_id) & (PlayerTeam.team_id == Event.team_id)",
viewonly=True,
)
role: Mapped["PlayerTeamRole | None"] = relationship("PlayerTeamRole")
class EventWithPlayerSchema(spec.BaseModel):
event: "EventSchema"
player_event: Optional["PlayerEventRolesSchema"]
@classmethod
def from_event_player_event(cls, event: "Event", player_event: Optional["PlayerEvent"]):
res = cls(
event=EventSchema.from_model(event),
player_event=None,
)
if player_event:
res.player_event = PlayerEventRolesSchema.from_event_player_team(
player_event, player_event.player_team
)
return res
class PlayerEventRolesSchema(spec.BaseModel):
player: "PlayerSchema"
role: Optional["RoleSchema"]
roles: list["RoleSchema"]
has_confirmed: bool
playtime: int
@classmethod
def from_event_player_team(cls, player_event: "PlayerEvent", player_team: "PlayerTeam"):
return cls(
player=PlayerSchema.from_model(player_event.player),
role=RoleSchema.from_model(player_event.role) if player_event.role else None,
roles=[RoleSchema.from_model(role) for role in player_team.player_roles],
has_confirmed=player_event.has_confirmed,
playtime=player_team.playtime,
)
from models.event import Event, EventSchema
from models.player import Player, PlayerSchema
from models.player_team_role import PlayerTeamRole, RoleSchema
from models.player_team import PlayerTeam