From 3315f38abc3cdc96d8b716e7702f095966b9ef14 Mon Sep 17 00:00:00 2001 From: cocomarine Date: Fri, 19 Jun 2026 15:58:56 +0100 Subject: [PATCH 1/2] update student ability and json response to handle remix project and add test --- app/models/ability.rb | 2 +- app/views/api/projects/context.json.jbuilder | 5 ++++- spec/requests/projects/show_context_spec.rb | 23 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/models/ability.rb b/app/models/ability.rb index 8365cf7a3..3db74d435 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -115,7 +115,7 @@ def define_school_student_abilities(user:, school:) can(%i[read], SchoolClass, school: { id: school.id }, students: { student_id: user.id }) # Ensure no access to ClassMember resources, relationships otherwise allow access in some circumstances. can(%i[read], Lesson, school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } }) - can(%i[read create update], Project, school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids) + can(%i[read create update show_context], Project, school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids) can(%i[read show_context], Project, lesson: { school_id: school.id, visibility: 'students', school_class: { students: { student_id: user.id } } }) can(%i[read set_read], Feedback, school_project: { project: { school_id: school.id, user_id: user.id, lesson_id: nil, remixed_from_id: visible_lesson_project_ids } }) can(%i[show_finished set_finished show_status unsubmit submit], SchoolProject, project: { user_id: user.id, lesson_id: nil }, school_id: school.id) diff --git a/app/views/api/projects/context.json.jbuilder b/app/views/api/projects/context.json.jbuilder index 5e7f4c685..3b60a9837 100644 --- a/app/views/api/projects/context.json.jbuilder +++ b/app/views/api/projects/context.json.jbuilder @@ -1,5 +1,7 @@ # frozen_string_literal: true +source_lesson = @project.lesson || @project.parent&.lesson + json.call( @project, :identifier, @@ -8,4 +10,5 @@ json.call( :lesson_id ) -json.class_id(@project.lesson.school_class_id) +json.lesson_id source_lesson&.id +json.class_id source_lesson&.school_class_id diff --git a/spec/requests/projects/show_context_spec.rb b/spec/requests/projects/show_context_spec.rb index f59587b63..30946a831 100644 --- a/spec/requests/projects/show_context_spec.rb +++ b/spec/requests/projects/show_context_spec.rb @@ -136,6 +136,29 @@ end end + context 'when loading context of a remixed project that is visible to students' do + let!(:student_remix) { create(:project, school:, user_id: student.id, remixed_from_id: project.id, locale: nil) } + let(:expected_context_json) do + { + identifier: student_remix.identifier, + project_type: project.project_type, + school_id: school.id, + lesson_id: lesson.id, + class_id: school_class.id + }.to_json + end + + it 'returns success response' do + get("/api/projects/#{student_remix.identifier}/context", headers:) + expect(response).to have_http_status(:ok) + end + + it 'returns the remix project context json' do + get("/api/projects/#{student_remix.identifier}/context", headers:) + expect(response.body).to eq(expected_context_json) + end + end + context 'when loading context of a lesson project that is not visible to students' do before do project.lesson.update(visibility: 'teachers') From ad418263cd41b2146ee14c6da2cd590381376230 Mon Sep 17 00:00:00 2001 From: cocomarine Date: Fri, 19 Jun 2026 16:09:56 +0100 Subject: [PATCH 2/2] remove redundant lesson_id --- app/views/api/projects/context.json.jbuilder | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/api/projects/context.json.jbuilder b/app/views/api/projects/context.json.jbuilder index 3b60a9837..602803793 100644 --- a/app/views/api/projects/context.json.jbuilder +++ b/app/views/api/projects/context.json.jbuilder @@ -6,8 +6,7 @@ json.call( @project, :identifier, :project_type, - :school_id, - :lesson_id + :school_id ) json.lesson_id source_lesson&.id