From be2053610d6dd1e9c41f35deccf3296cd60cb05c Mon Sep 17 00:00:00 2001 From: SanjanaBottu Date: Wed, 29 Apr 2026 20:56:41 +1000 Subject: [PATCH 1/3] Add peer progress API endpoint --- app/controllers/peer_progress_controller.rb | 31 +++++++++++++++++++++ config/routes.rb | 1 + 2 files changed, 32 insertions(+) create mode 100644 app/controllers/peer_progress_controller.rb diff --git a/app/controllers/peer_progress_controller.rb b/app/controllers/peer_progress_controller.rb new file mode 100644 index 0000000000..1e0ae8d934 --- /dev/null +++ b/app/controllers/peer_progress_controller.rb @@ -0,0 +1,31 @@ +class PeerProgressController < ApplicationController + def show + student_id = params[:student_id].to_i + unit_id = params[:unit_id].to_i + + project = Project.find_by(user_id: student_id, unit_id: unit_id) + + return render json: { error: "Project not found" }, status: 404 unless project + + # Tasks required for target grade + required_tasks = project.tasks.joins(:task_definition) + .where('task_definitions.target_grade <= ?', project.target_grade) + + tasks_required = required_tasks.count + + # Tasks completed + tasks_completed = required_tasks.select(&:complete?).count + + # Percentage + progress_percentage = tasks_required > 0 ? ((tasks_completed.to_f / tasks_required) * 100).round : 0 + + render json: { + student_id: student_id, + unit_id: unit_id, + target_grade: project.target_grade_desc, + tasks_completed: tasks_completed, + tasks_required: tasks_required, + progress_percentage: progress_percentage + } + end +end diff --git a/config/routes.rb b/config/routes.rb index ea52a79000..518a19da57 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,6 +5,7 @@ get 'api/submission/unit/:id/task_definitions/:task_def_id/download_submissions', to: 'task_downloads#index' get 'api/submission/unit/:id/task_definitions/:task_def_id/student_pdfs', to: 'task_submission_pdfs#index' get 'api/units/:id/all_resources', to: 'lecture_resource_downloads#index' + get 'api/peer_progress/:unit_id/:student_id', to: 'peer_progress#show' mount ApiRoot => '/' mount GrapeSwaggerRails::Engine => '/api/docs' From 2e8100658222562970c100b18f5f85c2dc4ef3cc Mon Sep 17 00:00:00 2001 From: SanjanaBottu Date: Thu, 7 May 2026 02:16:18 +1000 Subject: [PATCH 2/3] Fix peer progress task calculation --- app/controllers/peer_progress_controller.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/controllers/peer_progress_controller.rb b/app/controllers/peer_progress_controller.rb index 1e0ae8d934..ab2065623c 100644 --- a/app/controllers/peer_progress_controller.rb +++ b/app/controllers/peer_progress_controller.rb @@ -7,15 +7,15 @@ def show return render json: { error: "Project not found" }, status: 404 unless project + project = Project.find_by(user_id: student_id, unit_id: unit_id) + + return render json: { error: "Project not found" }, status: 404 unless project # Tasks required for target grade - required_tasks = project.tasks.joins(:task_definition) - .where('task_definitions.target_grade <= ?', project.target_grade) + required_tasks = project.unit.tasks.where(project_id: project.id) tasks_required = required_tasks.count - # Tasks completed tasks_completed = required_tasks.select(&:complete?).count - # Percentage progress_percentage = tasks_required > 0 ? ((tasks_completed.to_f / tasks_required) * 100).round : 0 @@ -29,3 +29,4 @@ def show } end end + From ab10c18c9910678e36c17d0376685564a8eb47d1 Mon Sep 17 00:00:00 2001 From: SanjanaBottu Date: Thu, 7 May 2026 04:24:52 +1000 Subject: [PATCH 3/3] Filter peer progress tasks by target grade --- app/controllers/peer_progress_controller.rb | 45 +++++++++++---------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/app/controllers/peer_progress_controller.rb b/app/controllers/peer_progress_controller.rb index ab2065623c..145c25e4f9 100644 --- a/app/controllers/peer_progress_controller.rb +++ b/app/controllers/peer_progress_controller.rb @@ -1,32 +1,33 @@ class PeerProgressController < ApplicationController def show - student_id = params[:student_id].to_i - unit_id = params[:unit_id].to_i + student_id = params[:student_id].to_i + unit_id = params[:unit_id].to_i - project = Project.find_by(user_id: student_id, unit_id: unit_id) + project = Project.find_by(user_id: student_id, unit_id: unit_id) - return render json: { error: "Project not found" }, status: 404 unless project + return render json: { error: "Project not found" }, status: :not_found unless project - project = Project.find_by(user_id: student_id, unit_id: unit_id) + target_grade = project.target_grade - return render json: { error: "Project not found" }, status: 404 unless project - # Tasks required for target grade - required_tasks = project.unit.tasks.where(project_id: project.id) + required_tasks = project.unit.tasks.where(project_id: project.id).select do |task| + task.task_definition.present? && + task.task_definition.target_grade.present? && + task.task_definition.target_grade <= target_grade + end - tasks_required = required_tasks.count - # Tasks completed - tasks_completed = required_tasks.select(&:complete?).count - # Percentage - progress_percentage = tasks_required > 0 ? ((tasks_completed.to_f / tasks_required) * 100).round : 0 + tasks_required = required_tasks.count + tasks_completed = required_tasks.select(&:complete?).count - render json: { - student_id: student_id, - unit_id: unit_id, - target_grade: project.target_grade_desc, - tasks_completed: tasks_completed, - tasks_required: tasks_required, - progress_percentage: progress_percentage - } + progress_percentage = + tasks_required.positive? ? ((tasks_completed.to_f / tasks_required) * 100).round : 0 + + render json: { + student_id: student_id, + unit_id: unit_id, + target_grade: project.target_grade_desc, + tasks_completed: tasks_completed, + tasks_required: tasks_required, + progress_percentage: progress_percentage + } end end -