diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 75ae109e..673903b6 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -44,7 +44,15 @@ class Exercise < ApplicationRecord def average_percentage if average_score and maximum_score != 0.0 and submissions.exists?(cause: 'submit') - (average_score / maximum_score * 100).round + (average_score / maximum_score * 100).round(2) + else + 0 + end + end + + def finishers_percentage + if users.distinct.count != 0 + (100.0 / users.distinct.count * finishers.count).round(2) else 0 end diff --git a/app/views/exercise_collections/statistics.html.slim b/app/views/exercise_collections/statistics.html.slim index 74c9f49d..8951f326 100644 --- a/app/views/exercise_collections/statistics.html.slim +++ b/app/views/exercise_collections/statistics.html.slim @@ -15,3 +15,27 @@ h1 = @exercise_collection .legend-entry div(class="box #{klass}") .box-label = label + +h4.mt-4 = t('activerecord.attributes.exercise_collections.exercises') +.table-responsive#exercise-list + table.table.sortable + thead + tr + th = '#' + th = t('activerecord.attributes.exercise.title') + th = t('activerecord.attributes.exercise.number_of_users') + th = t('activerecord.attributes.exercise.distinct_final_submissions') + th = t('activerecord.attributes.exercise.finishing_rate') + th = t('activerecord.attributes.exercise.average_score_percentage') + th = t('shared.actions') + tbody + - @exercise_collection.items.sort_by{|item| item.position}.each do |exercise_collection_item| + - exercise = exercise_collection_item.exercise + tr + td = exercise_collection_item.position + td = link_to_if(policy(exercise).show?, exercise.title, exercise) + td = exercise.users.distinct.count + td = exercise.submissions.send(:final).distinct.count(:user_id) + td = exercise.finishers_percentage + td = exercise.average_percentage + td = link_to(t('shared.statistics'), statistics_exercise_path(exercise), 'data-turbolinks' => "false") if policy(exercise).statistics? diff --git a/config/locales/de.yml b/config/locales/de.yml index 66f1fbd7..b522a023 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -23,8 +23,11 @@ de: testing_framework: Testing-Framework user: Autor exercise: + average_score_percentage: "Durchschnittliche Bewertung in Prozent" description: Beschreibung + distinct_final_submissions: "Endgültige Abgaben" embedding_parameters: Parameter für LTI-Einbettung + finishing_rate: "Abschlussquote" tags: Tags execution_environment: Ausführungsumgebung execution_environment_id: Ausführungsumgebung @@ -32,6 +35,7 @@ de: hide_file_tree: Dateibaum verstecken instructions: Anweisungen maximum_score: Erreichbare Punktzahl + number_of_users: "# Nutzer" public: Öffentlich selection: Ausgewählt title: Titel diff --git a/config/locales/en.yml b/config/locales/en.yml index 617da065..a9a7c7a7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -23,8 +23,11 @@ en: testing_framework: Testing Framework user: Author exercise: + average_score_percentage: "Average Score Percentage" description: Description + distinct_final_submissions: "Distinct Final Submissions" embedding_parameters: LTI Embedding Parameters + finishing_rate: "Finishing Rate" tags: Tags execution_environment: Execution Environment execution_environment_id: Execution Environment @@ -32,6 +35,7 @@ en: hide_file_tree: Hide File Tree instructions: Instructions maximum_score: Maximum Score + number_of_users: "# Users" public: Public selection: Selected title: Title diff --git a/spec/models/exercise_spec.rb b/spec/models/exercise_spec.rb index 640efd92..edfbd1cc 100644 --- a/spec/models/exercise_spec.rb +++ b/spec/models/exercise_spec.rb @@ -59,7 +59,7 @@ describe Exercise do it 'returns the average score expressed as a percentage' do maximum_percentages = exercise.submissions.group_by(&:user_id).values.map { |submission| submission.sort_by(&:score).last.score / exercise.maximum_score * 100 } - expect(exercise.average_percentage).to eq(maximum_percentages.average.round) + expect(exercise.average_percentage).to eq(maximum_percentages.average.round(2)) end end end