mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
feat: init trails
This commit is contained in:
parent
b04fd64c92
commit
eca819b896
5 changed files with 495 additions and 253 deletions
53
apps/api/src/db/trail_runs.py
Normal file
53
apps/api/src/db/trail_runs.py
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
from sqlalchemy import JSON, Column
|
||||
from sqlmodel import Field, SQLModel
|
||||
from enum import Enum
|
||||
|
||||
from src.db.trail_steps import TrailStep
|
||||
|
||||
|
||||
class TrailRunEnum(str, Enum):
|
||||
RUN_TYPE_COURSE = "RUN_TYPE_COURSE"
|
||||
|
||||
|
||||
class StatusEnum(str, Enum):
|
||||
STATUS_IN_PROGRESS = "STATUS_IN_PROGRESS"
|
||||
STATUS_COMPLETED = "STATUS_COMPLETED"
|
||||
STATUS_PAUSED = "STATUS_PAUSED"
|
||||
STATUS_CANCELLED = "STATUS_CANCELLED"
|
||||
|
||||
|
||||
class TrailRun(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
data: dict = Field(default={}, sa_column=Column(JSON))
|
||||
status: StatusEnum = StatusEnum.STATUS_IN_PROGRESS
|
||||
# foreign keys
|
||||
trail_id: int = Field(default=None, foreign_key="trail.id")
|
||||
course_id: int = Field(default=None, foreign_key="course.id")
|
||||
org_id: int = Field(default=None, foreign_key="organization.id")
|
||||
user_id: int = Field(default=None, foreign_key="user.id")
|
||||
# timestamps
|
||||
creation_date: str
|
||||
update_date: str
|
||||
|
||||
|
||||
class TrailRunCreate(TrailRun):
|
||||
pass
|
||||
|
||||
|
||||
# trick because Lists are not supported in SQLModel (runs: list[TrailStep] )
|
||||
class TrailRunRead(BaseModel):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
data: dict = Field(default={}, sa_column=Column(JSON))
|
||||
status: StatusEnum = StatusEnum.STATUS_IN_PROGRESS
|
||||
# foreign keys
|
||||
trail_id: int = Field(default=None, foreign_key="trail.id")
|
||||
course_id: int = Field(default=None, foreign_key="course.id")
|
||||
org_id: int = Field(default=None, foreign_key="organization.id")
|
||||
user_id: int = Field(default=None, foreign_key="user.id")
|
||||
# timestamps
|
||||
creation_date: str
|
||||
update_date: str
|
||||
steps: list[TrailStep]
|
||||
pass
|
||||
32
apps/api/src/db/trail_steps.py
Normal file
32
apps/api/src/db/trail_steps.py
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
from enum import Enum
|
||||
from typing import Optional
|
||||
from sqlalchemy import JSON, Column
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
|
||||
class TrailStepTypeEnum(str, Enum):
|
||||
STEP_TYPE_READABLE_ACTIVITY = "STEP_TYPE_READABLE_ACTIVITY"
|
||||
STEP_TYPE_ASSIGNMENT_ACTIVITY = "STEP_TYPE_ASSIGNMENT_ACTIVITY"
|
||||
STEP_TYPE_CUSTOM_ACTIVITY = "STEP_TYPE_CUSTOM_ACTIVITY"
|
||||
|
||||
|
||||
class TrailStep(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
complete: bool
|
||||
teacher_verified: bool
|
||||
grade: str
|
||||
data: dict = Field(default={}, sa_column=Column(JSON))
|
||||
# foreign keys
|
||||
trailrun_id: int = Field(default=None, foreign_key="trailrun.id")
|
||||
trail_id: int = Field(default=None, foreign_key="trail.id")
|
||||
activity_id: int = Field(default=None, foreign_key="activity.id")
|
||||
course_id: int = Field(default=None, foreign_key="course.id")
|
||||
org_id: int = Field(default=None, foreign_key="organization.id")
|
||||
user_id: int = Field(default=None, foreign_key="user.id")
|
||||
# timestamps
|
||||
creation_date: str
|
||||
update_date: str
|
||||
|
||||
|
||||
# note : prepare assignments support
|
||||
# an assignment object will be linked to a trail step object in the future
|
||||
34
apps/api/src/db/trails.py
Normal file
34
apps/api/src/db/trails.py
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
from typing import Optional
|
||||
from pydantic import BaseModel
|
||||
from sqlmodel import Field, SQLModel
|
||||
from enum import Enum
|
||||
from src.db.trail_runs import TrailRun, TrailRunRead
|
||||
|
||||
from src.db.trail_steps import TrailStep
|
||||
|
||||
|
||||
class TrailBase(SQLModel):
|
||||
org_id: int = Field(default=None, foreign_key="organization.id")
|
||||
user_id: int = Field(default=None, foreign_key="user.id")
|
||||
|
||||
|
||||
class Trail(TrailBase, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
trail_uuid: str = ""
|
||||
creation_date: str = ""
|
||||
update_date: str = ""
|
||||
|
||||
|
||||
class TrailCreate(TrailBase):
|
||||
pass
|
||||
|
||||
|
||||
# trick because Lists are not supported in SQLModel (runs: list[TrailRun] )
|
||||
class TrailRead(BaseModel):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
trail_uuid: str
|
||||
org_id: int = Field(default=None, foreign_key="organization.id")
|
||||
user_id: int = Field(default=None, foreign_key="user.id")
|
||||
creation_date: str
|
||||
update_date: str
|
||||
runs: list[TrailRunRead]
|
||||
Loading…
Add table
Add a link
Reference in a new issue