Files
agon/database_setup/models.py
T

129 lines
5.0 KiB
Python

"""File holds all model definitions of SQL tables."""
from sqlalchemy.dialects.mysql import BIGINT, INTEGER, SMALLINT
from sqlmodel import Column, Field, ForeignKey, Relationship, SQLModel, UniqueConstraint
class Guild(SQLModel, table=True):
"""
Represents a Guild entity in the database.
Attributes:
id (int): The unique identifier for the guild.
name (str): The name of the guild.
submission_channel (int): The ID of the submission channel associated with the guild.
verification_channel (int): The ID of the verification channel associated with the guild.
active (bool): Indicates whether the guild is active. Defaults to True.
category_groups (list[CategoryGroup]): A list of category groups associated with the guild.
"""
__tablename__: str = "Guilds"
id: int = Field(sa_column=Column(BIGINT(unsigned=True), primary_key=True, nullable=False))
name: str = Field(max_length=95)
submission_channel: int = Field(sa_column=Column(BIGINT(unsigned=True)))
verification_channel: int = Field(sa_column=Column(BIGINT(unsigned=True)))
active: bool = Field(default=True)
category_groups: list["CategoryGroup"] = Relationship(back_populates="guild", cascade_delete=True)
class CategoryGroup(SQLModel, table=True):
"""
Represents a category group in the database.
Attributes:
id (int | None): The primary key of the category group.
name (str): The name of the category group, with a maximum length of 50 characters.
channel_id (int): The ID of the channel associated with the category group.
guild_id (int): The ID of the guild associated with the category group.
message_id (int): The ID of the message associated with the category group.
pad_length (int): The padding length for the category group, default is 12.
username_length (int): The username length for the category group, default is 12.
guild (Guild | None): The guild relationship back-populated from the Guild model.
"""
__tablename__: str = "CategoryGroups"
id: int | None = Field(default=None, primary_key=True)
name: str = Field(max_length=50)
channel_id: int = Field(sa_column=Column(BIGINT(unsigned=True)))
guild_id: int = Field(
sa_column=Column(
BIGINT(unsigned=True),
ForeignKey("Guilds.id", ondelete="CASCADE"),
nullable=False,
)
)
message_id: int = Field(sa_column=Column(BIGINT(unsigned=True)))
pad_length: int = Field(default=12, sa_column=Column(SMALLINT(unsigned=True)))
username_length: int = Field(default=12, sa_column=Column(SMALLINT(unsigned=True)))
__table_args__ = (UniqueConstraint("guild_id", "name", name="UniqueGuildCategoryGroup"),)
guild: Guild | None = Relationship(back_populates="category_groups")
categories: list["Category"] | None = Relationship(back_populates="category_group", cascade_delete=True)
class Category(SQLModel, table=True):
__tablename__: str = "Categories"
id: int | None = Field(default=None, primary_key=True)
name: str = Field(max_length=30)
group_id: int = Field(
sa_column=Column(
INTEGER(unsigned=True),
ForeignKey("CategoryGroups.id", ondelete="CASCADE"),
nullable=False,
)
)
size: int = Field(sa_column=Column(SMALLINT(unsigned=True), default=3, nullable=False))
is_ascending: bool = Field(default=True, nullable=False)
is_time_record: bool = Field(default=False, nullable=False)
is_validated: bool = Field(default=True, nullable=False)
__table_args__ = (UniqueConstraint("group_id", "name", name="UniqueCategoryInGroup"),)
category_group: CategoryGroup | None = Relationship(back_populates="categories")
scores: list["Score"] | None = Relationship(back_populates="category", cascade_delete=True)
class Score(SQLModel, table=True):
__tablename__: str = "Scores"
username: str = Field(max_length=30, nullable=False, primary_key=True)
score: float = Field(nullable=False)
category_id: int = Field(
sa_column=Column(
INTEGER(unsigned=True),
ForeignKey("Categories.id", ondelete="CASCADE"),
nullable=False,
primary_key=True,
),
)
category: Category | None = Relationship(back_populates="scores")
class Submission(SQLModel, table=True):
__tablename__: str = "Submissions"
category_id: int = Field(
sa_column=Column(
INTEGER(unsigned=True),
nullable=False,
primary_key=True,
),
)
group_id: int = Field(
sa_column=Column(
INTEGER(unsigned=True),
nullable=False,
)
)
guild_id: int = Field(sa_column=Column(BIGINT(unsigned=True), nullable=False))
message_id: int = Field(sa_column=Column(BIGINT(unsigned=True), nullable=False))
score: str = Field(max_length=30, nullable=False)
user_id: int = Field(sa_column=Column(BIGINT(unsigned=True), nullable=False))
username: str = Field(max_length=30, nullable=False, primary_key=True)