From 14baea8cd678df7d2e39d43891654091aeb51552 Mon Sep 17 00:00:00 2001 From: b0ink <40929320+b0ink@users.noreply.github.com> Date: Wed, 12 Aug 2026 11:21:38 +1000 Subject: [PATCH] fix: show group overseer reports across member tasks --- app/api/overseer_steps_api.rb | 6 +- app/api/submission/portfolio_evidence_api.rb | 14 +++-- app/models/task.rb | 6 ++ test/api/submission_history_api_test.rb | 62 ++++++++++++++++++++ 4 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 test/api/submission_history_api_test.rb diff --git a/app/api/overseer_steps_api.rb b/app/api/overseer_steps_api.rb index 5327b08bf..b26ce43c3 100644 --- a/app/api/overseer_steps_api.rb +++ b/app/api/overseer_steps_api.rb @@ -206,8 +206,12 @@ class OverseerStepsApi < Grape::API end unit = project.unit + task_definition = unit.task_definitions.find(params[:task_def_id]) + task = project.task_for_task_definition(task_definition) - overseer_assessment = OverseerAssessment.find(params[:id]) + overseer_assessment = OverseerAssessment + .where(submission_history_id: task.related_submission_histories.select(:id)) + .find(params[:id]) present overseer_assessment.overseer_step_results, with: Entities::OverseerStepResultEntity, my_role: unit.role_for(current_user) end end diff --git a/app/api/submission/portfolio_evidence_api.rb b/app/api/submission/portfolio_evidence_api.rb index 8a6d36fe8..98cdf01a1 100644 --- a/app/api/submission/portfolio_evidence_api.rb +++ b/app/api/submission/portfolio_evidence_api.rb @@ -181,7 +181,9 @@ def self.logger error!({ error: "A submission for this task definition have never been created" }, 401) end - result = OverseerAssessment.where(task_id: task.id).order(submission_timestamp: :desc).limit(10) + result = OverseerAssessment.where(submission_history_id: task.related_submission_histories.select(:id)) + .order(submission_timestamp: :desc) + .limit(10) present result, with: Entities::OverseerAssessmentEntity end @@ -199,7 +201,7 @@ def self.logger error!({ error: 'A submission for this task definition has never been created' }, 404) end - present task.submission_histories.order(submission_timestamp: :desc), + present task.related_submission_histories.order(submission_timestamp: :desc), with: Entities::SubmissionHistoryEntity end @@ -213,7 +215,7 @@ def self.logger end task = project.task_for_task_definition(task_definition) - history = task&.submission_histories&.find_by(id: params[:history_id]) + history = task&.related_submission_histories&.find_by(id: params[:history_id]) error!({ error: 'Submission history was not found' }, 404) unless history error!({ error: 'Submission history files are not available' }, 404) unless history.has_submission_files? @@ -244,7 +246,9 @@ def self.logger oa_id = timestamp = params[:oa_id] - oa = task.overseer_assessments.find(oa_id) + oa = OverseerAssessment + .where(submission_history_id: task.related_submission_histories.select(:id)) + .find(oa_id) response = oa.send_to_overseer if response[:error].present? error!({ error: response[:error] }, 403) @@ -325,7 +329,7 @@ def self.logger error!({ error: 'A submission for this task definition have never been created' }, 401) end - history = task.submission_histories.find_by(submission_timestamp: params[:timestamp]) + history = task.related_submission_histories.find_by(submission_timestamp: params[:timestamp]) unless history error!({ error: "No submission history found for timestamp '#{params[:timestamp]}'" }, 404) end diff --git a/app/models/task.rb b/app/models/task.rb index 9a535b5a1..e72ef62f3 100644 --- a/app/models/task.rb +++ b/app/models/task.rb @@ -569,6 +569,12 @@ def group_task? !group_submission.nil? || !task_definition.group_set.nil? end + def related_submission_histories + return submission_histories unless group_submission + + SubmissionHistory.where(task_id: group_submission.tasks.select(:id)) + end + def active_overflow_task_claim claim = overflow_task_claim return nil unless claim diff --git a/test/api/submission_history_api_test.rb b/test/api/submission_history_api_test.rb new file mode 100644 index 000000000..0a99ac5ad --- /dev/null +++ b/test/api/submission_history_api_test.rb @@ -0,0 +1,62 @@ +require 'test_helper' + +class SubmissionHistoryApiTest < ActiveSupport::TestCase + include Rack::Test::Methods + include TestHelpers::AuthHelper + include TestHelpers::JsonHelper + + def app + Rails.application + end + + def test_group_member_can_view_submission_history_and_overseer_assessment + setup_group_submission + history = FactoryBot.create(:submission_history, task: @tasks.first.reload) + assessment = FactoryBot.create( + :overseer_assessment, + task: @tasks.first, + submission_history: history, + submission_timestamp: history.submission_timestamp + ) + add_auth_header_for(user: @projects.second.student) + + get submission_histories_path(@projects.second) + + assert_equal 200, last_response.status, last_response.body + assert_equal [history.id], last_response_body.pluck('id') + + get overseer_assessments_path(@projects.second) + + assert_equal 200, last_response.status, last_response.body + assert_equal [assessment.id], last_response_body.pluck('id') + end + + private + + def setup_group_submission + unit = FactoryBot.create(:unit, student_count: 3, task_count: 1) + @projects = unit.active_projects.first(3) + @task_definition = unit.task_definitions.first + group_set = FactoryBot.create(:group_set, unit: unit) + @task_definition.update!(group_set: group_set) + @group = FactoryBot.create(:group, group_set: group_set, tutorial: unit.tutorials.first) + @tasks = @projects.first(2).map do |project| + @group.add_member(project) + project.task_for_task_definition(@task_definition) + end + @group.create_submission( + @tasks.first, + 'Group submission', + @tasks.map { |task| { project: task.project, pct: 50, pts: 3 } } + ) + @tasks + end + + def submission_histories_path(project) + "/api/projects/#{project.id}/task_def_id/#{@task_definition.id}/submission_histories" + end + + def overseer_assessments_path(project) + "/api/projects/#{project.id}/task_def_id/#{@task_definition.id}/submissions/timestamps" + end +end