@falkenslab/moodle-driver 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/areas/activities/build.d.ts +47 -10
- package/dist/areas/activities/build.js +157 -24
- package/dist/areas/activities/build.js.map +1 -1
- package/dist/areas/activities/conditions.d.ts +77 -0
- package/dist/areas/activities/conditions.js +216 -0
- package/dist/areas/activities/conditions.js.map +1 -0
- package/dist/areas/activities/content.d.ts +3 -0
- package/dist/areas/activities/content.js +1 -0
- package/dist/areas/activities/content.js.map +1 -1
- package/dist/areas/assignments/grader.d.ts +32 -0
- package/dist/areas/assignments/grader.js +66 -2
- package/dist/areas/assignments/grader.js.map +1 -1
- package/dist/areas/assignments/grading.d.ts +69 -6
- package/dist/areas/assignments/grading.js +173 -13
- package/dist/areas/assignments/grading.js.map +1 -1
- package/dist/areas/assignments/student.d.ts +14 -0
- package/dist/areas/assignments/student.js +43 -2
- package/dist/areas/assignments/student.js.map +1 -1
- package/dist/areas/backup/backup.d.ts +86 -0
- package/dist/areas/backup/backup.js +368 -0
- package/dist/areas/backup/backup.js.map +1 -0
- package/dist/areas/calendar/calendar.d.ts +27 -0
- package/dist/areas/calendar/calendar.js +115 -9
- package/dist/areas/calendar/calendar.js.map +1 -1
- package/dist/areas/completion/completion.d.ts +3 -0
- package/dist/areas/completion/completion.js.map +1 -1
- package/dist/areas/courses/list.d.ts +2 -0
- package/dist/areas/courses/list.js.map +1 -1
- package/dist/areas/courses/reset.d.ts +51 -0
- package/dist/areas/courses/reset.js +123 -0
- package/dist/areas/courses/reset.js.map +1 -0
- package/dist/areas/courses/state.d.ts +17 -0
- package/dist/areas/courses/state.js +37 -6
- package/dist/areas/courses/state.js.map +1 -1
- package/dist/areas/courses/structure.d.ts +14 -2
- package/dist/areas/courses/structure.js +11 -5
- package/dist/areas/courses/structure.js.map +1 -1
- package/dist/areas/forums/discussions.d.ts +8 -0
- package/dist/areas/forums/discussions.js +10 -0
- package/dist/areas/forums/discussions.js.map +1 -1
- package/dist/areas/forums/grading.d.ts +49 -0
- package/dist/areas/forums/grading.js +125 -0
- package/dist/areas/forums/grading.js.map +1 -0
- package/dist/areas/forums/posts.d.ts +37 -0
- package/dist/areas/forums/posts.js +141 -6
- package/dist/areas/forums/posts.js.map +1 -1
- package/dist/areas/grades/export.d.ts +38 -0
- package/dist/areas/grades/export.js +88 -0
- package/dist/areas/grades/export.js.map +1 -0
- package/dist/areas/grades/gradebook.d.ts +50 -0
- package/dist/areas/grades/gradebook.js +120 -0
- package/dist/areas/grades/gradebook.js.map +1 -1
- package/dist/areas/grades/singleview.d.ts +39 -0
- package/dist/areas/grades/singleview.js +186 -0
- package/dist/areas/grades/singleview.js.map +1 -0
- package/dist/areas/h5p/h5p.d.ts +2 -0
- package/dist/areas/h5p/h5p.js +12 -7
- package/dist/areas/h5p/h5p.js.map +1 -1
- package/dist/areas/lessons/lessons.d.ts +1 -0
- package/dist/areas/lessons/lessons.js.map +1 -1
- package/dist/areas/messages/messages.d.ts +32 -0
- package/dist/areas/messages/messages.js +44 -2
- package/dist/areas/messages/messages.js.map +1 -1
- package/dist/areas/participants/enrolments.d.ts +60 -0
- package/dist/areas/participants/enrolments.js +218 -0
- package/dist/areas/participants/enrolments.js.map +1 -0
- package/dist/areas/participants/groups.d.ts +75 -0
- package/dist/areas/participants/groups.js +201 -0
- package/dist/areas/participants/groups.js.map +1 -0
- package/dist/areas/participants/methods.d.ts +56 -0
- package/dist/areas/participants/methods.js +154 -0
- package/dist/areas/participants/methods.js.map +1 -0
- package/dist/areas/participants/participants.d.ts +11 -0
- package/dist/areas/participants/participants.js +24 -19
- package/dist/areas/participants/participants.js.map +1 -1
- package/dist/areas/questions/banks.d.ts +36 -1
- package/dist/areas/questions/banks.js +140 -17
- package/dist/areas/questions/banks.js.map +1 -1
- package/dist/areas/quizzes/attempts.d.ts +2 -0
- package/dist/areas/quizzes/attempts.js +9 -0
- package/dist/areas/quizzes/attempts.js.map +1 -1
- package/dist/areas/quizzes/grading.d.ts +50 -0
- package/dist/areas/quizzes/grading.js +131 -0
- package/dist/areas/quizzes/grading.js.map +1 -0
- package/dist/areas/quizzes/results.d.ts +3 -0
- package/dist/areas/quizzes/results.js +2 -1
- package/dist/areas/quizzes/results.js.map +1 -1
- package/dist/areas/quizzes/structure.d.ts +65 -9
- package/dist/areas/quizzes/structure.js +222 -23
- package/dist/areas/quizzes/structure.js.map +1 -1
- package/dist/areas/ratings/ratings.d.ts +26 -0
- package/dist/areas/ratings/ratings.js +108 -0
- package/dist/areas/ratings/ratings.js.map +1 -0
- package/dist/areas/reports/dates.d.ts +18 -0
- package/dist/areas/reports/dates.js +134 -0
- package/dist/areas/reports/dates.js.map +1 -0
- package/dist/areas/reports/reports.d.ts +143 -0
- package/dist/areas/reports/reports.js +267 -0
- package/dist/areas/reports/reports.js.map +1 -0
- package/dist/areas/scorm/scorm.d.ts +1 -0
- package/dist/areas/scorm/scorm.js.map +1 -1
- package/dist/areas/site/users.d.ts +7 -1
- package/dist/areas/site/users.js +9 -2
- package/dist/areas/site/users.js.map +1 -1
- package/dist/areas/surveys/choice.d.ts +2 -0
- package/dist/areas/surveys/choice.js +6 -3
- package/dist/areas/surveys/choice.js.map +1 -1
- package/dist/areas/surveys/surveys.d.ts +3 -0
- package/dist/areas/surveys/surveys.js +1 -0
- package/dist/areas/surveys/surveys.js.map +1 -1
- package/dist/areas/workshops/workshops.d.ts +133 -0
- package/dist/areas/workshops/workshops.js +335 -0
- package/dist/areas/workshops/workshops.js.map +1 -0
- package/dist/browser/background.d.ts +43 -0
- package/dist/browser/background.js +164 -0
- package/dist/browser/background.js.map +1 -0
- package/dist/browser/host.d.ts +30 -0
- package/dist/browser/host.js +373 -0
- package/dist/browser/host.js.map +1 -0
- package/dist/browser/manager.d.ts +9 -0
- package/dist/browser/manager.js +8 -0
- package/dist/browser/manager.js.map +1 -1
- package/dist/categories.d.ts +1 -0
- package/dist/categories.js +67 -0
- package/dist/categories.js.map +1 -1
- package/dist/cli/args.d.ts +8 -0
- package/dist/cli/args.js +49 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/background.d.ts +23 -0
- package/dist/cli/background.js +128 -0
- package/dist/cli/background.js.map +1 -0
- package/dist/cli/command.d.ts +66 -0
- package/dist/cli/command.js +328 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands.generated.js +2635 -577
- package/dist/cli/commands.generated.js.map +1 -1
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.js +2 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/main.js +30 -10
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/run.d.ts +3 -14
- package/dist/cli/run.js +9 -185
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/shell.d.ts +9 -0
- package/dist/cli/shell.js +233 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/client.d.ts +10 -120
- package/dist/client.js +77 -8
- package/dist/client.js.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/files.d.ts +5 -0
- package/dist/core/files.js +7 -3
- package/dist/core/files.js.map +1 -1
- package/dist/core/forms.d.ts +33 -3
- package/dist/core/forms.js +105 -8
- package/dist/core/forms.js.map +1 -1
- package/dist/core/http.d.ts +7 -0
- package/dist/core/http.js +28 -7
- package/dist/core/http.js.map +1 -1
- package/dist/core/login.d.ts +3 -0
- package/dist/core/login.js +2 -0
- package/dist/core/login.js.map +1 -1
- package/dist/core/session.d.ts +12 -1
- package/dist/core/session.js +12 -1
- package/dist/core/session.js.map +1 -1
- package/dist/index.d.ts +35 -11
- package/dist/index.js +32 -12
- package/dist/index.js.map +1 -1
- package/dist/internals.d.ts +9 -1
- package/dist/internals.js +9 -4
- package/dist/internals.js.map +1 -1
- package/dist/moodle-methods.generated.d.ts +1127 -0
- package/dist/moodle-methods.generated.js +4 -0
- package/dist/moodle-methods.generated.js.map +1 -0
- package/dist/options.d.ts +2 -0
- package/dist/options.js.map +1 -1
- package/dist/testing/fakeMoodle.d.ts +9 -2
- package/dist/testing/fakeMoodle.js +5 -3
- package/dist/testing/fakeMoodle.js.map +1 -1
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { GradingError, NotAnAssignmentError, assignmentIds, fillGradingForm, gradingPanelHtml, listParticipants, panelGrade, participantDates, readSubmissionContent, submitGradingForm } from "./grader.js";
|
|
1
|
+
import { GradingError, NotAnAssignmentError, assignmentIds, draftAreaFiles, fillGradingForm, gradingPanelHtml, listParticipants, panelGrade, participantDates, readPanelState, readSubmissionContent, replaceDraftFiles, submitGradingForm, WORKFLOW_STATES, } from "./grader.js";
|
|
2
|
+
import { checkLocalFiles } from "../../core/files.js";
|
|
2
3
|
import { isoDate } from "../courses/list.js";
|
|
3
|
-
import { dateSelectorDate, dateSelectorValues, openForm, setFields, submitForm } from "../../core/forms.js";
|
|
4
|
-
import { NotLoggedInError } from "../../core/session.js";
|
|
4
|
+
import { FormError, dateSelectorDate, dateSelectorValues, openForm, setFields, submitForm } from "../../core/forms.js";
|
|
5
|
+
import { NotLoggedInError, fetchSitePage, moodleErrorMessage } from "../../core/session.js";
|
|
6
|
+
import { decodeEntities } from "../../core/text.js";
|
|
5
7
|
import { inPage } from "../../core/inPage.js";
|
|
6
8
|
import { MoodleError } from "../../core/errors.js";
|
|
7
9
|
/** The grader's feedback comments field, when the assignment has them on. */
|
|
@@ -22,7 +24,11 @@ async function extensionDate(context, siteUrl, activityId, userId) {
|
|
|
22
24
|
await page.close().catch(() => undefined);
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Every participant's submission to an assignment, with the group they submit for (group
|
|
29
|
+
* submissions), and, unless `includeContent` is false, its content, the feedback files they have,
|
|
30
|
+
* its marking workflow state and markers (all from each participant's grading panel).
|
|
31
|
+
*/
|
|
26
32
|
export async function assignmentSubmissions(context, siteUrl, activityId, { includeContent = true } = {}) {
|
|
27
33
|
const ids = await assignmentIds(context, siteUrl, activityId);
|
|
28
34
|
const participants = await listParticipants(context, siteUrl, ids.instanceId);
|
|
@@ -34,7 +40,10 @@ export async function assignmentSubmissions(context, siteUrl, activityId, { incl
|
|
|
34
40
|
for (const participant of participants) {
|
|
35
41
|
const dates = await participantDates(context, siteUrl, ids.instanceId, participant.id);
|
|
36
42
|
const status = participant.submissionstatus || "none";
|
|
37
|
-
|
|
43
|
+
// Everyone's panel: feedback files can come without a submission.
|
|
44
|
+
const panel = parser ? await gradingPanelHtml(context, siteUrl, ids.contextId, participant.id) : undefined;
|
|
45
|
+
const withContent = status === "submitted" || status === "draft";
|
|
46
|
+
const state = parser && panel !== undefined ? await readPanelState(parser, panel) : {};
|
|
38
47
|
submissions.push({
|
|
39
48
|
userId: participant.id,
|
|
40
49
|
fullName: participant.fullname,
|
|
@@ -46,7 +55,11 @@ export async function assignmentSubmissions(context, siteUrl, activityId, { incl
|
|
|
46
55
|
allowSubmissionsFrom: isoDate(dates.allowsubmissionsfromdate),
|
|
47
56
|
dueDate: isoDate(dates.duedate),
|
|
48
57
|
cutoffDate: isoDate(dates.cutoffdate),
|
|
49
|
-
content: withContent ? await readSubmissionContent(parser,
|
|
58
|
+
content: parser && panel !== undefined && withContent ? await readSubmissionContent(parser, panel) : undefined,
|
|
59
|
+
feedbackFiles: state.draftId && state.sesskey ? await draftAreaFiles(context, siteUrl, state.sesskey, state.draftId) : undefined,
|
|
60
|
+
...(participant.groupid ? { group: { id: participant.groupid, name: participant.groupname ?? "" } } : {}),
|
|
61
|
+
...(state.workflowState ? { workflowState: state.workflowState } : {}),
|
|
62
|
+
...(state.markers ? { markers: state.markers } : {}),
|
|
50
63
|
});
|
|
51
64
|
}
|
|
52
65
|
}
|
|
@@ -58,10 +71,15 @@ export async function assignmentSubmissions(context, siteUrl, activityId, { incl
|
|
|
58
71
|
/**
|
|
59
72
|
* Grades a participant as the grader does: a grade (simple grading), a rubric's level per criterion
|
|
60
73
|
* or a marking guide's score per criterion (by their ids, from `rubric()`), remarks per criterion,
|
|
61
|
-
* feedback comments (HTML),
|
|
62
|
-
*
|
|
74
|
+
* feedback comments (HTML), feedback files (local paths that replace the ones the participant has;
|
|
75
|
+
* `[]` removes them), whether to notify, and any other grading field by name. Returns the grade
|
|
76
|
+
* saved and the gradebook's grade, the total Moodle computes for a rubric or a guide, and the
|
|
77
|
+
* feedback files after saving when they were given. Throws `GradingError` when Moodle refuses the
|
|
78
|
+
* grade, or when files are given to an assignment without feedback files.
|
|
63
79
|
*/
|
|
64
|
-
export async function gradeSubmission(context, siteUrl, activityId, userId, { grade, rubric, guide, remarks, feedback, notify, fields, }) {
|
|
80
|
+
export async function gradeSubmission(context, siteUrl, activityId, userId, { grade, rubric, guide, remarks, feedback, feedbackFiles, workflowState, applyToGroup, notify, fields, }) {
|
|
81
|
+
if (feedbackFiles)
|
|
82
|
+
await checkLocalFiles(feedbackFiles);
|
|
65
83
|
const ids = await assignmentIds(context, siteUrl, activityId);
|
|
66
84
|
const values = { ...fields };
|
|
67
85
|
if (grade !== undefined)
|
|
@@ -76,18 +94,53 @@ export async function gradeSubmission(context, siteUrl, activityId, userId, { gr
|
|
|
76
94
|
values[FEEDBACK_FIELD] = feedback;
|
|
77
95
|
if (notify !== undefined)
|
|
78
96
|
values.sendstudentnotifications = notify ? 1 : 0;
|
|
97
|
+
if (workflowState !== undefined) {
|
|
98
|
+
if (!WORKFLOW_STATES.includes(workflowState))
|
|
99
|
+
throw new GradingError(`"${workflowState}" isn't a marking workflow state: one of ${WORKFLOW_STATES.join(", ")}.`);
|
|
100
|
+
// The form's "Not marked" is its empty choice.
|
|
101
|
+
values.workflowstate = workflowState === "notmarked" ? "" : workflowState;
|
|
102
|
+
}
|
|
103
|
+
if (applyToGroup !== undefined)
|
|
104
|
+
values.applytoall = applyToGroup ? "1" : "0";
|
|
79
105
|
// A blank tab holds the panel's form: nothing of the grader's page needs to load.
|
|
80
106
|
const page = await context.newPage();
|
|
81
107
|
try {
|
|
82
|
-
const
|
|
108
|
+
const panel = await gradingPanelHtml(context, siteUrl, ids.contextId, userId);
|
|
109
|
+
const serialized = await fillGradingForm(page, panel, values).catch((error) => {
|
|
83
110
|
if (feedback !== undefined && error.message.includes(FEEDBACK_FIELD)) {
|
|
84
111
|
throw new MoodleError("This assignment has no feedback comments: grade it without feedback, or turn feedback comments on in its settings.", "not-available");
|
|
85
112
|
}
|
|
113
|
+
if (workflowState !== undefined && error.message.includes("workflowstate")) {
|
|
114
|
+
throw new GradingError(`Assignment ${activityId} doesn't use the marking workflow (or ${workflowState} isn't a state you can set): grade it without workflowState, or turn "Use marking workflow" on in its settings.`);
|
|
115
|
+
}
|
|
116
|
+
if (applyToGroup !== undefined && error.message.includes("applytoall")) {
|
|
117
|
+
throw new GradingError(`Assignment ${activityId} doesn't take group submissions: grade it without applyToGroup.`);
|
|
118
|
+
}
|
|
86
119
|
throw error;
|
|
87
120
|
});
|
|
121
|
+
// A select keeps no value it doesn't offer: Moodle offers each person only the states they may set.
|
|
122
|
+
if (values.workflowstate !== undefined && new URLSearchParams(serialized).get("workflowstate") !== values.workflowstate) {
|
|
123
|
+
throw new GradingError(`You can't set assignment ${activityId}'s submission to ${workflowState}: its grading form doesn't offer that state to you.`);
|
|
124
|
+
}
|
|
125
|
+
if (feedbackFiles) {
|
|
126
|
+
// The panel's draft area is what the form saves as the feedback files: changed before submitting it.
|
|
127
|
+
const draft = await readPanelState(page, panel);
|
|
128
|
+
if (!draft.draftId || !draft.sesskey) {
|
|
129
|
+
throw new GradingError(`Assignment ${activityId} has no feedback files: grade it without them, or turn "Feedback files" on in its settings.`);
|
|
130
|
+
}
|
|
131
|
+
await replaceDraftFiles(context, siteUrl, activityId, userId, draft.sesskey, draft.draftId, feedbackFiles);
|
|
132
|
+
}
|
|
88
133
|
await submitGradingForm(context, siteUrl, ids.instanceId, userId, serialized);
|
|
89
|
-
const
|
|
90
|
-
|
|
134
|
+
const after = await gradingPanelHtml(context, siteUrl, ids.contextId, userId);
|
|
135
|
+
const saved = await panelGrade(page, after);
|
|
136
|
+
const state = await readPanelState(page, after);
|
|
137
|
+
const extras = [feedback !== undefined ? "feedback" : "", feedbackFiles ? `${feedbackFiles.length} feedback file${feedbackFiles.length === 1 ? "" : "s"}` : ""].filter(Boolean).join(" and ");
|
|
138
|
+
return {
|
|
139
|
+
changed: `Graded user ${userId}${applyToGroup ? " and their group" : ""} in assignment ${activityId}${extras ? `, with ${extras}` : ""}${workflowState ? `, workflow state ${workflowState}` : ""}.`,
|
|
140
|
+
...saved,
|
|
141
|
+
...(feedbackFiles && state.draftId && state.sesskey ? { feedbackFiles: await draftAreaFiles(context, siteUrl, state.sesskey, state.draftId) } : {}),
|
|
142
|
+
...(state.workflowState ? { workflowState: state.workflowState } : {}),
|
|
143
|
+
};
|
|
91
144
|
}
|
|
92
145
|
finally {
|
|
93
146
|
await page.close().catch(() => undefined);
|
|
@@ -140,7 +193,9 @@ export async function rubric(context, siteUrl, activityId) {
|
|
|
140
193
|
}
|
|
141
194
|
/**
|
|
142
195
|
* Grants participants an extension until a date, through the assignment's extension form (several at
|
|
143
|
-
* once as its bulk action does). Moodle refuses a date before the assignment's due date
|
|
196
|
+
* once as its bulk action does). Moodle refuses a date before the assignment's due date, and a person
|
|
197
|
+
* without its "grant extension" capability only on saving (the form opens for anyone, confirmed
|
|
198
|
+
* empirically on the sandbox, 5.2): both throw.
|
|
144
199
|
*/
|
|
145
200
|
export async function grantExtension(context, siteUrl, activityId, userIds, until) {
|
|
146
201
|
if (userIds.length === 0)
|
|
@@ -153,10 +208,115 @@ export async function grantExtension(context, siteUrl, activityId, userIds, unti
|
|
|
153
208
|
try {
|
|
154
209
|
await setFields(page, { selectedusers: userIds.join(","), "extensionduedate[enabled]": true, ...(await dateSelectorValues(page, "extensionduedate", until)) });
|
|
155
210
|
await submitForm(page, "submitbutton");
|
|
211
|
+
// Moodle shows the form to anyone and checks the capability on saving, answering with its error page.
|
|
212
|
+
const refused = await moodleErrorMessage(page);
|
|
213
|
+
if (refused !== undefined)
|
|
214
|
+
throw new NotAnAssignmentError(`Moodle didn't grant the extension in activity ${activityId}: ${refused}`);
|
|
156
215
|
}
|
|
157
216
|
finally {
|
|
158
217
|
await page.close().catch(() => undefined);
|
|
159
218
|
}
|
|
160
219
|
return { changed: `Extension until ${until.toISOString()} granted to user${userIds.length > 1 ? "s" : ""} ${userIds.join(", ")} in assignment ${activityId}.` };
|
|
161
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Opens one of the grading table's batch forms for `userIds` (as its "With selected…" menu does),
|
|
223
|
+
* or throws `GradingError` with Moodle's reason when it shows none.
|
|
224
|
+
*/
|
|
225
|
+
async function openBatchForm(context, siteUrl, activityId, action, userIds, what) {
|
|
226
|
+
if (userIds.length === 0)
|
|
227
|
+
throw new GradingError(`Give the participants to ${what} for.`);
|
|
228
|
+
const path = `mod/assign/view.php?id=${activityId}&action=${action}&selectedusers=${userIds.join(",")}`;
|
|
229
|
+
return openForm(context, siteUrl, path).catch(async (error) => {
|
|
230
|
+
if (!(error instanceof FormError))
|
|
231
|
+
throw error;
|
|
232
|
+
// Moodle's error page says why (not enough markers, not allowed…): read without a tab.
|
|
233
|
+
const { html } = await fetchSitePage(context, siteUrl, path);
|
|
234
|
+
const reason = /class="errormessage">([^<]*)</.exec(html)?.[1];
|
|
235
|
+
throw new GradingError(`Moodle didn't open the form to ${what} in activity ${activityId}: ${reason ? decodeEntities(reason).trim() : "it isn't an assignment with the marking workflow, or you aren't allowed"}`);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Refuses a batch action the assignment doesn't use: Moodle's batch forms open and save whatever its
|
|
240
|
+
* settings (its source, and the sandbox for marker allocation, 5.2), but the grading panel has the workflow state only with the
|
|
241
|
+
* marking workflow, and the marker selects only with marker allocation too.
|
|
242
|
+
*/
|
|
243
|
+
async function requireGradingFeature(context, siteUrl, activityId, userId, feature) {
|
|
244
|
+
const ids = await assignmentIds(context, siteUrl, activityId);
|
|
245
|
+
const page = await context.newPage();
|
|
246
|
+
try {
|
|
247
|
+
const state = await readPanelState(page, await gradingPanelHtml(context, siteUrl, ids.contextId, userId));
|
|
248
|
+
if (state[feature] !== undefined)
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
await page.close().catch(() => undefined);
|
|
253
|
+
}
|
|
254
|
+
throw new GradingError(feature === "workflowState"
|
|
255
|
+
? `Assignment ${activityId} doesn't use the marking workflow: turn "Use marking workflow" on in its settings first.`
|
|
256
|
+
: `Assignment ${activityId} doesn't allocate markers (or you can't manage allocations): turn "Use marking workflow" and "Use marking allocation" on in its settings first.`);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Sets the marking workflow state of participants' submissions, as the grading table's "Set marking
|
|
260
|
+
* workflow state" does; "released" shows them their grades, notifying them when `notify` is true
|
|
261
|
+
* (the form's default is not to). With several markers, it sets the submission's overall state.
|
|
262
|
+
*/
|
|
263
|
+
export async function setWorkflowState(context, siteUrl, activityId, userIds, state, { notify } = {}) {
|
|
264
|
+
if (!WORKFLOW_STATES.includes(state) || state === "notmarked") {
|
|
265
|
+
throw new GradingError(`"${state}" isn't a state the batch form sets: one of ${WORKFLOW_STATES.slice(1).join(", ")}.`);
|
|
266
|
+
}
|
|
267
|
+
if (notify && state !== "released")
|
|
268
|
+
throw new GradingError('Moodle notifies students only when releasing: give notify with "released".');
|
|
269
|
+
if (userIds.length > 0)
|
|
270
|
+
await requireGradingFeature(context, siteUrl, activityId, userIds[0], "workflowState");
|
|
271
|
+
const page = await openBatchForm(context, siteUrl, activityId, "viewbatchsetmarkingworkflowstate", userIds, "set the marking workflow state");
|
|
272
|
+
try {
|
|
273
|
+
if ((await page.locator(`form.mform [name="markingworkflowstate"] option[value="${state}"]`).count()) === 0) {
|
|
274
|
+
throw new GradingError(`You can't set submissions to ${state} in assignment ${activityId}: the form doesn't offer that state to you.`);
|
|
275
|
+
}
|
|
276
|
+
const values = {};
|
|
277
|
+
// With several markers the form asks whose state: the submission's ("grade"), not the person's own mark.
|
|
278
|
+
if ((await page.locator('form.mform [name="workflowcontext"]').count()) > 0)
|
|
279
|
+
values.workflowcontext = "grade";
|
|
280
|
+
values.markingworkflowstate = state;
|
|
281
|
+
if (state === "released" && notify !== undefined)
|
|
282
|
+
values.sendstudentnotifications = notify ? 1 : 0;
|
|
283
|
+
await setFields(page, values);
|
|
284
|
+
await submitForm(page, "submitbutton");
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
await page.close().catch(() => undefined);
|
|
288
|
+
}
|
|
289
|
+
return { changed: `Set the marking workflow state of user${userIds.length > 1 ? "s" : ""} ${userIds.join(", ")} to ${state} in assignment ${activityId}${notify ? ", notifying them" : ""}.` };
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Allocates a marker (the user id of someone who can grade; several where the assignment uses
|
|
293
|
+
* several markers per submission) to participants' submissions, as the grading table's "Allocate
|
|
294
|
+
* marker" does. Moodle leaves alone submissions past marking (marking completed, in review, ready
|
|
295
|
+
* for release, released).
|
|
296
|
+
*/
|
|
297
|
+
export async function allocateMarker(context, siteUrl, activityId, userIds, markerId) {
|
|
298
|
+
const markerIds = Array.isArray(markerId) ? markerId : [markerId];
|
|
299
|
+
if (markerIds.length === 0)
|
|
300
|
+
throw new GradingError("Give the marker to allocate.");
|
|
301
|
+
if (userIds.length > 0)
|
|
302
|
+
await requireGradingFeature(context, siteUrl, activityId, userIds[0], "markers");
|
|
303
|
+
const page = await openBatchForm(context, siteUrl, activityId, "viewbatchmarkingallocation", userIds, "allocate markers");
|
|
304
|
+
try {
|
|
305
|
+
// One select per marker the assignment uses: allocatedmarker1, allocatedmarker2…
|
|
306
|
+
const slots = await page.locator('form.mform select[name^="allocatedmarker"]').count();
|
|
307
|
+
if (markerIds.length > slots)
|
|
308
|
+
throw new GradingError(`Assignment ${activityId} uses ${slots} marker${slots === 1 ? "" : "s"} per submission; ${markerIds.length} given.`);
|
|
309
|
+
for (const [index, id] of markerIds.entries()) {
|
|
310
|
+
if ((await page.locator(`form.mform [name="allocatedmarker${index + 1}"] option[value="${id}"]`).count()) === 0) {
|
|
311
|
+
throw new GradingError(`User ${id} can't mark assignment ${activityId}: markers are the course's users who can grade it.`);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
await setFields(page, Object.fromEntries(markerIds.map((id, index) => [`allocatedmarker${index + 1}`, String(id)])));
|
|
315
|
+
await submitForm(page, "submitbutton");
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
await page.close().catch(() => undefined);
|
|
319
|
+
}
|
|
320
|
+
return { changed: `Allocated marker${markerIds.length > 1 ? "s" : ""} ${markerIds.join(", ")} to user${userIds.length > 1 ? "s" : ""} ${userIds.join(", ")} in assignment ${activityId}.` };
|
|
321
|
+
}
|
|
162
322
|
//# sourceMappingURL=grading.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grading.js","sourceRoot":"","sources":["../../../src/areas/assignments/grading.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grading.js","sourceRoot":"","sources":["../../../src/areas/assignments/grading.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,22 @@ export interface StudentAssignment {
|
|
|
30
30
|
label: string;
|
|
31
31
|
value: string;
|
|
32
32
|
}[];
|
|
33
|
+
/** The files the teacher attached to the feedback, for `downloadFile`. */
|
|
34
|
+
feedbackFiles: {
|
|
35
|
+
name: string;
|
|
36
|
+
url: string;
|
|
37
|
+
}[];
|
|
33
38
|
canEdit: boolean;
|
|
34
39
|
canSubmit: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* With group submissions, the submission is the group's: its name, and its id where the
|
|
42
|
+
* participants page shows the group to the person (`participants(courseId, { group: id })` gives
|
|
43
|
+
* its members); only the name for Moodle's "Default group" (the person is in no group).
|
|
44
|
+
*/
|
|
45
|
+
group?: {
|
|
46
|
+
id?: number;
|
|
47
|
+
name: string;
|
|
48
|
+
};
|
|
35
49
|
}
|
|
36
50
|
export declare function readStudentAssignment(page: Page): Promise<StudentAssignment>;
|
|
37
51
|
/** An assignment as the student sees it: its description and files, dates, the submission's status and files, the feedback, and whether it can be edited or submitted now. */
|
|
@@ -3,6 +3,8 @@ import { formValue, openForm, setFields, submitForm, uploadToDraft } from "../..
|
|
|
3
3
|
import { inPage } from "../../core/inPage.js";
|
|
4
4
|
import { NotLoggedInError, openSitePage } from "../../core/session.js";
|
|
5
5
|
import { MoodleError } from "../../core/errors.js";
|
|
6
|
+
import { callService } from "../../core/ajax.js";
|
|
7
|
+
import { participantFilters } from "../participants/participants.js";
|
|
6
8
|
/** The assignment isn't there, or the person can't do that now. */
|
|
7
9
|
export class SubmissionError extends MoodleError {
|
|
8
10
|
name = "SubmissionError";
|
|
@@ -33,6 +35,8 @@ export function readStudentAssignment(page) {
|
|
|
33
35
|
graded: doc.querySelector(".submissionstatustable td.submissiongraded") !== null,
|
|
34
36
|
submittedFiles: links('.submissionstatustable a[href*="pluginfile.php"]'),
|
|
35
37
|
feedback: rows(".feedback tr"),
|
|
38
|
+
// The feedback files plugin's block: summary_assignfeedback_file_<gradeid>.
|
|
39
|
+
feedbackFiles: links('.feedback [class*="summary_assignfeedback_file_"] a[href*="pluginfile.php"]'),
|
|
36
40
|
canEdit: actions.includes("editsubmission"),
|
|
37
41
|
canSubmit: actions.includes("submit"),
|
|
38
42
|
};
|
|
@@ -45,12 +49,44 @@ export async function studentAssignment(context, siteUrl, activityId) {
|
|
|
45
49
|
if ((await page.locator("body#page-mod-assign-view").count()) === 0) {
|
|
46
50
|
throw new SubmissionError(`Activity ${activityId} isn't an assignment you can open. Take the id of an assignment (module "assign") from the course structure.`);
|
|
47
51
|
}
|
|
48
|
-
|
|
52
|
+
const assignment = await readStudentAssignment(page);
|
|
53
|
+
const group = await submissionGroup(context, siteUrl, page, assignment);
|
|
54
|
+
return group ? { ...assignment, group } : assignment;
|
|
49
55
|
}
|
|
50
56
|
finally {
|
|
51
57
|
await page.close().catch(() => undefined);
|
|
52
58
|
}
|
|
53
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* With group submissions, the status table's first row is the group's ("Group": its name, or
|
|
62
|
+
* "Default group"), before the submission status, whose cell has a class. Its label is told apart
|
|
63
|
+
* by Moodle's own string in the person's language (`core_get_string`), only when there's a row
|
|
64
|
+
* before the status one; its id comes from the participants page's group filter.
|
|
65
|
+
*/
|
|
66
|
+
async function submissionGroup(context, siteUrl, page, assignment) {
|
|
67
|
+
const before = await page.evaluate(() => {
|
|
68
|
+
const doc = globalThis.document;
|
|
69
|
+
return Array.from(doc.querySelectorAll(".submissionstatustable tr")).findIndex((row) => row.querySelector('td[class*="submissionstatus"]') !== null);
|
|
70
|
+
});
|
|
71
|
+
const first = assignment.status[0];
|
|
72
|
+
if (before < 1 || !first)
|
|
73
|
+
return undefined;
|
|
74
|
+
const [team, defaultTeam] = await Promise.all(["submissionteam", "defaultteam"].map((stringid) => callService(context, siteUrl, "core_get_string", { stringid, component: "assign" })));
|
|
75
|
+
if (first.label !== team?.trim())
|
|
76
|
+
return undefined;
|
|
77
|
+
if (first.value === defaultTeam?.trim())
|
|
78
|
+
return { name: first.value };
|
|
79
|
+
const courseId = await page.evaluate(() => Number(/\bcourse-(\d+)\b/.exec(globalThis.document.body.className)?.[1]));
|
|
80
|
+
// The participants page may be closed to the person: the group's name is what the assignment says.
|
|
81
|
+
const filters = await participantFilters(context, siteUrl, courseId).catch((error) => {
|
|
82
|
+
if (error instanceof NotLoggedInError)
|
|
83
|
+
throw error;
|
|
84
|
+
return undefined;
|
|
85
|
+
});
|
|
86
|
+
const group = filters?.groups.find((g) => g.name === first.value);
|
|
87
|
+
// Not its members: they're others' data, which `participants(courseId, { group: id })` gives.
|
|
88
|
+
return group ? { id: group.id, name: group.name } : { name: first.value };
|
|
89
|
+
}
|
|
54
90
|
/** Saves the submission's online text and adds files, as "Save changes" on the edit page does; gives the assignment afterwards. */
|
|
55
91
|
export async function saveSubmission(context, siteUrl, activityId, input) {
|
|
56
92
|
if (input.onlineText === undefined && (!input.files || input.files.length === 0))
|
|
@@ -91,10 +127,15 @@ export async function saveSubmission(context, siteUrl, activityId, input) {
|
|
|
91
127
|
*/
|
|
92
128
|
export async function submitForGrading(context, siteUrl, activityId, options = {}) {
|
|
93
129
|
const acceptStatement = typeof options === "boolean" ? options : (options.acceptStatement ?? false);
|
|
130
|
+
const nothing = () => new SubmissionError(`Assignment ${activityId} has nothing to submit now (no draft, submitted already, or it doesn't ask students to click submit).`);
|
|
131
|
+
// Moodle shows the confirmation whatever the submission's state (confirmed empirically on the sandbox,
|
|
132
|
+
// 5.2): the assignment's own "Submit assignment" button says whether there's a draft to submit.
|
|
133
|
+
if (!(await studentAssignment(context, siteUrl, activityId)).canSubmit)
|
|
134
|
+
throw nothing();
|
|
94
135
|
const page = await openForm(context, siteUrl, `mod/assign/view.php?id=${activityId}&action=submit`).catch((error) => {
|
|
95
136
|
if (error instanceof NotLoggedInError)
|
|
96
137
|
throw error;
|
|
97
|
-
throw
|
|
138
|
+
throw nothing();
|
|
98
139
|
});
|
|
99
140
|
try {
|
|
100
141
|
const statement = page.locator('form.mform [name="submissionstatement"][type="checkbox"]');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"student.js","sourceRoot":"","sources":["../../../src/areas/assignments/student.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"student.js","sourceRoot":"","sources":["../../../src/areas/assignments/student.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { BrowserContext } from "playwright-core";
|
|
2
|
+
import { type DownloadedFile } from "../../core/files.js";
|
|
3
|
+
import { MoodleError } from "../../core/errors.js";
|
|
4
|
+
/** Moodle refused a copy, backup, restore or import, or didn't finish it in time. */
|
|
5
|
+
export declare class BackupError extends MoodleError {
|
|
6
|
+
name: string;
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
/** A course as a copy, restore or import leaves it. */
|
|
10
|
+
export interface CourseRef {
|
|
11
|
+
id: number;
|
|
12
|
+
fullName: string;
|
|
13
|
+
shortName: string;
|
|
14
|
+
categoryId?: number;
|
|
15
|
+
url: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Copies a course into a new one, as Moodle's "Copy course" does: its content (and its people's
|
|
19
|
+
* data and enrolments, `withUsers`), under a new full and short name, in a category (the course's
|
|
20
|
+
* unless given), with new dates. Goes through Moodle's copy service, then waits for the copy, which
|
|
21
|
+
* Moodle makes in its scheduled tasks, up to `timeoutMs` (ten minutes). Needs the rights to back
|
|
22
|
+
* up, restore and create courses (`moodle/backup:backupcourse`, `moodle/restore:restorecourse`,
|
|
23
|
+
* `moodle/course:create`); without them, `BackupError` says so.
|
|
24
|
+
*/
|
|
25
|
+
export declare function copyCourse(context: BrowserContext, siteUrl: string, courseId: number, { fullName, shortName, categoryId, start, end, withUsers, visible, timeoutMs, }: {
|
|
26
|
+
fullName: string;
|
|
27
|
+
shortName: string;
|
|
28
|
+
categoryId?: number;
|
|
29
|
+
start?: Date;
|
|
30
|
+
end?: Date;
|
|
31
|
+
withUsers?: boolean;
|
|
32
|
+
visible?: boolean;
|
|
33
|
+
timeoutMs?: number;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
changed: string;
|
|
36
|
+
course: CourseRef;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Backs a course up to a `.mbz` file, through Moodle's backup wizard (initial settings, schema,
|
|
40
|
+
* confirmation), and downloads it into `destDir`. Without users' data unless `withUsers`, which
|
|
41
|
+
* needs `moodle/backup:userinfo` (`anonymize` makes their names anonymous). An asynchronous backup
|
|
42
|
+
* is waited for up to `timeoutMs` (ten minutes). Moodle keeps the file in the course's or the
|
|
43
|
+
* person's backup area too.
|
|
44
|
+
*/
|
|
45
|
+
export declare function backupCourse(context: BrowserContext, siteUrl: string, courseId: number, destDir: string, { withUsers, anonymize, timeoutMs }?: {
|
|
46
|
+
withUsers?: boolean;
|
|
47
|
+
anonymize?: boolean;
|
|
48
|
+
timeoutMs?: number;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
changed: string;
|
|
51
|
+
file: DownloadedFile;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Restores a backup file (`.mbz`) through Moodle's restore wizard: into a new course in a category
|
|
55
|
+
* (`into: "new"`, with `categoryId`, which needs `moodle/course:create` there), or into an existing
|
|
56
|
+
* course (`into: <course id>`), its content added to the course's (`mode: "merge"`, the default) or
|
|
57
|
+
* replacing it (`"replace"`: the course's content is deleted first). A new course takes the backup's
|
|
58
|
+
* names unless `fullName` and `shortName` are given. Users' data is restored when `withUsers` and the
|
|
59
|
+
* backup has it. An asynchronous restore is waited for up to `timeoutMs` (ten minutes). Needs
|
|
60
|
+
* `moodle/restore:restorecourse` where it restores.
|
|
61
|
+
*/
|
|
62
|
+
export declare function restoreCourse(context: BrowserContext, siteUrl: string, file: string, { into, categoryId, mode, fullName, shortName, withUsers, timeoutMs, }: {
|
|
63
|
+
into: "new" | number;
|
|
64
|
+
categoryId?: number;
|
|
65
|
+
mode?: "merge" | "replace";
|
|
66
|
+
fullName?: string;
|
|
67
|
+
shortName?: string;
|
|
68
|
+
withUsers?: boolean;
|
|
69
|
+
timeoutMs?: number;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
changed: string;
|
|
72
|
+
course: CourseRef;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Imports activities from another course into a course, as Moodle's "Import" does: every activity
|
|
76
|
+
* of `fromCourseId`, or only `activityIds`, added to `toCourseId`'s content (with their sections),
|
|
77
|
+
* without users' data. Needs `moodle/restore:restoretargetimport` in the course imported into and
|
|
78
|
+
* `moodle/backup:backuptargetimport` in the other. Returns the activities the course has afterwards
|
|
79
|
+
* that it didn't have before, by id.
|
|
80
|
+
*/
|
|
81
|
+
export declare function importActivities(context: BrowserContext, siteUrl: string, fromCourseId: number, toCourseId: number, { activityIds }?: {
|
|
82
|
+
activityIds?: number[];
|
|
83
|
+
}): Promise<{
|
|
84
|
+
changed: string;
|
|
85
|
+
activityIds: number[];
|
|
86
|
+
}>;
|