Improved Question Bank Tags
Overview
This document is "under construction" (really!)
This document is the technical design for a set of features proposed by the Moodle Users Association for Moodle 3.5.
The project proposal is here: https://moodleassociation.org/mod/page/view.php?id=465
The requirements / user stories have been written by the MUA - a copy is included here for clarity
User Stories / Requirements
Must:
- As a teacher, I can add tag(s) to a question bank question for use in my course for organizational and search/filtering of questions.
- As a teacher, I can filter my questions in courses based on tags.
- As a teacher, I can see tags on questions at higher category assigned by Question sharer role holder.
- As another teacher in the same course, I have access to the question tags on the questions in that course context.
- As a teacher in a course, I do not see tags of other in contexts I do not have access to. (Instructor 1’s “midterm 1” question set would not be relevant to Instructor 2)
- As a teacher, I am able to add/modify/remove tags on questions.
- As a teacher, I should not have to copy a question into my course from higher category contexts to include it in a ‘random question from question set’ question type.
- As a teacher, I can add a 'random question from question set' question type to my quiz where the question set is a selectable list of questions. These questions can be searched for and filtered by tag but the set itself is not defined by specifying a tag.
Nice to have:
- Labels can contain any visible ASCII characters including characters such as apostrophes, slashes, and colons. Exception of Comma.
- As a teacher, when searching for questions to add to a ‘random question from question set’ I see the question with its context clearly visible.
- As a teacher, I can export/import questions with their tags.
- As a Question sharer role holder, I can add a tag(s) to a question bank questions that exist at the category context.
- As a Question sharer role holder, I can search/filter all the questions I have access to and see them along with their context.
Design
The requirements listed above can be met by implementing the following changes (which are described in detail further down):
- New question type "Random question from a set of questions"
- Enhanced question search allowing search/filter by tag everywhere
- Allow adding course level tags to questions that exist in a category
Random question from a set of questions
Architecture
Currently the quiz_slots DB table has a questionid column that directly links to the question for that slot. We will change this table to abstract the logic for determining the question from the slot.
We would add a new slottype column to the quiz_slots table that indicates the class which contains the logic for determining the question from the slot.
We will introduce a new abstract class "mod_quiz\slot_type".
The slot_type subclass will be responsible for:
- Determining a specific question id from a quizid + slotid + userid. A new question id is only queried when a new attempt is started, or a question is re-attempted.
- Storing slottype specific data from the configuration of the question slot in it's own DB tables.
- Backup of it's own slottype specific data.
- Restore of it's own slottype specific data and upgrade data from previous backup file versions.
- Display of UI to configure this slot type (JS and non-JS).
When the slottype is "direct" - the slot_type_direct class is loaded directly from the quiz (not a sub-plugin). When the slottype is any other type - the slot_type_TYPE class will be loaded from the quizslot_TYPE sub-plugin.
DB changes
Add slottype to the slots table, make questionid allow null and add 2 new tables (one per slot type).
quizslot_randomfromcategory(id, quizslotid, includesubcategories, questioncategoryid) (foreign key quizslotid unique, foreign key questioncategoryid)
quizslot_randomfromset(id, quizslotid, questionid) (foreign key quizslotid, foreign key questionid)
Notes: For upgrades, it will be simpler to keep the questionid column on the slots table for the most common usage of question slots. This means a much smaller upgrade step and because the 'single' slottype is not implemented as a sub-plugin it makes sense to keep the data in the table belonging to the quiz component.
UI changes
Search for question by tag
- Describe list of changes
Course level tags for questions
- Describe list of changes