@falkenslab/moodle-driver 0.4.0 → 0.5.0

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.
Files changed (182) hide show
  1. package/README.md +3 -2
  2. package/dist/areas/activities/build.d.ts +47 -10
  3. package/dist/areas/activities/build.js +157 -24
  4. package/dist/areas/activities/build.js.map +1 -1
  5. package/dist/areas/activities/conditions.d.ts +77 -0
  6. package/dist/areas/activities/conditions.js +216 -0
  7. package/dist/areas/activities/conditions.js.map +1 -0
  8. package/dist/areas/activities/content.d.ts +3 -0
  9. package/dist/areas/activities/content.js +1 -0
  10. package/dist/areas/activities/content.js.map +1 -1
  11. package/dist/areas/assignments/grader.d.ts +32 -0
  12. package/dist/areas/assignments/grader.js +66 -2
  13. package/dist/areas/assignments/grader.js.map +1 -1
  14. package/dist/areas/assignments/grading.d.ts +69 -6
  15. package/dist/areas/assignments/grading.js +173 -13
  16. package/dist/areas/assignments/grading.js.map +1 -1
  17. package/dist/areas/assignments/student.d.ts +14 -0
  18. package/dist/areas/assignments/student.js +43 -2
  19. package/dist/areas/assignments/student.js.map +1 -1
  20. package/dist/areas/backup/backup.d.ts +86 -0
  21. package/dist/areas/backup/backup.js +368 -0
  22. package/dist/areas/backup/backup.js.map +1 -0
  23. package/dist/areas/calendar/calendar.d.ts +27 -0
  24. package/dist/areas/calendar/calendar.js +115 -9
  25. package/dist/areas/calendar/calendar.js.map +1 -1
  26. package/dist/areas/completion/completion.d.ts +3 -0
  27. package/dist/areas/completion/completion.js.map +1 -1
  28. package/dist/areas/courses/list.d.ts +2 -0
  29. package/dist/areas/courses/list.js.map +1 -1
  30. package/dist/areas/courses/reset.d.ts +51 -0
  31. package/dist/areas/courses/reset.js +123 -0
  32. package/dist/areas/courses/reset.js.map +1 -0
  33. package/dist/areas/courses/state.d.ts +17 -0
  34. package/dist/areas/courses/state.js +37 -6
  35. package/dist/areas/courses/state.js.map +1 -1
  36. package/dist/areas/courses/structure.d.ts +14 -2
  37. package/dist/areas/courses/structure.js +11 -5
  38. package/dist/areas/courses/structure.js.map +1 -1
  39. package/dist/areas/forums/discussions.d.ts +8 -0
  40. package/dist/areas/forums/discussions.js +10 -0
  41. package/dist/areas/forums/discussions.js.map +1 -1
  42. package/dist/areas/forums/grading.d.ts +49 -0
  43. package/dist/areas/forums/grading.js +125 -0
  44. package/dist/areas/forums/grading.js.map +1 -0
  45. package/dist/areas/forums/posts.d.ts +37 -0
  46. package/dist/areas/forums/posts.js +141 -6
  47. package/dist/areas/forums/posts.js.map +1 -1
  48. package/dist/areas/grades/export.d.ts +38 -0
  49. package/dist/areas/grades/export.js +88 -0
  50. package/dist/areas/grades/export.js.map +1 -0
  51. package/dist/areas/grades/gradebook.d.ts +50 -0
  52. package/dist/areas/grades/gradebook.js +120 -0
  53. package/dist/areas/grades/gradebook.js.map +1 -1
  54. package/dist/areas/grades/singleview.d.ts +39 -0
  55. package/dist/areas/grades/singleview.js +186 -0
  56. package/dist/areas/grades/singleview.js.map +1 -0
  57. package/dist/areas/h5p/h5p.d.ts +2 -0
  58. package/dist/areas/h5p/h5p.js +12 -7
  59. package/dist/areas/h5p/h5p.js.map +1 -1
  60. package/dist/areas/lessons/lessons.d.ts +1 -0
  61. package/dist/areas/lessons/lessons.js.map +1 -1
  62. package/dist/areas/messages/messages.d.ts +36 -1
  63. package/dist/areas/messages/messages.js +60 -4
  64. package/dist/areas/messages/messages.js.map +1 -1
  65. package/dist/areas/participants/enrolments.d.ts +60 -0
  66. package/dist/areas/participants/enrolments.js +218 -0
  67. package/dist/areas/participants/enrolments.js.map +1 -0
  68. package/dist/areas/participants/groups.d.ts +75 -0
  69. package/dist/areas/participants/groups.js +201 -0
  70. package/dist/areas/participants/groups.js.map +1 -0
  71. package/dist/areas/participants/methods.d.ts +56 -0
  72. package/dist/areas/participants/methods.js +154 -0
  73. package/dist/areas/participants/methods.js.map +1 -0
  74. package/dist/areas/participants/participants.d.ts +11 -0
  75. package/dist/areas/participants/participants.js +24 -19
  76. package/dist/areas/participants/participants.js.map +1 -1
  77. package/dist/areas/questions/banks.d.ts +36 -1
  78. package/dist/areas/questions/banks.js +140 -17
  79. package/dist/areas/questions/banks.js.map +1 -1
  80. package/dist/areas/quizzes/attempts.d.ts +2 -0
  81. package/dist/areas/quizzes/attempts.js +9 -0
  82. package/dist/areas/quizzes/attempts.js.map +1 -1
  83. package/dist/areas/quizzes/grading.d.ts +50 -0
  84. package/dist/areas/quizzes/grading.js +131 -0
  85. package/dist/areas/quizzes/grading.js.map +1 -0
  86. package/dist/areas/quizzes/results.d.ts +3 -0
  87. package/dist/areas/quizzes/results.js +2 -1
  88. package/dist/areas/quizzes/results.js.map +1 -1
  89. package/dist/areas/quizzes/structure.d.ts +65 -9
  90. package/dist/areas/quizzes/structure.js +222 -23
  91. package/dist/areas/quizzes/structure.js.map +1 -1
  92. package/dist/areas/ratings/ratings.d.ts +26 -0
  93. package/dist/areas/ratings/ratings.js +108 -0
  94. package/dist/areas/ratings/ratings.js.map +1 -0
  95. package/dist/areas/reports/dates.d.ts +18 -0
  96. package/dist/areas/reports/dates.js +134 -0
  97. package/dist/areas/reports/dates.js.map +1 -0
  98. package/dist/areas/reports/reports.d.ts +143 -0
  99. package/dist/areas/reports/reports.js +267 -0
  100. package/dist/areas/reports/reports.js.map +1 -0
  101. package/dist/areas/scorm/scorm.d.ts +1 -0
  102. package/dist/areas/scorm/scorm.js.map +1 -1
  103. package/dist/areas/site/users.d.ts +7 -1
  104. package/dist/areas/site/users.js +9 -2
  105. package/dist/areas/site/users.js.map +1 -1
  106. package/dist/areas/surveys/choice.d.ts +2 -0
  107. package/dist/areas/surveys/choice.js +6 -3
  108. package/dist/areas/surveys/choice.js.map +1 -1
  109. package/dist/areas/surveys/surveys.d.ts +3 -0
  110. package/dist/areas/surveys/surveys.js +1 -0
  111. package/dist/areas/surveys/surveys.js.map +1 -1
  112. package/dist/areas/workshops/workshops.d.ts +133 -0
  113. package/dist/areas/workshops/workshops.js +335 -0
  114. package/dist/areas/workshops/workshops.js.map +1 -0
  115. package/dist/browser/background.d.ts +43 -0
  116. package/dist/browser/background.js +164 -0
  117. package/dist/browser/background.js.map +1 -0
  118. package/dist/browser/host.d.ts +30 -0
  119. package/dist/browser/host.js +373 -0
  120. package/dist/browser/host.js.map +1 -0
  121. package/dist/browser/manager.d.ts +9 -0
  122. package/dist/browser/manager.js +8 -0
  123. package/dist/browser/manager.js.map +1 -1
  124. package/dist/categories.d.ts +1 -0
  125. package/dist/categories.js +67 -0
  126. package/dist/categories.js.map +1 -1
  127. package/dist/cli/args.d.ts +8 -0
  128. package/dist/cli/args.js +49 -0
  129. package/dist/cli/args.js.map +1 -1
  130. package/dist/cli/background.d.ts +23 -0
  131. package/dist/cli/background.js +128 -0
  132. package/dist/cli/background.js.map +1 -0
  133. package/dist/cli/command.d.ts +66 -0
  134. package/dist/cli/command.js +328 -0
  135. package/dist/cli/command.js.map +1 -0
  136. package/dist/cli/commands.generated.js +2636 -578
  137. package/dist/cli/commands.generated.js.map +1 -1
  138. package/dist/cli/config.d.ts +2 -0
  139. package/dist/cli/config.js +2 -0
  140. package/dist/cli/config.js.map +1 -1
  141. package/dist/cli/main.js +30 -10
  142. package/dist/cli/main.js.map +1 -1
  143. package/dist/cli/run.d.ts +3 -14
  144. package/dist/cli/run.js +9 -185
  145. package/dist/cli/run.js.map +1 -1
  146. package/dist/cli/shell.d.ts +9 -0
  147. package/dist/cli/shell.js +233 -0
  148. package/dist/cli/shell.js.map +1 -0
  149. package/dist/client.d.ts +71 -8
  150. package/dist/client.js +75 -8
  151. package/dist/client.js.map +1 -1
  152. package/dist/core/errors.d.ts +1 -1
  153. package/dist/core/errors.js.map +1 -1
  154. package/dist/core/files.d.ts +5 -0
  155. package/dist/core/files.js +7 -3
  156. package/dist/core/files.js.map +1 -1
  157. package/dist/core/forms.d.ts +33 -3
  158. package/dist/core/forms.js +105 -8
  159. package/dist/core/forms.js.map +1 -1
  160. package/dist/core/http.d.ts +7 -0
  161. package/dist/core/http.js +28 -7
  162. package/dist/core/http.js.map +1 -1
  163. package/dist/core/login.d.ts +3 -0
  164. package/dist/core/login.js +2 -0
  165. package/dist/core/login.js.map +1 -1
  166. package/dist/core/session.d.ts +12 -1
  167. package/dist/core/session.js +12 -1
  168. package/dist/core/session.js.map +1 -1
  169. package/dist/index.d.ts +35 -11
  170. package/dist/index.js +32 -12
  171. package/dist/index.js.map +1 -1
  172. package/dist/internals.d.ts +9 -1
  173. package/dist/internals.js +9 -4
  174. package/dist/internals.js.map +1 -1
  175. package/dist/options.d.ts +2 -0
  176. package/dist/options.js.map +1 -1
  177. package/dist/testing/fakeMoodle.d.ts +9 -2
  178. package/dist/testing/fakeMoodle.js +5 -3
  179. package/dist/testing/fakeMoodle.js.map +1 -1
  180. package/dist/testing/index.d.ts +7 -0
  181. package/dist/testing/index.js.map +1 -1
  182. 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
- /** Every participant's submission to an assignment, with its content unless `includeContent` is false. */
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
- const withContent = parser && (status === "submitted" || status === "draft");
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, await gradingPanelHtml(context, siteUrl, ids.contextId, participant.id)) : undefined,
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), whether to notify, and any other grading field by name. Returns the
62
- * grade saved and the gradebook's grade, the total Moodle computes for a rubric or a guide.
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 serialized = await fillGradingForm(page, await gradingPanelHtml(context, siteUrl, ids.contextId, userId), values).catch((error) => {
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 saved = await panelGrade(page, await gradingPanelHtml(context, siteUrl, ids.contextId, userId));
90
- return { changed: `Graded user ${userId} in assignment ${activityId}${feedback !== undefined ? ", with feedback" : ""}.`, ...saved };
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
- return await readStudentAssignment(page);
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 new SubmissionError(`Assignment ${activityId} has nothing to submit now (no draft, submitted already, or it doesn't ask students to click submit).`);
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":"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"}
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
+ }>;