MDL-80880 quiz: change display of previous attempts summary
[moodle.git] / mod / quiz / upgrade.txt
blobb0892c03ad577950628c26d733bce5e3fa6086bd
1 This file describes API changes in the quiz code.
3 === 4.4 ===
4 * A quiz_structure_modified callback has been added for quiz_ plugins, called from
5   grade_calculator::recompute_quiz_sumgrades(). Plugins can implement this by creating a `quiz_structure_modified`
6   class in their namespace with a static `callback` method, see quiz_statistics as an example.
7 * External functions returning question information, currently get_attempt_summary(), get_attempt_data() and get_attemp_review()
8   now return a new field called "stateclass". A machine-readable class name for the state that this question attempt is in,
9   as returned by question_usage_by_activity::get_question_state_class().
10 * External function mod_quiz_external::get_attempt_summary() now returns a new field "totalunanswered", with the total number of
11   unanswered questions.
12 * quiz_settings::no_review_message now takes a new argument $attemptsubmittime for the time when the quiz attempt was
13   submitted. It is strongly recommended that you always pass that.
14 * In the renderer, related to rendering the review page, review_summary_table and filter_review_summary_table have been
15   replaced by review_attempt_summary and filter_review_attempt_summary. This is to support changing the $summarydata argument
16   the review_page() method to an instance of a new templateable class attempt_summary_information for displaying this.
17   The $summarydata argument of review_question_page has also been changed to an attempt_summary_information.
18 * In the renderer, the view_table has been deprecated. Please use the list_of_attempts renderable instead.
20 === 4.3 ===
22 * The method get_questions() has a new parameter 'requirequestionfullyloaded' which can be used to instruct whether the
23   questions should be fully loaded or not.
24 * the quiz_settings and quiz_attempt classes now always store the ->cm property as a cm_info class.
25   In the distant past it was always a stdClass, then at one point there was an undocumented change making
26   it sometimes a stdClass and sometimes a cm_info. Now it is consistently a cm_info. Type hints have been
27   updated to reflect this.
28 * The parameter filtercondition in the web service mod_quiz_add_random_questions is now optional. This parameter is
29   only used when adding random questions from an existing category. It is not required when adding random questions from
30   a new category since it is not used in this case.
32 === 4.2 ===
34 * For the three quiz web services: mod_quiz_get_attempt_data, mod_quiz_get_attempt_summary and
35   mod_quiz_get_attempt_review, the ->number property of each question is now deprecated
36   (It had the wrong time and was documented wrongly.) In the future, please use the new property
37   ->questionnumber. Note, this question 'number' can include any string (e.g. 'Qs 1 & 2') so it is
38   important to applying htmlspecialchars, or equivalent, to the value if you are outputting to HTML.
40 * The methods in the quiz_settings class which return a URL now all return a moodle_url. Previously
41   some returns a moodle_url and others aa string.
43 * 'firstslotid' value is not used in section_shuffle_updated event anymore.
45 * The quiz has a lot of old classes in lib.php files. These have now been moved into the classes folder,
46   and so are now in namespaces. Because of Moodle's class renaming support, your code should continue
47   working, but output deprecated warnings, so you probably want to update. This should mostly be
48   doable by adding use statements, and a search/replace.
49   - mod_quiz_display_options => mod_quiz\question\display_options
50   - qubaids_for_quiz => mod_quiz\question\qubaids_for_quiz
51   - qubaids_for_quiz_user => mod_quiz\question\qubaids_for_quiz_user - which is deprecated, because
52           it is almost the same as mod_quiz\question\qubaids_for_users_attempts.
53   - mod_quiz_admin_setting_browsersecurity => mod_quiz\admin\browser_security_setting
54   - mod_quiz_admin_setting_grademethod => mod_quiz\admin\grade_method_setting
55   - mod_quiz_admin_setting_overduehandling => mod_quiz\admin\overdue_handling_setting
56   - mod_quiz_admin_review_setting => mod_quiz\admin\review_setting
57   - mod_quiz_admin_setting_user_image => mod_quiz\admin\user_image_setting
58   - mod_quiz_admin_setting_browsersecurity => mod_quiz\admin\browser_security_setting
59   - mod_quiz_admin_setting_grademethod => mod_quiz\admin\grade_method_setting
60   - mod_quiz_admin_setting_overduehandling => mod_quiz\admin\overdue_handling_setting
61   - mod_quiz_admin_review_setting => mod_quiz\admin\review_setting
62   - mod_quiz_admin_setting_user_image => mod_quiz\admin\user_image_setting
63   - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_browsersecurity =>
64             mod_quiz\adminpresets\adminpresets_browser_security_setting
65   - mod_quiz\adminpresets/adminpresets_mod_quiz_admin_setting_grademethod =>
66             mod_quiz\adminpresets\adminpresets_grade_method_setting
67   - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_overduehandling =>
68             mod_quiz\adminpresets\adminpresets_overdue_handling_setting
69   - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_review_setting =>
70             mod_quiz\adminpresets\adminpresets_review_setting
71   - mod_quiz\adminpresets\adminpresets_mod_quiz_admin_setting_user_image =>
72             mod_quiz\adminpresets\adminpresets_user_image_setting
73   - quiz_default_report => mod_quiz\local\reports\report_base
74   - quiz_attempts_report => mod_quiz\local\reports\attempts_report
75   - mod_quiz_attempts_report_form => mod_quiz\local\reports\attempts_report_options_form
76   - mod_quiz_attempts_report_options => mod_quiz\local\reports\attempts_report_options
77   - quiz_attempts_report_table => mod_quiz\local\reports\attempts_report_table
78   - quiz_access_manager => mod_quiz\access_manager
79   - mod_quiz_preflight_check_form => mod_quiz\form\preflight_check_form
80   - quiz_override_form => mod_quiz\form\edit_override_form
81   - quiz_access_rule_base => mod_quiz\local\access_rule_base
82   - quiz_add_random_form => mod_quiz\form\add_random_form
83   - mod_quiz_links_to_other_attempts => mod_quiz\output\links_to_other_attempts
84   - mod_quiz_view_object => mod_quiz\output\view_page
85   - mod_quiz_renderer => mod_quiz\output\renderer
86   - quiz_nav_question_button => mod_quiz\output\navigation_question_button
87   - quiz_nav_section_heading => mod_quiz\output\navigation_section_heading
88   - quiz_nav_panel_base => mod_quiz\output\navigation_panel_base
89   - quiz_attempt_nav_panel => mod_quiz\output\navigation_panel_attempt
90   - quiz_review_nav_panel => mod_quiz\output\navigation_panel_review
91   - quiz_attempt => mod_quiz\quiz_attempt
92   - quiz => mod_quiz\quiz_settings
93   - quizaccess_seb\quiz_settings => quizaccess_seb\seb_quiz_settings
94   - quizaccess_seb\access_manager => quizaccess_seb\seb_access_manager
96 * The following classes have been deprecated:
97   - mod_quiz_overdue_attempt_updater - merged into mod_quiz\task\update_overdue_attempts
98   - moodle_quiz_exception - just use normal moodle_exception
100 * As part of the clean-up, the following files are no longer required, and if you try to
101   include them, you will get a debugging notices telling you not to:
102   - mod/quiz/report/attemptsreport.php
103   - mod/quiz/report/attemptsreport_form.php
104   - mod/quiz/report/attemptsreport_options.php
105   - mod/quiz/report/attemptsreport_table.php
106   - mod/quiz/report/default.php
107   - mod/quiz/accessmanager.php
108   - mod/quiz/accessmanager_form.php
109   - mod/quiz/cronlib.php
110   - mod/quiz/override_form.php
111   - mod/quiz/accessrule/accessrulebase.php
112   - mod/quiz/renderer.php - actually, no debugging ouput for this one because of how renderer factories work.
113   - mod/quiz/attemptlib.php
115 * Various functions related to calculating grades have moved into a new class mod_quiz\grade_calculator.
116   You get that using $quizobj->get_grade_calculator(), then the following old functions have become these new methods.
117   - quiz_update_sumgrades -> recompute_quiz_sumgrades
118   - quiz_update_all_attempt_sumgrades -> recompute_all_attempt_sumgrades
119   - quiz_update_all_final_grades -> recompute_all_final_grades
120   - quiz_set_grade -> update_quiz_maximum_grade
121   - quiz_save_best_grade -> recompute_final_grade
122   - quiz_calculate_best_grade -> [no public direct replacement]
123   - quiz_calculate_best_attempt - [no replacement. It was not used.]
125 * Final deprecation (complete removal) of the following functions which were deprecated long ago:
126   - quiz_groups_member_added_handler - deprecated since 2.6
127   - quiz_groups_member_removed_handler - deprecated since 2.6
128   - quiz_groups_group_deleted_handler - deprecated since 2.6
129   - quiz_groups_members_removed_handler - deprecated since 2.6
130   - The method quiz_settings::confirm_start_attempt_message - deprecated in Moodle 3.1
131   - The field view_page::$startattemptwarning - deprecated in Moodle 3.1
132   - attempts_report::load_relevant_students - deprecated since 3.2
133   - quiz_statistics_graph_get_new_colour - deprecated since 3.2
134   - The file mod/quiz/report/overview/overviewgraph.php - deprecated since 3.2
135   - The file mod/quiz/report/statistics/statistics_graph.php - deprecated since 3.2
136   - quiz_print_overview - deprecated since 3.3
138 * For properties that were previously only declared dynamically, a few classes now include property declarations to support PHP 8.2.
139   The affected classes are:
140    - restore_quiz_activity_structure_step
141    - attempts_report_table
142    - attempts_report
143    - quiz_overview_report (Removing $hasgroupstudents, because the parent attempts_report class has the same variable.)
145 === 4.1 ===
147 * quiz_has_question_use is now deprecated. Use mod_quiz\structure::has_use_capability istead.
150 === 4.0.3, 4.1 ===
152 * If a quiz is sequential the external functions mod_quiz_external::get_attempt_data, mod_quiz_external::get_attempt_summary will not return any data
153 related to out of sequence question except while reviewing the quiz (MDL-75210).
155 === 4.0.2, 4.1 ===
157 * No external code should be calling quiz_overview_report::regrade_attempt because it is an
158   internal method of the quiz_overview plugin. But if you are incorrectly using it, be aware
159   that the API changed slightly. It now returns an array listing any questions which could
160   not be regraded.
161 * New method called get_number_of_unanswered_questions() has been added to mod/quiz/attemptlib.php
162   to get the total number of unanswered questions in the current attempt.
164 === 4.0 ===
166 * The following API methods have a new parameter, $studentisonline, to define whether the student is currently interacting:
167   - process_finish() in mod/quiz/attemptlib.php
168   - quiz_send_confirmation() in mod/quiz/locallib.php
169   - quiz_send_notification_messages() in mod/quiz/locallib.php
170 * The completionpass criteria has been moved to core as 'completionpassgrade'. Refer to completion/upgrade.txt for
171   further information.
172 * New argument quizhasquestions has been added to public methods: view_information in mod/quiz/renderer.php.
173 * The function no_questions_message() in class mod_quiz_renderer is deprecated. There is no replacement.
174 * Related to the Moodle 4.0 question bank changes, the quiz_slots database table.
175   The fields removed are now manage by new core_question tables:
176   - question_references -> Records where a specific question is used.
177   - question_set_references -> Records where groups of questions are used (e.g. random questions).
178 * The quiz_slots_tags database table has been removed entirely, as has the get_slot_tags_for_slot_id() method
179   from mod/quiz/classes/structure.php and the the locallib.php functions quiz_retrieve_slot_tags and
180   quiz_retrieve_slot_tag_ids. This information is now stored in question_set_references
181   and can be accessed in the results of qbank_helper::get_question_structure.
184 === 3.11 ===
186 * External function mod_quiz_external::get_user_best_grade now returns and additional optional field:
187   - gradetopass: The grade to pass the quiz (if set)
190 === 3.10.1 ===
192 * External functions mod_quiz_external::get_attempt_data, mod_quiz_external::get_attempt_summary
193   and mod_quiz_external::get_attempt_review now return a new additional optional field:
194    - settings: Containing the question definition settings for displaying the question in an external system.
196 === 3.10 ===
198 * External functions mod_quiz_external::get_attempt_data, mod_quiz_external::get_attempt_summary
199   and mod_quiz_external::get_attempt_review now return a new additional optional field:
200    - responsefileareas: Containing the user responses to questions file area names including files.
202 === 3.7 ===
204 * Quiz_cron() has been removed. Sub-plugins should implemented scheduled tasks, however legacy cron in subplugins are
205   supported.
207 === 3.6 ===
209 * The following renamed classes have been completely removed:
210   - quiz_question_bank_view (now: mod_quiz\question\bank\custom_view)
211   - question_bank_add_to_quiz_action_column (now: mod_quiz\question\bank\add_action_column)
212   - question_bank_question_name_text_column (now: mod_quiz\question\bank\question_name_text_column)
214 === 3.5 ===
215 * Removed questionbank.ajax.php. Please use the quiz_question_bank fragment instead.
216 * Adding "random" questions to a quiz via quiz_add_quiz_question() has been deprecated. Please use quiz_add_random_questions().
218 === 3.3.2 ===
220 * quiz_refresh_events() Now takes two additional parameters to refine the update to a specific instance. This function
221   now optionally takes the module instance object or ID, and the course module object or ID. Please try to send the full
222   objects instead of the ids to save DB calls.
224 === 3.2 ===
226 * External functions mod_quiz_external::get_attempt_data, mod_quiz_external::get_attempt_summary
227   and mod_quiz_external::get_attempt_review now return additional optional fields:
228    - blockedbyprevious: Whether a question is blocked by the previous question.
230 === 3.1 ===
232 * quiz_attempt::question_print_comment_fields() has been removed. It was broken
233   since at least Moodle 2.0.
235 * quiz::confirm_start_attempt_message and mod_quiz_view_object::$startattemptwarning
236   have been deprecated. This functionality is now entirely handled within the
237   quiz access rule plugins.
239 * The third argument to mod_quiz_renderer::start_attempt_button has been changed
240   from a warning string to a mod_quiz_preflight_check_form.
242 * mod_quiz_renderer::review_next_navigation has a new optional argument. If you
243   have overridden that method, consider updating your code to match.
245 * mod_quiz\output\edit_renderer::start_section_list now takes $structure as an
246   argument. If you have overridden this method (it's hard to believe anyone ever
247   would) you will need to update your renderer.
249 * Several methods relating to preview links/buttons/urls have a new optional
250   argument to make the preview be of a particular variant.
253 === 2.9 ===
255 * There have been changes in classes/output/edit_renderer.php for MDL-40990.
256   + Some methods use to take $structure & $question as the first two arguments.
257     They now take $structure & $slot number. If you need $question, you can get
258     it using $question = $structure->get_question_in_slot($slot);
259   + Some methods used to take $quiz & $question. They now take $structure & $slot
260     number. You can get $question as above. $quiz is $structure->get_quiz().
261   + initialise_editing_javascript has had some redundant arguments removed.
262   Hopefully, with these changes, we will have less need to make other changes in future.
264 * Due to MDL-40992, you should be aware that extra slots can get added to an attempt.
265   You may get slot numbers beyone the end of the original quiz layout, and you
266   may want to call $attemptobj->get_original_slot to find where the question
267   originally came from.
269 * You now need to pass an instance of the mod_quiz_renderer if you call
270   $attemptobj->render_question or $attemptobj->render_question_at_step.
272 * The array values in mod_quiz_links_to_other_attempts may now be either a moodle_url,
273   or renderable (or null). Previously they could only be a moodle_url or null.
275 * The contents of the navigation block is now not just quiz_nav_question_button-s.
276   It can also contain quiz_nav_section_heading-s. If you have overridden
277   mod_quiz_renderer::navigation_panel, then you may need to account for this.
278   This change also has implications for the Edit quiz page.
281 === 2.8 ===
283 * Classes that were defined in various lib files have been moved to the classes
284   folder to take advantage of auto-loading. This has involved renaming them.
285   see the list in mod/quiz/db/renamedclasses.php.
287 * The quiz no longer handles its own \mod_quiz\event\attempt_becameoverdue event,
288   and so the event handler function quiz_attempt_overdue_handler has been deleted.
289   Also, the internal function quiz_send_overdue_message has add the arguments
290   changed. It now takes the $attemptobj object, not separate stdClass objects.
292 * Major changes to the Edit quiz page.
294   The goal of this work was to increase usability, and also clean up the page
295   enough that it will be possible to add new features in future.
297   Display of mod/quiz/edit.php is now entirely generated by
298   mod_quiz\output\edit_renderer. This uses a helper class mod_quiz\structure
299   to provide details of the structure of the quiz, and mod_quiz\repaginate to
300   alter that structure. (Actually, there are still some modification methods on
301   mod_quiz\structure. Expect that to be cleaned up in future.)
303   The new code uses much more ajax, and there are new scripts mod/quiz/edit_rest.php
304   and mod/quiz/repaginate.php to handle this. (Again, don't be surprised if those
305   two scripts get merged in future.) Also questionbank.ajax.php (which may, in
306   future, be made more generic, and moved into the core question bank code.)
308   As a result of this, mod/quiz/editlib.php has gone. (A few remaining functions
309   were moved to locallib.php.)
311   Here is a list of all the old functions or classes that have changed.
312   If you used any of these in custom code, you will need to update your code.
313   (Note that many of these functions should have been considered private internals
314   of the quiz module, and you should not have been using them!)
316   From editlib.php:
317       quiz_remove_slot
318       quiz_delete_empty_page
319       quiz_add_page_break_after_slot    - Use methods of structure or repaginate
320       quiz_update_slot_maxmark          - classes instead.
321       _quiz_move_question
322       quiz_move_question_up
323       quiz_move_question_down
325       quiz_print_question_list
326       quiz_print_pagecontrols
327       quiz_print_singlequestion         - Use methods of edit_renderer instead.
328       quiz_print_randomquestion
329       quiz_print_singlequestion_reordertool
330       quiz_print_randomquestion_reordertool
331       print_random_option_icon
332       quiz_print_grading_form
333       quiz_print_status_bar
335   Moved from editlib.php to locallib.php:
336       quiz_question_tostring - now always returns a string (the only option used).
337                                The $return argument has gone.
339   Old editing JavaScript (e.g. mod/quiz/edit.js) is gone. Replaced with YUI modules.
342 === 2.7.1 ===
344 * The function quiz_fire_attempt_started_event has been removed. This function
345   should not have been used outside the quiz, but if you were using it, you should
346   trigger the event outside this function. Note that the appropriate start event is
347   fired automatically by the quiz_attempt_save_started function.
350 === 2.7 ===
352 * The old quiz.questions database column (comma-separated list of question ids)
353   is gone, and instead the quiz_question_instances table has been renamed to
354   to quiz_slots. Some of the columns of that table have been renamed to match
355   the coding guidelines. Specifically:
356       quiz     -> quizid
357       question -> questionid
358       grade    -> maxmark
359   also there are two new columns:
360       slot     -  numbers the questions in the quiz in order, as on the edit quiz page.
361       page     -  new way to determine which question is on which page.
362   naturally, other parts of the code and APIs have been updated to reflect that
363   change.
365 * The following functions, which were part of the internal workings of the quiz,
366   have been removed.
367       quiz_get_slot_for_question
368       quiz_number_of_questions_in_quiz
369       quiz_repaginate               (there is now a quiz_repaginate_questions with a different API).
370       quiz_add_page_break_at        (see quiz_add_page_break_after_slot)
371       quiz_add_page_break_after     (see quiz_add_page_break_after_slot)
372       quiz_number_of_pages
373       quiz_remove_question          (see quiz_remove_slot)
374       quiz_update_question_instance (see quiz_update_slot_maxmark)
376 * The following internal functions have had their API changed.
377       quiz_delete_empty_page: has had its arguments changed to $quiz and $pagenumber.
378       quiz_has_question_use: now takes $quiz and $slot, not $questionid.
381 === 2.6 ===
383 * As part of improving the page usability and accessibility, we updated the
384   heading levels for quiz module so it has a proper nesting. (MDL-41615)
386 * mod_quiz_renderer::view_best_score has been removed. (It did not do what the
387   name suggested anyway.)
390 === 2.4 ===
392 * mod_quiz_renderer::finish_review_link now requires $attemptobj to be passed in
393   instead of a moodle_url.
396 === Earlier changes ===
398 * Were not documented in this way. Sorry.