Rename user to contributor in submission
This commit is contained in:

committed by
Sebastian Serth

parent
97138288f4
commit
0234414bae
@ -17,7 +17,7 @@ module FileParameters
|
||||
# avoid that public files from other contexts can be created
|
||||
# `next` is similar to an early return and will proceed with the next iteration of the loop
|
||||
next true if file.context_type == 'Exercise' && file.context_id != exercise.id
|
||||
next true if file.context_type == 'Submission' && (file.context.user_id != current_user.id || file.context.user_type != current_user.class.name)
|
||||
next true if file.context_type == 'Submission' && (file.context.contributor_id != current_user.id || file.context.contributor_type != current_user.class.name)
|
||||
next true if file.context_type == 'CommunitySolution' && controller_name != 'community_solutions'
|
||||
|
||||
# Optimization: We already queried the ancestor file, let's reuse the object.
|
||||
|
@ -141,12 +141,12 @@ module Lti
|
||||
raise Error.new("Score #{submission.normalized_score} must be between 0 and #{MAXIMUM_SCORE}!")
|
||||
end
|
||||
|
||||
if submission.user.consumer
|
||||
lti_parameter = LtiParameter.where(consumers_id: submission.user.consumer.id,
|
||||
external_users_id: submission.user_id,
|
||||
if submission.contributor.consumer
|
||||
lti_parameter = LtiParameter.where(consumers_id: submission.contributor.consumer.id,
|
||||
external_users_id: submission.contributor_id,
|
||||
exercises_id: submission.exercise_id).last
|
||||
|
||||
provider = build_tool_provider(consumer: submission.user.consumer, parameters: lti_parameter.lti_parameters)
|
||||
provider = build_tool_provider(consumer: submission.contributor.consumer, parameters: lti_parameter.lti_parameters)
|
||||
end
|
||||
|
||||
if provider.nil?
|
||||
|
@ -16,7 +16,7 @@ module RedirectBehavior
|
||||
# redirect 10 percent pseudorandomly to the feedback page
|
||||
if current_user.respond_to? :external_id
|
||||
if @submission.redirect_to_feedback? && !@embed_options[:disable_redirect_to_feedback]
|
||||
clear_lti_session_data(@submission.exercise_id, @submission.user_id)
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
redirect_to_user_feedback
|
||||
return
|
||||
end
|
||||
@ -27,7 +27,7 @@ module RedirectBehavior
|
||||
flash[:notice] = I18n.t('exercises.submit.full_score_redirect_to_own_rfc')
|
||||
flash.keep(:notice)
|
||||
|
||||
clear_lti_session_data(@submission.exercise_id, @submission.user_id)
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to(rfc) }
|
||||
format.json { render(json: {redirect: url_for(rfc)}) }
|
||||
@ -45,7 +45,7 @@ module RedirectBehavior
|
||||
# increase counter 'times_featured' in rfc
|
||||
rfc.increment(:times_featured)
|
||||
|
||||
clear_lti_session_data(@submission.exercise_id, @submission.user_id)
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to(rfc) }
|
||||
format.json { render(json: {redirect: url_for(rfc)}) }
|
||||
@ -56,7 +56,7 @@ module RedirectBehavior
|
||||
else
|
||||
# redirect to feedback page if score is less than 100 percent
|
||||
if @exercise.needs_more_feedback?(@submission) && !@embed_options[:disable_redirect_to_feedback]
|
||||
clear_lti_session_data(@submission.exercise_id, @submission.user_id)
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
redirect_to_user_feedback
|
||||
else
|
||||
redirect_to_lti_return_path
|
||||
@ -118,8 +118,8 @@ module RedirectBehavior
|
||||
|
||||
def redirect_to_lti_return_path
|
||||
Sentry.set_extras(
|
||||
consumers_id: @submission.user&.consumer,
|
||||
external_users_id: @submission.user_id,
|
||||
consumers_id: current_user.consumer_id,
|
||||
external_users_id: current_user.id,
|
||||
exercises_id: @submission.exercise_id,
|
||||
session: session.to_hash,
|
||||
submission: @submission.inspect,
|
||||
@ -128,7 +128,7 @@ module RedirectBehavior
|
||||
)
|
||||
|
||||
path = lti_return_path(submission_id: @submission.id)
|
||||
clear_lti_session_data(@submission.exercise_id, @submission.user_id)
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
respond_to do |format|
|
||||
format.html { redirect_to(path) }
|
||||
format.json { render(json: {redirect: path}) }
|
||||
|
@ -22,7 +22,8 @@ module SubmissionParameters
|
||||
def merge_user(params)
|
||||
# The study_group_id might not be present in the session (e.g. for internal users), resulting in session[:study_group_id] = nil which is intended.
|
||||
params.merge(
|
||||
user: current_user,
|
||||
contributor_id: current_user.id,
|
||||
contributor_type: current_user.class.name,
|
||||
study_group_id: current_user.current_study_group_id
|
||||
)
|
||||
end
|
||||
|
@ -55,32 +55,32 @@ class ExecutionEnvironmentsController < ApplicationController
|
||||
SELECT exercise_id, avg(working_time) as average_time, stddev_samp(extract('epoch' from working_time)) * interval '1 second' as stddev_time
|
||||
FROM
|
||||
(
|
||||
SELECT user_id,
|
||||
SELECT contributor_id,
|
||||
exercise_id,
|
||||
sum(working_time_new) AS working_time
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
(SELECT contributor_id,
|
||||
exercise_id,
|
||||
CASE WHEN #{StatisticsHelper.working_time_larger_delta} THEN '0' ELSE working_time END AS working_time_new
|
||||
FROM
|
||||
(SELECT user_id,
|
||||
(SELECT contributor_id,
|
||||
exercise_id,
|
||||
id,
|
||||
(created_at - lag(created_at) over (PARTITION BY user_id, exercise_id
|
||||
(created_at - lag(created_at) over (PARTITION BY contributor_id, exercise_id
|
||||
ORDER BY created_at)) AS working_time
|
||||
FROM submissions
|
||||
WHERE exercise_id IN (SELECT ID FROM exercises WHERE #{ExecutionEnvironment.sanitize_sql(['execution_environment_id = ?', @execution_environment.id])})
|
||||
GROUP BY exercise_id, user_id, id) AS foo) AS bar
|
||||
GROUP BY user_id, exercise_id
|
||||
GROUP BY exercise_id, contributor_id, id) AS foo) AS bar
|
||||
GROUP BY contributor_id, exercise_id
|
||||
) AS baz GROUP BY exercise_id;
|
||||
"
|
||||
end
|
||||
|
||||
def user_query
|
||||
def contributor_query
|
||||
"
|
||||
SELECT
|
||||
id AS exercise_id,
|
||||
COUNT(DISTINCT user_id) AS users,
|
||||
COUNT(DISTINCT contributor_id) AS contributors,
|
||||
AVG(score) AS average_score,
|
||||
MAX(score) AS maximum_score,
|
||||
stddev_samp(score) as stddev_score,
|
||||
@ -88,24 +88,24 @@ class ExecutionEnvironmentsController < ApplicationController
|
||||
WHEN MAX(score)=0 THEN 0
|
||||
ELSE 100 / MAX(score) * AVG(score)
|
||||
END AS percent_correct,
|
||||
SUM(submission_count) / COUNT(DISTINCT user_id) AS average_submission_count
|
||||
SUM(submission_count) / COUNT(DISTINCT contributor_id) AS average_submission_count
|
||||
FROM
|
||||
(SELECT e.id,
|
||||
s.user_id,
|
||||
s.contributor_id,
|
||||
MAX(s.score) AS score,
|
||||
COUNT(s.id) AS submission_count
|
||||
FROM submissions s
|
||||
JOIN exercises e ON e.id = s.exercise_id
|
||||
WHERE #{ExecutionEnvironment.sanitize_sql(['e.execution_environment_id = ?', @execution_environment.id])}
|
||||
GROUP BY e.id,
|
||||
s.user_id) AS inner_query
|
||||
s.contributor_id) AS inner_query
|
||||
GROUP BY id;
|
||||
"
|
||||
end
|
||||
|
||||
def statistics
|
||||
working_time_statistics = {}
|
||||
user_statistics = {}
|
||||
contributor_statistics = {}
|
||||
|
||||
ApplicationRecord.connection.exec_query(working_time_query).each do |tuple|
|
||||
tuple = tuple.merge({
|
||||
@ -115,13 +115,13 @@ class ExecutionEnvironmentsController < ApplicationController
|
||||
working_time_statistics[tuple['exercise_id'].to_i] = tuple
|
||||
end
|
||||
|
||||
ApplicationRecord.connection.exec_query(user_query).each do |tuple|
|
||||
user_statistics[tuple['exercise_id'].to_i] = tuple
|
||||
ApplicationRecord.connection.exec_query(contributor_query).each do |tuple|
|
||||
contributor_statistics[tuple['exercise_id'].to_i] = tuple
|
||||
end
|
||||
|
||||
render locals: {
|
||||
working_time_statistics:,
|
||||
user_statistics:,
|
||||
contributor_statistics:,
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -467,9 +467,9 @@ class ExercisesController < ApplicationController
|
||||
# Show general statistic page for specific exercise
|
||||
user_statistics = {'InternalUser' => {}, 'ExternalUser' => {}}
|
||||
|
||||
query = Submission.select('user_id, user_type, MAX(score) AS maximum_score, COUNT(id) AS runs')
|
||||
query = Submission.select('contributor_id, contributor_type, MAX(score) AS maximum_score, COUNT(id) AS runs')
|
||||
.where(exercise_id: @exercise.id)
|
||||
.group('user_id, user_type')
|
||||
.group('contributor_id, contributor_type')
|
||||
|
||||
query = if policy(@exercise).detailed_statistics?
|
||||
query
|
||||
@ -481,7 +481,7 @@ class ExercisesController < ApplicationController
|
||||
end
|
||||
|
||||
query.each do |tuple|
|
||||
user_statistics[tuple['user_type']][tuple['user_id'].to_i] = tuple
|
||||
user_statistics[tuple['contributor_type']][tuple['contributor_id'].to_i] = tuple
|
||||
end
|
||||
|
||||
render locals: {
|
||||
@ -493,7 +493,7 @@ class ExercisesController < ApplicationController
|
||||
# Render statistics page for one specific external user
|
||||
|
||||
if policy(@exercise).detailed_statistics?
|
||||
submissions = Submission.where(user: @external_user, exercise: @exercise)
|
||||
submissions = Submission.where(contributor: @external_user, exercise: @exercise)
|
||||
.in_study_group_of(current_user)
|
||||
.order('created_at')
|
||||
@show_autosaves = params[:show_autosaves] == 'true' || submissions.none? {|s| s.cause != 'autosave' }
|
||||
@ -510,7 +510,7 @@ class ExercisesController < ApplicationController
|
||||
@working_times_until.push((format_time_difference(@deltas[0..index].sum) if index.positive?))
|
||||
end
|
||||
else
|
||||
final_submissions = Submission.where(user: @external_user,
|
||||
final_submissions = Submission.where(contributor: @external_user,
|
||||
exercise_id: @exercise.id).in_study_group_of(current_user).final
|
||||
submissions = []
|
||||
%i[before_deadline within_grace_period after_late_deadline].each do |filter|
|
||||
|
@ -5,7 +5,7 @@ class FlowrController < ApplicationController
|
||||
require_user!
|
||||
# get the latest submission for this user that also has a test run (i.e. structured_errors if applicable)
|
||||
submission = Submission.joins(:testruns)
|
||||
.where(submissions: {user: current_user})
|
||||
.where(submissions: {contributor: current_user})
|
||||
.includes(structured_errors: [structured_error_attributes: [:error_template_attribute]])
|
||||
.merge(Testrun.order(created_at: :desc)).first
|
||||
|
||||
|
@ -42,10 +42,10 @@ class SessionsController < ApplicationController
|
||||
def destroy_through_lti
|
||||
@submission = Submission.find(params[:submission_id])
|
||||
authorize(@submission, :show?)
|
||||
lti_parameter = LtiParameter.where(external_users_id: @submission.user_id, exercises_id: @submission.exercise_id).last
|
||||
@url = consumer_return_url(build_tool_provider(consumer: @submission.user.consumer, parameters: lti_parameter&.lti_parameters))
|
||||
lti_parameter = LtiParameter.where(external_users_id: current_user.id, exercises_id: @submission.exercise_id).last
|
||||
@url = consumer_return_url(build_tool_provider(consumer: current_user.consumer, parameters: lti_parameter&.lti_parameters))
|
||||
|
||||
clear_lti_session_data(@submission.exercise_id, @submission.user_id)
|
||||
clear_lti_session_data(@submission.exercise_id)
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
@ -22,7 +22,7 @@ class SubmissionsController < ApplicationController
|
||||
|
||||
def index
|
||||
@search = Submission.ransack(params[:q])
|
||||
@submissions = @search.result.includes(:exercise, :user).paginate(page: params[:page], per_page: per_page_param)
|
||||
@submissions = @search.result.includes(:exercise, :contributor).paginate(page: params[:page], per_page: per_page_param)
|
||||
authorize!
|
||||
end
|
||||
|
||||
|
@ -126,7 +126,7 @@ class UserExerciseFeedbacksController < ApplicationController
|
||||
user_id = current_user.id
|
||||
user_type = current_user.class.name
|
||||
latest_submission = Submission
|
||||
.where(user_id:, user_type:, exercise_id:)
|
||||
.where(contributor_id: user_id, contributor_type: user_type, exercise_id:)
|
||||
.order(created_at: :desc).final.first
|
||||
|
||||
authorize(latest_submission, :show?)
|
||||
|
Reference in New Issue
Block a user