Skip to content

Commit 3f6ac7e

Browse files
committed
add variable substitutions and capabilities needed for lti2
fixes PLAT-765 test-plan: specs pass Change-Id: I8d365f16c954194a103ec7f3047a91c70500712b Reviewed-on: https://gerrit.instructure.com/44376 Tested-by: Jenkins <jenkins@instructure.com> Reviewed-by: Brad Humphrey <brad@instructure.com> Product-Review: Nathan Mills <nathanm@instructure.com> QA-Review: Nathan Mills <nathanm@instructure.com>
1 parent f0ce6fc commit 3f6ac7e

10 files changed

Lines changed: 53 additions & 17 deletions

File tree

app/controllers/lti/message_controller.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
module Lti
2020
class MessageController < ApplicationController
21-
before_filter :require_context
21+
before_filter :require_context, except: :registration_return
22+
skip_before_filter :require_user, only: :registration_return
23+
skip_before_filter :load_user, only: :registration_return
2224

2325
def registration
2426
if authorized_action(@context, @current_user, :update)
@@ -69,6 +71,11 @@ def basic_lti_launch_request
6971
not_found
7072
end
7173

74+
def registration_return
75+
#params['lti_log']
76+
@message = params['lti_errormsg'] || params['lti_msg']
77+
end
78+
7279
private
7380

7481
def module_sequence(message_handler)
@@ -109,9 +116,9 @@ def tool_consumer_profile_url
109116
def registration_return_url
110117
case context
111118
when Course
112-
course_settings_url(context)
119+
course_registration_return_url(context)
113120
when Account
114-
account_settings_url(context)
121+
account_registration_return_url(context)
115122
else
116123
raise "Unsupported context"
117124
end

app/controllers/lti/tool_consumer_profile_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ToolConsumerProfileController < ApplicationController
2525
def show
2626
uuid = "339b6700-e4cb-47c5-a54f-3ee0064921a9" #Hard coded until we start persisting the tcp
2727
profile = Lti::ToolConsumerProfileCreator.new(@context, tool_consumer_profile_url(uuid)).create
28-
render json: profile.to_json, :content_type => 'application/json'
28+
render json: profile.to_json, :content_type => 'application/vnd.ims.lti.v2.toolconsumerprofile+json'
2929
end
3030

3131
private
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div><%= @message %></div>

config/routes.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@
286286

287287
get 'lti/basic_lti_launch_request/:message_handler_id', controller: 'lti/message', action: 'basic_lti_launch_request', as: :basic_lti_launch_request
288288
get 'lti/tool_proxy_registration', controller: 'lti/message', action: 'registration', as: :tool_proxy_registration
289-
289+
get 'lti/registration_return', controller: 'lti/message', action: 'registration_return', as: :registration_return
290290

291291
resources :submissions
292292
resources :calendar_events
@@ -547,7 +547,7 @@
547547

548548
get 'lti/basic_lti_launch_request/:message_handler_id', controller: 'lti/message', action: 'basic_lti_launch_request', as: :basic_lti_launch_request
549549
get 'lti/tool_proxy_registration', controller: 'lti/message', action: 'registration', as: :tool_proxy_registration
550-
550+
get 'lti/registration_return', controller: 'lti/message', action: 'registration_return', as: :registration_return
551551

552552
get 'outcomes/users/:user_id' => 'outcomes#user_outcome_results', as: :user_outcomes_results
553553
resources :outcomes do

gems/lti_outbound/lib/lti_outbound/tool_launch.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ def generate(overrides={})
8787
if tool.public?
8888
hash['user_image'] = user.avatar_url
8989
hash['custom_canvas_user_id'] = '$Canvas.user.id'
90-
hash['lis_person_sourcedid'] = user.sis_source_id if user.sis_source_id
90+
hash['lis_person_sourcedid'] = '$Person.sourcedId' if user.sis_source_id
9191
hash['custom_canvas_user_login_id'] = '$Canvas.user.loginId'
9292
if context.is_a?(LTICourse)
9393
hash['custom_canvas_course_id'] = '$Canvas.course.id'
94-
hash['lis_course_offering_sourcedid'] = context.sis_source_id if context.sis_source_id
94+
hash['lis_course_offering_sourcedid'] = '$CourseSection.sourcedId' if context.sis_source_id
9595
elsif context.is_a?(LTIAccount) || context.is_a?(LTIUser)
9696
hash['custom_canvas_account_id'] = '$Canvas.account.id'
9797
hash['custom_canvas_account_sis_id'] = '$Canvas.account.sisSourceId'

