Skip to content

Commit 357a227

Browse files
authored
Locking updates (#1655)
* Allow turning off teacher review for locked exercises * Enhance user exercise state management for chapter-locking courses * Refactor ExerciseBlock component to streamline chapter locking logic and update localization strings for improved clarity * Add update function for teacher review setting and implement related tests - Introduced `update_teacher_reviews_answer_after_locking` function to update the `teacher_reviews_answer_after_locking` field in the exercises table. - Enhanced `move_chapter_exercises_to_manual_review` function to update the reviewing stage when exercises are fully graded. - Added unit tests to verify the correct behavior of the new functionality, ensuring exercises transition to the reviewed and locked state as expected. * Update system tests for chapter locking feature to reflect changes in student context and exercise visibility * Fixes
1 parent 73ed44e commit 357a227

File tree

38 files changed

+882
-216
lines changed

38 files changed

+882
-216
lines changed

services/cms/src/blocks/Exercise/ExerciseSettings/ExerciseSettingsEditor.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
"use client"
22

33
import { css } from "@emotion/css"
4+
import { useQuery } from "@tanstack/react-query"
45
import { InnerBlocks } from "@wordpress/block-editor"
56
import { useContext } from "react"
67
import { useTranslation } from "react-i18next"
78

89
import PeerReviewEditor from "../../../components/PeerReviewEditor"
910
import ExerciseBlockContext from "../../../contexts/ExerciseBlockContext"
1011
import PageContext from "../../../contexts/PageContext"
12+
import { fetchCourseById } from "../../../services/backend/courses"
1113

1214
import Accordion from "@/shared-module/common/components/Accordion"
1315
import CheckBox from "@/shared-module/common/components/InputFields/CheckBox"
1416
import TextField from "@/shared-module/common/components/InputFields/TextField"
1517
import { baseTheme } from "@/shared-module/common/styles"
1618
import { respondToOrLarger } from "@/shared-module/common/styles/respond"
19+
import { assertNotNullOrUndefined } from "@/shared-module/common/utils/nullability"
1720

1821
const ALLOWED_NESTED_BLOCKS = ["core/image", "core/paragraph", "core/list", "moocfi/latex"]
1922

@@ -22,6 +25,13 @@ const ExerciseSettingsEditor = () => {
2225
const courseId = useContext(PageContext)?.page.course_id
2326
const { attributes, setAttributes } = useContext(ExerciseBlockContext)
2427

28+
const courseQuery = useQuery({
29+
queryKey: ["course", courseId],
30+
queryFn: () => fetchCourseById(assertNotNullOrUndefined(courseId)),
31+
enabled: !!courseId,
32+
})
33+
const chapterLockingEnabled = courseQuery.data?.chapter_locking_enabled ?? false
34+
2535
if (!attributes) {
2636
return null
2737
}
@@ -105,6 +115,18 @@ const ExerciseSettingsEditor = () => {
105115
`}
106116
/>
107117
</div>
118+
{courseId && chapterLockingEnabled && (
119+
<CheckBox
120+
label={t("teacher-reviews-answer-after-locking")}
121+
checked={attributes.teacher_reviews_answer_after_locking ?? true}
122+
onChangeByValue={(checked: boolean) => {
123+
setAttributes({ teacher_reviews_answer_after_locking: checked })
124+
}}
125+
className={css`
126+
margin-bottom: 1rem;
127+
`}
128+
/>
129+
)}
108130
{courseId && (
109131
<Accordion>
110132
<details>

services/cms/src/blocks/Exercise/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface ExerciseAttributes {
2121
peer_or_self_review_config: string
2222
peer_or_self_review_questions_config: string
2323
use_course_default_peer_review: boolean
24+
teacher_reviews_answer_after_locking?: boolean
2425
}
2526

2627
/**
@@ -78,6 +79,10 @@ const ExerciseConfiguration: BlockConfiguration<ExerciseAttributes> = {
7879
type: "boolean",
7980
default: false,
8081
},
82+
teacher_reviews_answer_after_locking: {
83+
type: "boolean",
84+
default: true,
85+
},
8186
},
8287
edit: enforceExerciseIdDefined(ExerciseEditor),
8388
save: ExerciseSave,

services/cms/src/utils/documentSchemaProcessor.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ export function normalizeDocument(args: UnnormalizedDocument): CmsPageUpdate {
9494
: JSON.parse(exerciseAttributes.peer_or_self_review_questions_config),
9595
use_course_default_peer_or_self_review_config:
9696
exerciseAttributes.use_course_default_peer_review,
97+
teacher_reviews_answer_after_locking:
98+
exerciseAttributes.teacher_reviews_answer_after_locking ?? true,
9799
})
98100
exerciseCount = exerciseCount + 1
99101
let exerciseSlideCount = 0
@@ -264,6 +266,7 @@ export function denormalizeDocument(input: CmsPageUpdate): UnnormalizedDocument
264266
? JSON.stringify(exercise.peer_or_self_review_questions)
265267
: "null",
266268
use_course_default_peer_review: exercise.use_course_default_peer_or_self_review_config,
269+
teacher_reviews_answer_after_locking: exercise.teacher_reviews_answer_after_locking,
267270
},
268271
}
269272

services/cms/tests/utils/documentSchemaProcessor.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ const exampleCMSPageUpdate: CmsPageUpdate = {
9898
weight: 0.3,
9999
},
100100
],
101+
teacher_reviews_answer_after_locking: true,
101102
use_course_default_peer_or_self_review_config: false,
102103
},
103104
],
@@ -150,6 +151,7 @@ const exampleUnnormalizedDocumentExerciseAttributes: ExerciseAttributes = {
150151
'[{"id":"f0ae5814-927d-4a38-a0c0-db66f08c2bee","course_id":"","exercise_id":"dd46fb67-d168-4554-b912-0018f812166d","processing_strategy":"AutomaticallyGradeOrManualReviewByAverage","accepting_threshold":"0.5","peer_reviews_to_give":"1","peer_reviews_to_receive":"1"}]',
151152
peer_or_self_review_questions_config:
152153
'[{"id":"f3c8eadd-75ca-409f-b1c6-31db65701930","peer_or_self_review_config_id":"f0ae5814-927d-4a38-a0c0-db66f08c2bee","answer_required":"true","order_number":"0","question":"how about...","question_type":"Essay","weight":0}]',
154+
teacher_reviews_answer_after_locking: true,
153155
use_course_default_peer_review: false,
154156
}
155157

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE exercises DROP COLUMN teacher_reviews_answer_after_locking;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
ALTER TABLE exercises
2+
ADD COLUMN teacher_reviews_answer_after_locking BOOLEAN NOT NULL DEFAULT TRUE;
3+
4+
COMMENT ON COLUMN exercises.teacher_reviews_answer_after_locking IS
5+
'When true (default), answers go to manual review when chapter is locked.
6+
When false, exercises with automated grading receive points immediately and lock without teacher review.';

services/headless-lms/models/.sqlx/query-18cad5d0cf2a854a36655738b9a05c4fe5376c77174239b17cdf7e21bc739b1f.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/headless-lms/models/.sqlx/query-306820247b9533af5d464aa15a58f9fcde6a59b1666a3709b32bc1823ad2e970.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/headless-lms/models/.sqlx/query-c1b7910c52809d3b28fbf4c6167bff5d72f78187127f4ab081ea61a3d08b7e57.json renamed to services/headless-lms/models/.sqlx/query-35dd30f2d33211427c8f9e79cee4b309e45d18398023266eb2f861e0c5ea9c5a.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

services/headless-lms/models/.sqlx/query-378026cd620ac9903b81d46a6f87c4e48f973bfb6fe5051eb5767438feb9b961.json

Lines changed: 137 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)