|
| 1 | +from typing import Optional |
1 | 2 | import uuid |
2 | 3 |
|
3 | | -from pydantic import EmailStr |
| 4 | +from pydantic import EmailStr, BaseModel |
4 | 5 | from sqlmodel import Field, Relationship, SQLModel |
| 6 | +from datetime import datetime |
| 7 | +import enum |
5 | 8 |
|
6 | 9 |
|
7 | 10 | # Shared properties |
@@ -112,3 +115,53 @@ class TokenPayload(SQLModel): |
112 | 115 | class NewPassword(SQLModel): |
113 | 116 | token: str |
114 | 117 | new_password: str = Field(min_length=8, max_length=40) |
| 118 | + |
| 119 | +class TaskDifficulty(enum.Enum): |
| 120 | + ONE_STAR = "one_star" |
| 121 | + TWO_STAR = "two_star" |
| 122 | + THREE_STAR = "three_star" |
| 123 | + FOUR_STAR = "four_star" |
| 124 | + FIVE_STAR = "five_star" |
| 125 | + |
| 126 | + |
| 127 | +class Task(SQLModel, table=True): |
| 128 | + __tablename__ = "tasks" |
| 129 | + |
| 130 | + id: Optional[int] = Field(default=None, primary_key=True, index=True) |
| 131 | + title: str = Field(..., max_length=255, description="Заголовок задачи (короткое описание)") |
| 132 | + description: str = Field(..., description="Полный текст задачи (условие)") |
| 133 | + test_cases: str = Field(..., description="JSON-объект с тестами (входные данные и ожидание ответа)") |
| 134 | + constraints: str = Field(default=None, description="JSON-объект с ограничениями (например, время/память)") |
| 135 | + difficulty: TaskDifficulty = Field(default=TaskDifficulty.ONE_STAR, description="Сложность задачи (1-5 звезд)") |
| 136 | + tags: str = Field(default=None, description="Тема задачи или теги (например, ['dynamic programming', 'math'])") |
| 137 | + illumination_type: str = Field(default=None, description="Тип иллюминации, к которой относится задача (interview, kids)") |
| 138 | + category: str = Field(description="Категория задачи (строки, числа, связные списки и пр.)") |
| 139 | + hint: Optional[str] = Field(default=None, description="Подсказка к задаче") |
| 140 | + created_at: datetime = Field(default_factory=datetime, description="Дата создания задачи") |
| 141 | + is_active: bool = Field(default=True, description="Активность задачи (например, скрытие её в системе)") |
| 142 | + solutions: list["Solution"] = Relationship(back_populates="task") |
| 143 | + |
| 144 | + |
| 145 | +class Solution(SQLModel, table=True): |
| 146 | + __tablename__ = "solutions" |
| 147 | + |
| 148 | + id: Optional[int] = Field(default=None, primary_key=True, index=True) |
| 149 | + task_id: int = Field(..., foreign_key="tasks.id", description="Связь с задачей") |
| 150 | + solution_code: str = Field(..., description="Текст решения (например, Python-код)") |
| 151 | + is_correct: bool = Field(default=False, description="Флаг корректности решения") |
| 152 | + created_at: datetime = Field(default_factory=datetime.utcnow, description="Дата создания решения") |
| 153 | + task: Task = Relationship(back_populates="solutions") |
| 154 | + |
| 155 | +class TaskPublic(BaseModel): |
| 156 | + id: Optional[int] = Field(default=None, primary_key=True, index=True) |
| 157 | + title: str = Field(..., max_length=255, description="Заголовок задачи (короткое описание)") |
| 158 | + description: str = Field(..., description="Полный текст задачи (условие)") |
| 159 | + difficulty: TaskDifficulty = Field(default=TaskDifficulty.ONE_STAR, description="Сложность задачи (1-5 звезд)") |
| 160 | + illumination_type: str = Field(default=None, description="Тип иллюминации, к которой относится задача (interview, kids)") |
| 161 | + category: str = Field(description="Категория задачи (строки, числа, связные списки и пр.)") |
| 162 | + created_at: datetime = Field(default_factory=datetime, description="Дата создания задачи") |
| 163 | + |
| 164 | +class IlluminationPublic(SQLModel): |
| 165 | + illumination_type: str |
| 166 | + tasks: list[TaskPublic] |
| 167 | + |
0 commit comments