File size: 2,832 Bytes
1bb9c62
 
e99662b
1bb9c62
d25bf89
 
1bb9c62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e99662b
 
 
 
 
 
 
1bb9c62
e99662b
1bb9c62
 
d25bf89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
075cf25
 
 
 
 
 
 
 
 
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

from datetime import date
from sqlalchemy import Integer, String, ForeignKey
from sqlalchemy.orm import relationship, mapped_column, Mapped
from typing import List, Optional
from pydantic import BaseModel

from . import Base

class Player(Base):
    """
    Player table
    """
    __tablename__ = "player"
    __table_args__ = {'schema': 'data'}

    # Player table columns
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String, nullable=True)
    tennis_id: Mapped[str] = mapped_column(String, nullable=True)

    caracteristics: Mapped["Caracteristics"] = relationship("Caracteristics", back_populates="player", cascade="all, delete-orphan")

    matches_won: Mapped[List["Match"]] = relationship("Match", back_populates="winner", foreign_keys='Match.fk_winner_id')
    matches_lost: Mapped[List["Match"]] = relationship("Match", back_populates="loser", foreign_keys='Match.fk_loser_id')

class Caracteristics(Base):
    """
    Caracteristics table
    """
    __tablename__ = "caracteristics"
    __table_args__ = {'schema': 'data'}

    # Caracteristics table columns
    id: Mapped[int] = mapped_column(primary_key=True)
    nationality: Mapped[str] = mapped_column(String, nullable=True)
    last_name: Mapped[str] = mapped_column(String, nullable=True)
    first_name: Mapped[str] = mapped_column(String, nullable=True)
    play_hand: Mapped[str] = mapped_column(String, nullable=True)
    back_hand: Mapped[int] = mapped_column(Integer, nullable=True)
    height_cm: Mapped[int] = mapped_column(Integer, nullable=True)
    weight_kg: Mapped[int] = mapped_column(Integer, nullable=True)
    date_of_birth: Mapped[date] = mapped_column(String, nullable=True)
    pro_year: Mapped[Integer] = mapped_column(Integer, nullable=True)

    fk_player_id: Mapped[int] = mapped_column(ForeignKey("data.player.id", ondelete="CASCADE", name='caracteristics_fk_player_id_fkey'), nullable=False)
    player: Mapped["Player"] = relationship("Player", back_populates="caracteristics")


# -----------------------------------------------------------
# Pydantic Model for Player
# -----------------------------------------------------------
class PlayerApiBase(BaseModel):
    id: int
    name: str
    tennis_id: Optional[str]

class PlayerApiDetail(PlayerApiBase):
    caracteristics: Optional['CaracteristicsApi']

# -----------------------------------------------------------
# Pydantic Model for Caracteristics
# -----------------------------------------------------------
class CaracteristicsApi(BaseModel):
    id: int
    nationality: Optional[str]
    last_name: Optional[str]
    first_name: Optional[str]
    play_hand: Optional[str]
    back_hand: Optional[int]
    height_cm: Optional[int]
    weight_kg: Optional[int]
    date_of_birth: Optional[date]
    pro_year: Optional[int]