gems/lti_outbound/spec/lti_outbound/tool_launch_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@
118118
expect(hash['custom_canvas_user_login_id']).to eq 'user_login_id'
119119
expect(hash['custom_canvas_course_id']).to eq 'course_id'
120120
expect(hash['custom_canvas_api_domain']).to eq 'root_account_domain'
121-
expect(hash['lis_course_offering_sourcedid']).to eq 'course_sis_source_id'
121+
expect(hash['lis_course_offering_sourcedid']).to eq '$CourseSection.sourcedId'
122122
expect(hash['lis_person_contact_email_primary']).to eq 'nobody@example.com'
123123
expect(hash['lis_person_name_full']).to eq 'user_name'
124124
expect(hash['lis_person_name_family']).to eq 'last_name'
125125
expect(hash['lis_person_name_given']).to eq 'first_name'
126-
expect(hash['lis_person_sourcedid']).to eq 'sis_user_id'
126+
expect(hash['lis_person_sourcedid']).to eq '$Person.sourcedId'
127127
expect(hash['launch_presentation_locale']).to eq 'en' #was I18n.default_locale.to_s
128128
expect(hash['launch_presentation_document_target']).to eq 'iframe'
129129
expect(hash['launch_presentation_return_url']).to eq 'http://www.google.com'
@@ -208,7 +208,7 @@
208208
:variable_substitutor => @variable_substitutor).generate
209209
expect(hash['custom_canvas_account_id']).to eq 'root_account_id'
210210
expect(hash['custom_canvas_account_sis_id']).to eq 'root_account_sis_source_id'
211-
expect(hash['lis_person_sourcedid']).to eq 'sis_user_id'
211+
expect(hash['lis_person_sourcedid']).to eq '$Person.sourcedId'
212212
expect(hash['custom_canvas_user_id']).to eq 'user_id'
213213
expect(hash['tool_consumer_instance_guid']).to eq 'root_account_lti_guid' #was hash['tool_consumer_instance_guid']).to eq sub_account.root_account.lti_guid
214214
end

lib/lti/message_helper.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def common_variable_substitutions
4747
substitutions.merge!(
4848
{
4949
'$Canvas.course.id' => @context.id,
50+
'$CourseSection.sourcedId' => @context.sis_source_id,
5051
'$Canvas.course.sisSourceId' => @context.sis_source_id,
5152
'$Canvas.enrollment.enrollmentState' => -> { lti_helper.enrollment_state },
5253
'$Canvas.membership.roles' => -> { lti_helper.current_canvas_roles },
@@ -73,6 +74,8 @@ def common_variable_substitutions
7374
'$User.id' => @current_user.id,
7475
'$Canvas.user.id' => @current_user.id,
7576
'$Canvas.user.prefersHighContrast' => -> { @current_user.prefers_high_contrast? ? 'true' : 'false' },
77+
'$Membership.role' => -> { lti_helper.lis2_roles },
78+
'$Canvas.xuser.allRoles' => -> { lti_helper.all_roles}
7679
}
7780
)
7881
if sis_pseudonym
@@ -84,6 +87,7 @@ def common_variable_substitutions
8487
'$User.username' => sis_pseudonym.unique_id,
8588
'$Canvas.user.loginId' => sis_pseudonym.unique_id,
8689
'$Canvas.user.sisSourceId' => sis_pseudonym.sis_user_id,
90+
'$Person.sourcedId' => sis_pseudonym.sis_user_id,
8791
}
8892
)
8993
end

spec/apis/lti/tool_consumer_profile_api_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ module Lti
2828
it 'renders "application/json"' do
2929
tool_consumer_profile_id = 'a_made_up_id'
3030
get "/api/lti/accounts/#{account.id}/tool_consumer_profile/#{tool_consumer_profile_id}", tool_consumer_profile_id: tool_consumer_profile_id, account_id: account.id
31-
expect(response.content_type).to eq 'application/json'
31+
expect(response.content_type.to_s).to eq 'application/vnd.ims.lti.v2.toolconsumerprofile+json'
3232
end
3333

3434
it 'returns the consumer profile JSON' do

spec/lib/lti/message_helper_spec.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ def logged_in_user
103103
expect(subject.common_variable_substitutions['$Canvas.course.id']).to eq 123
104104
end
105105

106+
it 'has substitution for $CourseSection.sourcedId' do
107+
course.sis_source_id = 'course1'
108+
expect(subject.common_variable_substitutions['$CourseSection.sourcedId']).to eq 'course1'
109+
end
110+
106111
it 'has substitution for $Canvas.course.sisSourceId' do
107112
course.sis_source_id = 'course1'
108113
expect(subject.common_variable_substitutions['$Canvas.course.sisSourceId']).to eq 'course1'
@@ -192,6 +197,18 @@ def logged_in_user
192197
expect(subject.common_variable_substitutions['$Canvas.user.id']).to eq 456
193198
end
194199

