@@ -68,6 +68,7 @@ def parse_condition(str)
68
68
elsif str =~ /^exercise\s +(?:group\s +)?(\S +)$/
69
69
parse_condition ( "100% of #{ $1} " )
70
70
71
+ # TODO: This does not work well with soft deadlines
71
72
elsif str =~ /^points?\s +(\S +.*)$/
72
73
points = $1. split ( ' ' ) . map ( &:strip ) . reject ( &:empty? )
73
74
@depends_on_other_exercises = true
@@ -87,13 +88,13 @@ def parse_condition(str)
87
88
check_group_or_exercise_exists ( @course , group )
88
89
@depends_on_other_exercises = true
89
90
@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
92
93
end
93
94
@universal_descriptions << "#{ percentage_str } % from #{ group } "
94
95
@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 )
97
98
if remaining > 0
98
99
"get #{ remaining } more #{ plural ( remaining , 'point' ) } from #{ group } "
99
100
else
@@ -127,12 +128,12 @@ def parse_condition(str)
127
128
check_group_or_exercise_exists ( @course , group )
128
129
@depends_on_other_exercises = true
129
130
@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 ]
131
132
awarded . count >= num_points
132
133
end
133
134
@universal_descriptions << "#{ num_points } #{ plural ( num_points , 'point' ) } from #{ group } "
134
135
@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 ]
136
137
remaining = num_points - awarded . count
137
138
if remaining > 0
138
139
"get #{ remaining } more #{ plural ( remaining , 'point' ) } from #{ group } "
@@ -151,15 +152,16 @@ def check_group_or_exercise_exists(course, group_or_exercise_name)
151
152
end
152
153
end
153
154
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 )
155
156
required_exercises = course . exercises_by_name_or_group ( group_or_exercise_name )
156
157
. select { |e | e . hide_submission_results == false && e . enabled? }
157
158
available = AvailablePoint . course_points_of_exercises_list ( course , required_exercises )
158
159
. 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 ]
163
165
end
164
166
165
167
def plural ( n , word )
0 commit comments