Skip to content

Commit f939c8d

Browse files
committed
Consistently use created_at for submissions
Previously, we considered the `updated_at` attribute, i.e., for deadlines. However, since submissions are currently non-updatable by the user (and only receive a minor update once the testrun finished), it doesn't make much sense. We rather want to stick with the user-triggered creation date.
1 parent 44c1f7c commit f939c8d

File tree

8 files changed

+30
-26
lines changed

8 files changed

+30
-26
lines changed

app/controllers/exercises_controller.rb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ def statistics
494494
contributor_statistics = {InternalUser => {}, ExternalUser => {}, ProgrammingGroup => {}}
495495

496496
query = SubmissionPolicy::DeadlineScope.new(current_user, Submission).resolve
497-
.select("contributor_id, contributor_type, MAX(score) AS maximum_score, COUNT(id) AS runs, MAX(updated_at) FILTER (WHERE cause IN ('submit', 'assess', 'remoteSubmit', 'remoteAssess')) AS updated_at, exercise_id")
497+
.select("contributor_id, contributor_type, MAX(score) AS maximum_score, COUNT(id) AS runs, MAX(created_at) FILTER (WHERE cause IN ('submit', 'assess', 'remoteSubmit', 'remoteAssess')) AS created_at, exercise_id")
498498
.where(exercise_id: @exercise.id)
499499
.group('contributor_id, contributor_type, exercise_id')
500500
.includes(:contributor, :exercise)
@@ -513,13 +513,9 @@ def external_user_statistics
513513

514514
submissions = SubmissionPolicy::DeadlineScope.new(current_user, Submission).resolve
515515
.where(contributor: @external_user, exercise: @exercise)
516-
.order(submissions: {updated_at: :desc})
516+
.order(submissions: {created_at: :desc})
517517
.includes(:exercise, testruns: [:testrun_messages, {file: [:file_type]}], files: [:file_type])
518518

519-
# From here on, we switch to sort by `created_at`. This is important for the working time estimation,
520-
# since a submission is updated after the corresponding testrun finishes.
521-
# Sorting by `updated_at` would lead to wrong working time estimations (but is more efficient for the database).
522-
523519
if policy(@exercise).detailed_statistics?
524520
@show_autosaves = params[:show_autosaves] == 'true' || submissions.where.not(cause: 'autosave').none?
525521

app/controllers/external_users_controller.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ def working_time_query(tag = nil)
3333
max(score) as maximum_score,
3434
count(bar.id) as runs,
3535
sum(working_time_new) AS working_time,
36-
max(max_updated_at) as updated_at
36+
max(max_created_at) as created_at
3737
FROM
3838
(SELECT contributor_id,
3939
exercise_id,
4040
score,
4141
id,
42-
max_updated_at,
42+
max_created_at,
4343
CASE
4444
WHEN #{StatisticsHelper.working_time_larger_delta} THEN '0'
4545
ELSE working_time
@@ -48,18 +48,18 @@ def working_time_query(tag = nil)
4848
(SELECT contributor_id,
4949
exercise_id,
5050
max(score) AS score,
51-
max(filtered_submissions.updated_at) FILTER (WHERE cause IN ('submit', 'assess', 'remoteSubmit', 'remoteAssess')) AS max_updated_at,
51+
max(filtered_submissions.created_at) FILTER (WHERE cause IN ('submit', 'assess', 'remoteSubmit', 'remoteAssess')) AS max_created_at,
5252
filtered_submissions.id,
53-
(filtered_submissions.updated_at - lag(filtered_submissions.updated_at) over (PARTITION BY contributor_id, exercise_id
54-
ORDER BY filtered_submissions.updated_at)) AS working_time
53+
(filtered_submissions.created_at - lag(filtered_submissions.created_at) over (PARTITION BY contributor_id, exercise_id
54+
ORDER BY filtered_submissions.created_at)) AS working_time
5555
FROM filtered_submissions
5656
JOIN exercises ON filtered_submissions.exercise_id = exercises.id
5757
WHERE #{ExternalUser.sanitize_sql(['contributor_id = ?', @user.id])}
5858
AND contributor_type = 'ExternalUser'
5959
GROUP BY exercise_id,
6060
contributor_id,
6161
filtered_submissions.id,
62-
filtered_submissions.updated_at
62+
filtered_submissions.created_at
6363
) AS foo
6464
) AS bar
6565
#{tag.nil? ? '' : " JOIN exercise_tags et ON et.exercise_id = bar.exercise_id AND #{ExternalUser.sanitize_sql(['et.tag_id = ?', tag])}"}
@@ -79,7 +79,7 @@ def statistics
7979
statistics = {}
8080

