From 87579342bac26a95dc12e62de94a4c125473968e Mon Sep 17 00:00:00 2001 From: Markku Riekkinen Date: Wed, 18 Oct 2023 20:54:07 +0300 Subject: [PATCH] Fix incorrect deadline in ModuleRevealState when it has no exercises When ModuleRevealState has no exercises (that is, the corresponding course module contains no exercises), then it must return the module's deadline instead of `None` in the methods `get_deadline()` and `get_latest_deadline()`. `None` value prevents deadline-triggered reveal rules from working, that is, the chapter model solution for the course module would never be revealed when the deadline trigger is used. In addition, this commit slightly optimizes ModuleRevealState. In `get_latest_deadline()`, all exercises belong to the same course module, thus their common deadlines are identical (the module's deadline). --- exercise/reveal_states.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/exercise/reveal_states.py b/exercise/reveal_states.py index 0b1b40e4c..aa86f6c9d 100644 --- a/exercise/reveal_states.py +++ b/exercise/reveal_states.py @@ -12,10 +12,12 @@ from .cache.points import LearningObjectPoints, ModulePoints, ExercisePoints -def _get_exercise_common_deadlines(exercise: ExercisePoints) -> List[datetime.datetime]: - deadlines = [exercise.closing_time] - if exercise.late_allowed and exercise.late_percent > 0: - deadlines.append(exercise.late_time) +def _get_exercise_common_deadlines( + exercise_or_module: Union[ExercisePoints, ModulePoints], + ) -> List[datetime.datetime]: + deadlines = [exercise_or_module.closing_time] + if exercise_or_module.late_allowed and exercise_or_module.late_percent > 0: + deadlines.append(exercise_or_module.late_time) return deadlines @@ -156,9 +158,8 @@ def get_latest_deadline(self) -> Optional[datetime.datetime]: deadlines = _get_exercise_common_deadlines(self.module) exercise_dict = {} for exercise in self.exercises: - deadlines.extend(_get_exercise_common_deadlines(exercise)) exercise_dict[exercise.id] = exercise - if not self.max_deviation_fetched: + if not self.max_deviation_fetched and self.exercises: self.max_deviation = ( DeadlineRuleDeviation.objects .filter(exercise__course_module_id=self.module_id)