Skip to content

Commit af47936

Browse files
committed
Take soft deadlines into account with unlocks
1 parent 99f150b commit af47936

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

app/models/unlock_spec.rb

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def parse_condition(str)
6868
elsif str =~ /^exercise\s+(?:group\s+)?(\S+)$/
6969
parse_condition("100% of #{$1}")
7070

71+
# TODO: This does not work well with soft deadlines
7172
elsif str =~ /^points?\s+(\S+.*)$/
7273
points = $1.split(' ').map(&:strip).reject(&:empty?)
7374
@depends_on_other_exercises = true
@@ -87,13 +88,13 @@ def parse_condition(str)
8788
check_group_or_exercise_exists(@course, group)
8889
@depends_on_other_exercises = true
8990
@conditions << lambda do |u|
90-
available, awarded = available_and_awarded(@course, group, u)
91-
awarded.count.to_f / available.count.to_f >= percentage - 0.0001
91+
available, awarded, late = available_and_awarded_and_awarded_late(@course, group, u)
92+
(awarded.count.to_f + late.count.to_f * @course.soft_deadline_point_multiplier) / available.count.to_f >= percentage - 0.0001
9293
end
9394
@universal_descriptions << "#{percentage_str}% from #{group}"
9495
@describers << lambda do |u|
95-
available, awarded = available_and_awarded(@course, group, u)
96-
remaining = ((percentage - 0.0001) * available.count.to_f).ceil - awarded.count
96+
available, awarded, late = available_and_awarded_and_awarded_late(@course, group, u)
97+
remaining = ((percentage - 0.0001) * available.count.to_f).ceil - (awarded.count.to_f + late.count.to_f * course.soft_deadline_point_multiplier).round(2)
9798
if remaining > 0
9899
"get #{remaining} more #{plural(remaining, 'point')} from #{group}"
99100
else
@@ -127,12 +128,12 @@ def parse_condition(str)
127128
check_group_or_exercise_exists(@course, group)
128129
@depends_on_other_exercises = true
129130
@conditions << lambda do |u|
130-
awarded = available_and_awarded(@course, group, u)[1]
131+
awarded = available_and_awarded_and_awarded_late(@course, group, u)[1]
131132
awarded.count >= num_points
132133
end
133134
@universal_descriptions << "#{num_points} #{plural(num_points, 'point')} from #{group}"
134135
@describers << lambda do |u|
135-
awarded = available_and_awarded(@course, group, u)[1]
136+
awarded = available_and_awarded_and_awarded_late(@course, group, u)[1]
136137
remaining = num_points - awarded.count
137138
if remaining > 0
138139
"get #{remaining} more #{plural(remaining, 'point')} from #{group}"
@@ -151,15 +152,16 @@ def check_group_or_exercise_exists(course, group_or_exercise_name)
151152
end
152153
end
153154

154-
def available_and_awarded(course, group_or_exercise_name, user)
155+
def available_and_awarded_and_awarded_late(course, group_or_exercise_name, user)
155156
required_exercises = course.exercises_by_name_or_group(group_or_exercise_name)
156157
.select { |e| e.hide_submission_results == false && e.enabled? }
157158
available = AvailablePoint.course_points_of_exercises_list(course, required_exercises)
158159
.map(&:name)
159-
awarded = AwardedPoint.course_user_points(course, user)
160-
.map(&:name)
161-
.select { |pt| available.include?(pt) }
162-
[available, awarded]
160+
awarded_and_late = AwardedPoint.course_user_points(course, user)
161+
.select { |pt| available.include?(pt.name) }
162+
awarded = awarded_and_late.select { |a| !a.awarded_after_soft_deadline? }
163+
late = awarded_and_late.select { |a| a.awarded_after_soft_deadline? }
164+
[available, awarded, late]
163165
end
164166

165167
def plural(n, word)

0 commit comments

Comments
 (0)