Merge branch 'MDL-81612' of https://github.com/timhunt/moodle
[moodle.git] / UPGRADING.md
blob9bc9c166fd39abbce734fd8d363e92085d55b5b3
1 # Moodle Upgrade notes
3 This file contains important information for developers on changes to the Moodle codebase.
5 More detailed information on key changes can be found in the [Developer update notes](https://moodledev.io/docs/devupdate) for your version of Moodle.
7 The format of this change log follows the advice given at [Keep a CHANGELOG](https://keepachangelog.com).
9 ## 4.5dev+
11 ### core_badges
13 #### Deprecated
15 - The badges/newbadge.php page has been deprecated and merged with badges/edit.php. Please, use badges/edit.php instead.
17   For more information see [MDL-43938](https://tracker.moodle.org/browse/MDL-43938)
18 - OPEN_BADGES_V1 is deprecated and should not be used anymore.
20   For more information see [MDL-70983](https://tracker.moodle.org/browse/MDL-70983)
21 - The course_badges systemreport has been deprecated and merged with the badges systemreport. Please, use the badges systemreport instead.
23   For more information see [MDL-82503](https://tracker.moodle.org/browse/MDL-82503)
24 - The $showmanage parameter in the core_badges\output\standard_action_bar constructor has been deprecated and should not be used anymore.
26   For more information see [MDL-82503](https://tracker.moodle.org/browse/MDL-82503)
27 - The badges/view.php page has been deprecated and merged with badges/index.php. Please, use badges/index.php instead.
29   For more information see [MDL-82503](https://tracker.moodle.org/browse/MDL-82503)
31 #### Removed
33 - Final removal of BADGE_BACKPACKAPIURL and BADGE_BACKPACKWEBURL.
35   For more information see [MDL-70983](https://tracker.moodle.org/browse/MDL-70983)
37 #### Added
39 - New webservices enable_badges and disable_badges have been added.
41   For more information see [MDL-82168](https://tracker.moodle.org/browse/MDL-82168)
43 #### Changed
45 - Added fields `recipientid` and `recipientfullname` to `user_badge_exporter`, which is used in the return structure of external functions `core_badges_get_user_badge_by_hash` and `core_badges_get_user_badges`.
47   For more information see [MDL-82742](https://tracker.moodle.org/browse/MDL-82742)
49 ### core
51 #### Removed
53 - The previously deprecated function `search_generate_text_SQL` has been removed and can no longer be used.
55   For more information see [MDL-48940](https://tracker.moodle.org/browse/MDL-48940)
56 - The previously deprecated function `core_text::reset_caches()` has been removed and can no longer be used.
58   For more information see [MDL-71748](https://tracker.moodle.org/browse/MDL-71748)
59 - The following previously deprecated methods have been removed and can no longer be used:
60     - `renderer_base::should_display_main_logo`
62   For more information see [MDL-73165](https://tracker.moodle.org/browse/MDL-73165)
63 - Final deprecation of print_error(). Use moodle_exception instead.
65   For more information see [MDL-74484](https://tracker.moodle.org/browse/MDL-74484)
66 - Final deprecation of \core\task\manager::ensure_adhoc_task_qos()
68   For more information see [MDL-74843](https://tracker.moodle.org/browse/MDL-74843)
69 - Support for deprecated `<component>\local\views\secondary` block/activity namespace, for overriding secondary navigation, is now entirely removed
71   For more information see [MDL-74939](https://tracker.moodle.org/browse/MDL-74939)
72 - Remove deprecation layer for YUI Events. The deprecation layer was introduced with MDL-70990 and MDL-72291.
74   For more information see [MDL-77167](https://tracker.moodle.org/browse/MDL-77167)
76 #### Deprecated
78 - The following method has been deprecated and should no longer be used: `reset_password_and_mail`. Please consider using `setnew_password_and_mail` as a replacement.
80   For more information see [MDL-64148](https://tracker.moodle.org/browse/MDL-64148)
81 - - Final deprecation and removal of the following functions:
82     - `plagiarism_plugin::get_configs()`
83     - `plagiarism_plugin::get_file_results()`
84     - `plagiarism_plugin::update_status()`, please use `{plugin name}_before_standard_top_of_body_html` instead.
85   - Final deprecation and removal of `plagiarism_get_file_results()`. Please use `plagiarism_get_links()` instead. - Final deprecation and removal of `plagiarism_update_status()`. Please use `{plugin name}_before_standard_top_of_body_html()` instead.
87   For more information see [MDL-71326](https://tracker.moodle.org/browse/MDL-71326)
88 - `moodle_list` and `list_item` were only used by `qbank_managecategories`, and these usages have been removed, so these classes (and thus all of listlib.php) are now deprecated. This method was the only usage of the `QUESTION_PAGE_LENGTH` constant, which was defined in `question_category_object.php`, and so is also now deprecated.
90   For more information see [MDL-72397](https://tracker.moodle.org/browse/MDL-72397)
91 - Deprecate timeout in navigation_cache constructor and clean up unused properties
93   For more information see [MDL-79628](https://tracker.moodle.org/browse/MDL-79628)
94 - The following methods have been deprecated, existing usage should switch to secure `\core\encryption` library:
95   - `rc4encrypt`
96   - `rc4decrypt`
97   - `endecrypt`
99   For more information see [MDL-81940](https://tracker.moodle.org/browse/MDL-81940)
100 - The following method has been deprecated and should not be used any longer: `print_grade_menu`.
102   For more information see [MDL-82157](https://tracker.moodle.org/browse/MDL-82157)
103 - The following files and their contents have been deprecated:
104   - `lib/soaplib.php`
105   - `lib/tokeniserlib.php`
107   For more information see [MDL-82191](https://tracker.moodle.org/browse/MDL-82191)
108 - The following methods have been formally deprecated:
109   - `get_core_subsystems`
110   - `get_plugin_types`
111   - `get_plugin_list`
112   - `get_plugin_list_with_class`
113   - `get_plugin_directory`
114   - `normalize_component`
115   - `get_component_directory`
116   - `get_context_instance`
117   Note: These methods have been deprecated for a long time, but previously did not emit any deprecation notice.
119   For more information see [MDL-82287](https://tracker.moodle.org/browse/MDL-82287)
120 - The following methods have been finally deprecated and will now throw an exception if called:
121   - `get_context_instance`
122   - `can_use_rotated_text`
123   - `get_system_context`
124   - `print_arrow`
126   For more information see [MDL-82287](https://tracker.moodle.org/browse/MDL-82287)
127 - The global_navigation::load_section_activities method is now deprecated and replaced by global_navigation::load_section_activities_navigation.
129   For more information see [MDL-82845](https://tracker.moodle.org/browse/MDL-82845)
131 #### Added
133 - Add \core_user::get_name_placeholders() to return an array of user name fields.
135   For more information see [MDL-64148](https://tracker.moodle.org/browse/MDL-64148)
136 - The following classes have been renamed and now support autoloading.
137   Existing classes are currently unaffected.
138   | Old class name | New class name |
139   | --- | --- |
140   | `\core_component` | `\core\component` |
142   For more information see [MDL-66903](https://tracker.moodle.org/browse/MDL-66903)
143 - Added the ability for unit tests to autoload classes in the `\[component]\tests\`
144   namespace from the `[path/to/component]/tests/classes` directory.
146   For more information see [MDL-66903](https://tracker.moodle.org/browse/MDL-66903)
147 - Added a helper to load fixtures from a components `tests/fixtures/` folder:
148   ```php
149   advanced_testcase::load_fixture(string $component, string $fixture): void;
150   ```
152   For more information see [MDL-66903](https://tracker.moodle.org/browse/MDL-66903)
153 - Redis session cache has been improved to make a single call where two were used before.
154    - The minimum Redis server version is now 2.6.12.
155    - The minimum PHP Redis extension version is now 2.2.4.
157   For more information see [MDL-69684](https://tracker.moodle.org/browse/MDL-69684)
158 - Added stored progress bars
160   For more information see [MDL-70854](https://tracker.moodle.org/browse/MDL-70854)
161 - Two new functions have been introduced in the \moodle_database class:
162   - `get_counted_records_sql()`
163   - `get_counted_recordset_sql()`
164   These methods are compatible with all databases.
165   They will check the current running database engine and apply the COUNT window function if it is supported,
166   otherwise, they will use the usual COUNT function.
167   The COUNT window function optimization is applied to the following databases:
168   - PostgreSQL
169   - MariaDB
170   - Oracle
171   MySQL and SQL Server do not use this optimization due to insignificant performance differences before and
172   after the improvement.
174   For more information see [MDL-78030](https://tracker.moodle.org/browse/MDL-78030)
175 - The `after_config()` callback has been converted to a hook, `\core\hook\after_config`.
177   For more information see [MDL-79011](https://tracker.moodle.org/browse/MDL-79011)
178 - The core\output\select_menu widget now supports rendering dividers between menu options. Empty elements (null or empty strings) within the array of options are considered and rendered as dividers in the dropdown menu.
180   For more information see [MDL-80747](https://tracker.moodle.org/browse/MDL-80747)
181 - The `core\output\select_menu` widget now supports a new feature: inline labels. You can render the label inside the combobox widget by passing `true` to the `$inlinelabel` parameter when calling the `->set_label()` method.
183   For more information see [MDL-80747](https://tracker.moodle.org/browse/MDL-80747)
184 - A new hook called `core\hook\output\after_http_headers` has been created. This hook allow plugins to modify the content after headers are sent.
186   For more information see [MDL-80890](https://tracker.moodle.org/browse/MDL-80890)
187 - The following classes have been renamed.
188   Existing classes are currently unaffected.
189   | Old class name | New class name |
190   | --- | --- |
191   | `\core_user` | `\core\user` |
193   For more information see [MDL-81031](https://tracker.moodle.org/browse/MDL-81031)
194 - New DML constant `SQL_INT_MAX` to define the size of a large integer with cross database platform support
196   For more information see [MDL-81282](https://tracker.moodle.org/browse/MDL-81282)
197 - The function update_display_mode will update the eye icon (enabled/disabled) in the availability. The $pluginname is represented to the plugin need to update. The $displaymode is represented to the eye icon. Whether it enabled or disabled.
199   For more information see [MDL-81533](https://tracker.moodle.org/browse/MDL-81533)
200 - Added an `exception` L2 Namespace to APIs
202   For more information see [MDL-81903](https://tracker.moodle.org/browse/MDL-81903)
203 - Added a mechanism to support autoloading of legacy class files.
204   This will help to reduce the number of require_once calls in the codebase, and move away from the use of monolithic libraries.
206   For more information see [MDL-81919](https://tracker.moodle.org/browse/MDL-81919)
207 - The following exceptions are now also available in the `\core\exception` namespace:
208     - `\coding_exception`
209     - `\file_serving_exception`
210     - `\invalid_dataroot_permissions`
211     - `\invalid_parameter_exception`
212     - `\invalid_response_exception`
213     - `\invalid_state_exception`
214     - `\moodle_exception`
215     - `\require_login_exception`
216     - `\require_login_session_timeout_exception`
217     - `\required_capability_exception`
218     - `\webservice_parameter_exception`
220   For more information see [MDL-81919](https://tracker.moodle.org/browse/MDL-81919)
221 - The following classes have been moved into the `\core` namespace and now support autoloading:
222   - `emoticon_manager`
223   - `lang_string`
225   For more information see [MDL-81920](https://tracker.moodle.org/browse/MDL-81920)
226 - The following classes have been renamed and now support autoloading. Existing classes are currently unaffected.
227   | Old class name | New class name |
228   | --- | --- |
229   | `\moodle_url` | `\core\url` |
230   | `\progress_trace` | `\core\output\progress_trace` |
231   | `\combined_progress_trace` | `\core\output\progress_trace\combined_progress_trace` |
232   | `\error_log_progress_trace` | `\core\output\progress_trace\error_log_progress_trace` |
233   | `\html_list_progress_trace` | `\core\output\progress_trace\html_list_progress_trace` |
234   | `\html_progress_trace` | `\core\output\progress_trace\html_progress_trace` |
235   | `\null_progress_trace` | `\core\output\progress_trace\null_progress_trace` |
236   | `\progress_trace_buffer` | `\core\output\progress_trace\progress_trace_buffer` |
237   | `\text_progress_trace` | `\core\output\progress_trace\text_progress_trace` |
239   For more information see [MDL-81960](https://tracker.moodle.org/browse/MDL-81960)
240 - The following classes are now also available in the following new locations. They will continue to work in their old locations:
241   | Old classname | New classname |
242   | --- | --- |
243   | `\action_link` | `\core\output\action_link` |
244   | `\action_menu_filler` | `\core\output\action_menu\filler` |
245   | `\action_menu_link_primary` | `\core\output\action_menu\link_primary` |
246   | `\action_menu_link_secondary` | `\core\output\action_menu\link_secondary` |
247   | `\action_menu_link` | `\core\output\action_menu\link` |
248   | `\action_menu` | `\core\output\action_menu` |
249   | `\block_contents` | `\core_block\output\block_contents` |
250   | `\block_move_target` | `\core_block\output\block_move_target` |
251   | `\component_action` | `\core\output\actions\component_action` |
252   | `\confirm_action` | `\core\output\actions\confirm_action` |
253   | `\context_header` | `\core\output\context_header` |
254   | `\core\output\local\action_menu\subpanel` | `\core\output\action_menu\subpanel` |
255   | `\core_renderer_ajax` | `\core\output\core_renderer_ajax` |
256   | `\core_renderer_cli` | `\core\output\core_renderer_cli` |
257   | `\core_renderer_maintenance` | `\core\output\core_renderer_maintenance` |
258   | `\core_renderer` | `\core\output\core_renderer` |
259   | `\custom_menu_item` | `\core\output\custom_menu_item` |
260   | `\custom_menu` | `\core\output\custom_menu` |
261   | `\file_picker` | `\core\output\file_picker` |
262   | `\flexible_table` | `\core_table\flexible_table` |
263   | `\fragment_requirements_manager` | `\core\output\requirements\fragment_requirements_manager` |
264   | `\help_icon` | `\core\output\help_icon` |
265   | `\html_table_cell` | `\core_table\output\html_table_cell` |
266   | `\html_table_row` | `\core_table\output\html_table_row` |
267   | `\html_table` | `\core_table\output\html_table` |
268   | `\html_writer` | `\core\output\html_writer` |
269   | `\image_icon` | `\core\output\image_icon` |
270   | `\initials_bar` | `\core\output\initials_bar` |
271   | `\js_writer` | `\core\output\js_writer` |
272   | `\page_requirements_manager` | `\core\output\requirements\page_requirements_manager` |
273   | `\paging_bar` | `\core\output\paging_bar` |
274   | `\pix_emoticon` | `\core\output\pix_emoticon` |
275   | `\pix_icon_font` | `\core\output\pix_icon_font` |
276   | `\pix_icon_fontawesome` | `\core\output\pix_icon_fontawesome` |
277   | `\pix_icon` | `\core\output\pix_icon` |
278   | `\plugin_renderer_base` | `\core\output\plugin_renderer_base` |
279   | `\popup_action` | `\core\output\actions\popup_action` |
280   | `\preferences_group` | `\core\output\preferences_group` |
281   | `\preferences_groups` | `\core\output\preferences_groups` |
282   | `\progress_bar` | `\core\output\progress_bar` |
283   | `\renderable` | `\core\output\renderable` |
284   | `\renderer_base` | `\core\output\renderer_base` |
285   | `\renderer_factory_base` | `\core\output\renderer_factory\renderer_factory_base` |
286   | `\renderer_factory` | `\core\output\renderer_factory\renderer_factory_interface` |
287   | `\single_button` | `\core\output\single_button` |
288   | `\single_select` | `\core\output\single_select` |
289   | `\standard_renderer_factory` | `\core\output\renderer_factory\standard_renderer_factory` |
290   | `\table_dataformat_export_format` | `\core_table\dataformat_export_format` |
291   | `\table_default_export_format_parent` | `\core_table\base_export_format` |
292   | `\table_sql` | `\core_table\sql_table` |
293   | `\tabobject` | `\core\output\tabobject` |
294   | `\tabtree` | `\core\output\tabtree` |
295   | `\templatable` | `\core\output\templatable` |
296   | `\theme_config` | `\core\output\theme_config` |
297   | `\theme_overridden_renderer_factory` | `\core\output\renderer_factory\theme_overridden_renderer_factory` |
298   | `\url_select` | `\core\output\url_select` |
299   | `\user_picture` | `\core\output\user_picture` |
300   | `\xhtml_container_stack` | `\core\output\xhtml_container_stack` |
301   | `\YUI_config` | `\core\output\requirements\yui` |
303   For more information see [MDL-82183](https://tracker.moodle.org/browse/MDL-82183)
304 - A new method, get_deprecated_icons(), has been added to the icon_system class. All deprecated icons should be registered through this method. Plugins can implement a callback to pluginname_get_deprecated_icons() to register their deprecated icons too. When $CFG->debugpageinfo is enabled, a console message will display a list of the deprecated icons.
306   For more information see [MDL-82212](https://tracker.moodle.org/browse/MDL-82212)
307 - Add optional icon and title to notification. Two parameters have been added to the `core\output\notification` so when creating a notification you can pass an icon and a title.
309   For more information see [MDL-82297](https://tracker.moodle.org/browse/MDL-82297)
310 - Add set_disabled_option method to url_select to enable or disable an option from its url (the key for the option).
312   For more information see [MDL-82490](https://tracker.moodle.org/browse/MDL-82490)
313 - There is a new method called `get_fixture_path()` that supports getting the path to the fixture
315   For more information see [MDL-82627](https://tracker.moodle.org/browse/MDL-82627)
316 - There is a new method called `get_mocked_http_client()` that supports mocking the `http_client`
318   For more information see [MDL-82627](https://tracker.moodle.org/browse/MDL-82627)
319 - The Moodle autoloader should now be registered using `\core\component::register_autoloader` rather than manually doing so in any exceptional location which requires it. It is not normally necessary to include the autoloader manually, as it is registered automatically when the Moodle environment is bootstrapped.
321   For more information see [MDL-82747](https://tracker.moodle.org/browse/MDL-82747)
322 - A new JS module for interacting with the Routed REST API has been introduced.
323   For more information see the documentation in the `core/fetch` module.
325   For more information see [MDL-82778](https://tracker.moodle.org/browse/MDL-82778)
326 - The section_info class now includes a new method called get_sequence_cm_infos that retrieves all cm_info instances associated with the course section.
328   For more information see [MDL-82845](https://tracker.moodle.org/browse/MDL-82845)
330 #### Fixed
332 - The `navigation_cache` class now uses the Moodle Universal Cache (MUC) to store the navigation cache data instead of storing it in the global `$SESSION` variable.
334   For more information see [MDL-79628](https://tracker.moodle.org/browse/MDL-79628)
335 - All the setup and tear down methods of `PHPUnit` now are required to, always, call to their parent counterparts. This is a good practice to avoid future problems, especially when updating to PHPUnit >= 10.
336   This includes the following methods:
337     - `setUp()`
338     - `tearDown()`
339     - `setUpBeforeClass()`
340     - `tearDownAfterClass()`
342   For more information see [MDL-81523](https://tracker.moodle.org/browse/MDL-81523)
343 - Use server timezone when constructing `\DateTimeImmutable` for the system `\core\clock` implementation.
345   For more information see [MDL-81894](https://tracker.moodle.org/browse/MDL-81894)
347 #### Changed
349 - The class autoloader has been moved to an earlier point in the Moodle bootstrap.
350   Autoloaded classes are now available to scripts using the `ABORT_AFTER_CONFIG` constant.
352   For more information see [MDL-80275](https://tracker.moodle.org/browse/MDL-80275)
353 - The `\core\dataformat::get_format_instance` method is now public, and can be used to retrieve a writer instance for a given dataformat
355   For more information see [MDL-81781](https://tracker.moodle.org/browse/MDL-81781)
356 - The `get_home_page()` method can now return new constant `HOMEPAGE_URL`, applicable when a third-party hook has extended the default homepage options for the site
357   A new method, `get_default_home_page_url()` has been added which will return the correct URL when this constant is returned
359   For more information see [MDL-82066](https://tracker.moodle.org/browse/MDL-82066)
361 ### core_reportbuilder
363 #### Added
365 - The return type of the `set_checkbox_toggleall` callback, defined by system reports, can now be null. Use if the checkbox should not be shown for the row.
367   For more information see [MDL-52046](https://tracker.moodle.org/browse/MDL-52046)
368 - System reports now support native entity column aggregation via each columns `set_aggregation()` method
370   For more information see [MDL-76392](https://tracker.moodle.org/browse/MDL-76392)
371 - The following external methods now return tags data relevant to each custom report:
372     - `core_reportbuilder_list_reports`
373     - `core_reportbuilder_retrieve_report`
375   For more information see [MDL-81433](https://tracker.moodle.org/browse/MDL-81433)
376 - Added a new database helper method `sql_replace_parameters` to help ensure uniqueness of parameters within a SQL expression
378   For more information see [MDL-81434](https://tracker.moodle.org/browse/MDL-81434)
379 - New format helper `format_time` method, for use in column callbacks that represent a duration of time (e.g. "3 days 4 hours")
381   For more information see [MDL-82466](https://tracker.moodle.org/browse/MDL-82466)
382 - Methods add_columns_from_entity(), add_filters_from_entity() and report_element_search() have been moved from \core_reportbuilder\datasource class to \core_reportbuilder\base class in order to be available also for system reports
384   For more information see [MDL-82529](https://tracker.moodle.org/browse/MDL-82529)
386 #### Removed
388 - Support for the following entity classes, renamed since 4.1, has now been removed completely:
389   - `core_admin\local\entities\task_log`
390   - `core_cohort\local\entities\cohort`
391   - `core_cohort\local\entities\cohort_member`
392   - `core_course\local\entities\course_category`
393   - `report_configlog\local\entities\config_change`
395   For more information see [MDL-74583](https://tracker.moodle.org/browse/MDL-74583)
396 - The following previously deprecated local helper methods have been removed and can no longer be used:
397     - `audience::get_all_audiences_menu_types`
398     - `report::get_available_columns`
400   For more information see [MDL-76690](https://tracker.moodle.org/browse/MDL-76690)
402 #### Changed
404 - In order to better support float values in filter forms, the following filter types now cast given SQL prior to comparison:
405     - `duration`
406     - `filesize`
407     - `number`
409   For more information see [MDL-81168](https://tracker.moodle.org/browse/MDL-81168)
410 - The base datasource `add_all_from_entities` method accepts a new optional parameter to specify which entities to add elements from
412   For more information see [MDL-81330](https://tracker.moodle.org/browse/MDL-81330)
413 - All time related code has been updated to the PSR-20 Clock interface, as such the following methods no longer accept a `$timenow` parameter (instead please use `\core\clock` dependency injection):
414   - `core_reportbuilder_generator::create_schedule`
415   - `core_reportbuilder\local\helpers\schedule::[create_schedule|calculate_next_send_time]`
417   For more information see [MDL-82041](https://tracker.moodle.org/browse/MDL-82041)
418 - The following classes have been moved to use the new exception API as a l2 namespace:
419   - `core_reportbuilder\\report_access_exception` => `core_reportbuilder\\exception\\report_access_exception` - `core_reportbuilder\\source_invalid_exception` => `core_reportbuilder\\exception\\source_invalid_exception` - `core_reportbuilder\\source_unavailable_exception` => `core_reportbuilder\\exception\\source_unavailable_exception`
421   For more information see [MDL-82133](https://tracker.moodle.org/browse/MDL-82133)
423 ### mod_assign
425 #### Added
427 - Added 2 new settings:
428     - `mod_assign/defaultgradetype`
429       - The value of this setting dictates which of the GRADE_TYPE_X constants is the default option when creating new instances of the assignment.
430       - The default value is GRADE_TYPE_VALUE (Point)
431     - `mod_assign/defaultgradescale`
432       - The value of this setting dictates which of the existing scales is the default option when creating new instances of the assignment.
434   For more information see [MDL-54105](https://tracker.moodle.org/browse/MDL-54105)
435 - A new default value for `attemptreopenmethod` has been set to "Automatically until pass".
437   For more information see [MDL-80741](https://tracker.moodle.org/browse/MDL-80741)
438 - A new method named `get_grading_batch_operation_details` has been added to the `assign_feedback_plugin` abstract class. Assignment feedback plugins can now override this method to define bulk action buttons that will appear in the sticky footer on the assignment grading page.
440   For more information see [MDL-80750](https://tracker.moodle.org/browse/MDL-80750)
442 #### Removed
444 - The default option "Never" for `attemptreopenmethod` setting, which disallowed multiple attempts at the assignment, has been removed. This option was unnecessary because limiting attempts to 1 through the `maxattempts` setting achieves the same behavior.
446   For more information see [MDL-80741](https://tracker.moodle.org/browse/MDL-80741)
448 #### Deprecated
450 - The constant `ASSIGN_ATTEMPT_REOPEN_METHOD_NONE` has been deprecated, and a new default value for `attemptreopenmethod` has been set to "Automatically until pass".
452   For more information see [MDL-80741](https://tracker.moodle.org/browse/MDL-80741)
453 - The `assign_feedback_plugin::get_grading_batch_operations` method is now deprecated. Use `assign_feedback_plugin::get_grading_batch_operation_details` instead.
455   For more information see [MDL-80750](https://tracker.moodle.org/browse/MDL-80750)
456 - The `assign_grading_table::plugingradingbatchoperations` property is removed. You can use `assign_feedback_plugin::get_grading_batch_operation_details` instead.
458   For more information see [MDL-80750](https://tracker.moodle.org/browse/MDL-80750)
459 - The `$submissionpluginenabled` and `$submissioncount` parameters from the constructor of the `mod_assign\output::grading_actionmenu` class have been deprecated.
461   For more information see [MDL-80752](https://tracker.moodle.org/browse/MDL-80752)
462 - Method assign_grading_table::col_picture has been deprecated.
464   For more information see [MDL-82292](https://tracker.moodle.org/browse/MDL-82292)
465 - Method assign_grading_table::col_userid has been deprecated.
467   For more information see [MDL-82295](https://tracker.moodle.org/browse/MDL-82295)
468 - The mod_assign_grading_options_form class has been deprecated since it is no longer used.
470   For more information see [MDL-82857](https://tracker.moodle.org/browse/MDL-82857)
472 ### core_role
474 #### Added
476 - Move all session management to the \core\session\manager class.
477   This removes the dependancy to use the "sessions" table.
478   Session management plugins (like redis) now need to inherit
479   the base \core\session\handler class which implements
480   SessionHandlerInterface and override methods as required.
481   The following methods in \core\session\manager have been deprecated:
482   * kill_all_sessions use destroy_all instead
483   * kill_session use destroy instead
484   * kill_sessions_for_auth_plugin use destroy_by_auth_plugin instead
485   * kill_user_sessions use destroy_user_sessions instead
487   For more information see [MDL-66151](https://tracker.moodle.org/browse/MDL-66151)
489 ### tool_oauth2
491 #### Added
493 - The `get_additional_login_parameters()` method now supports adding the language code to the authentication request so that the OAuth2 login page matches the language in Moodle.
495   For more information see [MDL-67554](https://tracker.moodle.org/browse/MDL-67554)
497 ### core_user
499 #### Added
501 - New '\core_user\hook\extend_user_menu' hook added to allow third party plugin to extend the user menu navigation
503   For more information see [MDL-71823](https://tracker.moodle.org/browse/MDL-71823)
504 - New `\core_user\hook\extend_default_homepage` hook added to allow third-party plugins to extend the default homepage options for the site
506   For more information see [MDL-82066](https://tracker.moodle.org/browse/MDL-82066)
508 #### Deprecated
510 - The participants_search::get_total_participants_count() is no longer used since the total count can be obtained from ::get_participants()
512   For more information see [MDL-78030](https://tracker.moodle.org/browse/MDL-78030)
514 #### Changed
516 - The visibility of the methods: check_access_for_dynamic_submission() and get_options() in core_user\form\private_files has been changed from protected to public.
518   For more information see [MDL-78293](https://tracker.moodle.org/browse/MDL-78293)
519 - The user profile field `display_name()` method now accepts an optional `$escape` parameter to define whether to escape the returned name
521   For more information see [MDL-82494](https://tracker.moodle.org/browse/MDL-82494)
523 ### report
525 #### Removed
527 - The previously deprecated `report_helper::save_selected_report` method has been removed and can no longer be used
529   For more information see [MDL-72353](https://tracker.moodle.org/browse/MDL-72353)
531 #### Changed
533 - The `report_helper::print_report_selector` method accepts an additional argument for adding content to the tertiary navigation to align with the report selector
535   For more information see [MDL-78773](https://tracker.moodle.org/browse/MDL-78773)
537 ### qbank_managecategories
539 #### Deprecated
541 - question_category_list and question_category_list_item are no longer used, and are deprecated. Category lists are now generated by templates.
543   For more information see [MDL-72397](https://tracker.moodle.org/browse/MDL-72397)
544 - The methods `question_is_only_child_of_top_category_in_context`, `question_is_top_category` and `question_can_delete_cat` from `qbank_managecategories\helper` class have been deprecated and moved to the `\core_question\category_manager` class, minus the misleading `question_` prefix. Following the creation of this class, it does not make sense for them to live inside the `qbank_managecategories` plugin.
546   For more information see [MDL-72397](https://tracker.moodle.org/browse/MDL-72397)
547 - `qbank_managecategories\question_category_object` is now completely deprecated. Its methods have either been migrated to `qbank_managecategories\question_categories`, `core_question\category_manager`, or are no longer used at all.
549   For more information see [MDL-72397](https://tracker.moodle.org/browse/MDL-72397)
551 #### Changed
553 - The methods in the `question_category_object` class that are still required following this change have been split between `\qbank_managecategories\question_categories` (for the parts used within this plugin for display a list of categories) and `\core_question\category_manager` (for the parts used for generate CRUD operations on question categories, including outside of this plugin). This will allow `question_category_object` to be deprecated, and avoids other parts of the system wishing to manipulate question categories from having to violate cross-component communication rules.
555   For more information see [MDL-72397](https://tracker.moodle.org/browse/MDL-72397)
557 ### mod_feedback
559 #### Deprecated
561 - The `feedback_check_is_switchrole` method has been deprecated as it didn't work
563   For more information see [MDL-72424](https://tracker.moodle.org/browse/MDL-72424)
564 - The method `mod_feedback\output\renderer::create_template_form()` has been deprecated. It is not used anymore.
566   For more information see [MDL-81742](https://tracker.moodle.org/browse/MDL-81742)
568 ### repository_onedrive
570 #### Removed
572 - The following previously deprecated methods have been removed and can no longer be used:
573   - `can_import_skydrive_files`
574   - `import_skydrive_files`
576   For more information see [MDL-72620](https://tracker.moodle.org/browse/MDL-72620)
578 ### report_eventlist
580 #### Deprecated
582 - The following deprecated methods in `report_eventlist_list_generator` have been removed:
583   - `get_core_events_list()`
584   - `get_non_core_event_list()`
586   For more information see [MDL-72786](https://tracker.moodle.org/browse/MDL-72786)
588 ### core_message
590 #### Removed
592 - Final deprecation MESSAGE_DEFAULT_LOGGEDOFF / MESSAGE_DEFAULT_LOGGEDIN.
594   For more information see [MDL-73284](https://tracker.moodle.org/browse/MDL-73284)
596 #### Changed
598 - The `\core_message\helper::togglecontact_link_params` now accepts a new optional param called `isrequested` to indicate the status of the contact request
600   For more information see [MDL-81428](https://tracker.moodle.org/browse/MDL-81428)
602 #### Deprecated
604 - The `core_message/remove_contact_button` template is deprecated and will be removed in the future version
606   For more information see [MDL-81428](https://tracker.moodle.org/browse/MDL-81428)
608 ### core_course
610 #### Removed
612 - The previously deprecated `print_course_request_buttons` method has been removed and can no longer be used
614   For more information see [MDL-73976](https://tracker.moodle.org/browse/MDL-73976)
615 - The $course class property in the core_course\output\actionbar\group_selector class has been removed.
617   For more information see [MDL-82393](https://tracker.moodle.org/browse/MDL-82393)
619 #### Added
621 - - New optional sectionNum parameter has been added to activitychooser AMD module initializer. - New option sectionnum parameter has been added to get_course_content_items() external function. - New optional sectionnum parameter has been added to get_content_items_for_user_in_course() function.
623   For more information see [MDL-81675](https://tracker.moodle.org/browse/MDL-81675)
624 - Webservices `core_course_get_courses_by_field` now accepts a new parameter `sectionid` to be able to retrieve the course that has the indicated section
626   For more information see [MDL-81699](https://tracker.moodle.org/browse/MDL-81699)
627 - Added new 'activitychooserbutton' output class to display the activitychooser button. New action_links can be added to the button via hooks converting it into a dropdown.
629   For more information see [MDL-81767](https://tracker.moodle.org/browse/MDL-81767)
630 - New `core_course\hook\before_activitychooserbutton_exported` hook added to allow third-party plugins to extend activity chooser button options
632   For more information see [MDL-81767](https://tracker.moodle.org/browse/MDL-81767)
633 - i_open_section_edit_menu(), i_show_section(), i_hide_section(), i_wait_until_section_is_available(), show_section_link_exists(), hide_section_link_exists() and section_exists() functions have been improved to accept not only section number but also section name.
635   For more information see [MDL-82259](https://tracker.moodle.org/browse/MDL-82259)
637 #### Deprecated
639 - The data-sectionid attribute in the activity chooser has been deprecated. Please update your code to use data-sectionnum instead.
641   For more information see [MDL-81676](https://tracker.moodle.org/browse/MDL-81676)
642 - The $course parameter in the constructor of the core_course\output\actionbar\group_selector class has been deprecated and is no longer used.
644   For more information see [MDL-82393](https://tracker.moodle.org/browse/MDL-82393)
646 #### Changed
648 - The reset course page has been improved. The words "Delete" and "Remove" have been removed from all the options to make it easier to focus on the data to be removed and avoid inconsistencies and duplicated information. Third party plugins implementing reset methods might need to:
649   - Add static element in the _reset_course_form_definition method before all the options with the Delete string:
650       `$mform->addElement('static', 'assigndelete', get_string('delete'));`
651   - Review all the strings used in the reset page to remove the "Delete" or "Remove" words from them.
653   For more information see [MDL-81872](https://tracker.moodle.org/browse/MDL-81872)
654 - The external function core_course::get_course_contents now returns the component and itemid of sections.
656   For more information see [MDL-82385](https://tracker.moodle.org/browse/MDL-82385)
658 ### theme
660 #### Removed
662 - Removed all references to iconhelp, icon-pre, icon-post, iconlarge, and iconsort classes
664   For more information see [MDL-74251](https://tracker.moodle.org/browse/MDL-74251)
666 #### Added
668 - New `core/context_header` mustache template has been added. This template can be overridden by themes to modify the context header
670   For more information see [MDL-81597](https://tracker.moodle.org/browse/MDL-81597)
672 #### Deprecated
674 - The method `\core\output\core_renderer::render_context_header` has been deprecated please use `\core\output\core_renderer::render($contextheader)` instead
676   For more information see [MDL-82160](https://tracker.moodle.org/browse/MDL-82160)
678 ### core_grades
680 #### Removed
682 - The following previously deprecated Behat step helper methods have been removed and can no longer be used:
683    - `behat_grade::select_in_gradebook_navigation_selector`
684    - `behat_grade::select_in_gradebook_tabs`
686   For more information see [MDL-74581](https://tracker.moodle.org/browse/MDL-74581)
688 #### Changed
690 - The grade `itemname` property contained in the return structure of the following external methods is now PARAM_RAW:
691     - `core_grades_get_gradeitems`
692     - `gradereport_user_get_grade_items`
694   For more information see [MDL-80017](https://tracker.moodle.org/browse/MDL-80017)
696 #### Deprecated
698 - The behat step definition behat_grade::i_confirm_in_search_within_the_gradebook_widget_exists has been deprecated. Please use behat_general::i_confirm_in_search_combobox_exists instead.
700   For more information see [MDL-80744](https://tracker.moodle.org/browse/MDL-80744)
701 - The behat step definition behat_grade::i_confirm_in_search_within_the_gradebook_widget_does_not_exist has been deprecated. Please use behat_general::i_confirm_in_search_combobox_does_not_exist instead.
703   For more information see [MDL-80744](https://tracker.moodle.org/browse/MDL-80744)
704 - The behat step definition behat_grade::i_click_on_in_search_widget has been deprecated. Please use behat_general::i_click_on_in_search_combobox instead.
706   For more information see [MDL-80744](https://tracker.moodle.org/browse/MDL-80744)
707 - The `core_grades_renderer::group_selector()` method has been deprecated. Please use `\core_course\output\actionbar\renderer` to render a `group_selector` renderable instead.
709   For more information see [MDL-80745](https://tracker.moodle.org/browse/MDL-80745)
711 ### core_backup
713 #### Removed
715 - Final deprecation and removal of core_backup\copy\copy in backup/util/ui/classes/copy.php. Please use copy_helper from backup/util/helper/copy_helper.class.php instead.
717   For more information see [MDL-75022](https://tracker.moodle.org/browse/MDL-75022)
718 - Final deprecation of base_controller::get_copy(). Please use restore_controller::get_copy() instead.
720   For more information see [MDL-75025](https://tracker.moodle.org/browse/MDL-75025)
721 - Final deprecation of base_controller::set_copy(). Please use a restore controller for storing copy information instead.
723   For more information see [MDL-75025](https://tracker.moodle.org/browse/MDL-75025)
725 ### core_files
727 #### Added
729 - The following are the changes made:
730   - New hook after_file_created
731   - In the \core_files\file_storage, new additional param $notify (default is true) added to:
732     - ::create_file_from_storedfile()
733     - ::create_file_from_pathname()
734     - ::create_file_from_string()
735     - ::create_file()
736     If true, it will trigger the after_file_created hook to re-create the image.
738   For more information see [MDL-75850](https://tracker.moodle.org/browse/MDL-75850)
740 ### core_question
742 #### Added
744 - A new utility function `format_question_fragment` has been created so that question content can filter based on filters.
746   For more information see [MDL-78662](https://tracker.moodle.org/browse/MDL-78662)
748 #### Changed
750 - column_base::from_column_name now has an ignoremissing field, which can be used to ignore if the class does not exist, instead of throwing an exception.
752   For more information see [MDL-81125](https://tracker.moodle.org/browse/MDL-81125)
754 ### tool
756 #### Removed
758 - The Convert to InnoDB plugin (tool_innodb) has been completely removed.
760   For more information see [MDL-78776](https://tracker.moodle.org/browse/MDL-78776)
762 ### core_webservice
764 #### Deprecated
766 - The `token_table` and `token_filter` classes have been deprecated, in favour of new report builder implementation.
768   For more information see [MDL-79496](https://tracker.moodle.org/browse/MDL-79496)
770 ### quiz
772 #### Added
774 - The functions quiz_overview_report::regrade_attempts and regrade_batch_of_attempts now have a new optional parameter $slots to only regrade some slots in each attempt (default all).
776   For more information see [MDL-79546](https://tracker.moodle.org/browse/MDL-79546)
778 ### gradereport_grader
780 #### Deprecated
782 - The `gradereport_grader/group` ESM has been deprecated. Please use `core_course/actionbar/group` instead.
784   For more information see [MDL-80745](https://tracker.moodle.org/browse/MDL-80745)
786 ### gradereport_singleview
788 #### Deprecated
790 - The `gradereport_singleview/group` ESM has been deprecated. Please use `core_course/actionbar/group` instead.
792   For more information see [MDL-80745](https://tracker.moodle.org/browse/MDL-80745)
794 ### gradereport_user
796 #### Deprecated
798 - The `gradereport_user/group` ESM has been deprecated. Please use `core_course/actionbar/group` instead.
800   For more information see [MDL-80745](https://tracker.moodle.org/browse/MDL-80745)
802 ### core_table
804 #### Added
806 - A new `$reponsive` property (defaulting to `true`) has been added to the `core_table\flexible_table` class.
807   This property allows you to control whether the table is rendered as a responsive table.
809   For more information see [MDL-80748](https://tracker.moodle.org/browse/MDL-80748)
811 #### Changed
813 - `core_table\dynamic` declares a new method `::has_capability()` to allow classes implementing this interface to perform access checks on the dynamic table. This is a breaking change that all dynamic table implementations must implement for continued functionality.
815   For more information see [MDL-82567](https://tracker.moodle.org/browse/MDL-82567)
817 ### mod_data
819 #### Added
821 - The `data_add_record` method accepts a new `$approved` parameter to set the corresponding state of the new record
823   For more information see [MDL-81274](https://tracker.moodle.org/browse/MDL-81274)
825 #### Deprecated
827 - The `mod_data_renderer::render_fields_footer` method has been deprecated as it's no longer used
829   For more information see [MDL-81321](https://tracker.moodle.org/browse/MDL-81321)
831 ### core_admin
833 #### Added
835 - Add availability_management_table is a table which extends from plugin_management_table. Create the availability_management_table can reusable the toggle button for enabled column.
837   For more information see [MDL-81533](https://tracker.moodle.org/browse/MDL-81533)
839 ### editor_tiny
841 #### Changed
843 - The `helplinktext` language string is no longer required by editor plugins, instead the `pluginname` will be used in the help dialogue
845   For more information see [MDL-81572](https://tracker.moodle.org/browse/MDL-81572)
847 ### output
849 #### Added
851 - Added a new `renderer_base::get_page` getter method
853   For more information see [MDL-81597](https://tracker.moodle.org/browse/MDL-81597)
855 ### core_courseformat
857 #### Added
859 - The constructor of `core_courseformat\output\local\state\cm` has been updated to accept a new optional parameter, `$istrackeduser`.
860   If `istrackeduser` is pre-computed for the course module's course, it can be provided here to avoid an additional function call.
862   For more information see [MDL-81610](https://tracker.moodle.org/browse/MDL-81610)
863 - Added new 'create_module' webservice to create new module (with quickcreate feature) instances in the course.
865   For more information see [MDL-81767](https://tracker.moodle.org/browse/MDL-81767)
866 - New $disabled parameter has been added to select, select_optgroup and select_option html_writers to create disabled option elements.
868   For more information see [MDL-82146](https://tracker.moodle.org/browse/MDL-82146)
869 - New \core_courseformat\output\local\content\basecontrolmenu class has been created. Existing \core_courseformat\output\local\content\cm\controlmenu and \core_courseformat\output\local\content\section\controlmenu classes extend the new \core_courseformat\output\local\content\basecontrolmenu class.
871   For more information see [MDL-82510](https://tracker.moodle.org/browse/MDL-82510)
872 - New \core_courseformat\output\local\content\cm\delegatedcontrolmenu class has been created extending \core_courseformat\output\local\content\basecontrolmenu class to render delegated section action menu combining section and module action menu.
874   For more information see [MDL-82510](https://tracker.moodle.org/browse/MDL-82510)
876 ### core_completion
878 #### Changed
880 - get_overall_completion_state() function could also return COMPLETION_COMPLETE_FAIL and not only COMPLETION_COMPLETE and COMPLETION_INCOMPLETE
882   For more information see [MDL-81749](https://tracker.moodle.org/browse/MDL-81749)
884 #### Added
886 - A new FEATURE_COMPLETION plugin support constant has been added. In the future, this constant will be used to indicate when a plugin does not allow completion and it is enabled by default.
888   For more information see [MDL-83008](https://tracker.moodle.org/browse/MDL-83008)
890 ### mod
892 #### Added
894 - Added new FEATURE_QUICKCREATE for modules that can be quickly created in the course wihout filling a previous form.
896   For more information see [MDL-81767](https://tracker.moodle.org/browse/MDL-81767)
898 ### core_report
900 #### Added
902 - Report has been added to subsystem components list
904   For more information see [MDL-81771](https://tracker.moodle.org/browse/MDL-81771)
905 - New coursestructure output general class has been created
907   For more information see [MDL-81771](https://tracker.moodle.org/browse/MDL-81771)
909 ### theme_boost
911 #### Added
913 - Bridged theme-color-level using a new shift-color function to prepare for its deprecation in Boostrap 5.
915   For more information see [MDL-81816](https://tracker.moodle.org/browse/MDL-81816)
916 - Upon upgrading Font Awesome from version 4 to 6, the solid family was selected by default. However, FA6 includes additional families such as regular and brands. Support for these families has now been integrated, allowing icons defined with icon_system::FONTAWESOME to use them. Icons can add the FontAwesome family (fa-regular, fa-brands, fa-solid) near the icon name to display it using this styling.
918   For more information see [MDL-82210](https://tracker.moodle.org/browse/MDL-82210)
920 #### Changed
922 - Bootstrap .no-gutters class is no longer used, use .g-0  instead.
924   For more information see [MDL-81818](https://tracker.moodle.org/browse/MDL-81818)
925 - The `.page-header-headings` CSS class now has a background colour applied to the maintenance and secure layouts.
926   You may need to override this class in your maintenance and secure layouts if both of the following are true:
927   * Your theme plugin inherits from `theme_boost` and uses this CSS class
928   * Your theme plugin applies a different styling for the page header for the maintenance and secure layouts.
930   For more information see [MDL-83047](https://tracker.moodle.org/browse/MDL-83047)
932 ### availability
934 #### Changed
936 - The base class `info::get_groups` method has a `$userid` parameter to specify for which user you want to retrieve course groups (defaults to current user)
938   For more information see [MDL-81850](https://tracker.moodle.org/browse/MDL-81850)
940 ### core_communication
942 #### Changed
944 - The get_enrolled_users_for_course() method now accepts an additional argument that can filter only active enrolments.
946   For more information see [MDL-81951](https://tracker.moodle.org/browse/MDL-81951)
948 ### report_log
950 #### Added
952 - get_activities_list() function returns also an array of disabled elements, apart from the array of activities.
954   For more information see [MDL-82146](https://tracker.moodle.org/browse/MDL-82146)
956 ### core_cache
958 #### Added
960 - The following classes have been renamed and now support autoloading.
961   Existing classes are currently unaffected.
962   | Old class name | New class name |
963   | --- | --- |
964   | `\cache_definition` | `\core_cache\definition` |
965   | `\cache_request` | `\core_cache\request_cache` |
966   | `\cache_session` | `\core_cache\session_cache` |
967   | `\cache_cached_object` | `\core_cache\cached_object` |
968   | `\cache_config` | `\core_cache\config` |
969   | `\cache_config_writer` | `\core_cache\config_writer` |
970   | `\cache_config_disabled` | `\core_cache\disabled_config` |
971   | `\cache_disabled` | `\core_cache\disabled_cache` |
972   | `\config_writer` | `\core_cache\config_writer` |
973   | `\cache_data_source` | `\core_cache\data_source_interface` |
974   | `\cache_data_source_versionable` | `\core_cache\versionable_data_source_interface` |
975   | `\cache_exception` | `\core_cache\exception/cache_exception` |
976   | `\cache_factory` | `\core_cache\factory` |
977   | `\cache_factory_disabled` | `\core_cache\disabled_factory` |
978   | `\cache_helper` | `\core_cache\helper` |
979   | `\cache_is_key_aware` | `\core_cache\key_aware_cache_interface` |
980   | `\cache_is_lockable` | `\core_cache\lockable_cache_interface` |
981   | `\cache_is_searchable` | `\core_cache\searchable_cache_interface` |
982   | `\cache_is_configurable` | `\core_cache\configurable_cache_interface` |
983   | `\cache_loader` | `\core_cache\loader_interface` |
984   | `\cache_loader_with_locking` | `\core_cache\loader_with_locking_interface` |
985   | `\cache_lock_interface` | `\core_cache\cache_lock_interface` |
986   | `\cache_store` | `\core_cache\store` |
987   | `\cache_store_interface` | `\core_cache\store_interface` |
988   | `\cache_ttl_wrapper` | `\core_cache\ttl_wrapper` |
989   | `\cacheable_object` | `\core_cache\cacheable_object_interface` |
990   | `\cacheable_object_array` | `\core_cache\cacheable_object_array` |
991   | `\cache_definition_mappings_form` | `\core_cache\form/cache_definition_mappings_form` |
992   | `\cache_definition_sharing_form` | `\core_cache\form/cache_definition_sharing_form` |
993   | `\cache_lock_form` | `\core_cache\form/cache_lock_form` |
994   | `\cache_mode_mappings_form` | `\core_cache\form/cache_mode_mappings_form` |
996   For more information see [MDL-82158](https://tracker.moodle.org/browse/MDL-82158)
998 ### tool_behat
1000 #### Added
1002 - Behat tests are now checking for deprecated icons. This check can be disabled by using the --no-icon-deprecations option in the behat CLI.
1004   For more information see [MDL-82212](https://tracker.moodle.org/browse/MDL-82212)
1006 ### core_availability
1008 #### Removed
1010 - The previously deprecated renderer `render_core_availability_multiple_messages` method has been removed
1012   For more information see [MDL-82223](https://tracker.moodle.org/browse/MDL-82223)
1014 ### core_filters
1016 #### Added
1018 - Added support for autoloading of filters from `\filter_[filtername]\filter`. Existing classes should be renamed to use the new namespace.
1020   For more information see [MDL-82427](https://tracker.moodle.org/browse/MDL-82427)
1022 #### Deprecated
1024 - The `filter_manager::text_filtering_hash` method has been finally deprecated and removed.
1026   For more information see [MDL-82427](https://tracker.moodle.org/browse/MDL-82427)
1028 ### mod_bigbluebuttonbn
1030 #### Removed
1032 - Mobile support via plugin has been removed.
1034   For more information see [MDL-82447](https://tracker.moodle.org/browse/MDL-82447)
1036 #### Added
1038 - Added new meeting_info value to show presentation file on BBB activity page
1040   For more information see [MDL-82520](https://tracker.moodle.org/browse/MDL-82520)
1042 ### customfield_select
1044 #### Changed
1046 - The field controller `get_options` method now returns each option pre-formatted
1048   For more information see [MDL-82481](https://tracker.moodle.org/browse/MDL-82481)
1050 ### core_customfield
1052 #### Changed
1054 - The field controller `get_formatted_name()` method now accepts an optional `$escape` parameter to define whether to escape the returned name
1056   For more information see [MDL-82488](https://tracker.moodle.org/browse/MDL-82488)
1058 ### core_form
1060 #### Added
1062 - Previously, the 'duration' form field type would allow users to input positive or negative durations. However looking at all the uses, everyone was expecting this input type to only accept times >= 0 seconds, and almost no-one was bothering to write manual form validation, leading to subtle bugs. So now, by default this field type will validate the input value is not negative. If you need the previous behaviour, there is a new option 'allownegative' which you can set to true. (The default is false.)
1064   For more information see [MDL-82687](https://tracker.moodle.org/browse/MDL-82687)
1066 ### customfield_number
1068 #### Added
1070 - New 'customfield_number\hook\add_custom_providers' hook has been added.
1071   It allows automatic calculation of number course custom field.
1072   Added new class '\customfield_number\local\numberproviders\nofactivities'
1073   that allows to automatically calculate number of activities of a given
1074   type in a given course.
1075   Added new webservice customfield_number_recalculate_value to recalculate
1076   a value of number course custom field.
1077   Added 'customfield_number\task\cron' cron task that recalculates
1078   automatically calculated number course custom fields.
1080   For more information see [MDL-82715](https://tracker.moodle.org/browse/MDL-82715)
1082 ### core_external
1084 #### Changed
1086 - The external function core_webservice_external::get_site_info now returns the default home page URL when needed.
1088   For more information see [MDL-82844](https://tracker.moodle.org/browse/MDL-82844)