fix: trail related bugs + general design improvements

This commit is contained in:
swve 2023-12-14 16:41:28 +01:00
parent 53f40f3f34
commit 5b3c2fab24
17 changed files with 128 additions and 71 deletions

View file

@ -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

View file

@ -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")

View file

@ -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
)

View file

@ -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()