Mark an activity as completed on behalf of a user.
(
request: Request,
token_user: APITokenUser,
user_id: int,
activity_uuid: str,
db_session: AsyncSession,
)
| 424 | |
| 425 | |
| 426 | async def complete_activity( |
| 427 | request: Request, |
| 428 | token_user: APITokenUser, |
| 429 | user_id: int, |
| 430 | activity_uuid: str, |
| 431 | db_session: AsyncSession, |
| 432 | ) -> dict: |
| 433 | """Mark an activity as completed on behalf of a user.""" |
| 434 | |
| 435 | await _get_user_in_org(user_id, token_user.org_id, db_session) |
| 436 | |
| 437 | activity = (await db_session.execute( |
| 438 | select(Activity).where(Activity.activity_uuid == activity_uuid) |
| 439 | )).scalars().first() |
| 440 | if not activity: |
| 441 | raise HTTPException(status_code=404, detail="Activity not found") |
| 442 | |
| 443 | course = (await db_session.execute(select(Course).where(Course.id == activity.course_id))).scalars().first() |
| 444 | if not course or course.org_id != token_user.org_id: |
| 445 | raise HTTPException(status_code=404, detail="Activity not found") |
| 446 | |
| 447 | # Ensure trail exists |
| 448 | trail = (await db_session.execute( |
| 449 | select(Trail).where(Trail.org_id == token_user.org_id, Trail.user_id == user_id) |
| 450 | )).scalars().first() |
| 451 | if not trail: |
| 452 | trail = Trail( |
| 453 | org_id=token_user.org_id, |
| 454 | user_id=user_id, |
| 455 | trail_uuid=f"trail_{uuid4()}", |
| 456 | creation_date=str(datetime.now()), |
| 457 | update_date=str(datetime.now()), |
| 458 | ) |
| 459 | db_session.add(trail) |
| 460 | await db_session.commit() |
| 461 | await db_session.refresh(trail) |
| 462 | |
| 463 | # Ensure trail run exists |
| 464 | trailrun = (await db_session.execute( |
| 465 | select(TrailRun).where( |
| 466 | TrailRun.trail_id == trail.id, |
| 467 | TrailRun.course_id == course.id, |
| 468 | TrailRun.user_id == user_id, |
| 469 | ) |
| 470 | )).scalars().first() |
| 471 | if not trailrun: |
| 472 | trailrun = TrailRun( |
| 473 | trail_id=trail.id if trail.id is not None else 0, |
| 474 | course_id=course.id if course.id is not None else 0, |
| 475 | org_id=course.org_id, |
| 476 | user_id=user_id, |
| 477 | creation_date=str(datetime.now()), |
| 478 | update_date=str(datetime.now()), |
| 479 | ) |
| 480 | db_session.add(trailrun) |
| 481 | await db_session.commit() |
| 482 | await db_session.refresh(trailrun) |
| 483 |