200+
it 'has substitution for $Canvas.xuser.allRoles' do
201+
Lti::SubstitutionsHelper.stubs(:new).returns(substitution_helper)
202+
substitution_helper.stubs(:all_roles).returns('Admin,User')
203+
expect(subject.common_variable_substitutions['$Canvas.xuser.allRoles'].call).to eq 'Admin,User'
204+
end
205+
206+
it 'has substitution for $Membership.role' do
207+
Lti::SubstitutionsHelper.stubs(:new).returns(substitution_helper)
208+
substitution_helper.stubs(:lis2_roles).returns('Admin,User')
209+
expect(subject.common_variable_substitutions['$Membership.role'].call).to eq 'Admin,User'
210+
end
211+
195212
it 'has substitution for $User.id' do
196213
user.stubs(:id).returns(456)
197214
expect(subject.common_variable_substitutions['$User.id']).to eq 456
@@ -209,6 +226,7 @@ def logged_in_user
209226
end
210227
end
211228

229+
212230
context 'pseudonym' do
213231
let(:pseudonym) { Pseudonym.new }
214232

@@ -221,6 +239,12 @@ def logged_in_user
221239
expect(subject.common_variable_substitutions['$Canvas.user.sisSourceId']).to eq '1a2b3c'
222240
end
223241

242+
it 'has substitution for $Person.sourcedId' do
243+
pseudonym.sis_user_id = '1a2b3c'
244+
expect(subject.common_variable_substitutions['$Person.sourcedId']).to eq '1a2b3c'
245+
end
246+
247+
224248
it 'has substitution for $Canvas.user.loginId' do
225249
pseudonym.unique_id = 'username'
226250
expect(subject.common_variable_substitutions['$Canvas.user.loginId']).to eq 'username'

spec/models/lti/lti_integration_spec.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,12 @@
108108
expect(post_payload['launch_presentation_document_target']).to eq 'iframe'
109109
expect(post_payload['launch_presentation_locale']).to eq 'en'
110110
expect(post_payload['launch_presentation_return_url']).to eq '/return/url'
111-
expect(post_payload['lis_course_offering_sourcedid']).to eq canvas_course.sis_source_id
111+
expect(post_payload['lis_course_offering_sourcedid']).to eq '$CourseSection.sourcedId'
112112
expect(post_payload['lis_person_contact_email_primary']).to eq canvas_user.email
113113
expect(post_payload['lis_person_name_family']).to eq canvas_user.last_name
114114
expect(post_payload['lis_person_name_full']).to eq canvas_user.name
115115
expect(post_payload['lis_person_name_given']).to eq canvas_user.first_name
116-
expect(post_payload['lis_person_sourcedid']).to eq pseudonym.sis_user_id
116+
expect(post_payload['lis_person_sourcedid']).to eq '$Person.sourcedId'
117117
expect(post_payload['lti_message_type']).to eq 'basic-lti-launch-request'
118118
expect(post_payload['lti_version']).to eq 'LTI-1p0'
119119
expect(post_payload['oauth_callback']).to eq 'about:blank'
@@ -176,12 +176,12 @@
176176
expect(hash['custom_canvas_user_login_id']).to eq '$Canvas.user.loginId'
177177
expect(hash['custom_canvas_course_id']).to eq @course.id.to_s
178178
expect(hash['custom_canvas_api_domain']).to eq '$Canvas.api.domain'
179-
expect(hash['lis_course_offering_sourcedid']).to eq 'coursesis'
179+
expect(hash['lis_course_offering_sourcedid']).to eq '$CourseSection.sourcedId'
180180
expect(hash['lis_person_contact_email_primary']).to eq 'nobody@example.com'
181181
expect(hash['lis_person_name_full']).to eq 'A Name'
182182
expect(hash['lis_person_name_family']).to eq 'Name'
183183
expect(hash['lis_person_name_given']).to eq 'A'
184-
expect(hash['lis_person_sourcedid']).to eq 'testfun'
184+
expect(hash['lis_person_sourcedid']).to eq '$Person.sourcedId'
185185
expect(hash['launch_presentation_locale']).to eq I18n.default_locale.to_s
186186
expect(hash['launch_presentation_document_target']).to eq 'iframe'
187187
expect(hash['launch_presentation_return_url']).to eq 'http://www.google.com'
@@ -233,7 +233,7 @@
233233

234234
hash['custom_canvas_account_id'] = sub_account.id.to_s
235235
hash['custom_canvas_account_sis_id'] = 'accountsis'
236-
expect(hash['lis_person_sourcedid']).to eq 'testfun'
236+
expect(hash['lis_person_sourcedid']).to eq '$Person.sourcedId'
237237
expect(hash['custom_canvas_user_id']).to eq '$Canvas.user.id'
238238
expect(hash['tool_consumer_instance_guid']).to eq sub_account.root_account.lti_guid
239239
end

0 commit comments

Comments
 (0)