8181
# We fake the statistics hash to be "submissions"
82-
# Available are: contributor_id, exercise_id, maximum_score, runs, working_time, updated_at
82+
# Available are: contributor_id, exercise_id, maximum_score, runs, working_time, created_at
8383
working_time_statistics = Submission.find_by_sql(working_time_query(tag&.id))
8484
ActiveRecord::Associations::Preloader.new(records: working_time_statistics, associations: [:exercise]).call
8585
working_time_statistics.each do |tuple|

app/models/submission.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,16 @@ class Submission < ApplicationRecord
3535
scope :intermediate, -> { where.not(cause: %w[submit remoteSubmit]) }
3636

3737
scope :before_deadline, lambda {
38-
joins(:exercise).where('submissions.updated_at <= exercises.submission_deadline OR exercises.submission_deadline IS NULL')
38+
joins(:exercise).where('submissions.created_at <= exercises.submission_deadline OR exercises.submission_deadline IS NULL')
3939
}
4040
scope :within_grace_period, lambda {
41-
joins(:exercise).where('(submissions.updated_at > exercises.submission_deadline) AND (submissions.updated_at <= exercises.late_submission_deadline OR exercises.late_submission_deadline IS NULL)')
41+
joins(:exercise).where('(submissions.created_at > exercises.submission_deadline) AND (submissions.created_at <= exercises.late_submission_deadline OR exercises.late_submission_deadline IS NULL)')
4242
}
4343
scope :after_late_deadline, lambda {
44-
joins(:exercise).where('submissions.updated_at > exercises.late_submission_deadline')
44+
joins(:exercise).where('submissions.created_at > exercises.late_submission_deadline')
4545
}
4646

47-
scope :latest, -> { order(submissions: {updated_at: :desc}).first }
47+
scope :latest, -> { order(submissions: {created_at: :desc}).first }
4848

4949
validates :cause, inclusion: {in: CAUSES}
5050

@@ -95,25 +95,25 @@ def to_s
9595

9696
def before_deadline?
9797
if exercise.submission_deadline.present?
98-
updated_at <= exercise.submission_deadline
98+
created_at <= exercise.submission_deadline
9999
else
100100
false
101101
end
102102
end
103103

104104
def within_grace_period?
105105
if exercise.submission_deadline.present? && exercise.late_submission_deadline.present?
106-
updated_at > exercise.submission_deadline && updated_at <= exercise.late_submission_deadline
106+
created_at > exercise.submission_deadline && created_at <= exercise.late_submission_deadline
107107
else
108108
false
109109
end
110110
end
111111

112112
def after_late_deadline?
113113
if exercise.late_submission_deadline.present?
114-
updated_at > exercise.late_submission_deadline
114+
created_at > exercise.late_submission_deadline
115115
elsif exercise.submission_deadline.present?
116-
updated_at > exercise.submission_deadline
116+
created_at > exercise.submission_deadline
117117
else
118118
false
119119
end

app/policies/submission_policy.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def latest_submissions_assessed(highest_scored: false)
9595
submission_table[:contributor_type],
9696
submission_table[:contributor_id],
9797
highest_scored ? submission_table[:score].desc.nulls_last : nil,
98-
submission_table[:updated_at].desc,
98+
submission_table[:created_at].desc,
9999
].compact
100100

101101
Submission.from(

app/views/exercises/statistics.html.slim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ h1 = @exercise
8282
td = link_to_if user_type == ExternalUser && policy(contributor).statistics?, contributor.displayname, statistics_external_user_exercise_path(contributor, @exercise)
8383
td = submission_stat['maximum_score'] || '0.0'
8484
td.align-middle
85-
- if submission_stat.updated_at.present?
85+
- if submission_stat.created_at.present?
8686
- if submission_stat.before_deadline?
8787
.deadline-result.positive-result
8888
- elsif submission_stat.within_grace_period?

app/views/external_users/statistics.html.slim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ h1 = t('.title', user: @user.displayname)
1616
td = link_to exercise, statistics_external_user_exercise_path(@user, exercise)
1717
td = submission_stat['maximum_score'] || 0.0
1818
td.align-middle
19-
- if submission_stat.updated_at.present?
19+
- if submission_stat.created_at.present?
2020
- if submission_stat.before_deadline?
2121
.deadline-result.positive-result
2222
- elsif submission_stat.within_grace_period?
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# frozen_string_literal: true
2+
3+
class MoveUpdatedAtIndexToCreatedAtOnSubmission < ActiveRecord::Migration[7.2]
4+
def change
5+
remove_index :submissions, :updated_at, order: {updated_at: :desc}
6+
add_index :submissions, :created_at, order: {updated_at: :desc}
7+
end
8+
end

db/schema.rb

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)