From 993fb88f03bdb4c91ead98b5247ea99cfb1dabec Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Wed, 25 Nov 2020 20:47:28 +0100 Subject: [PATCH] Enable submit via API client --- app/controllers/concerns/lti.rb | 7 ++- .../remote_evaluation_controller.rb | 51 +++++++++++++++++-- app/models/submission.rb | 2 +- config/routes.rb | 1 + 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/app/controllers/concerns/lti.rb b/app/controllers/concerns/lti.rb index 4d429dbc..5c656509 100644 --- a/app/controllers/concerns/lti.rb +++ b/app/controllers/concerns/lti.rb @@ -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? diff --git a/app/controllers/remote_evaluation_controller.rb b/app/controllers/remote_evaluation_controller.rb index 5f01860c..dd369113 100644 --- a/app/controllers/remote_evaluation_controller.rb +++ b/app/controllers/remote_evaluation_controller.rb @@ -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 \ No newline at end of file diff --git a/app/models/submission.rb b/app/models/submission.rb index b37af71a..9916abf2 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -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 diff --git a/config/routes.rb b/config/routes.rb index df1a8b5b..74f2ac81 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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