Skip to content

Commit

Permalink
feat: roster endpoint POC
Browse files Browse the repository at this point in the history
  • Loading branch information
zacharis278 committed Nov 3, 2023
1 parent 2dbb115 commit 5ea0826
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
1 change: 1 addition & 0 deletions edx_exams/apps/lti/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@
path('end_assessment/<int:attempt_id>', views.end_assessment, name='end_assessment'),
path('start_proctoring/<int:attempt_id>', views.start_proctoring, name='start_proctoring'),
path('exam/<int:exam_id>/instructor_tool', views.launch_instructor_tool, name='instructor_tool'),
path('exam/<int:exam_id>/instructor_tool/roster', views.exam_roster, name='exam_roster'),
]
31 changes: 31 additions & 0 deletions edx_exams/apps/lti/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
from urllib.parse import urljoin

from django.contrib.auth import login
from django.http import JsonResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication
from lti_consumer.api import get_end_assessment_return, get_lti_1p3_launch_start_url
Expand All @@ -25,6 +27,7 @@
from edx_exams.apps.core.api import (
get_attempt_by_id,
get_attempt_for_user_with_attempt_number_and_resource_id,
get_exam_attempts,
get_exam_by_id,
get_exam_url_path,
update_attempt_status
Expand Down Expand Up @@ -362,4 +365,32 @@ def launch_instructor_tool(request, exam_id):
context_id=exam.course_id,
)

# user is authenticated via JWT so use that to create a
# session with this service's authentication backend
request.user.backend = EDX_OAUTH_BACKEND
login(request, user)

return redirect(get_lti_1p3_launch_start_url(launch_data))


@csrf_exempt
@require_http_methods(['GET'])
def exam_roster(request, exam_id):
"""
Temporary endpoint to prove we can authenticate this request properly
"""
user = request.user
exam = get_exam_by_id(exam_id)

Check warning on line 383 in edx_exams/apps/lti/views.py

View check run for this annotation

Codecov / codecov/patch

edx_exams/apps/lti/views.py#L382-L383

Added lines #L382 - L383 were not covered by tests
if not user.is_staff and not user.has_course_staff_permission(exam.course_id):
return Response(status=status.HTTP_403_FORBIDDEN)

Check warning on line 385 in edx_exams/apps/lti/views.py

View check run for this annotation

Codecov / codecov/patch

edx_exams/apps/lti/views.py#L385

Added line #L385 was not covered by tests

attempts = get_exam_attempts(exam_id)
attempts.select_related('user')

Check warning on line 388 in edx_exams/apps/lti/views.py

View check run for this annotation

Codecov / codecov/patch

edx_exams/apps/lti/views.py#L387-L388

Added lines #L387 - L388 were not covered by tests

users = set(attempt.user for attempt in attempts)
roster = [
(user.anonymous_user_id, user.username)
for user in users
]

return JsonResponse(roster, safe=False)

Check warning on line 396 in edx_exams/apps/lti/views.py

View check run for this annotation

Codecov / codecov/patch

edx_exams/apps/lti/views.py#L396

Added line #L396 was not covered by tests

0 comments on commit 5ea0826

Please sign in to comment.