diff --git a/database_setup/models.py b/database_setup/models.py index cc6be82..6c23d36 100644 --- a/database_setup/models.py +++ b/database_setup/models.py @@ -41,6 +41,9 @@ class CategoryGroup(SQLModel, table=True): 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. + + Table Constraints: + __table_args__: Unique constraint on guild_id and name to ensure unique category groups within a guild. """ __tablename__: str = "CategoryGroups" @@ -66,9 +69,28 @@ class CategoryGroup(SQLModel, table=True): class Category(SQLModel, table=True): + """ + Represents a category in the database. + + Attributes: + id (int): The unique identifier for the category. Primary key. + name (str): The name of the category with a maximum length of 30 characters. + group_id (int): The identifier of the group to which the category belongs. + Foreign key referencing CategoryGroups.id. + size (int): The size attribute of the category, default is 3. + is_ascending (bool): Indicates if the category is in ascending order. Default is True. + is_time_record (bool): Indicates if the category is a time record. Default is False. + is_validated (bool): Indicates if the category is validated. Default is True. + category_group (CategoryGroup | None): The relationship to the CategoryGroup model. + scores (list["Score"] | None): The relationship to the Score model with cascade delete enabled. + + Table Constraints: + __table_args__: Unique constraint on group_id and name to ensure unique category names within a group. + """ + __tablename__: str = "Categories" - id: int | None = Field(default=None, primary_key=True) + id: int = Field(default=None, primary_key=True) name: str = Field(max_length=30) group_id: int = Field( sa_column=Column( @@ -89,6 +111,18 @@ class Category(SQLModel, table=True): class Score(SQLModel, table=True): + """ + Represents a score entry in the database. + + Attributes: + username (str): The username associated with the score. This is a primary key. + score (float): The score value. + category_id (int): The ID of the category this score belongs to. This is a primary key and a foreign key + referencing the Categories table. + category (Category | None): The relationship to the Category model, back-populated by the scores attribute + in the Category model. + """ + __tablename__: str = "Scores" username: str = Field(max_length=30, nullable=False, primary_key=True) @@ -106,6 +140,19 @@ class Score(SQLModel, table=True): class Submission(SQLModel, table=True): + """ + Represents a submission in the database. + + Attributes: + category_id (int): The ID of the category. This is a primary key. + group_id (int): The ID of the group. + guild_id (int): The ID of the guild. + message_id (int): The ID of the message. + score (str): The score of the submission, with a maximum length of 30 characters. + user_id (int): The ID of the user. + username (str): The username of the user. This is a primary key. + """ + __tablename__: str = "Submissions" category_id: int = Field(