Submissions Library
Project goal
Make activity module developers (not only Assignment developers) able to use submission types: both standard and community-developed.
Project scope
A library providing API for activity module submission types support implementation. Actual proposition is to make assignsubmission plugins system-level.
The existing modules requiring submissions (Assignment, Workshop) should use this library.
Relevant tracker issues
- MDL-47344 - Allow usage of submission methods in other plugins
Use cases
- Assignment: no comment.
- Workshop: uses submissions but it's another code doing the same.
- Lesson: as well as questions the submissions could be used at lessons for a small tasks. For example, a task at the end of lesson about MS Paint: draw an your dream house, save it and upload.
- Community module: for example, Assignment with individual tasks could not re-implement all existing submission types.
- Non-mod usage? If there is no such cases this library should only work with activity modules.
Database schema
submissions_bindings
Identifies all connected submission plugins to an activity modules.
Field | Type | Default | Description |
---|---|---|---|
id | bigint | Auto-numbered. | |
context | bigint | Activity context. | |
area | varchar(100) | An area within activity module. A module may have a few. | |
method | varchar(100) | Submission plugin name. It is considered that the plugin is activated in these area of these activity module instance. |
submissions_pluginconfig
Stores plugins configuration.
Field | Type | Default | Description |
---|---|---|---|
id | bigint | Auto-numbered. | |
binding | bigint | Activated plugin. Points to submissions_bindings record. | |
option | varchar(100) | Plugin setting name. | |
value | text | Setting value. |
submissions_instances
Identifies all submissions. A data associated with the submission is stored by plugin.
Field | Type | Default | Description |
---|---|---|---|
id | bigint | Auto-numbered. | |
binding | bigint | Activated plugin. Points to submissions_bindings record. | |
itemid | bigint | null | Identifies an element within area. For example, answer or user id. |
timecreated | bigint | 0 | When the submission was created. |
timemodified | bigint | 0 | Latest submission modification time. |
status | int | 0 | Draft (default), Latest, Archived. |
submissionplugin_onlinetext
This is a table example for "Online text" plugin. This table is not a part of library.
Field | Type | Default | Description |
---|---|---|---|
id | bigint | Auto-numbered. | |
submissioninstance | bigint | Point to submission from submissions_instances table. | |
onlinetext | text | Actual submission data. | |
onlineformat | int | 0 | Text format. |
submissionplugin_file
This is a table example for "File submission" plugin. This table is not a part of library.
Field | Type | Default | Description |
---|---|---|---|
id | bigint | Auto-numbered. | |
submissioninstance | bigint | Point to submission from submissions_instances table. | |
numfiles | bigint | Number of submitted files. |
How it works
API for activity modules
Activity instance settings form
In order to add a plugin settings elements on activity settings page the following method of moodleform_mod should be used:
$this->standard_submission_coursemodule_elements();
Displaying a submission
Activity module should access the submissions using a submission class.
$submission = new submission($context, $area);
First, a submission_instance object should be retrieved.
$submissioninstance = $submission->get_submission_instance($itemid);
Next, it can be displayed.
if ($submissioninstance) {
$submissioninstance->display();
// or
$html = $submissioninstance->render();
}
Displaying submission form
Activity module should access the submissions using a submission class.
$submission = new submission($context, $area);
A special method should be used to add elements on submission form. A previous submission can be loaded by specifying $baseitemid.
$submission->add_submission_form_elements($mform, $baseitemid);
Save/update submission
Activity module should access the submissions using a submission class.
$submission = new submission($context, $area);
To save or update the submission a special method should be used. It accepts submitted form data as its only argument.
$submission->save($formdata);
Delete submission
All submissions associated with the activity module instance can be deleted by using the following static method:
submission::delete_all_for_context($context);
Individual submissions can be deleted this way:
$submission = new submission($context, $area);
$submission->delete($itemid);
General workflow details
Student makes a submission
TODO: add more details
Teacher views student's submission
TODO: add more details
Someone tries to download a file from submissionplugin_file
TODO: add more details
Course module deletion
submission::delete_all_for_context(...) call should be added to course_delete_module(...) function.
Note: all associated files will be deleted when course_delete_module(...) function calls deletion of all files associated with the module's context. Perhaps submission plugins should not rely on this.
How "File submission" plugin stores files
File submission plugin stores all files at file areas identified by:
- context — activity context (from submissions_bindings)
- component name — submissionplugin_file
- area type — submissionplugin_file_<area> (<area> from submissions_bindings)
- itemid — submission instance id.