@@ -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