Add contest duration & complete ranking mode implementation
Some checks failed
CI / scan_ruby (push) Successful in 21s
CI / scan_js (push) Successful in 14s
CI / lint (push) Successful in 13s
CI / test (push) Failing after 37s

This commit is contained in:
sto
2025-11-18 09:18:18 +01:00
parent b88460ae71
commit e67ee92838
12 changed files with 62 additions and 12 deletions

View File

@@ -32,6 +32,8 @@
# puzzle_id (puzzle_id => puzzles.id)
#
class Completion < ApplicationRecord
include ContestsHelper
belongs_to :contest
belongs_to :contestant
belongs_to :puzzle
@@ -42,7 +44,7 @@ class Completion < ApplicationRecord
before_save :clean_pieces
before_save :compute_projected_time
validates :display_time_from_start, presence: true, format: { with: /\A(((\d\d|\d):\d\d|\d\d|\d):\d\d|\d\d|\d)\z/ }
validates :display_time_from_start, presence: true, format: { with: /\A(((\d\d|\d):\d\d|\d\d|\d):\d\d|\d\d|\d)\z/ }, if: -> { completed || offline.present? }
validates :remaining_pieces, presence: true, if: -> { !completed }
validates :contestant_id, uniqueness: { scope: :puzzle }, if: -> { contest.puzzles.size == 1 }
validates :puzzle_id, uniqueness: { scope: :contestant }, if: -> { contest.puzzles.size > 1 }
@@ -66,7 +68,8 @@ class Completion < ApplicationRecord
self.time_seconds = arr[0].to_i
end
else
self.time_seconds = 1
self.time_seconds = self.contest.duration_seconds
self.display_time_from_start = display_time(self.time_seconds)
end
end
@@ -75,6 +78,9 @@ class Completion < ApplicationRecord
self.remaining_pieces = nil
else
self.missing_pieces = nil
if !self.offline.present?
self.display_time_from_start = nil
end
end
end
@@ -82,7 +88,7 @@ class Completion < ApplicationRecord
add_time_seconds
if self.completed
self.projected_time = self.time_seconds
elsif self.offline.present?
else
assembled_time = self.time_seconds
assembled_pieces = self.puzzle.pieces - self.remaining_pieces
pieces_per_second = assembled_pieces.to_f / assembled_time.to_f