diff --git a/app/controllers/assessments_controller.rb b/app/controllers/assessments_controller.rb index d7ee688fc..29c2d34ba 100755 --- a/app/controllers/assessments_controller.rb +++ b/app/controllers/assessments_controller.rb @@ -489,6 +489,10 @@ def getAssessmentVariable(key) def export dir_path = @course.directory_path.to_s asmt_dir = @assessment.name + + pld_data = @assessment.calculate_pld.to_yaml + gdu_data = @assessment.calculate_gdu.to_yaml + begin # Update the assessment config YAML file. @assessment.dump_yaml @@ -500,6 +504,17 @@ def export tar.mkdir asmt_dir, File.stat(File.join(dir_path, asmt_dir)).mode filter = [@assessment.handin_directory_path] @assessment.load_dir_to_tar(dir_path, asmt_dir, tar, filter) + + # Add PLD and GDU data to the tarball as separate files + tar.add_file_simple("PLD.yml", 0o644, pld_data.bytesize) do |io| + io.write pld_data + end + + tar.add_file_simple("GDU.yml", 0o644, gdu_data.bytesize) do |io| + io.write gdu_data + end + + end tarStream.rewind tarStream.close diff --git a/app/models/assessment.rb b/app/models/assessment.rb index 472d804ff..6659c34e4 100755 --- a/app/models/assessment.rb +++ b/app/models/assessment.rb @@ -464,6 +464,33 @@ def date_to_s(date) date.strftime("%a, %b %e at %l:%M%P") end + # Public method to access the PLD data + def calculate_pld + submissions.includes(:scores).map do |submission| + late_days = [(submission.created_at.to_date - due_at.to_date).to_i, 0].max + { submission_id: submission.id, late_days: late_days } + end + end + + # Public method to access the GDU data + def calculate_gdu + # Define grade boundaries + grade_boundaries = { 'A': 90, 'B': 80, 'C': 70, 'D': 60, 'F': 0 } + # Initialize distribution + distribution = Hash.new(0) + + total_submissions = submissions.joins(:scores).count + submissions.includes(:scores).each do |submission| + # Assuming 'score' is a method that sums up scores for a submission + score = submission.scores.sum(&:points) + grade = grade_boundaries.keys.reverse.detect { |grade| score >= grade_boundaries[grade] } + distribution[grade] += 1 + end + + # Convert counts to percentages + distribution.transform_values { |count| (count.to_f / total_submissions * 100).round(2) } + end + def load_dir_to_tar(dir_path, asmt_dir, tar, filters = [], export_dir = "") Dir[File.join(dir_path, asmt_dir, "**")].each do |file| mode = File.stat(file).mode