diff --git a/app/controllers/execution_environments_controller.rb b/app/controllers/execution_environments_controller.rb index 574aaed7..eeae03f9 100644 --- a/app/controllers/execution_environments_controller.rb +++ b/app/controllers/execution_environments_controller.rb @@ -28,7 +28,42 @@ class ExecutionEnvironmentsController < ApplicationController render(json: @docker_client.execute_arbitrary_command(params[:command])) end + + def working_time_query + """ + SELECT exercise_id, avg(working_time) as average_time + FROM + ( + SELECT user_id, + exercise_id, + sum(working_time_new) AS working_time + FROM + (SELECT user_id, + exercise_id, + CASE WHEN working_time >= '0:30:00' THEN '0' ELSE working_time END AS working_time_new + FROM + (SELECT user_id, + exercise_id, + id, + (created_at - lag(created_at) over (PARTITION BY user_id, exercise_id + ORDER BY created_at)) AS working_time + FROM submissions + WHERE exercise_id IN (SELECT ID FROM exercises WHERE execution_environment_id = #{@execution_environment.id}) + GROUP BY exercise_id, user_id, id) AS foo) AS bar + GROUP BY user_id, exercise_id + ) AS baz GROUP BY exercise_id; + """ + end + def statistics + working_time_statistics = {} + ActiveRecord::Base.connection.execute(working_time_query).each do |tuple| + working_time_statistics[tuple["exercise_id"].to_i] = tuple + end + + render locals: { + working_time_statistics: working_time_statistics + } end def execution_environment_params diff --git a/app/policies/external_user_policy.rb b/app/policies/external_user_policy.rb index 2e11060b..5932e3f0 100644 --- a/app/policies/external_user_policy.rb +++ b/app/policies/external_user_policy.rb @@ -1,5 +1,5 @@ class ExternalUserPolicy < AdminOnlyPolicy def statistics? - admin? + admin? || author? || team_member? end end diff --git a/app/views/execution_environments/statistics.html.slim b/app/views/execution_environments/statistics.html.slim index 1b804e95..a0c99fe1 100644 --- a/app/views/execution_environments/statistics.html.slim +++ b/app/views/execution_environments/statistics.html.slim @@ -8,7 +8,6 @@ h1 = @execution_environment th.header = t(title) tbody - @execution_environment.exercises.each do |exercise| - - average_score = exercise.average_score tr td = link_to exercise.title, controller: "exercises", action: "statistics", id: exercise.id td = exercise.users.distinct.count @@ -16,4 +15,4 @@ h1 = @execution_environment td = exercise.maximum_score td = 100 / exercise.maximum_score * average_score td = exercise.average_number_of_submissions - td = exercise.average_working_time + td = working_time_statistics[exercise.id]["average_time"]