From 865b5a3546faac1073f3e7e42adae3c420ba4c5a Mon Sep 17 00:00:00 2001 From: Ying Tong Date: Fri, 10 Apr 2026 14:11:30 +0800 Subject: [PATCH] feat: Add progress updates to CSV --- app/controllers/courses_controller.rb | 45 ++++++++++++++++++--------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 562b21e..32e8b6c 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -416,8 +416,8 @@ def create_db_entries_grouped(hash_map, parent_course, unregistered_students, re role: :student ) - user_project_group_ids = ProjectGroupMember.where(user: new_user).pluck(:project_group_id) - new_group_member = ProjectGroupMember.joins(:project_group).find_by(user: new_user, project_groups: { course: parent_course } ) + ProjectGroupMember.where(user: new_user).pluck(:project_group_id) + new_group_member = ProjectGroupMember.joins(:project_group).find_by(user: new_user, project_groups: { course: parent_course }) if new_group_member new_group_member.update!(project_group: new_group) @@ -568,6 +568,13 @@ def build_csv_headers(template_fields) project_fields.each do |field| headers << field.label end + + if @course.use_progress_updates? + (1..@course.number_of_updates.to_i).each do |num| + headers << "Update #{num}" + end + end + headers end @@ -577,6 +584,7 @@ def build_group_rows(group, template_fields) supervisor = project&.supervisor project_status = project&.current_status || 'not_submitted' field_values = get_project_details_values(current_instance, template_fields) + progress_updates_values = get_progress_updates_values(project) rows = [] group.project_group_members.each do |member| @@ -591,7 +599,9 @@ def build_group_rows(group, template_fields) project&.current_title || '', project_status.humanize ] + row.concat(field_values) + row.concat(progress_updates_values) rows << row end rows @@ -603,6 +613,7 @@ def build_student_rows(student, template_fields) supervisor = project&.supervisor project_status = project&.current_status || 'not_submitted' field_values = get_project_details_values(current_instance, template_fields) + progress_updates_values = get_progress_updates_values(project) row = [ student.name || '', @@ -615,6 +626,7 @@ def build_student_rows(student, template_fields) ] row.concat(field_values) + row.concat(progress_updates_values) [row] end @@ -648,6 +660,19 @@ def get_project_details_values(current_instance, template_fields) end end + def get_progress_updates_values(project) + return [] unless @course.use_progress_updates? + + total_num = @course.number_of_updates.to_i + return Array.new(total_num, '') unless project + + progress_updates = project.progress_updates.order(:created_at).to_a + + (0..total_num).map do |index| + progress_updates[index]&.rating&.titleize || '' + end + end + # Lecturer capcity helpers def lecturer_approved_proposals_count(lecturer, course) @@ -815,13 +840,9 @@ def filtered_group_list group_list = group_list.select { |g| ids.include?(g.id) } end - if params[:status_filter].present? && params[:status_filter] != 'all' - group_list = @course.groups_with_status(params[:status_filter], group_list) - end + group_list = @course.groups_with_status(params[:status_filter], group_list) if params[:status_filter].present? && params[:status_filter] != 'all' - if params[:search_query].present? - group_list = search_groups(group_list, params[:search_query]) - end + group_list = search_groups(group_list, params[:search_query]) if params[:search_query].present? sorted_list = group_list.sort_by { |group| sort_value_for_group(group) } sort_descending? ? sorted_list.reverse : sorted_list @@ -834,13 +855,9 @@ def filtered_student_list student_list = student_list.select { |s| ids.include?(s.id) } end - if params[:status_filter].present? && params[:status_filter] != 'all' - student_list = @course.students_with_status(params[:status_filter], student_list) - end + student_list = @course.students_with_status(params[:status_filter], student_list) if params[:status_filter].present? && params[:status_filter] != 'all' - if params[:search_query].present? - student_list = search_students(student_list, params[:search_query]) - end + student_list = search_students(student_list, params[:search_query]) if params[:search_query].present? sorted_list = student_list.sort_by { |student| sort_value_for_student(student) } sort_descending? ? sorted_list.reverse : sorted_list