Skip to content

Commit eceb7af

Browse files
committed
Used string based forward refs and typing.TYPE_CHECKING to avoid circular imports
1 parent d47e0fa commit eceb7af

File tree

6 files changed

+29
-18
lines changed

6 files changed

+29
-18
lines changed

api/models/orm/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@
33
from .infraction import Infraction # noqa: F401
44
from .jam import Jam # noqa: F401
55
from .team import Team # noqa: F401
6-
from .team_has_users import team_has_users_table # noqa: F401
76
from .user import JamSpecificDetail, User # noqa: F401

api/models/orm/infraction.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from sqlalchemy import Enum, ForeignKey, String
44
from sqlalchemy.orm import Mapped, mapped_column
55

6-
from api.models.orm import Jam, User
76
from api.models.orm.base import Base
87

98
InfractionType = Literal["note", "ban", "warning"]
@@ -15,8 +14,8 @@ class Infraction(Base):
1514
__tablename__ = "infractions"
1615

1716
infraction_id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
18-
user_id: Mapped[int] = mapped_column(ForeignKey(User.user_id))
19-
issued_in_jam_id: Mapped[int] = mapped_column(ForeignKey(Jam.jam_id))
17+
user_id: Mapped[int] = mapped_column(ForeignKey("users.user_id"))
18+
issued_in_jam_id: Mapped[int] = mapped_column(ForeignKey("jams.jam_id"))
2019
infraction_type: Mapped[InfractionType] = mapped_column(
2120
Enum(*InfractionType.__args__, name="infraction_type_enum"),
2221
nullable=False,

api/models/orm/jam.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
from typing import TYPE_CHECKING
2+
13
from sqlalchemy import Boolean, String
24
from sqlalchemy.orm import Mapped, mapped_column, relationship
35

4-
from api.models.orm import Team
56
from api.models.orm.base import Base
67

8+
if TYPE_CHECKING:
9+
from api.models.orm import Team
10+
711

812
class Jam(Base):
913
"""A code jam."""
@@ -14,4 +18,4 @@ class Jam(Base):
1418
name: Mapped[str] = mapped_column(String(), nullable=False)
1519
ongoing: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
1620

17-
teams: Mapped[list[Team]] = relationship()
21+
teams: Mapped[list["Team"]] = relationship()

api/models/orm/team.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
from typing import TYPE_CHECKING
2+
13
from sqlalchemy import BigInteger, Boolean, ForeignKey, Index, String, text
24
from sqlalchemy.orm import Mapped, mapped_column, relationship
35

4-
from api.models.orm import Jam, User, team_has_users_table
56
from api.models.orm.base import Base
7+
from api.models.orm.team_has_users import team_has_users_table
8+
9+
if TYPE_CHECKING:
10+
from api.models.orm import User
611

712

813
class Team(Base):
@@ -11,8 +16,8 @@ class Team(Base):
1116
__tablename__ = "teams"
1217

1318
team_id: Mapped[int] = mapped_column(primary_key=True)
14-
jam_id: Mapped[int] = mapped_column(ForeignKey(Jam.jam_id))
15-
leader_id: Mapped[int] = mapped_column(ForeignKey(User.user_id))
19+
jam_id: Mapped[int] = mapped_column(ForeignKey("jams.jam_id"))
20+
leader_id: Mapped[int] = mapped_column(ForeignKey("users.user_id"))
1621
name: Mapped[str] = mapped_column(String(), nullable=False)
1722

1823
# These two fields are nullable to accommodate historic data
@@ -23,8 +28,8 @@ class Team(Base):
2328
winner: Mapped[bool] = mapped_column(Boolean, nullable=True)
2429
first_place_winner: Mapped[bool] = mapped_column(Boolean, nullable=True)
2530

26-
users: Mapped[list[User]] = relationship(
31+
users: Mapped[list["User"]] = relationship(
2732
secondary=team_has_users_table,
2833
back_populates="teams",
2934
)
30-
__table_args__ = Index("team_name_jam_unique", text("lower(name)"), "jam_id", unique=True)
35+
__table_args__ = (Index("team_name_jam_unique", text("lower(name)"), "jam_id", unique=True),)

api/models/orm/team_has_users.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
team_has_users_table = Table(
66
"team_has_users",
77
Base.metadata,
8-
Column("team_id", ForeignKey("teams.id"), primary_key=True),
9-
Column("user_id", ForeignKey("users.id"), primary_key=True),
8+
Column("team_id", ForeignKey("teams.team_id"), primary_key=True),
9+
Column("user_id", ForeignKey("users.user_id"), primary_key=True),
1010
)

api/models/orm/user.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1-
from typing import Literal
1+
from typing import TYPE_CHECKING, Literal
22

33
from sqlalchemy import BigInteger, Boolean, Enum, ForeignKey, String
44
from sqlalchemy.orm import Mapped, mapped_column, relationship
55

6-
from api.models.orm import Jam, Team, team_has_users_table
76
from api.models.orm.base import Base
7+
from api.models.orm.team_has_users import team_has_users_table
88

99
ExperienceLevels = Literal["beginner", "decent", "expierienced", "very_expierienced"]
1010

1111

12+
if TYPE_CHECKING:
13+
from api.models.orm import Team
14+
15+
1216
class User(Base):
1317
"""A user who has participated in a code jam."""
1418

1519
__tablename__ = "users"
1620

1721
user_id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=False)
1822

19-
teams: Mapped[list[Team]] = relationship(
23+
teams: Mapped[list["Team"]] = relationship(
2024
secondary=team_has_users_table,
2125
back_populates="users",
2226
)
@@ -29,8 +33,8 @@ class JamSpecificDetail(Base):
2933
__tablename__ = "jam_specific_details"
3034

3135
jam_specific_detail_id: Mapped[int] = mapped_column(primary_key=True)
32-
user_id: Mapped[int] = mapped_column(ForeignKey(User.id))
33-
jam_id: Mapped[int] = mapped_column(ForeignKey(Jam.jam_id))
36+
user_id: Mapped[int] = mapped_column(ForeignKey(User.user_id))
37+
jam_id: Mapped[int] = mapped_column(ForeignKey("jams.jam_id"))
3438
experience_level_git: Mapped[ExperienceLevels] = mapped_column(
3539
Enum(*ExperienceLevels.__args__, name="experience_level_git_enum"),
3640
nullable=False,

0 commit comments

Comments
 (0)