Enable submit via API client

This commit is contained in:
Sebastian Serth
2020-11-25 20:47:28 +01:00
parent 5aa270c5c4
commit 993fb88f03
4 changed files with 51 additions and 10 deletions

View File

@ -144,13 +144,12 @@ module Lti
::NewRelic::Agent.add_custom_attributes({score: submission.normalized_score, session: session})
fail(Error, "Score #{submission.normalized_score} must be between 0 and #{MAXIMUM_SCORE}!") unless (0..MAXIMUM_SCORE).include?(submission.normalized_score)
if session[:consumer_id]
lti_parameter = LtiParameter.where(consumers_id: session[:consumer_id],
if submission.user.consumer
lti_parameter = LtiParameter.where(consumers_id: submission.user.consumer.id,
external_users_id: submission.user_id,
exercises_id: submission.exercise_id).last
consumer = Consumer.find_by(id: session[:consumer_id])
provider = build_tool_provider(consumer: consumer, parameters: lti_parameter.lti_parameters)
provider = build_tool_provider(consumer: submission.user.consumer, parameters: lti_parameter.lti_parameters)
end
if provider.nil?

View File

@ -1,15 +1,55 @@
class RemoteEvaluationController < ApplicationController
include RemoteEvaluationParameters
include SubmissionScoring
include Lti
skip_after_action :verify_authorized
skip_before_action :verify_authenticity_token
# POST /evaluate
# @param validation_token
# @param files_attributes
def evaluate
result = create_and_score_submission("remoteAssess")
status = if result.is_a?(Hash) && result.has_key?(:status)
result[:status]
else
201
end
render json: result, status: status
end
# POST /submit
def submit
result = create_and_score_submission("remoteSubmit")
if @submission.present?
current_user = @submission.user
if !current_user.nil? && lti_outcome_service?(@submission.exercise_id, current_user.id, current_user.consumer_id)
lti_response = send_score(@submission)
if lti_response[:status] == 'success' and lti_response[:score_sent] != @submission.normalized_score
# Score has been reduced due to the passed deadline
result = {message: I18n.t('exercises.submit.too_late'), status: 207}
elsif lti_response[:status] == 'success'
result = {message: I18n.t('sessions.destroy_through_lti.success_with_outcome', consumer: @submission.user.consumer.name), status: 202}
else
result = {message: I18n.t('exercises.submit.failure'), status: 424}
end
# ToDo: Delete LTI parameters?
else
result = {message: "Your submission was successfully scored with #{@submission.normalized_score * 100}%. However, your score could not be sent to the e-Learning platform. Please reopen the exercise through the e-Learning platform and try again.", status: 410}
end
end
status = if result.is_a?(Hash) && result.has_key?(:status)
result[:status]
else
201
end
render json: result, status: status
end
def create_and_score_submission cause
validation_token = remote_evaluation_params[:validation_token]
files_attributes = remote_evaluation_params[:files_attributes] || []
@ -19,15 +59,16 @@ class RemoteEvaluationController < ApplicationController
_params = remote_evaluation_params.except(:validation_token)
_params[:exercise_id] = remote_evaluation_mapping.exercise_id
_params[:user_id] = remote_evaluation_mapping.user_id
_params[:cause] = "remoteAssess"
_params[:cause] = cause
_params[:user_type] = remote_evaluation_mapping.user_type
@submission = Submission.create(_params)
render json: score_submission(@submission)
score_submission(@submission)
else
# todo: better output
# todo: check token expired?
render json: "No exercise found for this validation_token! Please keep out!"
{message: "No exercise found for this validation_token! Please keep out!", status: 401}
end
end
private :create_and_score_submission
end

View File

@ -3,7 +3,7 @@ class Submission < ApplicationRecord
include Creation
include ActionCableHelper
CAUSES = %w(assess download file render run save submit test autosave requestComments remoteAssess)
CAUSES = %w(assess download file render run save submit test autosave requestComments remoteAssess remoteSubmit)
FILENAME_URL_PLACEHOLDER = '{filename}'
MAX_COMMENTS_ON_RECOMMENDED_RFC = 5
OLDEST_RFC_TO_SHOW = 6.months

View File

@ -157,6 +157,7 @@ Rails.application.routes.draw do
resources :events, only: [:create]
post "/evaluate", to: 'remote_evaluation#evaluate', via: [:post]
post "/submit", to: 'remote_evaluation#submit', via: [:post]
mount ActionCable.server => '/cable'
end