|
6 | 6 |
|
7 | 7 | from lms.models import ( |
8 | 8 | Assignment, |
| 9 | + AssignmentCheckpoint, |
9 | 10 | AssignmentGrouping, |
10 | 11 | AssignmentMembership, |
11 | 12 | AutoGradingConfig, |
@@ -62,6 +63,7 @@ def update_assignment( # noqa: PLR0913 |
62 | 63 | group_set_id, |
63 | 64 | course: Course, |
64 | 65 | auto_grading_config: dict | None = None, |
| 66 | + checkpoint_enabled: bool = False, |
65 | 67 | ): |
66 | 68 | """Update an existing assignment.""" |
67 | 69 | if self._misc_plugin.is_speed_grader_launch(request): |
@@ -96,6 +98,7 @@ def update_assignment( # noqa: PLR0913 |
96 | 98 |
|
97 | 99 | assignment.course_id = course.id |
98 | 100 | self._update_auto_grading_config(assignment, auto_grading_config) |
| 101 | + self._update_checkpoint(assignment, checkpoint_enabled) |
99 | 102 |
|
100 | 103 | return assignment |
101 | 104 |
|
@@ -151,6 +154,7 @@ def get_assignment_for_launch(self, request, course: Course) -> Assignment | Non |
151 | 154 | document_url = assignment_config.get("document_url") |
152 | 155 | group_set_id = assignment_config.get("group_set_id") |
153 | 156 | auto_grading_config = assignment_config.get("auto_grading_config") |
| 157 | + checkpoint_enabled = assignment_config.get("checkpoint_enabled", False) |
154 | 158 |
|
155 | 159 | if not document_url: |
156 | 160 | # We can't find a document_url, we shouldn't try to create an |
@@ -181,7 +185,13 @@ def get_assignment_for_launch(self, request, course: Course) -> Assignment | Non |
181 | 185 | # It often will be the same one while launching the assignment again but |
182 | 186 | # it might for example be an updated deep linked URL or similar. |
183 | 187 | return self.update_assignment( |
184 | | - request, assignment, document_url, group_set_id, course, auto_grading_config |
| 188 | + request, |
| 189 | + assignment, |
| 190 | + document_url, |
| 191 | + group_set_id, |
| 192 | + course, |
| 193 | + auto_grading_config, |
| 194 | + checkpoint_enabled=checkpoint_enabled, |
185 | 195 | ) |
186 | 196 |
|
187 | 197 | def upsert_assignment_membership( |
@@ -373,6 +383,21 @@ def get_assignment_sections(self, assignment) -> Sequence[Grouping]: |
373 | 383 | .order_by(Grouping.lms_name.asc()) |
374 | 384 | ).all() |
375 | 385 |
|
| 386 | + def _update_checkpoint( |
| 387 | + self, assignment: Assignment, checkpoint_enabled: bool |
| 388 | + ) -> None: |
| 389 | + """Create a checkpoint for an assignment if enabled and not already present. |
| 390 | +
|
| 391 | + Checkpoints can only be set at creation time -- once created they |
| 392 | + are never removed by an edit, and calling this with |
| 393 | + checkpoint_enabled=False on an assignment that already has a |
| 394 | + checkpoint is a no-op. |
| 395 | + """ |
| 396 | + if checkpoint_enabled and not assignment.checkpoint: |
| 397 | + checkpoint = AssignmentCheckpoint(assignment=assignment) |
| 398 | + self._db.add(checkpoint) |
| 399 | + assignment.checkpoint = checkpoint |
| 400 | + |
376 | 401 | def _update_auto_grading_config( |
377 | 402 | self, assignment: Assignment, auto_grading_config: dict | None |
378 | 403 | ) -> None: |
|
0 commit comments