Skip to content

Commit 36f51b8

Browse files
committed
feat: Send an LTI launch event for LTI Launches
1 parent 8485b2f commit 36f51b8

2 files changed

Lines changed: 53 additions & 1 deletion

File tree

lms/djangoapps/lti_provider/tests/test_views.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.test.client import RequestFactory
1111
from django.urls import reverse
1212
from opaque_keys.edx.locator import BlockUsageLocator, CourseLocator
13+
from openedx_events.learning.data import UserData, UserPersonalData, LtiProviderLaunchData, LtiProviderLaunchParamsData
1314

1415
from common.djangoapps.student.tests.factories import UserFactory
1516
from lms.djangoapps.courseware.testutils import RenderXBlockTestMixin
@@ -96,15 +97,36 @@ class LtiLaunchTest(LtiTestMixin, TestCase):
9697
"""
9798
Tests for the lti_launch view
9899
"""
100+
@patch('lms.djangoapps.lti_provider.views.LTI_PROVIDER_LAUNCH_SUCCESS.send_event')
99101
@patch('lms.djangoapps.lti_provider.views.render_courseware')
100102
@patch('lms.djangoapps.lti_provider.views.authenticate_lti_user')
101-
def test_valid_launch(self, _authenticate, render):
103+
def test_valid_launch(self, _authenticate, render, lti_launch_success_send_event):
102104
"""
103105
Verifies that the LTI launch succeeds when passed a valid request.
104106
"""
105107
request = build_launch_request()
106108
views.lti_launch(request, str(COURSE_KEY), str(USAGE_KEY))
107109
render.assert_called_with(request, USAGE_KEY)
110+
lti_launch_success_send_event.assert_called_with(
111+
launch_data=LtiProviderLaunchData(
112+
user=UserData(
113+
id=request.user.id,
114+
is_active=request.user.is_active,
115+
pii=UserPersonalData(
116+
username=request.user.username,
117+
email=request.user.email,
118+
name=request.user.profile.name,
119+
)
120+
),
121+
course_key=COURSE_KEY,
122+
usage_key=USAGE_KEY,
123+
launch_params=LtiProviderLaunchParamsData(
124+
roles='Instructor,urn:lti:instrole:ims/lis/Administrator',
125+
context_id='lti_launch_context_id',
126+
user_id='LTI_User', extra_params={}
127+
)
128+
)
129+
)
108130

109131
@patch('lms.djangoapps.lti_provider.views.render_courseware')
110132
@patch('lms.djangoapps.lti_provider.views.store_outcome_parameters')

lms/djangoapps/lti_provider/views.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from common.djangoapps.edxmako.shortcuts import render_to_response
1313
from opaque_keys import InvalidKeyError
1414
from opaque_keys.edx.keys import CourseKey, UsageKey
15+
from openedx_events.learning.data import LtiProviderLaunchData, LtiProviderLaunchParamsData, UserData, UserPersonalData
16+
from openedx_events.learning.signals import LTI_PROVIDER_LAUNCH_SUCCESS
1517

1618
from common.djangoapps.util.views import add_p3p_header
1719
from lms.djangoapps.lti_provider.models import LtiConsumer
@@ -107,6 +109,34 @@ def lti_launch(request, course_id, usage_id):
107109
# used earlier to verify the oauth signature.
108110
store_outcome_parameters(params, request.user, lti_consumer)
109111

112+
# Make a copy of params for the event signal, and remove sensitive oauth parameters.
113+
launch_params = params.copy()
114+
for key in list(launch_params.keys()):
115+
if key.startswith('oauth_'):
116+
launch_params.pop(key)
117+
118+
LTI_PROVIDER_LAUNCH_SUCCESS.send_event(
119+
launch_data=LtiProviderLaunchData(
120+
user=UserData(
121+
pii=UserPersonalData(
122+
username=request.user.username,
123+
email=request.user.email,
124+
name=request.user.profile.name,
125+
),
126+
id=request.user.id,
127+
is_active=request.user.is_active,
128+
),
129+
course_key=launch_params.pop("course_key"),
130+
usage_key=launch_params.pop("usage_key"),
131+
launch_params=LtiProviderLaunchParamsData(
132+
roles=launch_params.pop("roles"),
133+
context_id=launch_params.pop("context_id"),
134+
user_id=launch_params.pop("user_id"),
135+
extra_params={key: str(val) for key, val in launch_params.items()},
136+
),
137+
)
138+
)
139+
110140
return render_courseware(request, params['usage_key'])
111141

112142

0 commit comments

Comments
 (0)