mirror of
https://github.com/rzmk/learnhouse.git
synced 2025-12-19 04:19:25 +00:00
fix: trail related bugs + general design improvements
This commit is contained in:
parent
53f40f3f34
commit
5b3c2fab24
17 changed files with 128 additions and 71 deletions
|
|
@ -46,8 +46,12 @@ class TrailRunRead(BaseModel):
|
|||
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")
|
||||
# course object
|
||||
course: dict
|
||||
# timestamps
|
||||
creation_date: str
|
||||
update_date: str
|
||||
# number of activities in course
|
||||
course_total_steps: int
|
||||
steps: list[TrailStep]
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ from enum import Enum
|
|||
from typing import Optional
|
||||
from sqlalchemy import JSON, Column
|
||||
from sqlmodel import Field, SQLModel
|
||||
from sqlalchemy import BigInteger, Column, ForeignKey
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
|
||||
class TrailStepTypeEnum(str, Enum):
|
||||
|
|
@ -17,7 +19,9 @@ class TrailStep(SQLModel, table=True):
|
|||
grade: str
|
||||
data: dict = Field(default={}, sa_column=Column(JSON))
|
||||
# foreign keys
|
||||
trailrun_id: int = Field(default=None, foreign_key="trailrun.id")
|
||||
trailrun_id: int = Field(
|
||||
sa_column=Column(BigInteger, ForeignKey("trailrun.id", ondelete="CASCADE"))
|
||||
)
|
||||
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")
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ async def api_remove_course_to_trail(
|
|||
@router.post("/add_activity/{activity_uuid}")
|
||||
async def api_add_activity_to_trail(
|
||||
request: Request,
|
||||
activity_id: int,
|
||||
activity_uuid: str,
|
||||
user=Depends(get_current_user),
|
||||
db_session=Depends(get_db_session),
|
||||
) -> TrailRead:
|
||||
|
|
@ -93,5 +93,5 @@ async def api_add_activity_to_trail(
|
|||
Add Course to trail
|
||||
"""
|
||||
return await add_activity_to_trail(
|
||||
request, user, activity_id, db_session
|
||||
request, user, activity_uuid, db_session
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from datetime import datetime
|
||||
from uuid import uuid4
|
||||
from src.db.chapter_activities import ChapterActivity
|
||||
from fastapi import HTTPException, Request, status
|
||||
from sqlmodel import Session, select
|
||||
from src.db.activities import Activity
|
||||
|
|
@ -57,9 +58,24 @@ async def get_user_trails(
|
|||
trail_runs = db_session.exec(statement).all()
|
||||
|
||||
trail_runs = [
|
||||
TrailRunRead(**trail_run.__dict__, steps=[]) for trail_run in trail_runs
|
||||
TrailRunRead(**trail_run.__dict__, course={}, steps=[], course_total_steps=0)
|
||||
for trail_run in trail_runs
|
||||
]
|
||||
|
||||
# Add course object and total activities in a course to trail runs
|
||||
for trail_run in trail_runs:
|
||||
statement = select(Course).where(Course.id == trail_run.course_id)
|
||||
course = db_session.exec(statement).first()
|
||||
trail_run.course = course
|
||||
|
||||
# Add number of activities (steps) in a course
|
||||
statement = select(ChapterActivity).where(
|
||||
ChapterActivity.course_id == trail_run.course_id
|
||||
)
|
||||
course_total_steps = db_session.exec(statement)
|
||||
# count number of activities in a this list
|
||||
trail_run.course_total_steps = len(course_total_steps.all())
|
||||
|
||||
for trail_run in trail_runs:
|
||||
statement = select(TrailStep).where(TrailStep.trailrun_id == trail_run.id)
|
||||
trail_steps = db_session.exec(statement).all()
|
||||
|
|
@ -95,9 +111,24 @@ async def get_user_trail_with_orgid(
|
|||
trail_runs = db_session.exec(statement).all()
|
||||
|
||||
trail_runs = [
|
||||
TrailRunRead(**trail_run.__dict__, steps=[]) for trail_run in trail_runs
|
||||
TrailRunRead(**trail_run.__dict__, course={}, steps=[], course_total_steps=0)
|
||||
for trail_run in trail_runs
|
||||
]
|
||||
|
||||
# Add course object and total activities in a course to trail runs
|
||||
for trail_run in trail_runs:
|
||||
statement = select(Course).where(Course.id == trail_run.course_id)
|
||||
course = db_session.exec(statement).first()
|
||||
trail_run.course = course
|
||||
|
||||
# Add number of activities (steps) in a course
|
||||
statement = select(ChapterActivity).where(
|
||||
ChapterActivity.course_id == trail_run.course_id
|
||||
)
|
||||
course_total_steps = db_session.exec(statement)
|
||||
# count number of activities in a this list
|
||||
trail_run.course_total_steps = len(course_total_steps.all())
|
||||
|
||||
for trail_run in trail_runs:
|
||||
statement = select(TrailStep).where(TrailStep.trailrun_id == trail_run.id)
|
||||
trail_steps = db_session.exec(statement).all()
|
||||
|
|
@ -121,11 +152,11 @@ async def get_user_trail_with_orgid(
|
|||
async def add_activity_to_trail(
|
||||
request: Request,
|
||||
user: PublicUser,
|
||||
activity_id: int,
|
||||
activity_uuid: str,
|
||||
db_session: Session,
|
||||
) -> TrailRead:
|
||||
# Look for the activity
|
||||
statement = select(Activity).where(Activity.id == activity_id)
|
||||
statement = select(Activity).where(Activity.activity_uuid == activity_uuid)
|
||||
activity = db_session.exec(statement).first()
|
||||
|
||||
if not activity:
|
||||
|
|
@ -133,15 +164,6 @@ async def add_activity_to_trail(
|
|||
status_code=status.HTTP_404_NOT_FOUND, detail="Activity not found"
|
||||
)
|
||||
|
||||
# check if run already exists
|
||||
statement = select(TrailRun).where(TrailRun.course_id == activity.course_id)
|
||||
trailrun = db_session.exec(statement).first()
|
||||
|
||||
if trailrun:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST, detail="TrailRun already exists"
|
||||
)
|
||||
|
||||
statement = select(Course).where(Course.id == activity.course_id)
|
||||
course = db_session.exec(statement).first()
|
||||
|
||||
|
|
@ -179,15 +201,16 @@ async def add_activity_to_trail(
|
|||
db_session.refresh(trailrun)
|
||||
|
||||
statement = select(TrailStep).where(
|
||||
TrailStep.trailrun_id == trailrun.id, TrailStep.activity_id == activity_id
|
||||
TrailStep.trailrun_id == trailrun.id, TrailStep.activity_id == activity.id
|
||||
)
|
||||
trailstep = db_session.exec(statement).first()
|
||||
|
||||
if not trailstep:
|
||||
trailstep = TrailStep(
|
||||
trailrun_id=trailrun.id if trailrun.id is not None else 0,
|
||||
activity_id=activity_id,
|
||||
activity_id=activity.id,
|
||||
course_id=course.id if course.id is not None else 0,
|
||||
trail_id=trail.id if trail.id is not None else 0,
|
||||
org_id=course.org_id,
|
||||
complete=False,
|
||||
teacher_verified=False,
|
||||
|
|
@ -204,7 +227,8 @@ async def add_activity_to_trail(
|
|||
trail_runs = db_session.exec(statement).all()
|
||||
|
||||
trail_runs = [
|
||||
TrailRunRead(**trail_run.__dict__, steps=[]) for trail_run in trail_runs
|
||||
TrailRunRead(**trail_run.__dict__, course={}, steps=[], course_total_steps=0)
|
||||
for trail_run in trail_runs
|
||||
]
|
||||
|
||||
for trail_run in trail_runs:
|
||||
|
|
@ -282,7 +306,7 @@ async def add_course_to_trail(
|
|||
trail_runs = db_session.exec(statement).all()
|
||||
|
||||
trail_runs = [
|
||||
TrailRunRead(**trail_run.__dict__, steps=[]) for trail_run in trail_runs
|
||||
TrailRunRead(**trail_run.__dict__, course={}, steps=[], course_total_steps=0 ) for trail_run in trail_runs
|
||||
]
|
||||
|
||||
for trail_run in trail_runs:
|
||||
|
|
@ -338,12 +362,21 @@ async def remove_course_from_trail(
|
|||
db_session.delete(trail_run)
|
||||
db_session.commit()
|
||||
|
||||
# Delete all trail steps for this course
|
||||
statement = select(TrailStep).where(TrailStep.course_id == course.id)
|
||||
trail_steps = db_session.exec(statement).all()
|
||||
|
||||
for trail_step in trail_steps:
|
||||
db_session.delete(trail_step)
|
||||
db_session.commit()
|
||||
|
||||
statement = select(TrailRun).where(TrailRun.trail_id == trail.id)
|
||||
trail_runs = db_session.exec(statement).all()
|
||||
|
||||
trail_runs = [
|
||||
TrailRunRead(**trail_run.__dict__, steps=[]) for trail_run in trail_runs
|
||||
TrailRunRead(**trail_run.__dict__, course={}, steps=[], course_total_steps=0 ) for trail_run in trail_runs
|
||||
]
|
||||
|
||||
for trail_run in trail_runs:
|
||||
statement = select(TrailStep).where(TrailStep.trailrun_id == trail_run.id)
|
||||
trail_steps = db_session.exec(statement).all()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue