@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
@@ -0,0 +1,216 @@
1
+ import { COMPLETION_STATES } from "../courses/structure.js";
2
+ import { dateSelectorDate, dateSelectorValues } from "../../core/forms.js";
3
+ import { inPage } from "../../core/inPage.js";
4
+ import { moodleErrorMessage, openSitePage } from "../../core/session.js";
5
+ import { MoodleError } from "../../core/errors.js";
6
+ function time(value, what) {
7
+ const date = value instanceof Date ? value : new Date(value);
8
+ if (Number.isNaN(date.getTime()))
9
+ throw new MoodleError(`${what} isn't a date: "${String(value)}". Give it as an ISO date (2026-11-30T18:00:00Z).`, "invalid-input");
10
+ return Math.floor(date.getTime() / 1000);
11
+ }
12
+ /**
13
+ * Moodle's availability JSON for `restrictions`. A grade condition takes the activity's grade item
14
+ * from `gradeItems` (activity id to grade item id, from the gradebook setup).
15
+ */
16
+ export function restrictionsJson(restrictions, gradeItems = new Map()) {
17
+ const nodes = restrictions.conditions.map((condition) => {
18
+ switch (condition.type) {
19
+ case "date": {
20
+ const dates = [];
21
+ if (condition.from !== undefined)
22
+ dates.push({ type: "date", d: ">=", t: time(condition.from, "A date condition's from") });
23
+ if (condition.until !== undefined)
24
+ dates.push({ type: "date", d: "<", t: time(condition.until, "A date condition's until") });
25
+ if (dates.length === 0)
26
+ throw new MoodleError("A date condition needs from, until or both.", "invalid-input");
27
+ // A range is one condition: both dates, whatever the match of the others.
28
+ return dates.length === 1 ? dates[0] : { op: "&", c: dates };
29
+ }
30
+ case "grade": {
31
+ const id = gradeItems.get(condition.activityId);
32
+ if (id === undefined)
33
+ throw new MoodleError(`Activity ${condition.activityId} has no grade item in the course's gradebook, so no grade condition can name it.`, "not-found");
34
+ return { type: "grade", id, ...(condition.min !== undefined ? { min: condition.min } : {}), ...(condition.max !== undefined ? { max: condition.max } : {}) };
35
+ }
36
+ case "completion": {
37
+ const e = COMPLETION_STATES.indexOf(condition.state);
38
+ if (e < 0)
39
+ throw new MoodleError(`A completion condition's state is one of ${COMPLETION_STATES.join(", ")}, not "${String(condition.state)}".`, "invalid-input");
40
+ return { type: "completion", cm: condition.activityId, e };
41
+ }
42
+ case "group":
43
+ return { type: "group", id: condition.groupId };
44
+ case "other":
45
+ return condition.json;
46
+ default:
47
+ throw new MoodleError(`Unknown restriction type "${String(condition.type)}": date, grade, completion or group.`, "invalid-input");
48
+ }
49
+ });
50
+ const shown = !restrictions.hidden;
51
+ // As Moodle's own form writes it: one eye per condition for "all", one for the whole set for "any".
52
+ const tree = restrictions.match === "any" ? { op: "|", c: nodes, show: shown } : { op: "&", c: nodes, showc: nodes.map(() => shown) };
53
+ return JSON.stringify(tree);
54
+ }
55
+ const iso = (seconds) => new Date(Number(seconds) * 1000).toISOString();
56
+ /** The plain terms of one node of Moodle's tree; a grade item maps back to its activity through `gradeActivities`. */
57
+ function restrictionOf(node, gradeActivities) {
58
+ if (typeof node.op === "string") {
59
+ // A date range, as restrictionsJson writes it.
60
+ const tree = node;
61
+ const [a, b] = tree.c;
62
+ if (tree.op === "&" && tree.c.length === 2 && a?.type === "date" && b?.type === "date" && a.d === ">=" && b.d === "<")
63
+ return { type: "date", from: iso(a.t), until: iso(b.t) };
64
+ return { type: "other", json: node };
65
+ }
66
+ const leaf = node;
67
+ switch (leaf.type) {
68
+ case "date":
69
+ return leaf.d === ">=" ? { type: "date", from: iso(leaf.t) } : { type: "date", until: iso(leaf.t) };
70
+ case "grade": {
71
+ const activityId = gradeActivities.get(Number(leaf.id));
72
+ if (activityId === undefined)
73
+ return { type: "other", json: leaf };
74
+ return { type: "grade", activityId, ...(typeof leaf.min === "number" ? { min: leaf.min } : {}), ...(typeof leaf.max === "number" ? { max: leaf.max } : {}) };
75
+ }
76
+ case "completion": {
77
+ const state = COMPLETION_STATES[Number(leaf.e)];
78
+ return state ? { type: "completion", activityId: Number(leaf.cm), state } : { type: "other", json: leaf };
79
+ }
80
+ case "group":
81
+ return leaf.id !== undefined ? { type: "group", groupId: Number(leaf.id) } : { type: "other", json: leaf };
82
+ default:
83
+ return { type: "other", json: leaf };
84
+ }
85
+ }
86
+ /** Whether Moodle's availability JSON has a grade condition (reading it back needs the gradebook). */
87
+ export function hasGradeCondition(json) {
88
+ return /"type"\s*:\s*"grade"/.test(json);
89
+ }
90
+ /**
91
+ * The restrictions in Moodle's availability JSON, in plain terms; undefined when there are none. A
92
+ * negated set ("must not") has no plain terms: it comes whole as one `other` condition.
93
+ */
94
+ export function parseRestrictions(json, gradeActivities = new Map()) {
95
+ if (!json || json.trim() === "")
96
+ return undefined;
97
+ let tree;
98
+ try {
99
+ tree = JSON.parse(json);
100
+ }
101
+ catch {
102
+ return undefined;
103
+ }
104
+ if (!tree.c || tree.c.length === 0)
105
+ return undefined;
106
+ // Hidden when its one eye is closed, or every condition's is.
107
+ const hidden = tree.showc ? tree.showc.length > 0 && tree.showc.every((shown) => !shown) : tree.show === false;
108
+ if (tree.op === "!&" || tree.op === "!|")
109
+ return { conditions: [{ type: "other", json: tree }], hidden };
110
+ return { conditions: tree.c.map((node) => restrictionOf(node, gradeActivities)), match: tree.op === "|" ? "any" : "all", hidden };
111
+ }
112
+ /**
113
+ * The course's grade items by the activity they belong to, from the gradebook setup page (each item's
114
+ * row links to its activity): Moodle's grade condition names a grade item, not an activity. An
115
+ * activity with several items (a forum's whole-forum grade and ratings) maps to the first.
116
+ */
117
+ export async function gradeItemsByActivity(context, siteUrl, courseId) {
118
+ const page = await openSitePage(context, siteUrl, `grade/edit/tree/index.php?id=${courseId}`);
119
+ try {
120
+ if ((await page.locator("body#page-grade-edit-tree-index #grade_edit_tree_table").count()) === 0) {
121
+ throw new MoodleError(`Course ${courseId}'s gradebook setup can't be read, and a grade condition needs it: ${(await moodleErrorMessage(page)) ?? "you aren't allowed to manage its grades"}`, "not-available");
122
+ }
123
+ const pairs = await page.evaluate(() => {
124
+ const doc = globalThis.document;
125
+ const found = [];
126
+ for (const row of Array.from(doc.querySelectorAll("#grade_edit_tree_table tr[data-itemid]"))) {
127
+ const link = Array.from(row.querySelectorAll("a[href]"))
128
+ .map((a) => /\/mod\/[a-z0-9_]+\/view\.php\?(?:.*&)?id=(\d+)/.exec(a.getAttribute("href") ?? "")?.[1])
129
+ .find((id) => id !== undefined);
130
+ if (link)
131
+ found.push([Number(link), Number(row.getAttribute("data-itemid"))]);
132
+ }
133
+ return found;
134
+ });
135
+ const items = new Map();
136
+ for (const [activityId, itemId] of pairs)
137
+ if (!items.has(activityId))
138
+ items.set(activityId, itemId);
139
+ return items;
140
+ }
141
+ finally {
142
+ await page.close().catch(() => undefined);
143
+ }
144
+ }
145
+ /** The completion conditions in plain terms, by the form field each stands for. */
146
+ const COMPLETION_FIELDS = { view: "completionview", grade: "completionusegrade", passGrade: "completionpassgrade", submit: "completionsubmit" };
147
+ /** Which of `names` the form in `page` has, as fields a person can see (hidden twins aside). */
148
+ function fieldsPresent(page, names) {
149
+ return page.evaluate((names) => {
150
+ const doc = globalThis.document;
151
+ return names.filter((name) => Array.from(doc.querySelectorAll(`form.mform [name="${name}"]`)).some((field) => field.type !== "hidden"));
152
+ }, names);
153
+ }
154
+ /**
155
+ * The form values for `completion` in an activity's form, in the order to set them (each enables the
156
+ * next): conditions not given are turned off. Refuses a condition the module's form doesn't have.
157
+ */
158
+ export async function completionValues(page, completion) {
159
+ const present = new Set(await fieldsPresent(page, ["completion", ...Object.values(COMPLETION_FIELDS), "completionexpected[enabled]"]));
160
+ const module = (await page.evaluate(() => globalThis.document.querySelector('form.mform [name="modulename"]')?.value)) ?? "activity";
161
+ if (!present.has("completion"))
162
+ throw new MoodleError(`This ${module}'s form has no completion settings: completion tracking is off in the course or on the site.`, "not-available");
163
+ if (completion === "none")
164
+ return { completion: 0 };
165
+ if (completion === "manual")
166
+ return { completion: 1 };
167
+ const wanted = { ...completion, grade: completion.grade || completion.passGrade };
168
+ const missing = Object.keys(COMPLETION_FIELDS).filter((key) => wanted[key] && !present.has(COMPLETION_FIELDS[key]));
169
+ if (missing.length > 0)
170
+ throw new MoodleError(`This ${module} has no completion condition ${missing.join(", ")}: its form has no such field.`, "invalid-input");
171
+ const values = { completion: 2 };
172
+ if (present.has(COMPLETION_FIELDS.view))
173
+ values[COMPLETION_FIELDS.view] = Boolean(wanted.view);
174
+ if (present.has(COMPLETION_FIELDS.submit))
175
+ values[COMPLETION_FIELDS.submit] = Boolean(wanted.submit);
176
+ if (present.has(COMPLETION_FIELDS.grade))
177
+ values[COMPLETION_FIELDS.grade] = Boolean(wanted.grade);
178
+ // A radio, enabled by the grade condition.
179
+ if (wanted.grade && present.has(COMPLETION_FIELDS.passGrade))
180
+ values[COMPLETION_FIELDS.passGrade] = wanted.passGrade ? 1 : 0;
181
+ if (present.has("completionexpected[enabled]")) {
182
+ values["completionexpected[enabled]"] = wanted.expected !== undefined;
183
+ if (wanted.expected !== undefined) {
184
+ const expected = new Date(time(wanted.expected, "completion.expected") * 1000);
185
+ Object.assign(values, await dateSelectorValues(page, "completionexpected", expected));
186
+ }
187
+ }
188
+ return values;
189
+ }
190
+ /** An activity's completion in plain terms, from its form; undefined when the form has no completion settings. */
191
+ export async function readCompletion(page) {
192
+ const read = await inPage(page, (fields) => {
193
+ const doc = globalThis.document;
194
+ const radio = doc.querySelector('form.mform input[type="radio"][name="completion"]:checked');
195
+ if (!radio)
196
+ return undefined;
197
+ const on = (name) => doc.querySelector(`form.mform input[type="checkbox"][name="${name}"]`)?.checked ?? false;
198
+ const pass = doc.querySelector(`form.mform input[type="radio"][name="${fields.passGrade}"]:checked`)?.value === "1";
199
+ return { mode: radio.value, view: on(fields.view), grade: on(fields.grade), passGrade: pass, submit: on(fields.submit) };
200
+ }, COMPLETION_FIELDS);
201
+ if (!read)
202
+ return undefined;
203
+ if (read.mode === "0")
204
+ return "none";
205
+ if (read.mode === "1")
206
+ return "manual";
207
+ const expected = await dateSelectorDate(page, "completionexpected");
208
+ return {
209
+ ...(read.view ? { view: true } : {}),
210
+ ...(read.grade ? { grade: true } : {}),
211
+ ...(read.grade && read.passGrade ? { passGrade: true } : {}),
212
+ ...(read.submit ? { submit: true } : {}),
213
+ ...(expected ? { expected: expected.toISOString() } : {}),
214
+ };
215
+ }
216
+ //# sourceMappingURL=conditions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditions.js","sourceRoot":"","sources":["../../../src/areas/activities/conditions.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,16 @@ import type { BrowserContext } from "playwright-core";
2
2
  import type { Trail } from "../../options.js";
3
3
  import { type MediaItem } from "../../core/text.js";
4
4
  import { MoodleError } from "../../core/errors.js";
5
+ /** The modules whose content `activityContent` reads. */
5
6
  export declare const CONTENT_TYPES: readonly ["page", "book", "label", "url", "resource", "folder"];
7
+ /** One of `CONTENT_TYPES`. */
6
8
  export type ContentType = (typeof CONTENT_TYPES)[number];
7
9
  /** The activity isn't of the given type, or the person can't view it. */
8
10
  export declare class NotViewableError extends MoodleError {
9
11
  name: string;
10
12
  constructor(message: string);
11
13
  }
14
+ /** What `activityContent` read of an activity: only the fields of its type are present. */
12
15
  export interface ActivityContent {
13
16
  activity: {
14
17
  id: number;
@@ -2,6 +2,7 @@ import { pause, readingSeconds } from "../../core/pace.js";
2
2
  import { openSitePage } from "../../core/session.js";
3
3
  import { readMedia, readTexts } from "../../core/text.js";
4
4
  import { MoodleError } from "../../core/errors.js";
5
+ /** The modules whose content `activityContent` reads. */
5
6
  export const CONTENT_TYPES = ["page", "book", "label", "url", "resource", "folder"];
6
7
  // A book has a reasonable number of chapters; the bound stops a loop on a broken "next" link.
7
8
  const MAX_CHAPTERS = 200;
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/areas/activities/content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../../src/areas/activities/content.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,9 @@ export interface MoodleParticipant {
22
22
  requiregrading: boolean;
23
23
  grantedextension: boolean;
24
24
  submissionstatus: string;
25
+ /** With group submissions, the group the participant submits for (absent or 0 for none). */
26
+ groupid?: number;
27
+ groupname?: string;
25
28
  }
26
29
  /** The dates `mod_assign_get_participant` gives for one participant (Unix seconds; 0 is none). */
27
30
  export interface MoodleParticipantDates {
@@ -64,5 +67,34 @@ export declare function panelGrade(page: Page, panelHtml: string): Promise<{
64
67
  gradebookGrade?: string;
65
68
  feedback?: string;
66
69
  }>;
70
+ /** The marking workflow's states, as Moodle names them ("notmarked" is the grading form's empty choice). */
71
+ export declare const WORKFLOW_STATES: readonly ["notmarked", "inmarking", "readyforreview", "inreview", "readyforrelease", "released"];
72
+ /** One of `WORKFLOW_STATES`: where a submission is in the marking workflow. */
73
+ export type WorkflowState = (typeof WORKFLOW_STATES)[number];
74
+ /** What a grading panel's form says beyond the grade, read by field names. */
75
+ export interface PanelState {
76
+ /** The feedback files' draft area, where the assignment has feedback files on. */
77
+ draftId?: string;
78
+ sesskey?: string;
79
+ /** Where the assignment uses the marking workflow. */
80
+ workflowState?: WorkflowState;
81
+ /** Where it allocates markers: the ones allocated (Moodle 5.2 allows several per submission). */
82
+ markers?: {
83
+ id: number;
84
+ name: string;
85
+ }[];
86
+ }
87
+ export declare function readPanelState(page: Page, html: string): Promise<PanelState>;
88
+ /** The files at the top of a draft area of the person's, as the file manager lists them. */
89
+ export declare function draftAreaFiles(context: BrowserContext, siteUrl: string, sesskey: string, draftId: string): Promise<{
90
+ name: string;
91
+ url: string;
92
+ }[]>;
93
+ /**
94
+ * Makes a draft area hold exactly `files` (local paths): what's in it is deleted, as the file
95
+ * manager's "Delete" does, then they're uploaded from Moodle's own grading page for the participant,
96
+ * the page whose file picker the grader uses (it carries the upload repository).
97
+ */
98
+ export declare function replaceDraftFiles(context: BrowserContext, siteUrl: string, activityId: number, userId: number, sesskey: string, draftId: string, files: string[]): Promise<void>;
67
99
  /** Submits a serialized grading form; Moodle answers warnings when it refuses it. */
68
100
  export declare function submitGradingForm(context: BrowserContext, siteUrl: string, instanceId: number, userId: number, serialized: string): Promise<void>;
@@ -1,6 +1,7 @@
1
1
  import { callService } from "../../core/ajax.js";
2
- import { setFields } from "../../core/forms.js";
3
- import { openSitePage } from "../../core/session.js";
2
+ import { setFields, uploadToDraft } from "../../core/forms.js";
3
+ import { siteFetch } from "../../core/http.js";
4
+ import { NotLoggedInError, openSitePage } from "../../core/session.js";
4
5
  import { MoodleError } from "../../core/errors.js";
5
6
  /** The id isn't an assignment's course module, or the person can't grade it. */
6
7
  export class NotAnAssignmentError extends MoodleError {
@@ -154,6 +155,69 @@ export async function panelGrade(page, panelHtml) {
154
155
  return { grade: grade || undefined, ...(gradebook && gradebook !== "-" ? { gradebookGrade: gradebook } : {}), feedback: feedback || undefined };
155
156
  });
156
157
  }
158
+ /** The marking workflow's states, as Moodle names them ("notmarked" is the grading form's empty choice). */
159
+ export const WORKFLOW_STATES = ["notmarked", "inmarking", "readyforreview", "inreview", "readyforrelease", "released"];
160
+ export function readPanelState(page, html) {
161
+ return page.evaluate((html) => {
162
+ const g = globalThis;
163
+ const fields = Array.from(new g.DOMParser().parseFromString(html, "text/html").querySelectorAll("form.gradeform [name]"));
164
+ // The feedback files plugin names its file manager after the participant: files_<userid>_filemanager.
165
+ const draft = fields.find((field) => /^files_\d+_filemanager$/.test(field.name));
166
+ const workflow = fields.find((field) => field.name === "workflowstate");
167
+ const markerFields = fields.filter((field) => /^allocatedmarker\[\d+\]$/.test(field.name));
168
+ const markers = markerFields.filter((field) => Number(field.value) > 0).map((field) => ({ id: Number(field.value), name: (field.selectedOptions?.[0]?.textContent ?? "").trim() }));
169
+ return {
170
+ draftId: draft?.value || undefined,
171
+ sesskey: fields.find((field) => field.name === "sesskey")?.value || undefined,
172
+ ...(workflow ? { workflowState: (workflow.value || "notmarked") } : {}),
173
+ ...(markerFields.length > 0 ? { markers } : {}),
174
+ };
175
+ }, html);
176
+ }
177
+ async function draftFilesRequest(context, siteUrl, action, fields) {
178
+ const { status, url, body } = await siteFetch(context, new URL(`repository/draftfiles_ajax.php?action=${action}`, siteUrl).href, {
179
+ method: "POST",
180
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
181
+ body: new URLSearchParams(fields).toString(),
182
+ });
183
+ // Without a session, Moodle sends the request to its login page.
184
+ if (new URL(url).pathname.includes("/login/"))
185
+ throw new NotLoggedInError();
186
+ try {
187
+ return JSON.parse(body);
188
+ }
189
+ catch {
190
+ throw new GradingError(`Moodle's file manager answered ${status} to "${action}" with something other than JSON.`);
191
+ }
192
+ }
193
+ /** The files at the top of a draft area of the person's, as the file manager lists them. */
194
+ export async function draftAreaFiles(context, siteUrl, sesskey, draftId) {
195
+ const listing = await draftFilesRequest(context, siteUrl, "list", { sesskey, itemid: draftId, filepath: "/" });
196
+ return (listing.list ?? []).filter((file) => file.type === "file").map((file) => ({ name: file.filename, url: file.url }));
197
+ }
198
+ /**
199
+ * Makes a draft area hold exactly `files` (local paths): what's in it is deleted, as the file
200
+ * manager's "Delete" does, then they're uploaded from Moodle's own grading page for the participant,
201
+ * the page whose file picker the grader uses (it carries the upload repository).
202
+ */
203
+ export async function replaceDraftFiles(context, siteUrl, activityId, userId, sesskey, draftId, files) {
204
+ const listing = await draftFilesRequest(context, siteUrl, "list", { sesskey, itemid: draftId, filepath: "/" });
205
+ const existing = (listing.list ?? []).map((file) => ({ filename: file.filename, filepath: file.filepath }));
206
+ if (existing.length > 0) {
207
+ const deleted = await draftFilesRequest(context, siteUrl, "deleteselected", { sesskey, itemid: draftId, selected: JSON.stringify(existing) });
208
+ if (!Array.isArray(deleted))
209
+ throw new GradingError("Moodle didn't delete the feedback files there were: nothing was graded.");
210
+ }
211
+ if (files.length === 0)
212
+ return;
213
+ const page = await openSitePage(context, siteUrl, `mod/assign/view.php?id=${activityId}&action=grade&userid=${userId}`);
214
+ try {
215
+ await uploadToDraft(page, draftId, files);
216
+ }
217
+ finally {
218
+ await page.close().catch(() => undefined);
219
+ }
220
+ }
157
221
  /** Submits a serialized grading form; Moodle answers warnings when it refuses it. */
158
222
  export async function submitGradingForm(context, siteUrl, instanceId, userId, serialized) {
159
223
  const warnings = await callService(context, siteUrl, "mod_assign_submit_grading_form", {
@@ -1 +1 @@
1
- {"version":3,"file":"grader.js","sourceRoot":"","sources":["../../../src/areas/assignments/grader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grader.js","sourceRoot":"","sources":["../../../src/areas/assignments/grader.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { BrowserContext, Page } from "playwright-core";
2
- import { type PluginContent } from "./grader.js";
2
+ import { type PluginContent, type WorkflowState } from "./grader.js";
3
3
  import { type FieldValue } from "../../core/forms.js";
4
+ /** A participant's submission to an assignment, as `assignmentSubmissions` reads it for the grader. */
4
5
  export interface Submission {
5
6
  userId: number;
6
7
  fullName: string;
@@ -17,18 +18,45 @@ export interface Submission {
17
18
  cutoffDate?: string;
18
19
  /** Per submission plugin; only for submitted and draft submissions. */
19
20
  content?: PluginContent[];
21
+ /**
22
+ * The feedback files the participant has, where the assignment takes them: as the grader's file
23
+ * manager holds them, a working copy (`draftfile.php`) that `downloadFile` saves while the session lasts.
24
+ */
25
+ feedbackFiles?: {
26
+ name: string;
27
+ url: string;
28
+ }[];
29
+ /** With group submissions, the group the participant submits for; absent for none (Moodle's "Default group"). */
30
+ group?: {
31
+ id: number;
32
+ name: string;
33
+ };
34
+ /** With the marking workflow, the submission's state ("notmarked" before any). */
35
+ workflowState?: WorkflowState;
36
+ /** With marker allocation, the markers allocated to it. */
37
+ markers?: {
38
+ id: number;
39
+ name: string;
40
+ }[];
20
41
  }
21
- /** Every participant's submission to an assignment, with its content unless `includeContent` is false. */
42
+ /**
43
+ * Every participant's submission to an assignment, with the group they submit for (group
44
+ * submissions), and, unless `includeContent` is false, its content, the feedback files they have,
45
+ * its marking workflow state and markers (all from each participant's grading panel).
46
+ */
22
47
  export declare function assignmentSubmissions(context: BrowserContext, siteUrl: string, activityId: number, { includeContent }?: {
23
48
  includeContent?: boolean | undefined;
24
49
  }): Promise<Submission[]>;
25
50
  /**
26
51
  * Grades a participant as the grader does: a grade (simple grading), a rubric's level per criterion
27
52
  * or a marking guide's score per criterion (by their ids, from `rubric()`), remarks per criterion,
28
- * feedback comments (HTML), whether to notify, and any other grading field by name. Returns the
29
- * grade saved and the gradebook's grade, the total Moodle computes for a rubric or a guide.
53
+ * feedback comments (HTML), feedback files (local paths that replace the ones the participant has;
54
+ * `[]` removes them), whether to notify, and any other grading field by name. Returns the grade
55
+ * saved and the gradebook's grade, the total Moodle computes for a rubric or a guide, and the
56
+ * feedback files after saving when they were given. Throws `GradingError` when Moodle refuses the
57
+ * grade, or when files are given to an assignment without feedback files.
30
58
  */
31
- export declare function gradeSubmission(context: BrowserContext, siteUrl: string, activityId: number, userId: number, { grade, rubric, guide, remarks, feedback, notify, fields, }: {
59
+ export declare function gradeSubmission(context: BrowserContext, siteUrl: string, activityId: number, userId: number, { grade, rubric, guide, remarks, feedback, feedbackFiles, workflowState, applyToGroup, notify, fields, }: {
32
60
  grade?: string | number;
33
61
  /** Criterion id → level id. */
34
62
  rubric?: Record<number, number>;
@@ -37,20 +65,33 @@ export declare function gradeSubmission(context: BrowserContext, siteUrl: string
37
65
  /** Criterion id → remark, for a rubric or a guide. */
38
66
  remarks?: Record<number, string>;
39
67
  feedback?: string;
68
+ /** Local paths (absolute): the participant's feedback files afterwards. */
69
+ feedbackFiles?: string[];
70
+ /** With the marking workflow: the state to leave the submission in ("released" shows the grade). */
71
+ workflowState?: WorkflowState;
72
+ /** With group submissions: grade every member of the participant's group alike (Moodle's default), or only them. */
73
+ applyToGroup?: boolean;
40
74
  notify?: boolean;
41
75
  fields?: Record<string, FieldValue>;
42
76
  }): Promise<{
77
+ workflowState?: "notmarked" | "inmarking" | "readyforreview" | "inreview" | "readyforrelease" | "released" | undefined;
78
+ feedbackFiles?: {
79
+ name: string;
80
+ url: string;
81
+ }[] | undefined;
43
82
  grade?: string;
44
83
  gradebookGrade?: string;
45
84
  feedback?: string;
46
85
  changed: string;
47
86
  }>;
87
+ /** A criterion of a rubric or a marking guide, with the ids grading takes. */
48
88
  export interface GradingCriterion {
49
89
  id: number;
50
90
  /** A rubric criterion's description; a guide criterion's short name. */
51
91
  description: string;
52
92
  /** A guide criterion's description for students and for markers. */
53
93
  details?: string;
94
+ /** A guide criterion's description for markers only. */
54
95
  markers?: string;
55
96
  /** A rubric criterion's levels, by the ids grading takes. */
56
97
  levels?: {
@@ -61,6 +102,7 @@ export interface GradingCriterion {
61
102
  /** A guide criterion's maximum score. */
62
103
  maxScore?: number;
63
104
  }
105
+ /** How an assignment is graded: its method and, for advanced grading, its criteria. */
64
106
  export interface GradingDefinition {
65
107
  /** "simple" for a plain grade (or a scale), "rubric" or "guide" for advanced grading. */
66
108
  method: "simple" | "rubric" | "guide";
@@ -79,8 +121,29 @@ export declare function rubric(context: BrowserContext, siteUrl: string, activit
79
121
  } & GradingDefinition>;
80
122
  /**
81
123
  * Grants participants an extension until a date, through the assignment's extension form (several at
82
- * once as its bulk action does). Moodle refuses a date before the assignment's due date.
124
+ * once as its bulk action does). Moodle refuses a date before the assignment's due date, and a person
125
+ * without its "grant extension" capability only on saving (the form opens for anyone, confirmed
126
+ * empirically on the sandbox, 5.2): both throw.
83
127
  */
84
128
  export declare function grantExtension(context: BrowserContext, siteUrl: string, activityId: number, userIds: number[], until: Date): Promise<{
85
129
  changed: string;
86
130
  }>;
131
+ /**
132
+ * Sets the marking workflow state of participants' submissions, as the grading table's "Set marking
133
+ * workflow state" does; "released" shows them their grades, notifying them when `notify` is true
134
+ * (the form's default is not to). With several markers, it sets the submission's overall state.
135
+ */
136
+ export declare function setWorkflowState(context: BrowserContext, siteUrl: string, activityId: number, userIds: number[], state: Exclude<WorkflowState, "notmarked">, { notify }?: {
137
+ notify?: boolean;
138
+ }): Promise<{
139
+ changed: string;
140
+ }>;
141
+ /**
142
+ * Allocates a marker (the user id of someone who can grade; several where the assignment uses
143
+ * several markers per submission) to participants' submissions, as the grading table's "Allocate
144
+ * marker" does. Moodle leaves alone submissions past marking (marking completed, in review, ready
145
+ * for release, released).
146
+ */
147
+ export declare function allocateMarker(context: BrowserContext, siteUrl: string, activityId: number, userIds: number[], markerId: number | number[]): Promise<{
148
+ changed: string;
149
+ }>;