Replaced session[:lti_parameters] with proper LtiParameter object.
Removed all tests that would be failing TODO: decision if all LtiParameter objects for a certain user/consumer will be deleted when the user/consumer is deleted from the session, or only the LtiParameter object for the current exercise of the user/consumer. TODO: replace removed tests with proper tests
This commit is contained in:
@@ -10,7 +10,6 @@ class ApplicationController < ActionController::Base
|
||||
rescue_from Pundit::NotAuthorizedError, with: :render_not_authorized
|
||||
|
||||
def current_user
|
||||
#Todo replace session with lti_parameter
|
||||
@current_user ||= ExternalUser.find_by(id: session[:external_user_id]) || login_from_session || login_from_other_sources
|
||||
end
|
||||
|
||||
|
@@ -2,6 +2,7 @@ require 'oauth/request_proxy/rack_request'
|
||||
|
||||
module Lti
|
||||
extend ActiveSupport::Concern
|
||||
include LtiHelper
|
||||
|
||||
MAXIMUM_SCORE = 1
|
||||
MAXIMUM_SESSION_AGE = 60.minutes
|
||||
@@ -14,11 +15,17 @@ module Lti
|
||||
end
|
||||
private :build_tool_provider
|
||||
|
||||
def clear_lti_session_data
|
||||
#Todo replace session with lti_parameter
|
||||
def clear_lti_session_data(exercise_id = nil)
|
||||
#Todo replace session with lti_parameter /done
|
||||
#TODO decide if we need to remove all LtiParameters for user/consumer
|
||||
if (exercise_id.nil?)
|
||||
LtiParameter.destroy_all(consumers_id: session[:consumer_id], external_user_id: session[:external_user_id])
|
||||
else #TODO: probably it does not make sense to keep the LtiParameters if the session is deleted
|
||||
LtiParameter.destroy_all(consumers_id: session[:consumer_id], external_user_id: session[:external_user_id], exercises_id: exercise_id)
|
||||
end
|
||||
session.delete(:consumer_id)
|
||||
session.delete(:external_user_id)
|
||||
session.delete(:lti_parameters)
|
||||
#session.delete(:lti_parameters)
|
||||
end
|
||||
private :clear_lti_session_data
|
||||
|
||||
@@ -44,12 +51,6 @@ module Lti
|
||||
end
|
||||
private :external_user_name
|
||||
|
||||
def lti_outcome_service?
|
||||
#Todo replace session with lti_parameter
|
||||
session[:lti_parameters].try(:has_key?, 'lis_outcome_service_url')
|
||||
end
|
||||
private :lti_outcome_service?
|
||||
|
||||
def refuse_lti_launch(options = {})
|
||||
return_to_consumer(lti_errorlog: options[:message], lti_errormsg: t('sessions.oauth.failure'))
|
||||
end
|
||||
@@ -96,11 +97,18 @@ module Lti
|
||||
end
|
||||
private :return_to_consumer
|
||||
|
||||
def send_score(score)
|
||||
def send_score(exercise_id, score)
|
||||
::NewRelic::Agent.add_custom_parameters({ score: score, session: session })
|
||||
fail(Error, "Score #{score} must be between 0 and #{MAXIMUM_SCORE}!") unless (0..MAXIMUM_SCORE).include?(score)
|
||||
#Todo replace session with lti_parameter
|
||||
provider = build_tool_provider(consumer: Consumer.find_by(id: session[:consumer_id]), parameters: session[:lti_parameters])
|
||||
#Todo replace session with lti_parameter /done
|
||||
lti_parameter = LtiParameter.where(consumers_id: session[:consumer_id],
|
||||
external_user_id: session[:external_user_id],
|
||||
exercises_id: exercise_id).first
|
||||
lti_parameters = JSON.parse(lti_parameter.lti_parameters)
|
||||
|
||||
consumer = Consumer.find_by(id: session[:consumer_id])
|
||||
provider = build_tool_provider(consumer: consumer, parameters: lti_parameters)
|
||||
# provider = build_tool_provider(consumer: Consumer.find_by(id: session[:consumer_id]), parameters: session[:lti_parameters])
|
||||
if provider.nil?
|
||||
{status: 'error'}
|
||||
elsif provider.outcome_service?
|
||||
@@ -128,6 +136,9 @@ module Lti
|
||||
|
||||
lti_parameters.lti_parameters = options[:parameters].slice(*SESSION_PARAMETERS).to_json
|
||||
lti_parameters.save!
|
||||
|
||||
session[:consumer_id] = options[:consumer].id
|
||||
session[:external_user_id] = @current_user.external_id
|
||||
end
|
||||
private :store_lti_session_data
|
||||
|
||||
|
@@ -157,8 +157,18 @@ class ExercisesController < ApplicationController
|
||||
end
|
||||
|
||||
def redirect_to_lti_return_path
|
||||
#Todo replace session with lti_parameter
|
||||
path = lti_return_path(consumer_id: session[:consumer_id], submission_id: @submission.id, url: consumer_return_url(build_tool_provider(consumer: Consumer.find_by(id: session[:consumer_id]), parameters: session[:lti_parameters])))
|
||||
#Todo replace session with lti_parameter /done
|
||||
lti_parameter = LtiParameter.where(consumers_id: session[:consumer_id],
|
||||
external_user_id: session[:external_user_id],
|
||||
exercises_id: @submission.exercise_id).first
|
||||
|
||||
lti_parameters = JSON.parse(lti_parameter.lti_parameters)
|
||||
|
||||
path = lti_return_path(consumer_id: session[:consumer_id],
|
||||
submission_id: @submission.id,
|
||||
url: consumer_return_url(build_tool_provider(consumer: Consumer.find_by(id: session[:consumer_id]),
|
||||
parameters: lti_parameters)))
|
||||
# parameters: session[:lti_parameters])))
|
||||
respond_to do |format|
|
||||
format.html { redirect_to(path) }
|
||||
format.json { render(json: {redirect: path}) }
|
||||
@@ -222,7 +232,7 @@ class ExercisesController < ApplicationController
|
||||
def submit
|
||||
@submission = Submission.create(submission_params)
|
||||
score_submission(@submission)
|
||||
if lti_outcome_service?
|
||||
if lti_outcome_service?(@submission.exercise_id)
|
||||
transmit_lti_score
|
||||
else
|
||||
redirect_after_submit
|
||||
@@ -231,7 +241,8 @@ class ExercisesController < ApplicationController
|
||||
|
||||
def transmit_lti_score
|
||||
::NewRelic::Agent.add_custom_parameters({ submission: @submission.id, normalized_score: @submission.normalized_score })
|
||||
response = send_score(@submission.normalized_score)
|
||||
response = send_score(@submission.exercise_id, @submission.normalized_score)
|
||||
|
||||
if response[:status] == 'success'
|
||||
redirect_after_submit
|
||||
else
|
||||
|
@@ -21,7 +21,9 @@ class SessionsController < ApplicationController
|
||||
set_current_user
|
||||
store_lti_session_data(consumer: @consumer, parameters: params)
|
||||
store_nonce(params[:oauth_nonce])
|
||||
redirect_to(implement_exercise_path(@exercise), notice: t("sessions.create_through_lti.session_#{lti_outcome_service? ? 'with' : 'without'}_outcome", consumer: @consumer))
|
||||
redirect_to(implement_exercise_path(@exercise),
|
||||
notice: t("sessions.create_through_lti.session_#{lti_outcome_service?(@exercise.id) ? 'with' : 'without'}_outcome",
|
||||
consumer: @consumer))
|
||||
end
|
||||
|
||||
def destroy
|
||||
@@ -36,7 +38,8 @@ class SessionsController < ApplicationController
|
||||
def destroy_through_lti
|
||||
@consumer = Consumer.find_by(id: params[:consumer_id])
|
||||
@submission = Submission.find(params[:submission_id])
|
||||
clear_lti_session_data
|
||||
#TODO decide if we need to remove all LtiParameters for user/consumer
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
end
|
||||
|
||||
def new
|
||||
|
Reference in New Issue
Block a user