Rename user to contributor in submission

This commit is contained in:
kiragrammel
2023-08-11 12:15:36 +02:00
committed by Sebastian Serth
parent 97138288f4
commit 0234414bae
39 changed files with 267 additions and 233 deletions

View File

@ -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.

View File

@ -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?

View File

@ -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}) }

View File

@ -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

View File

@ -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

View File

@ -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|

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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?)