<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pholden</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pholden"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/Pholden"/>
	<updated>2026-04-24T06:48:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_Workplace_4.1_release_notes&amp;diff=64640</id>
		<title>Moodle Workplace 4.1 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_Workplace_4.1_release_notes&amp;diff=64640"/>
		<updated>2025-08-12T14:14:30Z</updated>

		<summary type="html">&lt;p&gt;Pholden: 4.1.20&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=4.1=&lt;br /&gt;
See our [https://docs.moodle.org/401/en/Moodle_Workplace_new_features Moodle Workplace 4.1 new features page] in the user documentation for an introduction to Moodle Workplace 4.1 with screenshots. &lt;br /&gt;
==Major features==&lt;br /&gt;
Moodle Workplace 4.1 is based on top of Moodle LMS 4.1 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace:&lt;br /&gt;
* &#039;&#039;&#039;Advanced tenant appearance settings&#039;&#039;&#039;: tenant branding now includes two more settings that were available in Workplace 3.11: Navigation bar and Primary button colours. We have added more granularity to the permissions to change the appearance of the tenant, so advanced settings such as custom SCSS can be restricted to specific roles.&lt;br /&gt;
* &#039;&#039;&#039;Improvement to Tenant-allocation rules in the Shared Space&#039;&#039;&#039;. We have added two new conditions (“Users is allocated to tenant” and “User is not allocated to tenant”) and one action (“Allocate to tenant”) to Shared Dynamic Rules, with this addition we simplify the tenant allocation workflows for Admins in multi-tenant Workplace sites.&lt;br /&gt;
* &#039;&#039;&#039;Migration of core_reportbuilder custom reports&#039;&#039;&#039;. Migration feature now supports import and export of Custom Reports using Moodle LMS native report sources.&lt;br /&gt;
* &#039;&#039;&#039;Improved My Teams support in the Workplace App&#039;&#039;&#039;. The new My Teams page now includes information about learning and tracking in the Workplace App. &lt;br /&gt;
=== Other interesting features ===&lt;br /&gt;
* Hide/mask description of Dynamic rules conditions and actions when current user is not able to edit them&lt;br /&gt;
* Improved how hidden courses are displayed in the My Courses and Program pages&lt;br /&gt;
* Added &amp;quot;department&amp;quot; to User profile field condition in Dynamic Rules&lt;br /&gt;
* New setting to disable Program Cover page&lt;br /&gt;
* New setting to hide &amp;quot;Dates&amp;quot; section in the course information popup&lt;br /&gt;
* Fixed bug with deleted appointments being listed in user calendar&lt;br /&gt;
* Archive course certificates during program reset&lt;br /&gt;
* Display a warning when changing a tab without saving a form&lt;br /&gt;
* Allow tenant admin to edit locked profile fields for users in their tenant&lt;br /&gt;
* Fixed a bug causing an exception when viewing program progress report as an organisation manager after program import&lt;br /&gt;
== Upgrade notes for 4.1 ==&lt;br /&gt;
=== Upgrade from LMS ===&lt;br /&gt;
If &amp;quot;$CFG-&amp;gt;forcewpsetup = true;&amp;quot; is set in config.php before upgrading Moodle LMS to Moodle Workplace 4.1, the upgrade process add ‘myinprogress’ and ‘myavailable’ blocks to the default dashboard, and reset the dashboard for all users.&lt;br /&gt;
=== Upgrade from Moodle Workplace 3.11 and 4.0 ===&lt;br /&gt;
On upgrade from Workplace 3.11 to 4.1 in one step, all appearance settings will be preserved excepting the Drawer colour, which doesn’t have any equivalent in 4.1.&lt;br /&gt;
&lt;br /&gt;
Note that in case the upgrade is performed in two steps (3.11 &amp;gt; 4.0 and 4.0 &amp;gt; 4.1), the Navigation bar and Primary button colours will not be preserved in the corresponding settings, but the values of the settings that were added as custom CSS on upgrade to 4.0 will still be available (see [[Moodle Workplace 4.0 release notes#Branding|Workplace 4.0 upgrade notes]]).&lt;br /&gt;
=== Deprecation ===&lt;br /&gt;
We have deprecated the following in 4.1:&lt;br /&gt;
* get_managed_users web and get_teams_tab_filters web service in tool_organisation; &lt;br /&gt;
* get_user_learning_statuses in tool_program.&lt;br /&gt;
* tool_wp/db class&lt;br /&gt;
=4.1.1=&lt;br /&gt;
Moodle Workplace 4.1.1 is based on top of Moodle LMS 4.1.1 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace. This is a very short release as we launched 4.1 one week ago, so it does only include a couple of minor bug fixes.&lt;br /&gt;
=== Interesting features and fixes ===&lt;br /&gt;
* Fixed bug blocking users without the capability to edit their own profile to access Program Pages&lt;br /&gt;
=4.1.2=&lt;br /&gt;
See our [https://docs.moodle.org/401/en/Moodle_Workplace_new_features#4.1.2 Moodle Workplace 4.1.2 new features page] in the user documentation for an introduction to Moodle Workplace 4.1.2 with screenshots. &lt;br /&gt;
==Major features==&lt;br /&gt;
Moodle Workplace 4.1.2 is based on top of Moodle LMS 4.1.2 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace:&lt;br /&gt;
=== Key highlights ===&lt;br /&gt;
&#039;&#039;(Available in 4.1.2 rolling only)&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Search, filtering and reporting improvements to the Team overview block&#039;&#039;&#039;:&lt;br /&gt;
** Quick filters that allow users to sort and filter data quickly within the Team overview block, making it easier to find the information they need.&lt;br /&gt;
** Access to full progress reports for certification, program, and course reports provide a comprehensive overview of each team member&#039;s learning progress&lt;br /&gt;
** Live search functionality that allows users to search for specific items in real-time within the Team overview block&lt;br /&gt;
** Warnings for overdue learning to provide notifications and reminders to users when they are falling behind on their coursework or certifications.&lt;br /&gt;
* &#039;&#039;&#039;Automatic branding enhancement for tenants&#039;&#039;&#039;: generate shades of grey automatically based on the tenant primary colour, to reinforce the brand identity while avoiding disturbing the experience.&lt;br /&gt;
* &#039;&#039;&#039;Improvements in Appointments:&#039;&#039;&#039;&lt;br /&gt;
** New expandable UI for session details and bookings, with consistent navigation and design across activity modules.&lt;br /&gt;
** New completion criteria based on attendance&lt;br /&gt;
* &#039;&#039;&#039;Improvements in Dynamic Rules&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;New action to end jobs&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;New action to assign users to learning plans&#039;&#039;&#039;&lt;br /&gt;
** Option to suspend user&#039;s allocation to programs and certifications&lt;br /&gt;
* &#039;&#039;&#039;New setting to lock shared department and position frameworks&#039;&#039;&#039;: only users with appropriate permissions can manage jobs within locked departments and position frameworks.&lt;br /&gt;
* &#039;&#039;&#039;Apply only allowed filters in Certificates:&#039;&#039;&#039; new feature for users to define allowed filters for certificates, so that only the ones specified by the user are applied to the PDF content.&lt;br /&gt;
=== Other improvements ===&lt;br /&gt;
&#039;&#039;(Available in 4.1.2 rolling only)&#039;&#039;&lt;br /&gt;
* Lock the Audience tab in Custom Pages and don’t include audiences in duplication of custom pages for users with no permission to locked departments and positions.&lt;br /&gt;
* Added back a link to Moodle LMS&#039;s user management page in Site Administration&lt;br /&gt;
* Maintain the order of blocks in courses when switching from Workplace List to topics course format during upgrade&lt;br /&gt;
* Introduce new data attributes to distinguish the tenant for better tenant customization&lt;br /&gt;
* Preserve the URL when switching tenants&lt;br /&gt;
=== Other interesting features and fixes ===&lt;br /&gt;
&#039;&#039;(Available in 4.1.2 rolling and 4.1.2 standard)&#039;&#039;&lt;br /&gt;
* Add the possibility for Certificate element plugins to have their own settings page&lt;br /&gt;
* Add course name to “My Certificates” list&lt;br /&gt;
* Fixed a bug that prevented the import of positions and departments into existing frameworks, preserving the hierarchy&lt;br /&gt;
* Fixed a bug where the completion status for courses was not displaying correctly on the Program Page&lt;br /&gt;
* Fixed a bug that prevented tenant administrators from viewing hidden user fields&lt;br /&gt;
* Legacy custom reports can no longer be created if custom reports are disabled site wide&lt;br /&gt;
== Upgrade notes for 4.1.2 ==&lt;br /&gt;
=== Block order is preserved when upgrading to 4.1 rolling only ===&lt;br /&gt;
In Workplace 4.0, the old Workplace List course format was replaced with topics course format (more details on [[Moodle Workplace 4.0 release notes#Course%20format%20.E2.80.9CWPList.E2.80.9D|Workplace 4.0 upgrade notes]]). As a consequence of that upgrade, order of blocks in course page might not be preserved (as per MDL-37240).&lt;br /&gt;
&lt;br /&gt;
If the order of the blocks in courses has been changed and needs to be preserved, please make sure to upgrade to 4.1.2 rolling.&lt;br /&gt;
=== New data attributes to identify the tenant ===&lt;br /&gt;
Workplace 4.1.2 (rolling only) includes two new HTML data attributes to help to customize the styles for specific tenants. The new attributes are &amp;lt;code&amp;gt;[data-tenantid=&amp;quot;{tenant_id}&amp;quot;]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[data-tenantidnumber=&amp;quot;{tenant_idnumber}&amp;quot;]&amp;lt;/code&amp;gt; (available when &amp;lt;code&amp;gt;idnumber&amp;lt;/code&amp;gt; is defined for the tenant)&lt;br /&gt;
=4.1.3=&lt;br /&gt;
See our [https://docs.moodle.org/401/en/Moodle_Workplace_new_features#4.1.3 Moodle Workplace 4.1.3 new features page] in the user documentation for an introduction to Moodle Workplace 4.1.3 with screenshots. &lt;br /&gt;
==Major features==&lt;br /&gt;
Moodle Workplace 4.1.3 is based on top of Moodle LMS 4.1.3 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace:&lt;br /&gt;
=== Key highlights ===&lt;br /&gt;
&#039;&#039;(Available in 4.1.3 rolling only)&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Support contact by tenant.&#039;&#039;&#039; Now it is possible to configure the support contact information (support contact, support URL and availability) at a tenant level, so different tenant can have their own support contact settings.&lt;br /&gt;
* T&#039;&#039;&#039;eam’s overdue learning warnings for managers&#039;&#039;&#039;. The team overview block in the My Teams page now displays a warning when there are people with overdue learning to their managers. This notice includes a link to the corresponding report.&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;&#039;User first login dynamic rule condition.&#039;&#039;&#039;&#039;&#039;&#039; Now it’s possible to create automations based on user’s first login.&lt;br /&gt;
=== Other improvements ===&lt;br /&gt;
&#039;&#039;(Available in 4.1.3 rolling only)&#039;&#039;&lt;br /&gt;
* Notify program creators when a course in the program when course completion is not set for courses with completion tracking enabled&lt;br /&gt;
* Add manager and department lead permissions to CSV import&lt;br /&gt;
=== Other interesting features and fixes ===&lt;br /&gt;
&#039;&#039;(Available in 4.1.3 rolling, 4.1.3 standard and 4.0.8)&#039;&#039;&lt;br /&gt;
* Fixed a bug causing appointment sessions being deleted after deleting another session.&lt;br /&gt;
* Fixed a bug that prevented assigning jobs in the upload user tool when using positions with duplicated idnumbers&lt;br /&gt;
* Fixed a bug in causing ad-hoc reports scheduled to be stuck endlessly&lt;br /&gt;
== Upgrade notes for 4.1.3 ==&lt;br /&gt;
Due to a fixed bug, the reports generated in the scheduled reports may now contain more data than they did before. We recommend reviewing your schedules and make sure that &amp;quot;View report as&amp;quot; is correct. For example, if the &amp;quot;View report as&amp;quot; is a global admin, the reports may contain cross-tenant data and they will be sent to all users in the schedules audiences, even those who do not normally have access to cross-tenant data.&lt;br /&gt;
= 4.1.4 =&lt;br /&gt;
Moodle Workplace 4.1.4 is based on top of Moodle LMS 4.1.4 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Interesting features and bug fixes ===&lt;br /&gt;
* Fixed a bug where the &#039;reset program&#039; option was incorrectly displayed for dynamic allocation&lt;br /&gt;
* Fixed a bug in the &#039;Access&#039; tab on tenant page where some users might have been incorrectly displayed.&lt;br /&gt;
* Fixed a bug during the upgrade process that caused it to get stuck in a loop&lt;br /&gt;
* Fixed a bug during the installation process that caused blocks in the dashboard to be copied multiple times under certain circumstances.&lt;br /&gt;
* Fixed a bug in tenant archiving that was granting tenant administration permissions from the default tenant to the tenant administrator of the archived tenant&lt;br /&gt;
* Fixed a bug during the upgrade process that caused it to get stuck in a loop (&#039;&#039;4.1.4 rolling only)&#039;&#039;&lt;br /&gt;
= 4.1.5 =&lt;br /&gt;
Moodle Workplace 4.1.5 is based on top of Moodle LMS 4.1.5 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Highlights ===&lt;br /&gt;
* We added some changes to the &amp;quot;Workplace&amp;quot; theme that allow to create child themes easier. We have released an example &amp;quot;[https://github.com/moodleworkplace/moodle-theme_wpchild Workplace child theme]&amp;quot; &lt;br /&gt;
* Moved &amp;quot;Information&amp;quot; tab to the second position on the course page&lt;br /&gt;
* Changed report data source &amp;quot;Issued certificates&amp;quot; removing a very strict capability check. Now it is possible to create reports such as &amp;quot;My certificates&amp;quot; or &amp;quot;My team&#039;s certificates&amp;quot; that can be accessed by users who can not view the templates list.&lt;br /&gt;
** &#039;&#039;&#039;Upgrade notes:&#039;&#039;&#039; To prevent accidental disclosure of new data to people who already have reports using the &amp;quot;Issued certificates&amp;quot; datasource, we have added a new condition that mimics the previous hardcoded restriction. This condition (called &amp;quot;Permission to access templates&amp;quot;) is automatically added during upgrade to all existing reports from this datasource. It can be removed if necessary. This condition will not be automatically added to the newly created reports but can be added manually if needed.&lt;br /&gt;
=== Other fixes ===&lt;br /&gt;
* Fixed a bug causing program reset ad-hoc task to fail&lt;br /&gt;
* Fixed a bug insufficiently resetting course module views during program reset &lt;br /&gt;
* Fixed a bug causing failures during organisation structure export&lt;br /&gt;
* Improved Dynamic rules, allowing some actions to be executed as scheduled tasks only. Changed actions &amp;quot;Assign to learning plans&amp;quot; and respective &amp;quot;Unassign&amp;quot; action to use this functionality, because they can fail if they are executed in a session of a student&lt;br /&gt;
* Changed workplace activity icons to look more consistent with the LMS activity icons (white instead of black)&lt;br /&gt;
* Bug fixes and improvements in how some tenant configuration data is being sent to the mobile app (among other things, this makes sure that the site name in the user information page is correct and corresponds to the current tenant).&lt;br /&gt;
* Added validation to the tenant branding &amp;quot;Custom SCSS&amp;quot; field to prevent accidental breaking of the whole site layout&lt;br /&gt;
* Added column &amp;quot;Session date &amp;amp; time&amp;quot; to Appointments datasources that was present in legacy report builder in 3.11 but was forgotten in 4.0+ report builder&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This version also contains a fix for a security issue in Moodle Workplace, the details will be communicated to the Moodle Partners on the day of release and disclosed here later.&lt;br /&gt;
= 4.1.6 =&lt;br /&gt;
Moodle Workplace 4.1.6 is based on top of Moodle LMS 4.1.6 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Other fixes ===&lt;br /&gt;
* Fixed: Suspended on Program report displays &amp;quot;Yes&amp;quot; even though user is not suspended from program&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This version also contains a fix for a security issue in Moodle Workplace, the details will be communicated to the Moodle Partners on the day of release and disclosed here later.&lt;br /&gt;
= 4.1.7 =&lt;br /&gt;
Moodle Workplace 4.1.7 is based on top of Moodle LMS 4.1.7 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
* Fixed condition &#039;Select course&#039; in the course participants custom report&lt;br /&gt;
* Appointment status and session summary no longer shows Wait-listed users as &#039;Booked&#039;&lt;br /&gt;
* Allow to sort by allocation date column in report builder&lt;br /&gt;
* Fixed bug when manually changing certification due date causes date to get stuck on program info card&lt;br /&gt;
* Do not show percentage in recent courses block if course does not have completion&lt;br /&gt;
* It is now possible to delete user profile picture in the tenant user editing popup&lt;br /&gt;
* Do not show the enable/disable switch for the manual auth method that can never be disabled&lt;br /&gt;
= 4.1.8 =&lt;br /&gt;
Moodle Workplace 4.1.8 is based on top of Moodle LMS 4.1.8 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
* Removed and empty link in the &amp;quot;Certification progress&amp;quot; report&lt;br /&gt;
&lt;br /&gt;
= 4.1.9 =&lt;br /&gt;
Moodle Workplace 4.1.9 is based on top of Moodle LMS 4.1.9 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
* Corrected the link to the user documentation in the Course Certificate activity module&lt;br /&gt;
* Fixed a bug in the Course Certificate scheduled task related with deleted templates&lt;br /&gt;
&lt;br /&gt;
= 4.1.10 =&lt;br /&gt;
Moodle Workplace 4.1.10 is based on top of Moodle LMS 4.1.10 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed multiple accessibility issues in several components in the scope of the WCAG 2.1 AA accreditation&lt;br /&gt;
&lt;br /&gt;
= 4.1.11 =&lt;br /&gt;
Moodle Workplace 4.1.11 is based on top of Moodle LMS 4.1.11 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Various accessibility fixes related to the ongoing effort to achieve WCAG AA accessibility accreditation for Moodle Workplace&lt;br /&gt;
&lt;br /&gt;
= 4.1.12 =&lt;br /&gt;
Moodle Workplace 4.1.12 is based on top of Moodle LMS 4.1.12 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Add support for separate group mode to Appointments activity module&lt;br /&gt;
&lt;br /&gt;
=4.1.13=&lt;br /&gt;
Moodle Workplace 4.1.13 is based on top of Moodle LMS 4.1.13 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
&lt;br /&gt;
=== Security fixes ===&lt;br /&gt;
* A number of security related issues were resolved. Details of these issues will be released after a period of approximately one week to allow system administrators to safely update to the latest version.&lt;br /&gt;
&lt;br /&gt;
= 4.1.14 =&lt;br /&gt;
Moodle Workplace 4.1.14 is based on top of Moodle LMS 4.1.14 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
&lt;br /&gt;
=== Security fixes ===&lt;br /&gt;
&lt;br /&gt;
* A number of security related issues were resolved&lt;br /&gt;
&lt;br /&gt;
= 4.1.15 =&lt;br /&gt;
Moodle Workplace 4.1.15 is based on top of Moodle LMS 4.1.15 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Resolved issue where users from other tenants could be incorrectly displayed on the tag index page&lt;br /&gt;
&lt;br /&gt;
= 4.1.16 =&lt;br /&gt;
Moodle Workplace 4.1.16 is based on top of Moodle LMS 4.1.16 and has all the new features of the core version. In addition, it contains all exclusive features from Moodle Workplace.&lt;br /&gt;
&lt;br /&gt;
There were no workplace-specific fixes in this release.&lt;br /&gt;
&lt;br /&gt;
= 4.1.17 =&lt;br /&gt;
Moodle Workplace 4.1.17 is based on top of Moodle LMS 4.1.17 and has all the security fixes of the core version. &lt;br /&gt;
&lt;br /&gt;
There were no workplace-specific fixes in this release.&lt;br /&gt;
&lt;br /&gt;
= 4.1.18 =&lt;br /&gt;
Moodle Workplace 4.1.18 is based on top of Moodle LMS 4.1.18 and has all the security fixes of the core version. &lt;br /&gt;
&lt;br /&gt;
There were no workplace-specific fixes in this release.&lt;br /&gt;
&lt;br /&gt;
= 4.1.19 =&lt;br /&gt;
Moodle Workplace 4.1.19 is based on top of Moodle LMS 4.1.19 and has all the security fixes of the core version. &lt;br /&gt;
&lt;br /&gt;
=== Improvements ===&lt;br /&gt;
&lt;br /&gt;
* Added functionality to capture and display historical data for registered and active users in the datastore.&lt;br /&gt;
&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Resolved an issue where the course certificates page was not displayed within the course navigation layout.&lt;br /&gt;
&lt;br /&gt;
= 4.1.20 =&lt;br /&gt;
Moodle Workplace 4.1.20 is based on top of Moodle LMS 4.1.20 and has all the security fixes of the core version.&lt;br /&gt;
&lt;br /&gt;
=== Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Resolved potential privacy issue moving users with job assignments between tenants&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=61759</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=61759"/>
		<updated>2022-03-02T14:25:06Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Library updates for 4.0.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.21.0&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014 Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-styleMDL-71712&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
==Axe==&lt;br /&gt;
&#039;&#039;lib/behat/axe&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Accessibility testing engine for websites and other HTML-based user interfaces. &lt;br /&gt;
&lt;br /&gt;
Version: 3.5.5&lt;br /&gt;
&lt;br /&gt;
Copyright Deque Systems Inc.&lt;br /&gt;
&lt;br /&gt;
License: Mozilla Public License 2.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://github.com/dequelabs/axe-core/tags&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Bennu==&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
==CAS==&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.8&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
==CFPropertyList==&lt;br /&gt;
&#039;&#039;/lib/plist&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Implementation of Apple&#039;s PList (binary and XML)&lt;br /&gt;
&lt;br /&gt;
Version: 2.0.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2018 Teclib&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Christian Kruse, Rodney Rehm&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://teclib.github.io/CFPropertyList/&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
==CodeMirror==&lt;br /&gt;
&#039;&#039;lib/editor/atto/plugins/html/yui/src/codemirror&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
CodeMirror is a versatile text editor implemented in JavaScript for the browser.&lt;br /&gt;
&lt;br /&gt;
Version: 5.59.4&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/codemirror/CodeMirror&lt;br /&gt;
==Emoji-data==&lt;br /&gt;
&#039;&#039;lib/emoji-data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to parse easily data and sprite sheets for emoji.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013 Cal Henderson&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/iamcal/emoji-data/&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
==FLV player==&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==FPDI==&lt;br /&gt;
&#039;&#039;/mod/assign/feedback/editpdf/fpdi/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF.&lt;br /&gt;
&lt;br /&gt;
Version: 2.3.6&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2020 Setasign GmbH &amp;amp; Co. KG, https://www.setasign.com&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://www.setasign.com/products/pdf-php-solutions/fpdi/&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for processing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.11.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
== GeoPattern==&lt;br /&gt;
&#039;&#039;lib/geopattern-php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for creating beautiful generative background images from a string&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/RedeyeGroup/geopattern-php&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000 Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
==H5P==&lt;br /&gt;
&#039;&#039;joubel/core&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The general H5P library&lt;br /&gt;
&lt;br /&gt;
Version: 1.24.2&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: GPL-3.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-php-library/&lt;br /&gt;
==H5P Editor PHP Library==&lt;br /&gt;
&#039;&#039;joubel/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A general library that is supposed to be used in most PHP implementations of H5P.&lt;br /&gt;
&lt;br /&gt;
Version: moodle-1.20.2&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-editor-php-library&lt;br /&gt;
==Horde==&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.23&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
==html2text==&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002 interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.13.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
==http-message==&lt;br /&gt;
&amp;quot;/lib/http-message&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Provide a set of common interfaces for HTTP messages as described in RFC 7230 and RFC 7231&lt;br /&gt;
&lt;br /&gt;
Version: 1.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014 PHP Framework Interoperability Group&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002 Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==Jabber - XMPPHP==&lt;br /&gt;
&#039;&#039;lib/jabber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP library for XMPP (aka Jabber, Google Talk, etc).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1rc2-r77&lt;br /&gt;
&lt;br /&gt;
Copyright: 2008 Nathanael C. Fritz&lt;br /&gt;
&lt;br /&gt;
License: GPL&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/xmpphp&lt;br /&gt;
==jQuery==&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
==jQuery EU Cookie Law popups==&lt;br /&gt;
&#039;/admin/tool/policy/amd/src/jquery-eu-cookie-law-popup.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
An easy-to-install jQuery plugin to create EU Cookie Law popups&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.3&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Richard Dancsi&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/wimagguc/jquery-eu-cookie-law-popup&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
==JavaScript Beautifier==&lt;br /&gt;
&#039;&#039;yui/src/beautify&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beautify HTML code in Atto.&lt;br /&gt;
&lt;br /&gt;
Version: 1.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://beautifier.io/&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==JWT==&lt;br /&gt;
&#039;&#039;lib/php-jwt&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to RFC 7519&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2011, Neuman Vong&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/firebase/php-jwt&lt;br /&gt;
==ENUM==&lt;br /&gt;
&#039;&#039;lib/php-enum&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Enum implementation inspired from SplEnum&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.7&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 My C-Labs&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/myclabs/php-enum&lt;br /&gt;
==kses==&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005 Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==less.php==&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright: Matt Agar and Martin Jantošovič&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
==MathJax==&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
* Default MathJax version: 2.7.9 (Moodle 3.11)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.63&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Path converter==&lt;br /&gt;
CSS path converter, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.1.3&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/path-converter&lt;br /&gt;
==MaxMind DB Reader==&lt;br /&gt;
lib/maxmind/MaxMind/&lt;br /&gt;
&lt;br /&gt;
PHP API for reading MaxMind DB files&lt;br /&gt;
&lt;br /&gt;
Version: 1.10.1&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/MaxMind-DB-Reader-php/&lt;br /&gt;
==MDN Polyfills==&lt;br /&gt;
&#039;&#039;/lib/mdn-polyfills&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A collection of side-effect ECMAScript modules. Minimized, mangled and extremely small thanks to Rollup - next-generation ES6 module bundler.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.0&lt;br /&gt;
Version url-polyfill: 1.1.12&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://www.npmjs.com/package/mdn-polyfills&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.77&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004 John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
==MongoDB PHP Library==&lt;br /&gt;
&#039;&#039;/cache/stores/mongodb/MongoDB/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MongoDB PHP library&lt;br /&gt;
&lt;br /&gt;
Version: 1.8.0&lt;br /&gt;
&lt;br /&gt;
License: apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://docs.mongodb.com/php-library/&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 3.1.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
==Mustache==&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
==mp3player==&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004 Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004 Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==PclZip==&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==PhpSpreadsheet==&lt;br /&gt;
&#039;&#039;lib/phpspreadsheet&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.16.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PhpSpreadsheet&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP. Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.2.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.9.0 (with modifications)&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
==PHP-ML==&lt;br /&gt;
&#039;&#039;lib/mlbackend/php/phpml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Machine learning library used to generate data for the Analytics system.&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.0&lt;br /&gt;
 * @copyright 2016-2018 Arkadiusz Kondas &amp;lt;arkadiusz.kondas[at]gmail&amp;gt;&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://php-ml.readthedocs.io/&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.6&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
==Rangy==&lt;br /&gt;
&amp;quot;/lib/editor/atto/yui/src/rangy/js/*.*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A cross-browser JavaScript range and selection library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014 Tim Down&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/timdown/rangy&lt;br /&gt;
==RTLCSS for PHP==&lt;br /&gt;
&amp;quot;lib/rtlcss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RTLCSS is a framework for converting Left-To-Right (LTR) Cascading Style Sheets(CSS) to Right-To-Left (RTL).&lt;br /&gt;
&lt;br /&gt;
© 2016 Frédéric Massart&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/moodlehq/rtlcss-php&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
==scssphp==&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 1.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.6&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001 Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
==Spout==&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 3.3.0&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
==TCPDF Class==&lt;br /&gt;
&#039;&#039;lib/tcpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 6.4.1&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: LGPL-v3.0-only&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
==Twitter Bootstrap==&lt;br /&gt;
&#039;&#039;/theme/boost/scss/bootstrap/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML, CSS, and JavaScript framework for developing responsive, mobile-first projects on the web.&lt;br /&gt;
&lt;br /&gt;
Version: 4.6.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011-2021 Twitter, Inc.&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011-2021 The Bootstrap Authors&lt;br /&gt;
&lt;br /&gt;
Licence: MIT&lt;br /&gt;
&lt;br /&gt;
https://getbootstrap.com/&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
==truncate.js==&lt;br /&gt;
&#039;&#039;amd/src/truncate.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dead simple HTML-safe truncation via the DOM. It truncates HTML code, and has several options such as length, finishBlock, noBreak...&lt;br /&gt;
&lt;br /&gt;
Version: 0.0.1&lt;br /&gt;
&lt;br /&gt;
Licence: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pathable/truncate&lt;br /&gt;
==Video.js==&lt;br /&gt;
&#039;&#039;/media/player/videojs/amd/src/video-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/media/player/videojs/videojs/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JavaScript library that makes it easier to work with and build on HTML5 video&lt;br /&gt;
&lt;br /&gt;
Version: 7.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
http://videojs.com/&lt;br /&gt;
==Video.js - The Flash tech==&lt;br /&gt;
&#039;&#039;/media/player/videojs/amd/src/videojs-flash-lazy.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Flash tech for video.js&lt;br /&gt;
&lt;br /&gt;
Version: 2.2.1&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/videojs/videojs-flash&lt;br /&gt;
==Video.js - Custom Flash Player==&lt;br /&gt;
&#039;&#039;/media/player/videojs/amd/src/videojs-flash-lazy.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Custom Flash Player for VideoJS&lt;br /&gt;
&lt;br /&gt;
Version: 5.4.2&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/videojs/video-js-swf/releases&lt;br /&gt;
==WebRTC adapter==&lt;br /&gt;
&#039;&#039;amd/src/adapter.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
JavaScript library to insulate apps from spec changes and prefix differences in WebRTC. The prefix differences are mostly gone these days but differences in behaviour between browsers remain.&lt;br /&gt;
&lt;br /&gt;
Version: 7.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2014, The WebRTC project authors. All rights reserved. Copyright (c) 2018, The adapter.js project authors. &lt;br /&gt;
&lt;br /&gt;
Licence: BSD 3 Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/webrtc/adapter&lt;br /&gt;
==XHProf==&lt;br /&gt;
&#039;&#039;lib/xhprof&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Hierarchical Profiler for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 2.2.3&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Phacility&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/phacility/xhprof&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc. We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 3.17.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
==ZipStream-PHP==&lt;br /&gt;
&#039;&#039;/lib/zipstream&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP ZIP Streaming Library&lt;br /&gt;
&lt;br /&gt;
Version: 2.1.0&lt;br /&gt;
&lt;br /&gt;
Copyright (C) 2007-2009 Paul Duncan &amp;lt;pabs@pablotron.org&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copyright (C) 2014 Jonatan Männchen &amp;lt;jonatan@maennchen.ch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copyright (C) 2014 Jesse G. Donat &amp;lt;donatj@gmail.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Copyright (C) 2018 Nicolas CARPi &amp;lt;nicolas.carpi@curie.fr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Licence: MIT&lt;br /&gt;
&lt;br /&gt;
https://packagist.org/packages/maennchen/zipstream-php&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Category:Obsolete&amp;diff=61445</id>
		<title>Category:Obsolete</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Category:Obsolete&amp;diff=61445"/>
		<updated>2021-10-14T13:34:59Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Correct obsolete tag.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These pages are no longer in use.&lt;br /&gt;
&lt;br /&gt;
A page can be marked as obsolete by adding &amp;lt;syntaxhighlight&amp;gt;{{obsolete}}&amp;lt;/syntaxhighlight&amp;gt; to the page.&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Core_APIs&amp;diff=61420</id>
		<title>Core APIs</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Core_APIs&amp;diff=61420"/>
		<updated>2021-10-07T11:52:20Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Link to Report builder API.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Moodle has a number of core APIs that provide tools for Moodle scripts.&lt;br /&gt;
&lt;br /&gt;
They are essential when writing [[Plugins|Moodle plugins]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Most-used General APIs==&lt;br /&gt;
These APIs are critical and will be used by nearly every Moodle plugin.&lt;br /&gt;
=== Access API (access) ===&lt;br /&gt;
The [[Access API]] gives you functions so you can determine what the current user is allowed to do, and it allows modules to extend Moodle with new capabilities.&lt;br /&gt;
=== Data manipulation API (dml) ===&lt;br /&gt;
The [[Data manipulation API]] allows you to read/write to databases in a consistent and safe way.&lt;br /&gt;
=== File API (files) ===&lt;br /&gt;
The [[File API]] controls the storage of files in connection to various plugins.&lt;br /&gt;
=== Form API (form) ===&lt;br /&gt;
The [[Form API]] defines and handles user data via web forms.&lt;br /&gt;
=== Logging API (log) ===&lt;br /&gt;
The [[Events API]] allows you to log events in Moodle, while [[Logging 2]] describes how logs are stored and retrieved.&lt;br /&gt;
=== Navigation API (navigation) ===&lt;br /&gt;
The [[Navigation API]] allows you to manipulate the navigation tree to add and remove items as you wish.&lt;br /&gt;
=== Page API (page) ===&lt;br /&gt;
The [[Page API]] is used to set up the current page, add JavaScript, and configure how things will be displayed to the user.&lt;br /&gt;
=== Output API (output) ===&lt;br /&gt;
The [[Output API]] is used to render the HTML for all parts of the page.&lt;br /&gt;
=== String API (string) ===&lt;br /&gt;
The [[String API]] is how you get language text strings to use in the user interface. It handles any language translations that might be available.&lt;br /&gt;
=== Upgrade API (upgrade) ===&lt;br /&gt;
The [[Upgrade API]] is how your module installs and upgrades itself, by keeping track of its own version.&lt;br /&gt;
=== Moodlelib API (core) ===&lt;br /&gt;
The [[Moodlelib API]] is the central library file of miscellaneous general-purpose Moodle functions. Functions can over the handling of request parameters, configs, user preferences, time, login, mnet, plugins, strings and others. There are plenty of defined constants too.&lt;br /&gt;
==Other General APIs==&lt;br /&gt;
=== Admin settings API (admin) ===&lt;br /&gt;
The [[Admin settings]] API deals with providing configuration options for each plugin and Moodle core.&lt;br /&gt;
=== Analytics API (analytics) ===&lt;br /&gt;
The [[Analytics API]] allow you to create prediction models and generate insights.&lt;br /&gt;
=== Availability API (availability) ===&lt;br /&gt;
The [[Availability API]] controls access to activities and sections.&lt;br /&gt;
=== Backup API (backup) ===&lt;br /&gt;
The [[Backup API]] defines exactly how to convert course data into XML for backup purposes, and the [[Restore API]] describes how to convert it back the other way.&lt;br /&gt;
=== Cache API (cache) ===&lt;br /&gt;
The [[The Moodle Universal Cache (MUC)]] is the structure for storing cache data within Moodle. [[Cache_API]] explains some of what is needed to use a cache in your code.&lt;br /&gt;
=== Calendar API (calendar) ===&lt;br /&gt;
The [[Calendar API]] allows you to add and modify events in the calendar for user, groups, courses, or the whole site.&lt;br /&gt;
=== Check API (check) ===&lt;br /&gt;
The [[Check API]] allows you to add security, performance or health checks to your site.&lt;br /&gt;
=== Comment API (comment) ===&lt;br /&gt;
The [[Comment API]] allows you to save and retrieve user comments, so that you can easily add commenting to any of your code.&lt;br /&gt;
=== Competency API (competency) ===&lt;br /&gt;
The [[Competency API]] allows you to list and add evidence of competencies to learning plans, learning plan templates, frameworks, courses and activities.&lt;br /&gt;
=== Data definition API (ddl) ===&lt;br /&gt;
The [[Data definition API]] is what you use to create, change and delete tables and fields in the database during upgrades.&lt;br /&gt;
=== Editor API ===&lt;br /&gt;
The [[Editor API]] is used to control HTML text editors.&lt;br /&gt;
=== Enrolment API (enrol) ===&lt;br /&gt;
The [[Enrolment API]] deals with course participants.&lt;br /&gt;
=== Events API (event) ===&lt;br /&gt;
The [[Events API]] allows to define &amp;quot;events&amp;quot; with payload data to be fired whenever you like, and it also allows you to define handlers to react to these events when they happen. This is the recommended form of inter-plugin communication. This also forms the basis for logging in Moodle.&lt;br /&gt;
=== Experience API (xAPI) ===&lt;br /&gt;
The Experience API (xAPI) is an e-learning standard that allows learning content and learning systems to speak to each other. The [[Experience API (xAPI)]]&lt;br /&gt;
allows any plugin to generate and handle xAPI standard statements.&lt;br /&gt;
=== External functions API (external) ===&lt;br /&gt;
The [[External functions API]] allows you to create fully parametrised methods that can be accessed by external programs (such as [[Web services]]).&lt;br /&gt;
=== Favourites API ===&lt;br /&gt;
The [[Favourites API]] allows you to mark items as favourites for a user and manage these favourites. This is often referred to as &#039;Starred&#039;.&lt;br /&gt;
=== H5P API (h5p) ===&lt;br /&gt;
The [[H5P API]] allows plugins to make some decisions/implementations related to the [[H5P|H5P integration]].&lt;br /&gt;
=== Lock API (lock) ===&lt;br /&gt;
The [[Lock API]] lets you synchronise processing between multiple requests, even for separate nodes in a cluster.&lt;br /&gt;
=== Message API (message) ===&lt;br /&gt;
The [[Message API]] lets you post messages to users. They decide how they want to receive them.&lt;br /&gt;
=== Media API (media) ===&lt;br /&gt;
The [[Media_players#Using_media_players|Media]] API can be used to embed media items such as audio, video, and Flash.&lt;br /&gt;
=== My profile API ===&lt;br /&gt;
The [[My profile API]] is used to add things to the profile page.&lt;br /&gt;
=== OAuth 2 API (oauth2) ===&lt;br /&gt;
The [[OAuth 2 API]] is used to provide a common place to configure and manage external systems using OAuth 2.&lt;br /&gt;
=== Payment API (payment) ===&lt;br /&gt;
The [[Payment API]] deals with payments.&lt;br /&gt;
=== Preference API (preference) ===&lt;br /&gt;
The [[Preference API]] is a simple way to store and retrieve preferences for individual users.&lt;br /&gt;
=== Portfolio API (portfolio) ===&lt;br /&gt;
The [[Portfolio API]] allows you to add portfolio interfaces on your pages and allows users to package up data to send to their portfolios.&lt;br /&gt;
=== Privacy API (privacy) ===&lt;br /&gt;
The [[Privacy API]] allows you to describe the personal data that you store, and provides the means for that data to be discovered, exported, and deleted on a per-user basis.&lt;br /&gt;
This allows compliance with regulation such as the General Data Protection Regulation (GDPR) in Europe.&lt;br /&gt;
=== Rating API (rating) ===&lt;br /&gt;
The [[Rating API]] lets you create AJAX rating interfaces so that users can rate items in your plugin. In an activity module, you may choose to aggregate ratings to form grades.&lt;br /&gt;
=== Report builder API (reportbuilder) ===&lt;br /&gt;
The [[Report builder API]] allows you to create reports in your plugin, as well as providing custom reporting data which users can use to build their own reports.&lt;br /&gt;
=== RSS API (rss) ===&lt;br /&gt;
The [[RSS API]] allows you to create secure RSS feeds of data in your module.&lt;br /&gt;
=== Search API (search) ===&lt;br /&gt;
The [[Search API]] allows you to index contents in a search engine and query the search engine for results.&lt;br /&gt;
=== Tag API (tag) ===&lt;br /&gt;
The [[Tag API]] allows you to store tags (and a tag cloud) to items in your module.&lt;br /&gt;
=== Task API (task) ===&lt;br /&gt;
The [[Task API]] lets you run jobs in the background. Either once off, or on a regular schedule.&lt;br /&gt;
=== Time API (time) ===&lt;br /&gt;
The [[Time API]] takes care of translating and displaying times between users in the site.&lt;br /&gt;
=== Testing API (test) ===&lt;br /&gt;
The testing API contains the Unit test API ([[PHPUnit]]) and Acceptance test API ([[Acceptance testing]]). Ideally all new code should have unit tests written FIRST.&lt;br /&gt;
=== User-related APIs (user) ===&lt;br /&gt;
This is a rather informal grouping of miscellaneous [[User-related APIs]] relating to sorting and searching lists of users.&lt;br /&gt;
=== Web services API (webservice) ===&lt;br /&gt;
The [[Web services API]] allows you to expose particular functions (usually external functions) as web services.&lt;br /&gt;
=== Badges API (badges) ===&lt;br /&gt;
The [https://docs.moodle.org/dev/OpenBadges_User_Documentation Badges] user documentation (is a temp page until we compile a proper page with all the classes and APIs that allows you to manage particular badges and OpenBadges Backpack).&lt;br /&gt;
=== Custom fields API ===&lt;br /&gt;
The [[Custom fields API]] allows you to configure and add custom fields for different entities&lt;br /&gt;
&lt;br /&gt;
== Activity module APIs ==&lt;br /&gt;
Activity modules are the most important plugin in Moodle. There are several core APIs that service only Activity modules.&lt;br /&gt;
=== Activity completion API (completion) ===&lt;br /&gt;
The [[Activity completion API]] is to indicate to the system how activities are completed.&lt;br /&gt;
=== Advanced grading API (grading) ===&lt;br /&gt;
The [[Advanced grading API]] allows you to add more advanced grading interfaces (such as rubrics) that can produce simple grades for the gradebook.&lt;br /&gt;
=== Conditional activities API (condition) - deprecated in 2.7 ===&lt;br /&gt;
The deprecated [[Conditional activities API]] used to provide conditional access to modules and sections in Moodle 2.6 and below. It has been replaced by the [[Availability API]].&lt;br /&gt;
=== Groups API (group) ===&lt;br /&gt;
The [[Groups API]] allows you to check the current activity group mode and set the current group.&lt;br /&gt;
=== Gradebook API (grade) ===&lt;br /&gt;
The [[Gradebook API]] allows you to read and write from the gradebook. It also allows you to provide an interface for detailed grading information.&lt;br /&gt;
=== Plagiarism API (plagiarism) ===&lt;br /&gt;
The [[Plagiarism API]] allows your activity module to send files and data to external services to have them checked for plagiarism.&lt;br /&gt;
=== Question API (question) ===&lt;br /&gt;
The [[Question API]] (which can be divided into the Question bank API and the Question engine API), can be used by activities that want to use questions from the question bank.&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Plugins]] - plugin types also have their own APIs&lt;br /&gt;
* [[Callbacks]] - list of all callbacks in Moodle&lt;br /&gt;
* [[Coding style]] - general information about writing PHP code for Moodle&lt;br /&gt;
[[ja:コアAPI]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Report_builder_API&amp;diff=60513</id>
		<title>Report builder API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Report_builder_API&amp;diff=60513"/>
		<updated>2021-07-28T09:40:19Z</updated>

		<summary type="html">&lt;p&gt;Pholden: /* Create an entity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Report Builder API overview ==&lt;br /&gt;
== System Reports ==&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
System reports are a consistent way of providing reporting data, with paging, filtering, exporting standardized across them. Once the groundwork is done in defining the report elements in entities, it&#039;s possible to implement them with minimal code just by adding entities to the report, and defining which elements you want to use from them.&lt;br /&gt;
=== Column ===&lt;br /&gt;
==== Column overview ====&lt;br /&gt;
Column instances define the data captured/displayed within a report column - typically:&amp;lt;br /&amp;gt;&lt;br /&gt;
* How the data is retrieved, either a simple SQL table.field fragment or an expression that returns a value&lt;br /&gt;
* They type of data that is being retrieved (int, text, datetime, etc)&lt;br /&gt;
* How that data should be presented in a report (for instance calling userdate() on datetime types)&lt;br /&gt;
==== Column types ====&lt;br /&gt;
* &#039;&#039;&#039;Text&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Integer&#039;&#039;&#039; (Integer numbers)&lt;br /&gt;
* &#039;&#039;&#039;Float&#039;&#039;&#039; (Decimal numbers)&lt;br /&gt;
* &#039;&#039;&#039;Timestamp&#039;&#039;&#039; (Dates)&lt;br /&gt;
* &#039;&#039;&#039;Boolean&#039;&#039;&#039; (Yes / No values)&lt;br /&gt;
* &#039;&#039;&#039;Longtext&#039;&#039;&#039;&lt;br /&gt;
==== Creating columns ====&lt;br /&gt;
To create a new column, just create a new instance of &#039;&#039;&#039;reportbuilder/classes/local/report/column.php&#039;&#039;&#039; class with:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
* string $name&lt;br /&gt;
* ?lang_string $title&lt;br /&gt;
* string $entityname&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
And use:&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;add_joins()&#039;&#039;&#039; to add any extra SQL joins the column might need&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;set_type()&#039;&#039;&#039; to add the column type (All constant types are defined within the same column class)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;set_is_sortable()&#039;&#039;&#039; to define if column can be sorted (For example we don&#039;t want to sort if the column shows just a picture)&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;add_callback()&#039;&#039;&#039; to format the output of the column&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;add_field()&#039;&#039;&#039; to add any db fields format callback might need&amp;lt;br /&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$columns[] = (new column(&lt;br /&gt;
            &#039;starttime&#039;,&lt;br /&gt;
            new lang_string(&#039;task_starttime&#039;, &#039;admin&#039;),&lt;br /&gt;
            $this-&amp;gt;get_entity_name()&lt;br /&gt;
        ))&lt;br /&gt;
            -&amp;gt;add_joins($this-&amp;gt;get_joins())&lt;br /&gt;
            -&amp;gt;set_type(column::TYPE_TIMESTAMP)&lt;br /&gt;
            -&amp;gt;add_field(&amp;quot;{$tablealias}.timestart&amp;quot;)&lt;br /&gt;
            -&amp;gt;set_is_sortable(true)&lt;br /&gt;
            -&amp;gt;add_callback([format::class, &#039;userdate&#039;]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Filter ===&lt;br /&gt;
==== Filter overview ====&lt;br /&gt;
Report filters can be defined for a report and allow users to narrow down (filter) the data that is displayed in a report&lt;br /&gt;
* They define the data being filtered, either a simple SQL fragment or expression.&lt;br /&gt;
* The type of filtering being performed (int, text, datetime, etc).&lt;br /&gt;
Filter types are extendable, allowing for the addition of many more as suits each use case. We have provided common ones that cover most use cases.&lt;br /&gt;
&lt;br /&gt;
Note that filters &amp;amp; columns are entirely separate concepts in the report, and each can be used without a matching column/filter (that is to say, we can add a report filter for a user field without needing the column for the same field to be present in the report).&lt;br /&gt;
==== Filter types ====&lt;br /&gt;
* &#039;&#039;&#039;Text&#039;&#039;&#039; (reportbuilder/classes/local/filters/text.php)&lt;br /&gt;
* &#039;&#039;&#039;Date&#039;&#039;&#039; (reportbuilder/classes/local/filters/date.php)&lt;br /&gt;
* &#039;&#039;&#039;Number&#039;&#039;&#039; (reportbuilder/classes/local/filters/number.php)&lt;br /&gt;
* &#039;&#039;&#039;Boolean Select&#039;&#039;&#039; (reportbuilder/classes/local/filters/boolean_select.php)&lt;br /&gt;
* &#039;&#039;&#039;Select&#039;&#039;&#039; (reportbuilder/classes/local/filters/select.php)&lt;br /&gt;
* &#039;&#039;&#039;Course selector&#039;&#039;&#039;  (reportbuilder/classes/local/filters/course_selector.php)&lt;br /&gt;
==== Creating filters ====&lt;br /&gt;
To create a new filter, just create a new instance of &#039;&#039;&#039;reportbuilder/classes/local/report/filter.php&#039;&#039;&#039; class with:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
* string $filterclass&lt;br /&gt;
* string $name&lt;br /&gt;
* lang_string $header&lt;br /&gt;
* string $entityname&lt;br /&gt;
* string $fieldsql = &#039;&#039;&lt;br /&gt;
* array $fieldparams = []&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$filters[] = (new filter(&lt;br /&gt;
            course_selector::class,&lt;br /&gt;
            &#039;courseselector&#039;,&lt;br /&gt;
            new lang_string(&#039;courses&#039;),&lt;br /&gt;
            $this-&amp;gt;get_entity_name(),&lt;br /&gt;
            &amp;quot;{$tablealias}.id&amp;quot;&lt;br /&gt;
        ))&lt;br /&gt;
            -&amp;gt;add_joins($this-&amp;gt;get_joins());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Entity ===&lt;br /&gt;
==== Entity overview ====&lt;br /&gt;
Entities are simply collections of report elements (currently columns and filters). They allow for common elements to be defined once, and then re-used in all reports - developers can choose to use as many or as few of the elements from each entity as required. We have provided user and course entities. They can be joined to reports using standard SQL query syntax&lt;br /&gt;
&lt;br /&gt;
All report elements can be defined within the reports themselves - but entities mean it&#039;s much easier to create re-usable components, and will also help in the long term with custom reports&lt;br /&gt;
==== Create an entity ====&lt;br /&gt;
To create an entity, the new entity class must extend &#039;&#039;&#039;/reportbuilder/classes/local/entities/base.php&#039;&#039;&#039; class and must include these methods:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
get_default_table_aliases()&lt;br /&gt;
get_default_entity_title()&lt;br /&gt;
initialise()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===== get_default_table_aliases() =====&lt;br /&gt;
Defines the SQL alias for the database tables the entity uses.&lt;br /&gt;
===== get_default_entity_title() =====&lt;br /&gt;
Defines the default title for this entity.&lt;br /&gt;
===== initialise() =====&lt;br /&gt;
This is where we &#039;&#039;&#039;add&#039;&#039;&#039; the entity columns and filters.&lt;br /&gt;
==== Examples ====&lt;br /&gt;
Report Builder has two entities as an example to start building reports:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;User entity&#039;&#039;&#039;: reportbuilder/classes/local/entities/user.php&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Course entity&#039;&#039;&#039;: reportbuilder/classes/local/entities/course.php&lt;br /&gt;
=== Actions ===&lt;br /&gt;
Report actions can be defined in system reports to provide CTA links for each row in the report. Using :placeholder elements in the action URLs allows them to be specific to the row content - e.g. to always provide a link to the current user/course of the current row&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  $this-&amp;gt;add_action((new action(&lt;br /&gt;
      new moodle_url(&#039;/admin/tasklogs.php&#039;, [&#039;logid&#039; =&amp;gt; &#039;:id&#039;]),&lt;br /&gt;
      new pix_icon(&#039;e/search&#039;, get_string(&#039;view&#039;)),&lt;br /&gt;
      [],&lt;br /&gt;
      true,&lt;br /&gt;
  )));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== System reports ===&lt;br /&gt;
System reports are a consistent way of providing reporting data, with paging, filtering, exporting standardized across them. Once the groundwork is done in defining the report elements in entities, it&#039;s possible to implement them with minimal code just by adding entities to the report, and defining which elements you want to use from them&lt;br /&gt;
==== Create a new system report using entities ====&lt;br /&gt;
To create a new system report just create a new class extending &#039;&#039;&#039;reportbuilder/classes/system_report.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The first method that we need is &#039;&#039;&#039;initialise()&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* Initialise report, we need to set the main table, load our entities and set columns/filters&lt;br /&gt;
*/&lt;br /&gt;
protected function initialise(): void {&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The initialise method needs to get the main entity, set the main table it needs to use and add the entity to the report:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Our main entity, it contains all of the column definitions that we need.&lt;br /&gt;
$entitymain = new task_log();&lt;br /&gt;
$entitymainalias = $entitymain-&amp;gt;get_table_alias(&#039;task_log&#039;);&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;set_main_table(&#039;task_log&#039;, $entitymainalias);&lt;br /&gt;
$this-&amp;gt;add_entity($entitymain);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After that, if the report will have &#039;Actions&#039;, it needs to define the columns it will use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;add_base_fields(&amp;quot;{$entitymainalias}.id&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Now, after adding our first entity, the report can use the columns and filters from it OR more entities can be added to the report using SQL joins:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$entityuser = new user();&lt;br /&gt;
$entituseralias = $entityuser-&amp;gt;get_table_alias(&#039;user&#039;);&lt;br /&gt;
$this-&amp;gt;add_entity($entityuser-&amp;gt;add_join(&lt;br /&gt;
    &amp;quot;LEFT JOIN {user} {$entituseralias} ON {$entituseralias}.id = {$entitymainalias}.userid&amp;quot;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Once all entities have been added it needs to define which columns it needs to show in the order we need:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$columns = [&lt;br /&gt;
     &#039;task_log:name&#039;,&lt;br /&gt;
     &#039;task_log:type&#039;,&lt;br /&gt;
     &#039;user:fullname&#039;,&lt;br /&gt;
     &#039;task_log:starttime&#039;,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;add_columns_from_entities($columns);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
After defining the columns, it needs to define all the filters (or empty array for no filters) that it will use:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$filters = [&lt;br /&gt;
    &#039;task_log:name&#039;,&lt;br /&gt;
    &#039;task_log:result&#039;,&lt;br /&gt;
    &#039;task_log:timestart&#039;,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$this-&amp;gt;add_filters_from_entities($filters);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In case it needs actions for each report row, they can be defined like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Action to download individual task log.&lt;br /&gt;
$this-&amp;gt;add_action((new action(&lt;br /&gt;
    new moodle_url(&#039;/admin/tasklogs.php&#039;, [&#039;logid&#039; =&amp;gt; &#039;:id&#039;, &#039;download&#039; =&amp;gt; true]),&lt;br /&gt;
    new pix_icon(&#039;t/download&#039;, get_string(&#039;download&#039;)),&lt;br /&gt;
)));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Once the whole report has been defined, is possible to set if the report will be downloadable or not:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;set_downloadable(true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Use an entity ====&lt;br /&gt;
==== Override display name for a column ====&lt;br /&gt;
It&#039;s possible to override the display name of a column, if you don&#039;t want to use the value provided by the entity.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($column = $this-&amp;gt;get_column(&#039;user:fullname&#039;)) {&lt;br /&gt;
   $column-&amp;gt;set_title(new lang_string(&#039;user&#039;, &#039;admin&#039;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Set a default initial sort direction ====&lt;br /&gt;
It&#039;s possible to set a default initial sort direction for one column.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;set_initial_sort_column(&#039;task_log:starttime&#039;, SORT_DESC);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Privacy_API/Utilities&amp;diff=60013</id>
		<title>Privacy API/Utilities</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Privacy_API/Utilities&amp;diff=60013"/>
		<updated>2021-07-14T19:53:25Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Fix syntaxhighlight tags.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;While implementing the privacy API into your plugin, there are CLI scripts that can help you to test things on the fly. Just don&#039;t forget these are not supposed to replace proper unit tests.&lt;br /&gt;
&lt;br /&gt;
Put these scripts into the root of your Moodle development installation and run them via command line. See [[Privacy API]] for the full guide on implementing the API in your plugin.&lt;br /&gt;
&lt;br /&gt;
== Test of privacy API compliance ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// Set this if you want to run the script for one component only. Otherwise leave empty.&lt;br /&gt;
$CHECK_COMPONENT = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
define(&#039;CLI_SCRIPT&#039;, true);&lt;br /&gt;
&lt;br /&gt;
require_once(&#039;config.php&#039;);&lt;br /&gt;
&lt;br /&gt;
$user = \core_user::get_user(2);&lt;br /&gt;
&lt;br /&gt;
\core\session\manager::init_empty_session();&lt;br /&gt;
\core\session\manager::set_user($user);&lt;br /&gt;
&lt;br /&gt;
$rc = new \ReflectionClass(\core_privacy\manager::class);&lt;br /&gt;
$rcm = $rc-&amp;gt;getMethod(&#039;get_component_list&#039;);&lt;br /&gt;
$rcm-&amp;gt;setAccessible(true);&lt;br /&gt;
&lt;br /&gt;
$manager = new \core_privacy\manager();&lt;br /&gt;
$components = $rcm-&amp;gt;invoke($manager);&lt;br /&gt;
&lt;br /&gt;
$list = (object) [&lt;br /&gt;
    &#039;good&#039; =&amp;gt; [],&lt;br /&gt;
    &#039;bad&#039; =&amp;gt; [],&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
foreach ($components as $component) {&lt;br /&gt;
    if ($CHECK_COMPONENT &amp;amp;&amp;amp; $component !== $CHECK_COMPONENT) {&lt;br /&gt;
        continue;&lt;br /&gt;
    }&lt;br /&gt;
    $compliant = $manager-&amp;gt;component_is_compliant($component);&lt;br /&gt;
    if ($compliant) {&lt;br /&gt;
        $list-&amp;gt;good[] = $component;&lt;br /&gt;
    } else {&lt;br /&gt;
        $list-&amp;gt;bad[] = $component;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;The following plugins are not compliant:\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;=&amp;gt; &amp;quot; . implode(&amp;quot;\n=&amp;gt; &amp;quot;, array_values($list-&amp;gt;bad)) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;Testing the compliant plugins:\n&amp;quot;;&lt;br /&gt;
foreach ($list-&amp;gt;good as $component) {&lt;br /&gt;
    $classname = \core_privacy\manager::get_provider_classname_for_component($component);&lt;br /&gt;
    echo &amp;quot;== {$component} ($classname) ==\n&amp;quot;;&lt;br /&gt;
    if (check_implements($component, \core_privacy\local\metadata\null_provider::class)) {&lt;br /&gt;
        echo &amp;quot;    Claims not to store any data with reason:\n&amp;quot;;&lt;br /&gt;
        echo &amp;quot;      &#039;&amp;quot; . get_string($classname::get_reason(), $component) . &amp;quot;&#039;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else if (check_implements($component, \core_privacy\local\metadata\provider::class)) {&lt;br /&gt;
        $collection = new \core_privacy\local\metadata\collection($component);&lt;br /&gt;
        $classname::get_metadata($collection);&lt;br /&gt;
        $count = count($collection-&amp;gt;get_collection());&lt;br /&gt;
        echo &amp;quot;    Found {$count} items of metadata\n&amp;quot;;&lt;br /&gt;
        if (empty($count)) {&lt;br /&gt;
            echo &amp;quot;!!! No metadata found!!! This an error.\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (check_implements($component, \core_privacy\local\request\user_preference_provider::class)) {&lt;br /&gt;
            $userprefdescribed = false;&lt;br /&gt;
            foreach ($collection-&amp;gt;get_collection() as $item) {&lt;br /&gt;
                if ($item instanceof \core_privacy\local\metadata\types\user_preference) {&lt;br /&gt;
                    $userprefdescribed = true;&lt;br /&gt;
                    echo &amp;quot;     &amp;quot;.$item-&amp;gt;get_name().&amp;quot; : &amp;quot;.get_string($item-&amp;gt;get_summary(), $component) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (!$userprefdescribed) {&lt;br /&gt;
                echo &amp;quot;!!! User preference found, but was not described in metadata\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (check_implements($component, \core_privacy\local\request\core_user_data_provider::class)) {&lt;br /&gt;
            // No need to check the return type - it&#039;s enforced by the interface.&lt;br /&gt;
            $contextlist = $classname::get_contexts_for_userid($user-&amp;gt;id);&lt;br /&gt;
            $approvedcontextlist = new \core_privacy\local\request\approved_contextlist($user, $contextlist-&amp;gt;get_component(), $contextlist-&amp;gt;get_contextids());&lt;br /&gt;
            if (count($approvedcontextlist)) {&lt;br /&gt;
                $classname::export_user_data($approvedcontextlist);&lt;br /&gt;
                echo &amp;quot;    Successfully ran a test export\n&amp;quot;;&lt;br /&gt;
            } else {&lt;br /&gt;
                echo &amp;quot;    Nothing to export.\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (check_implements($component, \core_privacy\local\request\shared_data_provider::class)) {&lt;br /&gt;
            echo &amp;quot;    This is a shared data provider\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;\n\n== Done ==\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
function check_implements($component, $interface) {&lt;br /&gt;
    $manager = new \core_privacy\manager();&lt;br /&gt;
    $rc = new \ReflectionClass(\core_privacy\manager::class);&lt;br /&gt;
    $rcm = $rc-&amp;gt;getMethod(&#039;component_implements&#039;);&lt;br /&gt;
    $rcm-&amp;gt;setAccessible(true);&lt;br /&gt;
&lt;br /&gt;
    return $rcm-&amp;gt;invoke($manager, $component, $interface);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test of exporting user data ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Helper utility to perform a test export.&lt;br /&gt;
 *&lt;br /&gt;
 * @copyright 2018 Andrew Nicols &amp;lt;andrew@nicols.co.uk&amp;gt;&lt;br /&gt;
 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
define(&#039;CLI_SCRIPT&#039;, true);&lt;br /&gt;
require_once(&#039;config.php&#039;);&lt;br /&gt;
require_once(&amp;quot;$CFG-&amp;gt;libdir/clilib.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
list($options, $unrecognized) = cli_get_params(&lt;br /&gt;
    [&lt;br /&gt;
        &#039;username&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        &#039;userid&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
    ],&lt;br /&gt;
    []&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$user = null;&lt;br /&gt;
$username = $options[&#039;username&#039;];&lt;br /&gt;
$userid = $options[&#039;userid&#039;];&lt;br /&gt;
&lt;br /&gt;
if (!empty($options[&#039;username&#039;])) {&lt;br /&gt;
    $user = \core_user::get_user_by_username($options[&#039;username&#039;]);&lt;br /&gt;
} else if (!empty($options[&#039;userid&#039;])) {&lt;br /&gt;
    $user = \core_user::get_user($options[&#039;userid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (empty($user)) {&lt;br /&gt;
    if (!empty($username)) {&lt;br /&gt;
        echo &amp;quot;Unable to find a user with username &#039;{$username}&#039;.\n&amp;quot;;&lt;br /&gt;
        echo &amp;quot;Try again.\n&amp;quot;;&lt;br /&gt;
    } else if (!empty($userid)) {&lt;br /&gt;
        echo &amp;quot;Unable to find a user with userid &#039;{$userid}&#039;.\n&amp;quot;;&lt;br /&gt;
        echo &amp;quot;Try again.\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    $username = readline(&amp;quot;Username: &amp;quot;);&lt;br /&gt;
    $user = \core_user::get_user_by_username($username);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Processing export for &amp;quot; . fullname($user) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
\core\session\manager::init_empty_session();&lt;br /&gt;
\core\session\manager::set_user($user);&lt;br /&gt;
&lt;br /&gt;
$PAGE = new moodle_page();&lt;br /&gt;
$OUTPUT = new core_renderer($PAGE, RENDERER_TARGET_GENERAL);&lt;br /&gt;
&lt;br /&gt;
$manager = new \core_privacy\manager();&lt;br /&gt;
&lt;br /&gt;
$approvedlist = new \core_privacy\local\request\contextlist_collection($user-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
$contextlists = $manager-&amp;gt;get_contexts_for_userid($user-&amp;gt;id);&lt;br /&gt;
foreach ($contextlists as $contextlist) {&lt;br /&gt;
    $approvedlist-&amp;gt;add_contextlist(new \core_privacy\local\request\approved_contextlist(&lt;br /&gt;
        $user,&lt;br /&gt;
        $contextlist-&amp;gt;get_component(),&lt;br /&gt;
        $contextlist-&amp;gt;get_contextids()&lt;br /&gt;
    ));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$exportedcontent = $manager-&amp;gt;export_user_data($approvedlist);&lt;br /&gt;
$basedir = make_temp_directory(&#039;privacy&#039;);&lt;br /&gt;
$exportpath = make_unique_writable_directory($basedir, true);&lt;br /&gt;
$fp = get_file_packer();&lt;br /&gt;
$fp-&amp;gt;extract_to_pathname($exportedcontent, $exportpath);&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;== File export was uncompressed to {$exportpath}\n&amp;quot;;&lt;br /&gt;
echo &amp;quot;============================================================================\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test of deleting user data ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// This file is part of Moodle - http://moodle.org/&lt;br /&gt;
//&lt;br /&gt;
// Moodle is free software: you can redistribute it and/or modify&lt;br /&gt;
// it under the terms of the GNU General Public License as published by&lt;br /&gt;
// the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
// (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
// Moodle is distributed in the hope that it will be useful,&lt;br /&gt;
// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
// GNU General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
// You should have received a copy of the GNU General Public License&lt;br /&gt;
// along with Moodle.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
define(&#039;CLI_SCRIPT&#039;, true);&lt;br /&gt;
require_once(&#039;config.php&#039;);&lt;br /&gt;
require_once(&amp;quot;$CFG-&amp;gt;libdir/clilib.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
list($options, $unrecognized) = cli_get_params(&lt;br /&gt;
    [&lt;br /&gt;
        &#039;username&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
        &#039;userid&#039; =&amp;gt; &#039;&#039;,&lt;br /&gt;
    ],&lt;br /&gt;
    []&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$user = null;&lt;br /&gt;
$username = $options[&#039;username&#039;];&lt;br /&gt;
$userid = $options[&#039;userid&#039;];&lt;br /&gt;
&lt;br /&gt;
if (!empty($options[&#039;username&#039;])) {&lt;br /&gt;
    $user = \core_user::get_user_by_username($options[&#039;username&#039;]);&lt;br /&gt;
} else if (!empty($options[&#039;userid&#039;])) {&lt;br /&gt;
    $user = \core_user::get_user($options[&#039;userid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
while (empty($user)) {&lt;br /&gt;
    if (!empty($username)) {&lt;br /&gt;
        echo &amp;quot;Unable to find a user with username &#039;{$username}&#039;.\n&amp;quot;;&lt;br /&gt;
        echo &amp;quot;Try again.\n&amp;quot;;&lt;br /&gt;
    } else if (!empty($userid)) {&lt;br /&gt;
        echo &amp;quot;Unable to find a user with userid &#039;{$userid}&#039;.\n&amp;quot;;&lt;br /&gt;
        echo &amp;quot;Try again.\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    $username = readline(&amp;quot;Username: &amp;quot;);&lt;br /&gt;
    $user = \core_user::get_user_by_username($username);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Processing delete for &amp;quot; . fullname($user) . &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
\core\session\manager::init_empty_session();&lt;br /&gt;
\core\session\manager::set_user($user);&lt;br /&gt;
&lt;br /&gt;
$manager = new \core_privacy\manager();&lt;br /&gt;
&lt;br /&gt;
$approvedlist = new \core_privacy\local\request\contextlist_collection($user-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
$trace = new text_progress_trace();&lt;br /&gt;
$contextlists = $manager-&amp;gt;get_contexts_for_userid($user-&amp;gt;id, $trace);&lt;br /&gt;
foreach ($contextlists as $contextlist) {&lt;br /&gt;
    $approvedlist-&amp;gt;add_contextlist(new \core_privacy\local\request\approved_contextlist(&lt;br /&gt;
        $user,&lt;br /&gt;
        $contextlist-&amp;gt;get_component(),&lt;br /&gt;
        $contextlist-&amp;gt;get_contextids()&lt;br /&gt;
    ));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$manager-&amp;gt;delete_data_for_user($approvedlist, $trace);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Privacy]]&lt;br /&gt;
[[Category:GDPR]]&lt;br /&gt;
[[Category:Utilities]]&lt;br /&gt;
[[Category:SampleCode]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58776</id>
		<title>Moodle libraries credits</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=58776"/>
		<updated>2021-05-11T08:07:23Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Library updates for 3.11.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some of Moodle&#039;s libraries were written by other people, and are being redistributed as part of Moodle under their respective open source licenses that thankfully allow us to do so. Thanks to the authors of all these excellent products - without them Moodle would be missing important functionality. Copyright information for each package is included below:&lt;br /&gt;
&lt;br /&gt;
==ADOdb==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/adodb&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Database abstraction library for MySQL, PostgreSQL, MSSQL, Oracle, Interbase, Foxpro, Access, ADO, Sybase, DB2 and ODBC.&lt;br /&gt;
&lt;br /&gt;
Version: 5.20.14&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.&lt;br /&gt;
&lt;br /&gt;
@copyright (c) 2014      Damien Regad, Mark Newnham and the ADOdb community&lt;br /&gt;
&lt;br /&gt;
License: Dual LGPL and BSD-style&lt;br /&gt;
&lt;br /&gt;
http://adodb.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
==Bennu==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/bennu&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bennu is an object-oriented library written in PHP that implements the iCalendar standard (RFC 2445).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1 (customized since then)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005, Jon Papaioannou&lt;br /&gt;
&lt;br /&gt;
License: LGPL 2.1+&lt;br /&gt;
&lt;br /&gt;
http://bennu.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
==Amazon S3==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;repository/s3/S3.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A standalone Amazon S3 (REST) client for PHP 5.2.x using CURL that does not require PEAR. &lt;br /&gt;
&lt;br /&gt;
Version: 0.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2013, Donovan Schönknecht&lt;br /&gt;
&lt;br /&gt;
License: BSD 2-Clause&lt;br /&gt;
&lt;br /&gt;
https://github.com/tpyo/amazon-s3-php-class/releases&lt;br /&gt;
&lt;br /&gt;
==CAS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;auth/cas/CAS&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
phpCAS library to support CAS authentication plugin&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.7&lt;br /&gt;
&lt;br /&gt;
Copyright Jasig&lt;br /&gt;
&lt;br /&gt;
License: Apache License 2.0&lt;br /&gt;
&lt;br /&gt;
https://wiki.jasig.org/display/CASC/phpCAS&lt;br /&gt;
&lt;br /&gt;
==Chart.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/amd/src/chartjs-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Simple yet flexible JavaScript charting for designers &amp;amp; developers&lt;br /&gt;
&lt;br /&gt;
Version: 2.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright 2016 Nick Downie&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://www.chartjs.org&lt;br /&gt;
&lt;br /&gt;
==CodeMirror==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor/atto/plugins/html/yui/src/codemirror&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
CodeMirror is a versatile text editor implemented in JavaScript for the browser.&lt;br /&gt;
&lt;br /&gt;
Version: 5.59.4&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/codemirror/CodeMirror&lt;br /&gt;
&lt;br /&gt;
==Emoji-data==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/emoji-data&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to parse easily data and spritesheets for emoji&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/iamcal/emoji-data/&lt;br /&gt;
&lt;br /&gt;
==EvalMath==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/evalmath&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to safely evaluate math expressions&lt;br /&gt;
&lt;br /&gt;
Copyright Miles Kaufmann&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.twmagic.com/&lt;br /&gt;
&lt;br /&gt;
==Flexitour==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/tour.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A JS library for tours&lt;br /&gt;
&lt;br /&gt;
© 2016 Andrew Nicols and contributors&lt;br /&gt;
&lt;br /&gt;
License: GPLv3&lt;br /&gt;
&lt;br /&gt;
https://github.com/andrewnicols/flexitour&lt;br /&gt;
&lt;br /&gt;
==FLV player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/mediaplugin/flvplayer.swf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play FLV files&lt;br /&gt;
&lt;br /&gt;
Copyright Jeroen Wijering &lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.jeroenwijering.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
== GeoIp2 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/maxmind/GeoIp2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for processing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 2.10.0&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/GeoIP2-php&lt;br /&gt;
&lt;br /&gt;
== GeoPattern==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geopattern-php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for creating beautiful generative background images from a string&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.1&lt;br /&gt;
&lt;br /&gt;
Copyright 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/RedeyeGroup/geopattern-php&lt;br /&gt;
&lt;br /&gt;
==Google APIs==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/google&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library Google APIs Client Library for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 1.1.7&lt;br /&gt;
&lt;br /&gt;
License: Apache License Version 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/google/google-api-php-client&lt;br /&gt;
&lt;br /&gt;
==Graph Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/graphlib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to draw line, point, bar, and area graphs, including numeric x-axis and double y-axis.&lt;br /&gt;
&lt;br /&gt;
Version: 1.6.3 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000  Herman Veluwenkamp (&#039;&#039;hermanV AT mindless DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==H5P==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/h5p&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The general H5P library&lt;br /&gt;
&lt;br /&gt;
Version: 1.24&lt;br /&gt;
&lt;br /&gt;
Copyright © Joubel&lt;br /&gt;
&lt;br /&gt;
License: GPL-3.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/h5p/h5p-php-library/&lt;br /&gt;
&lt;br /&gt;
==Horde==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/horde&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used by the inbound e-mail handling system.&lt;br /&gt;
&lt;br /&gt;
Version: 5.2.22&lt;br /&gt;
&lt;br /&gt;
Copyright © Horde LLC&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.horde.org/&lt;br /&gt;
&lt;br /&gt;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP script to convert HTML into an approximate text equivalent&lt;br /&gt;
&lt;br /&gt;
Version: 4.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2005-2007 Jon Abernathy &amp;lt;jon@chuggnutt.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/mtibben/html2text.git&lt;br /&gt;
&lt;br /&gt;
==htmlArea==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/editor&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript/HTML script to put a GUI editor in textareas on Internet Explorer and Mozilla&lt;br /&gt;
&lt;br /&gt;
Version: 3.0 beta (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  interactivetools.com, inc.&lt;br /&gt;
&lt;br /&gt;
License: htmlArea License (based on BSD license)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==HTML Purifier==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/htmlpurifier&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Filters HTML.&lt;br /&gt;
&lt;br /&gt;
Version: 4.13.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
==IP-Atlas==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/ipatlas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP scripts to show the location of an IP address on a map.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002   Ivan Kozik&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.xpenguin.com/ip-atlas.php&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Jabber - XMPPHP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jabber&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP library for XMPP (aka Jabber, Google Talk, etc).&lt;br /&gt;
&lt;br /&gt;
Version: 0.1rc2-r77&lt;br /&gt;
&lt;br /&gt;
Copyright: 2008  Nathanael C. Fritz&lt;br /&gt;
&lt;br /&gt;
License: GPL&lt;br /&gt;
&lt;br /&gt;
http://code.google.com/p/xmpphp&lt;br /&gt;
&lt;br /&gt;
==jQuery==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery is a fast, small, and feature-rich JavaScript library widely used on moodle.&lt;br /&gt;
&lt;br /&gt;
Version: 3.4.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://jquery.com&lt;br /&gt;
&lt;br /&gt;
==jQuery migrate==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/jquery-migrate-1.4.0.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library used migrate older jQuery code to jQuery 3.0.&lt;br /&gt;
&lt;br /&gt;
Version: 1.4.0&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==jQuery UI==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/jquery/ui-1.12.1/&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
jQuery UI is a set of user interface interactions, effects, widgets, and themes built on top of the jQuery library.&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.1&lt;br /&gt;
&lt;br /&gt;
Copyright: 2016 The jQuery Foundation and other contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/jquery/jquery-migrate&lt;br /&gt;
&lt;br /&gt;
==JavaScript Beautifier==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;yui/src/beautify&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beautify HTML code in Atto.&lt;br /&gt;
&lt;br /&gt;
Version: 1.13.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://beautifier.io/&lt;br /&gt;
&lt;br /&gt;
==Services_JSON==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/json&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Allows PHP-&amp;gt;JS communication via JSON&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Michal Migurski&lt;br /&gt;
&lt;br /&gt;
License: Modified BSD (GPL-compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/pepr/pepr-proposal-show.php?id=198&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==JWT==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-jwt&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to RFC 7519&lt;br /&gt;
&lt;br /&gt;
Version: 5.0.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 2011, Neuman Vong&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/firebase/php-jwt&lt;br /&gt;
&lt;br /&gt;
==ENUM==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-enum&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP Enum implementation inspired from SplEnum&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.6&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 My C-Labs&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/myclabs/php-enum&lt;br /&gt;
&lt;br /&gt;
==kses==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/kses.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
HTML/XHTML filter that only allows some elements and attributes&lt;br /&gt;
&lt;br /&gt;
Version: 0.2.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002, 2003, 2005   Ulf Harnhammar&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://sourceforge.net/projects/kses&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==less.php==&lt;br /&gt;
&lt;br /&gt;
The less.php is a PHP port of the official LESS processor used by moodle themes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/lessphp&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Version: 1.7.0.10&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
http://lessphp.typesettercms.com/&lt;br /&gt;
&lt;br /&gt;
Copyright:  Matt Agar and Martin Jantošovič&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==loglevel.js==&lt;br /&gt;
&lt;br /&gt;
Minimal lightweight simple logging for JavaScript.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2019 Tim Perry&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/pimterry/loglevel/&lt;br /&gt;
&lt;br /&gt;
==LTI Tool Provider Library for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/ltiprovider/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for communicating with learning tools as per the LTI specification.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.2&lt;br /&gt;
&lt;br /&gt;
© 2016 IMS Global Learning Consortium Inc. All Rights Reserved. Trademark Policy - (www.imsglobal.org/trademarks)&lt;br /&gt;
&lt;br /&gt;
License: Apache 2&lt;br /&gt;
&lt;br /&gt;
https://github.com/IMSGlobal/LTI-Tool-Provider-Library-PHP&lt;br /&gt;
&lt;br /&gt;
==MathJax==&lt;br /&gt;
&lt;br /&gt;
JavaScript filter library for displaying LaTeX, AsciiMath notation, and MathML.&lt;br /&gt;
&lt;br /&gt;
Not actually included in Moodle. Instead, Moodle [[:en:MathJax filter|has a setting]] for where the library is located to be loaded from. It is currently pointing to the Cloudflare CDN by default.&lt;br /&gt;
&lt;br /&gt;
© Copyright 2009 - 2017 The MathJax Consortium&lt;br /&gt;
&lt;br /&gt;
* Default MathJax version: 2.7.2 (Moodle 3.4)&lt;br /&gt;
* License: Apache 2.0&lt;br /&gt;
* Homepage: https://www.mathjax.org/&lt;br /&gt;
&lt;br /&gt;
==MatthiasMullie\Minify==&lt;br /&gt;
CSS &amp;amp; JavaScript minifier, in PHP&lt;br /&gt;
&lt;br /&gt;
Version 1.3.61&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/matthiasmullie/minify&lt;br /&gt;
&lt;br /&gt;
==MaxMind DB Reader==&lt;br /&gt;
lib/maxmind/MaxMind/&lt;br /&gt;
&lt;br /&gt;
PHP API for reading MaxMind DB files&lt;br /&gt;
&lt;br /&gt;
Version: 1.5.1&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: Apache 2.0&lt;br /&gt;
&lt;br /&gt;
https://github.com/maxmind/MaxMind-DB-Reader-php/&lt;br /&gt;
&lt;br /&gt;
==mimeTeX==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;filter/tex&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Compiled C program to convert TeX into GIFs&lt;br /&gt;
&lt;br /&gt;
Version: 1.74&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   John Forkosh Associates, Inc&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.forkosh.com/mimetex.html&lt;br /&gt;
&lt;br /&gt;
==Mustache.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/amd/src/mustache.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
JS library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 3.0.1&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2009 Chris Wanstrath (Ruby)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2014 Jan Lehnardt (JavaScript)&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2015 The mustache.js community&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/janl/mustache.js/releases&lt;br /&gt;
&lt;br /&gt;
==Mustache==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/mustache&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PHP library for displaying mustache templates.&lt;br /&gt;
&lt;br /&gt;
Version: 2.12.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2010-2016 Justin Hileman&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/bobthecow/mustache.php/releases&lt;br /&gt;
&lt;br /&gt;
==mp3player==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mp3player&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Flash movie to play streaming MP3s&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005   Andrew Walker&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==overlibmws==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/overlib.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Javascript library to enable DHTML popups, floating windows, events etc&lt;br /&gt;
&lt;br /&gt;
Version: July 2004&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002-2004   Foteos Macrides&lt;br /&gt;
&lt;br /&gt;
Copyright © 1998-2004   Erik Bosrup&lt;br /&gt;
&lt;br /&gt;
License: Artistic Open Source License&lt;br /&gt;
&lt;br /&gt;
http://www.macridesweb.com/oltest/&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PclZip==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pclzip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to create, manage and unpack zip files.&lt;br /&gt;
&lt;br /&gt;
Version: 2.4 RC1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Vincent Blavet (&#039;&#039;vincent AT phpconcept DOT net&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://www.phpconcept.net&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR OLE Classes==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.5&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/OLE&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR Spreadsheet_Excel_Writer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write Excel files&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Xavier Noguer and Mika Tuupola&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/Spreadsheet_Excel_Writer&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to write forms&lt;br /&gt;
&lt;br /&gt;
Version: 3.2.6&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Bertrand Mansion, Adam Daniel, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Quickform_Renderer_Tableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render forms without tables&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Quickform_Renderer_Tableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_QuickForm_DHTMLRulesTableless==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to render validation notices with dhtml&lt;br /&gt;
&lt;br /&gt;
Version: 0.1.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2005 Alexey Borzov, Adam Daniel, Bertrand Mansion, Justin Patrin, Mark Wiesemann&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_QuickForm_DHTMLRulesTableless&lt;br /&gt;
&lt;br /&gt;
==PEAR HTML_Common==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class with many common HTML functions (used by HTML Quickform)&lt;br /&gt;
&lt;br /&gt;
Version: 0.3.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004  Adam Daniel, Bertrand Mansion, Klaus Guenther, Alexey Borzov&lt;br /&gt;
&lt;br /&gt;
License: PHP (plus special exemption for Moodle to make it compatible)&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/HTML_Common&lt;br /&gt;
&lt;br /&gt;
==PEAR XML_Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/pear&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class implementing one handy (sax-expat) XML parser&lt;br /&gt;
&lt;br /&gt;
Version: 1.3.2&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004-2008 The PHP Group &amp;amp; Stephan Schmidt&lt;br /&gt;
&lt;br /&gt;
License: New BSD License&lt;br /&gt;
&lt;br /&gt;
http://pear.php.net/package/XML_Parser&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PHP-CSS-Parser==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/php-css-parser&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Parser for CSS Files written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 8.3.0&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2011 Raphael Schweikert, http://sabberworm.com/&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/sabberworm/PHP-CSS-Parser&lt;br /&gt;
&lt;br /&gt;
==PHPExcel==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpexcel/PHPExcel.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.8.1&lt;br /&gt;
&lt;br /&gt;
Copyright © 2006 - 2015 PHPExcel&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PHPExcel&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==PhpSpreadsheet==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/phpspreadsheet&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library to read, write and create spreadsheet documents in PHP.&lt;br /&gt;
&lt;br /&gt;
Version 1.7.0&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
https://github.com/PHPOffice/PhpSpreadsheet&lt;br /&gt;
&lt;br /&gt;
==PHP mailer==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.phpmailer.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for sending email using either sendmail, PHP mail(), or SMTP.  Methods are based upon the standard AspEmail(tm) classes.&lt;br /&gt;
&lt;br /&gt;
Version 6.0.7&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003 Brent R. Matzelle (&#039;&#039;bmatzelle AT yahoo DOT com&#039;&#039;)&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://phpmailer.sourceforge.net&lt;br /&gt;
https://github.com/PHPMailer/PHPMailer/releases&lt;br /&gt;
&lt;br /&gt;
==PHP Markdown==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/markdown.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Functions to convert from the Markdown text format into clean XHTML.&lt;br /&gt;
&lt;br /&gt;
Version: 1.8.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2004-2016 Michel Fortin &amp;lt;https://michelf.com/projects/php-markdown/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * @copyright (Original Markdown) 2004-2006 John Gruber &amp;lt;https://daringfireball.net/projects/markdown/&amp;gt;&lt;br /&gt;
All rights reserved.&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&lt;br /&gt;
&lt;br /&gt;
==PHP-ML==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/mlbackend/php/phpml&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Machine learning library used to generate data for the Analytics system.&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.0&lt;br /&gt;
&lt;br /&gt;
 * @copyright 2016-2018 Arkadiusz Kondas &amp;lt;arkadiusz.kondas[at]gmail&amp;gt;&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://php-ml.readthedocs.io/&lt;br /&gt;
&lt;br /&gt;
==Popper.js==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;admin/tool/usertours/amd/src/popper.js&amp;quot;&lt;br /&gt;
&lt;br /&gt;
A kickass library used to created Poppers in web applications&lt;br /&gt;
&lt;br /&gt;
Version: 1.12.6&lt;br /&gt;
&lt;br /&gt;
© 2016 Federico Zivolo and contributors&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/FezVrasta/popper.js&lt;br /&gt;
&lt;br /&gt;
==RTLCSS for PHP==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/rtlcss&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RTLCSS is a framework for converting Left-To-Right (LTR) Cascading Style Sheets(CSS) to Right-To-Left (RTL).&lt;br /&gt;
&lt;br /&gt;
© 2016 Frédéric Massart&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
https://github.com/moodlehq/rtlcss-php&lt;br /&gt;
&lt;br /&gt;
==RequireJS==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/requirejs/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
RequireJS is a JavaScript file and module loader.&lt;br /&gt;
&lt;br /&gt;
Version 2.3.5&lt;br /&gt;
&lt;br /&gt;
License: new BSD or MIT&lt;br /&gt;
&lt;br /&gt;
http://requirejs.org/&lt;br /&gt;
&lt;br /&gt;
==scssphp==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/lib/scssphp/&#039;&#039;	&lt;br /&gt;
&lt;br /&gt;
scssphp is a compiler for SCSS written in PHP.&lt;br /&gt;
&lt;br /&gt;
Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2015 Leaf Corcoran&lt;br /&gt;
&lt;br /&gt;
License: MIT&lt;br /&gt;
&lt;br /&gt;
http://leafo.github.io/scssphp&lt;br /&gt;
&lt;br /&gt;
==SimplePie==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;/lib/simplepie&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Simple Pie helps with blogs.&lt;br /&gt;
&lt;br /&gt;
Version 1.5.6&lt;br /&gt;
&lt;br /&gt;
License: BSD&lt;br /&gt;
&lt;br /&gt;
https://github.com/simplepie/simplepie&lt;br /&gt;
&lt;br /&gt;
==Snoopy==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/snoopy&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A PHP net client&lt;br /&gt;
&lt;br /&gt;
Version: 1.0&lt;br /&gt;
&lt;br /&gt;
Copyright © 1999-2000 Monte Ohrt (&#039;&#039;monte AT ispi DOT net&#039;&#039;)&lt;br /&gt;
License: GNU LGPL&lt;br /&gt;
&lt;br /&gt;
http://snoopy.sourceforge.com&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==SMTP class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/class.smtp.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class that can be used to connect and communicate with any SMTP server. It implements all the SMTP functions defined in RFC821 except TURN.&lt;br /&gt;
&lt;br /&gt;
Version: 03/26/2001&lt;br /&gt;
&lt;br /&gt;
Copyright © 2001  Chris Ryan (&#039;&#039;chris AT greatbridge DOT com&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spike PHPCoverage==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/spikephpcoverage&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
PHP code coverage reporting tool&lt;br /&gt;
&lt;br /&gt;
Version: 0.8.2 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 SpikeSource Inc&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://developer.spikesource.com/projects/phpcoverage&lt;br /&gt;
&lt;br /&gt;
(This library is not currently used in Moodle)&lt;br /&gt;
&lt;br /&gt;
==Spout==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;lib/spout&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Library for importing and exporting csv / excel / ODS files.&lt;br /&gt;
&lt;br /&gt;
Version 3.0.1&lt;br /&gt;
&lt;br /&gt;
License: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/box/spout/&lt;br /&gt;
&lt;br /&gt;
==TCPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/tcpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 6.3.5&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: LGPL-v3.0-only&lt;br /&gt;
&lt;br /&gt;
http://www.setasign.com/products/fpdi/downloads&lt;br /&gt;
&lt;br /&gt;
==Typo3 Character Set Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/typo3&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class for conversion between charsets and multibyte-savy operations with strings.&lt;br /&gt;
&lt;br /&gt;
Version: 4.7.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2005 Kasper Skaarhoj&lt;br /&gt;
&lt;br /&gt;
Licence: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://typo3.org/&lt;br /&gt;
&lt;br /&gt;
==Video.js==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;amd/src/video-lazy.js&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
JavaScript library that makes it easier to work with and build on HTML5 video&lt;br /&gt;
&lt;br /&gt;
Version: 7.7.6&lt;br /&gt;
&lt;br /&gt;
Copyright Brightcove, Inc&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
http://videojs.com/&lt;br /&gt;
&lt;br /&gt;
==XHProf==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/xhprof&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A Hierarchical Profiler for PHP&lt;br /&gt;
&lt;br /&gt;
Version: 0.9.4&lt;br /&gt;
&lt;br /&gt;
Copyright © 2009 Phacility&lt;br /&gt;
&lt;br /&gt;
Licence: Apache&lt;br /&gt;
&lt;br /&gt;
https://github.com/phacility/xhprof&lt;br /&gt;
&lt;br /&gt;
==Yahoo User Interface==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/yui&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The Yahoo! User Interface Library is a set of utilities and controls, in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.Set of user-interface components using AJAX, DHTML etc.  We use it for all our AJAX-related stuff.&lt;br /&gt;
&lt;br /&gt;
CVS version: 3.17.2&lt;br /&gt;
&lt;br /&gt;
Copyright (c) 2006, Yahoo! Inc.&lt;br /&gt;
&lt;br /&gt;
Licence: BSD&lt;br /&gt;
&lt;br /&gt;
http://developer.yahoo.com/yui/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Data_manipulation_API&amp;diff=58371</id>
		<title>Data manipulation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Data_manipulation_API&amp;diff=58371"/>
		<updated>2021-02-26T13:54:15Z</updated>

		<summary type="html">&lt;p&gt;Pholden: SQL group concatenation method.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle_2.0}}This page describes the functions available to access data in the Moodle database. You should &#039;&#039;&#039;exclusively&#039;&#039;&#039; use these functions in order to retrieve or modify database content because these functions provide a high level of abstraction and guarantee that your database manipulation will work against different RDBMSes.&lt;br /&gt;
&lt;br /&gt;
Where possible, tricks and examples will be documented here in order to make developers&#039; lives a bit easier. Of course, feel free to clarify, complete and add more information to  this documentation. It will be welcome, absolutely!&lt;br /&gt;
&lt;br /&gt;
== General concepts ==&lt;br /&gt;
&lt;br /&gt;
=== DB object ===&lt;br /&gt;
&lt;br /&gt;
* The data manipulation API is exposed via public methods of the &amp;lt;tt&amp;gt;$DB&amp;lt;/tt&amp;gt; object.&lt;br /&gt;
* Moodle core takes care of setting up the connection to the database according to values specified in the main config.php file.&lt;br /&gt;
* The $DB global object is an instance of the &amp;lt;tt&amp;gt;moodle_database&amp;lt;/tt&amp;gt; class. It is instantiated automatically during the bootstrap setup, i.e. as a part of including the main config.php file.&lt;br /&gt;
* The DB object is available in the global scope right after including the config.php file:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
require(__DIR__.&#039;/../../../config.php&#039;);&lt;br /&gt;
&lt;br /&gt;
// You can access the database via the $DB method calls here.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* To make the DB object available in your local scope, such as within a function:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
&lt;br /&gt;
function my_function_making_use_of_database() {&lt;br /&gt;
    global $DB;&lt;br /&gt;
&lt;br /&gt;
    // You can access the database via the $DB method calls here.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table prefix ===&lt;br /&gt;
&lt;br /&gt;
* Most Moodle installations use a prefix for all the database tables, such as &amp;lt;tt&amp;gt;mdl_&amp;lt;/tt&amp;gt;. This prefix is NOT to be used in the code in the code itself.&lt;br /&gt;
* All the $table parameters in the functions are meant to be the table name without prefixes:&lt;br /&gt;
&amp;lt;code php&amp;gt;$user = $DB-&amp;gt;get_record(&#039;user&#039;, [&#039;id&#039; =&amp;gt; &#039;1&#039;]);&amp;lt;/code&amp;gt;&lt;br /&gt;
* In custom SQL queries, table names must be enclosed between curly braces. They will be then automatically converted to the real prefixed table name. There is no need to access &amp;lt;tt&amp;gt;$CFG-&amp;gt;prefix&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;code php&amp;gt;$user = $DB-&amp;gt;get_record_sql(&#039;SELECT COUNT(*) FROM {user} WHERE deleted = 1 OR suspended = 1;&#039;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conditions ===&lt;br /&gt;
&lt;br /&gt;
* All the $conditions parameters in the functions are arrays of fieldname=&amp;gt;fieldvalue elements.&lt;br /&gt;
* They all must be fulfilled - i.e. logical &amp;lt;tt&amp;gt;AND&amp;lt;/tt&amp;gt; is used to populate the actual &amp;lt;tt&amp;gt;WHERE&amp;lt;/tt&amp;gt; statement.&lt;br /&gt;
&amp;lt;code php&amp;gt;$user = $DB-&amp;gt;get_record(&#039;user&#039;, [&#039;firstname&#039; =&amp;gt; &#039;Martin&#039;, &#039;lastname&#039; =&amp;gt; &#039;Dougiamas&#039;]);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Placeholders ===&lt;br /&gt;
&lt;br /&gt;
* All the $params parameters in the functions are arrays of values used to fill placeholders in SQL statements.&lt;br /&gt;
* Placeholders help to avoid problems with SQL-injection and/or invalid quotes in SQL queries. They facilitate secure and cross-db compatible code.&lt;br /&gt;
* Two types of placeholders are supported - question marks (&amp;lt;tt&amp;gt;SQL_PARAMS_QM&amp;lt;/tt&amp;gt;) and named placeholders (&amp;lt;tt&amp;gt;SQL_PARAMS_NAMED&amp;lt;/tt&amp;gt;).&lt;br /&gt;
* Named params &#039;&#039;&#039;must be unique&#039;&#039;&#039; even if the value passed is the same. If you need to pass the same value multiple times, you need to have multiple distinct named parameters.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
// Example of using question mark placeholders.&lt;br /&gt;
$DB-&amp;gt;get_record_sql(&#039;SELECT * FROM {user} WHERE firstname = ? AND lastname = ?&#039;, &lt;br /&gt;
    [&#039;Martin&#039;, &#039;Dougiamas&#039;]);&lt;br /&gt;
&lt;br /&gt;
// Example of using named placeholders.&lt;br /&gt;
$DB-&amp;gt;get_record_sql(&#039;SELECT * FROM {user} WHERE firstname = :firstname AND lastname = :lastname&#039;,&lt;br /&gt;
    [&#039;firstname&#039; =&amp;gt; &#039;Martin&#039;, &#039;lastname&#039; =&amp;gt; &#039;Dougiamas&#039;]);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Strictness ===&lt;br /&gt;
&lt;br /&gt;
Some methods accept the &amp;lt;tt&amp;gt;$strictness&amp;lt;/tt&amp;gt; parameter affecting the method behaviour. Supported modes are specified using the constants:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;MUST_EXIST&amp;lt;/tt&amp;gt; - In this mode, the requested record must exist and must be unique. An exception will be thrown if no record is found or multiple matching records are found.&lt;br /&gt;
* &amp;lt;tt&amp;gt;IGNORE_MISSING&amp;lt;/tt&amp;gt; - In this mode, a missing record is not an error. False boolean is returned if the requested record is not found. If more records are found, a debugging message is displayed.&lt;br /&gt;
* &amp;lt;tt&amp;gt;IGNORE_MULTIPLE&amp;lt;/tt&amp;gt; - This is not a recommended mode. The function will silently ignore multiple records found and will return just the first one of them.&lt;br /&gt;
&lt;br /&gt;
== Getting a single record ==&lt;br /&gt;
&lt;br /&gt;
=== get_record ===&lt;br /&gt;
Return a single database record as an object where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_record($table, array $conditions, $fields=&#039;*&#039;, $strictness=IGNORE_MISSING)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_record_select ===&lt;br /&gt;
Return a single database record as an object where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_record_select($table, $select, array $params=null, $fields=&#039;*&#039;, $strictness=IGNORE_MISSING)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_record_sql ===&lt;br /&gt;
Return a single database record as an object using a custom SELECT query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_record_sql($sql, array $params=null, $strictness=IGNORE_MISSING)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting a hashed array of records ==&lt;br /&gt;
Each of the following methods return an array of objects. The array is indexed by the first column of the fields returned by the query. To assure consistency, it is a good practice to ensure that your query include an &amp;quot;id column&amp;quot; as the first field. When designing custom tables, make &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; their first column and primary key.&lt;br /&gt;
&lt;br /&gt;
=== get_records ===&lt;br /&gt;
Return a list of records as an array of objects where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records($table, array $conditions=null, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_records_select ===&lt;br /&gt;
Return a list of records as an array of objects where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_select($table, $select, array $params=null, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
$fields is a comma separated list of fields to return (optional, by default all fields are returned).&lt;br /&gt;
&lt;br /&gt;
=== get_records_sql ===&lt;br /&gt;
Return a list of records as an array of objects using a custom SELECT query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_records_list ===&lt;br /&gt;
Return a list of records as an array of objects where the given field matches one of the possible values.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_list($table, $field, array $values, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=&#039;&#039;, $limitnum=&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting data as key/value pairs in an associative array ==&lt;br /&gt;
&lt;br /&gt;
=== get_records_menu ===&lt;br /&gt;
Return the first two columns from a list of records as an associative array where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_menu($table, array $conditions=null, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_records_select_menu ===&lt;br /&gt;
Return the first two columns from a list of records as an associative array where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_select_menu($table, $select, array $params=null, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_records_sql_menu ===&lt;br /&gt;
Return the first two columns from a number of records as an associative array using a custom SELECT query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_sql_menu($sql, array $params=null, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Counting records that match the given criteria ==&lt;br /&gt;
&lt;br /&gt;
=== count_records ===&lt;br /&gt;
Count the records in a table where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;count_records($table, array $conditions=null) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== count_records_select ===&lt;br /&gt;
Count the records in a table where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;count_records_select($table, $select, array $params=null, $countitem=&amp;quot;COUNT(&#039;x&#039;)&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== count_records_sql ===&lt;br /&gt;
Counting the records using a custom SELECT COUNT(...) query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;count_records_sql($sql, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Checking if a given record exists ==&lt;br /&gt;
&lt;br /&gt;
=== record_exists ===&lt;br /&gt;
Test whether a record exists in a table where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;record_exists($table, array $conditions=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== record_exists_select ===&lt;br /&gt;
Test whether any records exists in a table where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;record_exists_select($table, $select, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== record_exists_sql ===&lt;br /&gt;
Test whether the given SELECT query would return any record.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;record_exists_sql($sql, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting a particular field value from one record ==&lt;br /&gt;
&lt;br /&gt;
=== get_field ===&lt;br /&gt;
Get a single field value from a table record where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_field($table, $return, array $conditions, $strictness=IGNORE_MISSING)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_field_select ===&lt;br /&gt;
Get a single field value from a table record where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_field_select($table, $return, $select, array $params=null, $strictness=IGNORE_MISSING)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_field_sql ===&lt;br /&gt;
Get a single field value (first field) using a custom SELECT query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_field_sql($sql, array $params=null, $strictness=IGNORE_MISSING)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Getting field values from multiple records ==&lt;br /&gt;
&lt;br /&gt;
=== get_fieldset_select ===&lt;br /&gt;
Return values of the given field as an array where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_fieldset_select($table, $return, $select, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_fieldset_sql ===&lt;br /&gt;
Return values of the first column as an array using a custom SELECT field FROM ... query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_fieldset_sql($sql, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Setting a field value ==&lt;br /&gt;
&lt;br /&gt;
=== set_field ===&lt;br /&gt;
Set a single field in every record where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;set_field($table, $newfield, $newvalue, array $conditions=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set_field_select ===&lt;br /&gt;
Set a single field in every table record where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;set_field_select($table, $newfield, $newvalue, $select, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deleting records ==&lt;br /&gt;
&lt;br /&gt;
=== delete_records ===&lt;br /&gt;
Delete records from the table where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;delete_records($table, array $conditions=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== delete_records_select ===&lt;br /&gt;
Delete records from the table where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;delete_records_select($table, $select, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Inserting records ==&lt;br /&gt;
&lt;br /&gt;
=== insert_record ===&lt;br /&gt;
Insert the given data object into the table and return the &amp;quot;id&amp;quot; of the newly created record.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;insert_record($table, $dataobject, $returnid=true, $bulk=false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== insert_records ===&lt;br /&gt;
{{Moodle_2.7}}Insert multiple records into the table as fast as possible. Records are inserted in the given order, but the operation is not atomic. Use transactions if necessary.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;insert_records($table, $dataobjects)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== insert_record_raw ===&lt;br /&gt;
For rare cases when you also need to specify the ID of the record to be inserted.&lt;br /&gt;
&lt;br /&gt;
== Updating records ==&lt;br /&gt;
&lt;br /&gt;
=== update_record ===&lt;br /&gt;
Update a record in the table. The data object must have the property &amp;quot;id&amp;quot; set.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;update_record($table, $dataobject, $bulk=false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Executing a custom query ==&lt;br /&gt;
&lt;br /&gt;
=== execute ===&lt;br /&gt;
* If you need to perform a complex update using arbitrary SQL, you can use the low level &amp;quot;execute&amp;quot; method. Only use this when no specialised method exists.&lt;br /&gt;
* Do NOT use this to make changes in database structure, use database_manager methods instead!&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;execute($sql, array $params=null)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using recordsets ==&lt;br /&gt;
&lt;br /&gt;
If the number of records to be retrieved from DB is high, the &#039;get_records_xxx() functions above are far from optimal, because they load all the records into the memory via the returned array. Under those circumstances, it is highly recommended to use these get_recordset_xxx() functions instead. They return an iterator to iterate over all the found records and save a lot of memory.&lt;br /&gt;
&lt;br /&gt;
It is &#039;&#039;&#039;absolutely important&#039;&#039;&#039; to not forget to close the returned recordset iterator after using it. This is to free up a lot of resources in the RDBMS.&lt;br /&gt;
&lt;br /&gt;
A general way to iterate over records using the get_recordset_xxx() functions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$rs = $DB-&amp;gt;get_recordset(....) {&lt;br /&gt;
foreach ($rs as $record) {&lt;br /&gt;
    // Do whatever you want with this record&lt;br /&gt;
}&lt;br /&gt;
$rs-&amp;gt;close();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unlike get_record functions, you cannot check if &amp;lt;tt&amp;gt;$rs == true&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;!empty($rs)&amp;lt;/tt&amp;gt; to determine if any records were found. Instead, if you need to, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($rs-&amp;gt;valid()) {&lt;br /&gt;
    // The recordset contains some records.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_recordset ===&lt;br /&gt;
Return a list of records as a moodle_recordset where all the given conditions are met.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_recordset($table, array $conditions=null, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_recordset_select ===&lt;br /&gt;
Return a list of records as a moodle_recordset where the given conditions are used in the WHERE clause.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_recordset_select($table, $select, array $params=null, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_recordset_sql ===&lt;br /&gt;
Return a list of records as a moodle_recordset using a custom SELECT query.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_recordset_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_recordset_list ===&lt;br /&gt;
Return a list of records as a moodle_recordset where the given field matches one of the possible values.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_recordset_list($table, $field, array $values, $sort=&#039;&#039;, $fields=&#039;*&#039;, $limitfrom=&#039;&#039;, $limitnum=&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Delegated transactions ==&lt;br /&gt;
&lt;br /&gt;
* Please note some databases do not support transactions (such as the MyISAM MySQL database engine), however all server administrators are strongly encouraged to migrate to databases that support transactions (such as the InnoDB MySQL database engine).&lt;br /&gt;
* Previous versions supported only one level of transaction. Since Moodle 2.0, the DML layer emulates delegated transactions that allow nesting of transactions.&lt;br /&gt;
* Some subsystems (such as messaging) do not support transactions because it is not possible to rollback in external systems.&lt;br /&gt;
&lt;br /&gt;
A transaction is started by:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$transaction = $DB-&amp;gt;start_delegated_transaction();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and finished by:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$transaction-&amp;gt;allow_commit();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usually a transaction is rolled back when an exception is thrown:&lt;br /&gt;
&amp;lt;code php&amp;gt;$transaction-&amp;gt;rollback($ex);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which must be used very carefully because it might break compatibility with databases that do not support transactions. Transactions cannot be used as part of expected code flow; they can be used only as an emergency protection of data consistency.&lt;br /&gt;
&lt;br /&gt;
See more details in [[DB layer 2.0 delegated transactions]] or MDL-20625.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
global $DB;&lt;br /&gt;
try {&lt;br /&gt;
     $transaction = $DB-&amp;gt;start_delegated_transaction();&lt;br /&gt;
     $DB-&amp;gt;insert_record(&#039;foo&#039;, $object);&lt;br /&gt;
     $DB-&amp;gt;insert_record(&#039;bar&#039;, $otherobject);&lt;br /&gt;
&lt;br /&gt;
     // Assuming the both inserts work, we get to the following line.&lt;br /&gt;
     $transaction-&amp;gt;allow_commit();&lt;br /&gt;
&lt;br /&gt;
} catch(Exception $e) {&lt;br /&gt;
     $transaction-&amp;gt;rollback($e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cross-DB compatibility ==&lt;br /&gt;
&lt;br /&gt;
Moodle supports several SQL servers (MySQL, PostgreSQL, MS-SQL and Oracle). Each of them have some specific syntax in certain cases. In order to achieve cross-db compatibility of the code, following functions must be used to generate the fragments of the query valid for the actual SQL server.&lt;br /&gt;
&lt;br /&gt;
=== sql_bitand ===&lt;br /&gt;
Return the SQL text to be used in order to perform a bitwise AND operation between 2 integers.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_bitand($int1, $int2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_bitnot ===&lt;br /&gt;
Return the SQL text to be used in order to perform a bitwise NOT operation on the given integer.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_bitnot($int1)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_bitor ===&lt;br /&gt;
Return the SQL text to be used in order to perform a bitwise OR operation between 2 integers.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_bitor($int1, $int2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_bitxor ===&lt;br /&gt;
Return the SQL text to be used in order to perform a bitwise XOR operation between 2 integers.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_bitxor($int1, $int2)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
=== sql_null_from_clause ===&lt;br /&gt;
Return an empty FROM clause required by some DBs in all SELECT statements.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_null_from_clause()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_ceil ===&lt;br /&gt;
Return the correct CEIL expression applied to the given fieldname.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_ceil($fieldname)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_equal ===&lt;br /&gt;
{{Moodle 3.2}}Return the query fragment to perform cross-db varchar comparisons when case-sensitiveness is important.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_equal($fieldname, $param, $casesensitive = true, $accentsensitive = true, $notequal = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_like ===&lt;br /&gt;
Return the query fragment to perform the LIKE comparison.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_like($fieldname, $param, $casesensitive = true, $accentsensitive = true, $notlike = false, $escapechar = &#039; \\ &#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Searching for records partially matching the given hard-coded literal.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_records_sql(&#039;SELECT id,fullname FROM {course} WHERE &#039;.$DB-&amp;gt;sql_like(&#039;idnumber&#039;, &#039;:idnum&#039;), [&#039;idnum&#039; =&amp;gt; &#039;DEMO-%&#039;));&amp;lt;/code&amp;gt;&lt;br /&gt;
See below if you need to compare with a value submitted by the user.&lt;br /&gt;
&lt;br /&gt;
=== sql_like_escape ===&lt;br /&gt;
Escape the value submitted by the user so that it can be used for partial comparison and the special characters like &#039;_&#039; or &#039;%&#039; behave as literal characters, not wildcards.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_like_escape($text, $escapechar = &#039;\\&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: If you need to perform a partial comparison with a value that has been submitted by the user.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$search = required_param(&#039;search&#039;, PARAM_RAW);&lt;br /&gt;
$DB-&amp;gt;get_records_sql(&#039;SELECT id,fullname FROM {course} WHERE &#039;.$DB-&amp;gt;sql_like(&#039;fullname&#039;, &#039;:fullname&#039;), [&#039;fullname&#039; =&amp;gt; &#039;%&#039;.$DB-&amp;gt;sql_like_escape($search).&#039;%&#039;]);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_length ===&lt;br /&gt;
Return the query fragment to be used to calculate the length of the expression in characters.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_length($fieldname)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_modulo ===&lt;br /&gt;
Return the query fragment to be used to calculate the remainder after division.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_modulo($int1, $int2)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_position ===&lt;br /&gt;
Return the query fragment for searching a string for the location of a substring. If both needle and haystack use placeholders, you must use named placeholders.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_position($needle, $haystack)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_substr ===&lt;br /&gt;
Return the query fragment for extracting a substring from the given expression.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_substr($expr, $start, $length=false)&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
=== sql_cast_char2int ===&lt;br /&gt;
Return the query fragment to cast a CHAR column to INTEGER&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_cast_char2int($fieldname, $text=false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_cast_char2real ===&lt;br /&gt;
Return the query fragment to cast a CHAR column to REAL (float) number&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_cast_char2real($fieldname, $text=false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_compare_text ===&lt;br /&gt;
Return the query fragment to be used when comparing a TEXT (clob) column with a given string or a VARCHAR field (some RDBMs do not allow for direct comparison).&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_compare_text($fieldname, $numchars=32)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$todogroups = $DB-&amp;gt;get_records_sql(&#039;SELECT id FROM {group} WHERE &#039; . $DB-&amp;gt;sql_compare_text(&#039;description&#039;) . &#039; = &#039; . $DB-&amp;gt;sql_compare_text(&#039;:description&#039;), [&#039;description&#039; =&amp;gt; &#039;TODO&#039;]);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_order_by_text ===&lt;br /&gt;
Return the query fragment to be used to get records ordered by a TEXT (clob) column. Note this affects the performance badly and should be avoided if possible.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_order_by_text($fieldname, $numchars=32)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_concat ===&lt;br /&gt;
Return the query fragment to concatenate all given paremeters into one string.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_concat(...)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_group_concat ===&lt;br /&gt;
Return SQL for performing group concatenation on given field/expression.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_group_concat(string $field, string $separator = &#039;, &#039;, string $sort = &#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_concat_join ===&lt;br /&gt;
Return the query fragment to concatenate all given elements into one string using the given separator.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_concat_join($separator=&amp;quot;&#039; &#039;&amp;quot;, $elements=array())&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_fullname ===&lt;br /&gt;
Return the query fragment to concatenate the given $firstname and $lastname&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_fullname($first=&#039;firstname&#039;, $last=&#039;lastname&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  sql_isempty ===&lt;br /&gt;
Return the query fragment to check if the field is empty&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_isempty($tablename, $fieldname, $nullablefield, $textfield)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_isnotempty ===&lt;br /&gt;
Return the query fragment to check if the field is not empty&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_isnotempty($tablename, $fieldname, $nullablefield, $textfield)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== get_in_or_equal ===&lt;br /&gt;
Return the query fragment to check if a value is IN the given list of items (with a fallback to plain equal comparison if there is just one item)&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;get_in_or_equal($items, $type=SQL_PARAMS_QM, $prefix=&#039;param&#039;, $equal=true, $onemptyitems=false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$statuses = [&#039;todo&#039;, &#039;open&#039;, &#039;inprogress&#039;, &#039;intesting&#039;];&lt;br /&gt;
list($insql, $inparams) = $DB-&amp;gt;get_in_or_equal($statuses);&lt;br /&gt;
$sql = &amp;quot;SELECT * FROM {bugtracker_issues} WHERE status $insql&amp;quot;;&lt;br /&gt;
$bugs = $DB-&amp;gt;get_records_sql($sql, $inparams);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An example using named params:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
list($insql, $params) = $DB-&amp;gt;get_in_or_equal($contexts, SQL_PARAMS_NAMED, &#039;ctx&#039;);&lt;br /&gt;
$contextsql = &amp;quot;AND rc.contextid $insql&amp;quot;;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_regex_supported ===&lt;br /&gt;
Does the current database driver support regex syntax when searching?&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_regex_supported()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_regex ===&lt;br /&gt;
Return the query fragment to perform a regex search.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_regex($positivematch = true, $casesensitive = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: Searching for Page module instances containing links.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($DB-&amp;gt;sql_regex_supported()) {&lt;br /&gt;
    $select = &#039;content &#039; . $DB-&amp;gt;sql_regex() . &#039; :pattern&#039;;&lt;br /&gt;
    $params = [&#039;pattern&#039; =&amp;gt; &amp;quot;(src|data)\ *=\ *[\\\&amp;quot;\&#039;]https?://&amp;quot;]&lt;br /&gt;
} else {&lt;br /&gt;
    $select = $DB-&amp;gt;sql_like(&#039;content&#039;, &#039;:pattern&#039;, false);&lt;br /&gt;
    $params = [&#039;pattern&#039; =&amp;gt; &#039;%=%http%://%&#039;];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pages = $DB-&amp;gt;get_records_select(&#039;page&#039;, $select, $params, &#039;course&#039;, &#039;id, course, name&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sql_intersect ===&lt;br /&gt;
{{Moodle 2.8}}Return the query fragment that allows to find intersection of two or more queries&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;sql_intersect($selects, $fields)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
&lt;br /&gt;
=== set_debug ===&lt;br /&gt;
You can enable a debugging mode to make $DB output the SQL of every executed query, along with some timing information. This can be useful when debugging your code. Obviously, all such calls should be removed before code is submitted for integration.&lt;br /&gt;
&amp;lt;code php&amp;gt;$DB-&amp;gt;set_debug(true)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Special cases ==&lt;br /&gt;
&lt;br /&gt;
=== get_course ===&lt;br /&gt;
&lt;br /&gt;
From Moodle 2.5.1 onwards, you should use the get_course function instead of using get_record(&#039;course&#039;, ...) if you want to get a course record based on its ID, especially if there is a significant possibility that the course being retrieved is either the current course for the page, or the site course. Those two course records have probably already been loaded, and using this function will save a database query. &lt;br /&gt;
&lt;br /&gt;
Additionally, the code is shorter and easier to read.&lt;br /&gt;
&lt;br /&gt;
=== get_courses ===&lt;br /&gt;
&lt;br /&gt;
If you want to get all the current courses in your Moodle, use get_courses() without parameter:&lt;br /&gt;
&lt;br /&gt;
    $courses = get_courses();&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[SQL coding style]]&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
* [[DML exceptions|DML exceptions]]: New DML code is throwing exceptions instead of returning false if anything goes wrong&lt;br /&gt;
* [[DML drivers|DML drivers]]: Database drivers for new DML layer&lt;br /&gt;
* [[DML functions - pre 2.0|DML functions - pre 2.0]]: &#039;&#039;&#039;(deprecated!)&#039;&#039;&#039; For information valid before Moodle 2.0.&lt;br /&gt;
* [[DDL functions|DDL functions]]: Where all the functions used to handle DB objects ([[wikipedia:Data_Definition_Language|DDL]]) are defined.&lt;br /&gt;
* [[DB layer 2.0 examples|DB layer 2.0 examples]]: To see some code examples using various DML functions.&lt;br /&gt;
* [[DB layer 2.0 migration docs|DB layer 2.0 migration docs]]: Information about how to modify your code to work with the new Moodle 2.0 DB layer.&lt;br /&gt;
* [[DTL functions|DTL functions]]: Exporting, importing and moving of data stored in SQL databases&lt;br /&gt;
&lt;br /&gt;
[[Category:DB]]&lt;br /&gt;
[[Category:XMLDB]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=String_deprecation&amp;diff=57948</id>
		<title>String deprecation</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=String_deprecation&amp;diff=57948"/>
		<updated>2020-10-21T17:01:04Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Fix comment, lest we upset glorious codechecker.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = String deprecation&lt;br /&gt;
|state = Implemented&lt;br /&gt;
|tracker = MDL-46585&lt;br /&gt;
|discussion =&lt;br /&gt;
|assignee = Marina Glancy&lt;br /&gt;
}}&lt;br /&gt;
{{Moodle 2.8}}&lt;br /&gt;
==Removing strings which are no longer used==&lt;br /&gt;
&lt;br /&gt;
From Moodle 2.8 onwards, strings can be deprecated in a way very similar to how functions are  deprecated. This feature allows us to safely remove strings once we are reasonably sure they are no longer used. The process should help to remove unnecessary strings from the language packs, so translators do not waste valuable time  translating them, while protecting us from accidentally removing a string that is still being used somewhere.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
There is a file with the list of deprecated strings. When a deprecated string is used (typically via the &amp;lt;code&amp;gt;get_string()&amp;lt;/code&amp;gt; call), a warning message is displayed, such as:&lt;br /&gt;
&lt;br /&gt;
    String [identifier,component] is deprecated. Either you should no longer be using that string, &lt;br /&gt;
    or the string has been incorrectly deprecated, in which case you should report this as a bug. &lt;br /&gt;
    Please refer to https://docs.moodle.org/dev/String_deprecation&lt;br /&gt;
&lt;br /&gt;
Note that this warning is displayed at the DEBUG_DEVELOPER level only (which is what Moodle developers should have selected). See below for info on what to do if you see this message.&lt;br /&gt;
&lt;br /&gt;
=== Why and when should a string be deprecated? ===&lt;br /&gt;
&lt;br /&gt;
The most common case is that you realize that a string is not used any more in standard Moodle code. You will probably search the whole moodle.git for the string identifier and the only relevant place found is the string definition itself. Even if it seems that the given string is not used any more in the standard Moodle code, it&#039;s possible that some additional (contributed) plugins still rely on it. This is typical for semantically general strings provided by the moodle.php (core) component such as &amp;quot;Yes&amp;quot;, &amp;quot;Continue&amp;quot;, &amp;quot;Hidden&amp;quot; etc.&lt;br /&gt;
&lt;br /&gt;
Beware that searching for the string identifier only may sometimes lead to false negatives. Imagine you have a suspicion that a hypothetical string &amp;quot;actionloginremote&amp;quot; is no longer used any more as there is no code that would actually use this stringid. However, there can be places like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$action = optional_param(&#039;action&#039;, &#039;loginremote&#039;, PARAM_ALPHA);&lt;br /&gt;
print_string(&#039;action&#039;.$action);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
that are harder to detect. So, instead of simply removing the string &amp;quot;actionloginremote&amp;quot; you would put it to the list of deprecated strings.&lt;br /&gt;
&lt;br /&gt;
Another scenario may be that a semantically identical string was defined twice or it was put into the wrong component. If you think there may be places that rely on the wrong location (component), you should deprecate it. Copy the string to a new location (do not forget to use CPY instruction for AMOS to replay the change in all existing translations) and deprecate the old one.&lt;br /&gt;
&lt;br /&gt;
Also, it may turn out that some strings are only vaguely defined and do not have a clear and unique context / semantics. Ideally, Moodle code should use context-sensitive strings rather than rely on one general string covering all cases. Things like [http://en.wikipedia.org/wiki/Grammatical_gender grammatical gender] play an important role in many languages. For example, in Czech, &amp;quot;a role&amp;quot; or &amp;quot;a question&amp;quot; are of feminine gender and the correct translation of &amp;quot;hidden&amp;quot; in this case is &amp;quot;skrytá&amp;quot;, while &amp;quot;a badge&amp;quot; is of masculine gender and the correct translation is &amp;quot;skrytý&amp;quot;. So it would be better to have separate strings like &amp;quot;hiddenrole&amp;quot;, &amp;quot;hiddenquestion&amp;quot; and &amp;quot;hiddenbadge&amp;quot; even if they all read just &amp;quot;Hidden&amp;quot; in the English language pack. When you are about to split existing string into a couple of specific ones, you may wish to deprecate the general one at the end too (also, do not forget to use the CPY again).&lt;br /&gt;
&lt;br /&gt;
=== When should a string be removed? ===&lt;br /&gt;
&lt;br /&gt;
There are situations where deprecation does not make sense. For example when a whole functionality is being removed, or a very specific string (such as error message) is no longer used by the code. If it is very unlikely that the string is not used by any other code, it can simply be removed without the full deprecation process.&lt;br /&gt;
&lt;br /&gt;
The same logic applies to cases when a very specific string is to be moved or renamed. In this situation, it is valid to just move it (together with the matching MOV instruction in the AMOScript).&lt;br /&gt;
&lt;br /&gt;
== How to deprecate a string ==&lt;br /&gt;
&lt;br /&gt;
* Strings can be deprecated and removed on master branch only.&lt;br /&gt;
* Locate or create a file deprecated.txt either in &#039;&#039;lang/en/&#039;&#039; or &#039;&#039;componentfullpath/lang/en/&#039;&#039;&lt;br /&gt;
* Add a line &amp;quot;identifier,fullcomponentname&amp;quot; to the end of this file&lt;br /&gt;
* Move the string inside the existing language file to the end of the file under the comment &amp;lt;code&amp;gt;// Deprecated since Moodle X.Y.&amp;lt;/code&amp;gt; (this comment will help removing deprecated strings later).&lt;br /&gt;
* For final deprecation (4 major versions later), delete the string from both deprecated.txt and respective lang file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: when deprecating core string from lang/en/xxxx.php the fullcomponentname should be &amp;quot;core_xxxx&amp;quot;, except for lang/en/moodle.php that has fullcomponentname &amp;quot;core&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note: before Moodle 3.0, final deprecation was 2 major versions later. With 3.0 the policy switched to 4 major releases later&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Take care when deprecating a string within a few weeks of en_fix being merged with en, as it can result in a conflict (as happened in MDL-52315).&lt;br /&gt;
&lt;br /&gt;
== What to do if you get a debugging message ==&lt;br /&gt;
&lt;br /&gt;
There are two possibilities. Either the code that uses the deprecated string must be fixed, or the string should not have been deprecated and must be removed from the list.&lt;br /&gt;
&lt;br /&gt;
Use the git-blame tool on the corresponding lang/en/deprecated.txt and find the commit/issue that deprecated the string. It should give you enough information to decide on the most appropriate action.&lt;br /&gt;
&lt;br /&gt;
* If you think the string was deprecated by mistake, create a new issue in the tracker to remove it from the list (on all supported branches, not only on master).&lt;br /&gt;
* If the string was renamed or moved, you will probably want to fix the caller to use the new name/location of the string.&lt;br /&gt;
* You may as well copy the string to your own plugin scope and make it context-specific.&lt;br /&gt;
&lt;br /&gt;
  [https://github.com/moodle/moodle/blame/master/lang/en/deprecated.txt &amp;lt;nowiki&amp;gt;git blame lang/en/deprecated.txt&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
  [https://github.com/moodle/moodle/blame/master/mod/quiz/lang/en/deprecated.txt &amp;lt;nowiki&amp;gt;git blame mod/quiz/lang/en/deprecated.txt&amp;lt;/nowiki&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* MDL-64905 comments regarding introducing a new string and deprecating the old one&lt;br /&gt;
&lt;br /&gt;
[[Category:Language]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.9_release_notes&amp;diff=57605</id>
		<title>Moodle 3.9 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.9_release_notes&amp;diff=57605"/>
		<updated>2020-06-15T08:17:34Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Dataformat API upgrade notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Release date: 15 June 2020&lt;br /&gt;
&lt;br /&gt;
Here is [https://tracker.moodle.org/secure/IssueNavigator!executeAdvanced.jspa?jqlQuery=project+%3D+mdl+AND+resolution+%3D+fixed+AND+fixVersion+in+%28%223.9%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.9].&lt;br /&gt;
&lt;br /&gt;
If you are upgrading from a previous version, please see [[:en:Upgrading|Upgrading]] in the user docs.&lt;br /&gt;
&lt;br /&gt;
==Server requirements==&lt;br /&gt;
&lt;br /&gt;
These are just the minimum supported versions. We recommend keeping all of your software and operating systems up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 3.5 or later&lt;br /&gt;
* PHP version: minimum PHP 7.2.0 &#039;&#039;Note: minimum PHP version has increased since Moodle 3.8&#039;&#039;. PHP 7.3.x and 7.4.x are supported too. See [[Moodle and PHP]] for details.&lt;br /&gt;
* PHP extension &#039;&#039;&#039;mbstring&#039;&#039;&#039; is required (it was previously only recommended) &lt;br /&gt;
&lt;br /&gt;
=== Database requirements ===&lt;br /&gt;
&lt;br /&gt;
Moodle supports the following database servers. Again, version numbers are just the minimum supported version. We recommend running the latest stable version of any software.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Database&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.postgresql.org/ PostgreSQL]&lt;br /&gt;
| 9.5  (increased since Moodle 3.8)&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.6&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 10.2.29 (increased since Moodle 3.8)&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.microsoft.com/en-us/server-cloud/products/sql-server/ Microsoft SQL Server]&lt;br /&gt;
| 2012&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.oracle.com/us/products/database/overview/index.html Oracle Database]&lt;br /&gt;
| 11.2&lt;br /&gt;
| Latest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Client requirements==&lt;br /&gt;
&lt;br /&gt;
=== Browser support ===&lt;br /&gt;
Moodle is compatible with any standards compliant web browser. We regularly test Moodle with the following browsers:&lt;br /&gt;
&lt;br /&gt;
Desktop:&lt;br /&gt;
* Chrome&lt;br /&gt;
* Firefox&lt;br /&gt;
* Safari&lt;br /&gt;
* Edge&lt;br /&gt;
* Internet Explorer&lt;br /&gt;
&lt;br /&gt;
Mobile:&lt;br /&gt;
* MobileSafari&lt;br /&gt;
* Google Chrome&lt;br /&gt;
&lt;br /&gt;
For the best experience and optimum security, we recommend that you keep your browser up to date. https://whatbrowser.org&lt;br /&gt;
&lt;br /&gt;
Note: Legacy browsers with known compatibility issues with Moodle 3.9:&lt;br /&gt;
* Internet Explorer 10 and below&lt;br /&gt;
* Safari 7 and below&lt;br /&gt;
 &lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
===Activity chooser overhaul===&lt;br /&gt;
* MDL-67924 - Move turn editing on button out of the edit menu on boost&lt;br /&gt;
* MDL-67264 - Rework/Redesign the activity chooser&lt;br /&gt;
* MDL-67584 - Front end implementation of indicating favourites with a star&lt;br /&gt;
* MDL-67586 - Update activity chooser to include recommended activities&lt;br /&gt;
* MDL-67262 - Add admin page for recommending activities&lt;br /&gt;
* MDL-67321 - Support categories/tabs in the activity chooser&lt;br /&gt;
* MDL-67263 - Ability to search in the activity chooser&lt;br /&gt;
* MDL-67585 - New API for extending the activity chooser and implementation of favouriting&lt;br /&gt;
* MDL-68662 - Introduce an Activities and Resources tab&lt;br /&gt;
* MDL-67587 - Add searching of the recommended activities admin page&lt;br /&gt;
&lt;br /&gt;
===H5P updates and improvements===&lt;br /&gt;
* MDL-67814 - H5P editor integration&lt;br /&gt;
* MDL-67734 - Create basic skeleton for a global xAPI library needed for H5P content&lt;br /&gt;
* MDL-67337 - Apply Display H5P filter inside &amp;lt;a&amp;gt; tags&lt;br /&gt;
* MDL-68636 - Render specific icons for different H5P content types in content bank&lt;br /&gt;
* MDL-67701 - New activity icon for H5P&lt;br /&gt;
* MDL-67063 - Add a mechanism to support multi H5P core_api versions&lt;br /&gt;
* MDL-67707 - Create a new H5P activity&lt;br /&gt;
* MDL-67062 - Add Admin UI to delete existing H5P libraries&lt;br /&gt;
* MDL-67788 - Add xAPI statement support to mod_h5p&lt;br /&gt;
* MDL-67060 - Improve admin UI to manage H5P libraries and give information about H5P tools&#039; status&lt;br /&gt;
* MDL-67791 - Create xAPI activity report inside mod_h5p&lt;br /&gt;
* MDL-68271 - H5P editor: support content-type translations&lt;br /&gt;
* MDL-67810 - Integrate content bank and H5P content creator&lt;br /&gt;
* MDL-67713 - Include H5P Activity backup and restore options&lt;br /&gt;
* MDL-68227 - H5P editor: integrate translations with Moodle String API&lt;br /&gt;
* MDL-68379 - Add support for result, attachments, context to core_xapi library&lt;br /&gt;
* MDL-68381 - Add duration, completion and success to H5P activity attempts&lt;br /&gt;
* MDL-68241 - Add xAPI result support on mod_h5pactivity&lt;br /&gt;
* MDL-68826 - Add link to the content bank in the H5P activity&lt;br /&gt;
&lt;br /&gt;
===Content bank===&lt;br /&gt;
&lt;br /&gt;
* MDL-67786 - Create a new &#039;contentbank&#039; plugin type and a new H5P plugin in the content bank&lt;br /&gt;
* MDL-68314 - Backup and restore options for course level content bank&lt;br /&gt;
* MDL-67800 - Implement events for content bank&lt;br /&gt;
* MDL-67795 - Add a delete content option to the content bank&lt;br /&gt;
* MDL-67812 - Create a new repository for the content bank&lt;br /&gt;
* MDL-67813 - Implement search functionality for the repository_contentbank&lt;br /&gt;
* MDL-68493 - Create a new view type list in the Content Bank&lt;br /&gt;
* MDL-67797 - Implement search API for the content bank&lt;br /&gt;
* MDL-68483 - Implement search functionality for the content bank&lt;br /&gt;
&lt;br /&gt;
===MoodleNet integration===&lt;br /&gt;
* MDL-68111 - Core setting to toggle MoodleNet features globally (master)&lt;br /&gt;
* MDL-68698 - Allow links to be imported by tool_moodlenet (all versions)&lt;br /&gt;
* MDL-67884 - Add links to MoodleNet in Moodle (master)&lt;br /&gt;
&lt;br /&gt;
===Improved participants page filtering===&lt;br /&gt;
* MDL-67917 - Create a single filter for tables and the AMD structure behind this&lt;br /&gt;
* MDL-68348 - Update the participants filter to support filtering with additional logic operators&lt;br /&gt;
* MDL-68246 - Update fetching of participants to support multiple values per filter&lt;br /&gt;
* MDL-68169 - Add additional participants filter types and the ability to add multiple conditions to a filter set&lt;br /&gt;
* MDL-68464 - &amp;quot;Enrol users&amp;quot; should not reload the page&lt;br /&gt;
* MDL-68612 - Remove the previous (unified) filter from the participants page and deprecate relevant code&lt;br /&gt;
&lt;br /&gt;
===Course copy===&lt;br /&gt;
* MDL-64843 - Course Copy User Interface&lt;br /&gt;
&lt;br /&gt;
===Improved Safe Exam Browser integration===&lt;br /&gt;
* MDL-67850 - Add Safe Exam Browser integration to the standard Moodle package (moodle-quizaccess_seb)&lt;br /&gt;
* MDL-68041 - New theme settings for secure layout - display lang menu and display logged-in user&lt;br /&gt;
&lt;br /&gt;
===Quiz and questions===&lt;br /&gt;
&lt;br /&gt;
* MDL-58645 - Make drag-and-drop onto image questions responsive and fix the print layout&lt;br /&gt;
* MDL-62487 - Quiz manual grading: chosen options should be remembered as user preferences&lt;br /&gt;
* MDL-68113 - Improve responsive design of drag-drop into text questions (also fixes layout when printed)&lt;br /&gt;
* MDL-68446 - Drag-drop question types: remove the hard-coded maximum size limit on images&lt;br /&gt;
* MDL-68382 - Update drag-drop marker questions to be more responsive (and improve print layout)&lt;br /&gt;
* MDL-68367 - Question: Multi-choice Option to hide system &#039;Select ...&#039;&lt;br /&gt;
* MDL-68338 - GIFT question import/export format should support tags&lt;br /&gt;
* MDL-67934 - Intelligent default idnumber when duplicating a question in the question bank&lt;br /&gt;
* MDL-67351 -  Create an additional admin &amp;quot;Required&amp;quot; setting flag and apply it to quiz require password setting&lt;br /&gt;
&lt;br /&gt;
===Badges===&lt;br /&gt;
&lt;br /&gt;
* MDL-66992 - Add support for Open Badges 2.1&lt;br /&gt;
* MDL-68746 - Hide issuer details when creating badges with Open Badges 2.0 and above&lt;br /&gt;
* MDL-68567 - Allow admins to manage available backpacks&lt;br /&gt;
* MDL-66357 - Remove support for Mozilla Backpack&lt;br /&gt;
&lt;br /&gt;
===Accessibility audit improvements===&lt;br /&gt;
* MDL-68542 - Change the bold plugin to use strong tags instead of b for accessibility&lt;br /&gt;
* MDL-68541 - Limit the image description length and improve the alt text string&lt;br /&gt;
* MDL-68548 - Change the italics plugin to use em tags instead of i for accessibility&lt;br /&gt;
* MDL-68378 - Create an accessible change event&lt;br /&gt;
* MDL-68551 - Change the strikethrough plugin to use del tags instead of strike for accessibility&lt;br /&gt;
* MDL-67874 - Improve the contrast of browser focus outline &lt;br /&gt;
* MDL-68299 - Improve UI accessibility on small view ports&lt;br /&gt;
&lt;br /&gt;
===Usability improvements===&lt;br /&gt;
* MDL-66301 - Add ability to summarise all forums in a specific course&lt;br /&gt;
* MDL-33671 - Add ability to bulk delete files in &amp;quot;My private files&amp;quot; repository&lt;br /&gt;
* MDL-54554 - Improve error handling for unoconv (Universal Office Converter)&lt;br /&gt;
* MDL-47750 - Make pasting images into the Atto HTML editor work (as much as browsers will let us)&lt;br /&gt;
* MDL-45227 - Add text direction to default ATTO generated markup&lt;br /&gt;
* MDL-58413 - Support internationalized domain names (IDN) in URL resources&lt;br /&gt;
* MDL-68143 - Workshop: should remember collapsed/expanded sections&lt;br /&gt;
* MDL-67613 - Add a new availability completion option - &amp;quot;previous activity with completion&amp;quot;&lt;br /&gt;
* MDL-66463 - Add &amp;quot;Go to top&amp;quot; link when scroll down in boost and classic themes&lt;br /&gt;
* MDL-68163 - Add ability to duplicate grade items in gradebook setup&lt;br /&gt;
* MDL-67165 - Improve the user grade display modal&lt;br /&gt;
* MDL-67160 - Show graded status in forum grading UI&lt;br /&gt;
* MDL-65948 - Use the checkbox-toggleall component for the gradebook setup page&lt;br /&gt;
* MDL-68217 - Reduce the size of titles on the recent activity page&lt;br /&gt;
* MDL-68216 - Improve the recent activity block styling&lt;br /&gt;
* MDL-68497 - Make fonts appear smooth in Firefox on Mac&lt;br /&gt;
* MDL-68248 - My overview block: Add sort by short name&lt;br /&gt;
* MDL-66911 - Display more information such as the URL beside licenses drop down menu in help icon&lt;br /&gt;
* MDL-41958 - Show steps consistently during import&lt;br /&gt;
* MDL-67703 - Make calendar manage subscription form more user friendly&lt;br /&gt;
* MDL-68250 - Make book navigation easier to distinguish from activity navigation&lt;br /&gt;
* MDL-67244 - Avoid HTML5 player video forced scaling for low resolution videos&lt;br /&gt;
* MDL-67467 - Update progress report (Download in Excel-compatible format) dates to a sortable format&lt;br /&gt;
&lt;br /&gt;
==Other highlights==&lt;br /&gt;
&lt;br /&gt;
===Functional changes===&lt;br /&gt;
&lt;br /&gt;
* MDL-60817 - Notify the user when the original file extension has been removed or modified upon file editing in the filepicker&lt;br /&gt;
* MDL-64310 - Avoid recycle bin locking the user&#039;s session during activity deletion or backup/restore (when it is enabled)&lt;br /&gt;
* MDL-58827 - Add core profile fields to user filter&lt;br /&gt;
* MDL-65796 - Include site name and link in contact request notifications&lt;br /&gt;
* MDL-58866 - Modify the calendar events table to allow any component to create action events&lt;br /&gt;
* MDL-46542 - Allow setting a subset of the available units in moodleform duration field&lt;br /&gt;
* MDL-68563 - Enable additional content filters by default on new installs&lt;br /&gt;
* MDL-67363 - Add a Quality of Service layer to the processing of the ad-hoc task queue&lt;br /&gt;
* MDL-66920 - LTI 1.3: Allow tool to use JWKS URI rather than Public Key&lt;br /&gt;
* MDL-67846 - Add name of user to fields included in forum exports&lt;br /&gt;
* MDL-67547 - Render HTML in PDF dataformat export&lt;br /&gt;
* MDL-66732 - Improve detection of non-public sites for registration&lt;br /&gt;
* MDL-67072 - Include client_id and lti_deployment_id in OIDC Login Initiation request&lt;br /&gt;
* MDL-68320 - Add a campaign feature, with a link to a Moodle page, to support sustainability&lt;br /&gt;
* MDL-68409 - Stop using YUI modals in core/notification for alert and confirmation&lt;br /&gt;
* MDL-68076 - Create &amp;quot;Feedback&amp;quot; link in Moodle to permanent survey site&lt;br /&gt;
* MDL-56389 - Mark all as read in notifications menu should not apply to notifications received after the page was loaded&lt;br /&gt;
* MDL-68465 - Subject for messages digest email should include site name&lt;br /&gt;
* MDL-68568 - Move indent button to list group by default&lt;br /&gt;
* MDL-57635 - User Tours: Restrict tours to account creation date, first login date or last login date&lt;br /&gt;
* MDL-67384 - Upgrade jQuery EU Cookie Law popups to latest version&lt;br /&gt;
* MDL-65306 - Prevent LTI Advantage external tool add failing due to uniqueness constraint and tag not persisting&lt;br /&gt;
* MDL-66972 - Files API: Add Streaming file mime type support&lt;br /&gt;
&lt;br /&gt;
===For administrators===&lt;br /&gt;
* MDL-62815 - Add new capabilities to control adding LTI activities from preconfigured tools&lt;br /&gt;
* MDL-47271 - Add system status report including tasks with cli status script&lt;br /&gt;
* MDL-45184 - Create user interface to add/delete new licenses&lt;br /&gt;
* MDL-66332 - Add &amp;quot;show differences only&amp;quot; into tool_capability&lt;br /&gt;
* MDL-65812 - Increase default session timeout and allow it to be configured in the GUI&lt;br /&gt;
* MDL-64610 - Add support for per-task concurrency limits&lt;br /&gt;
* MDL-66213 - It should be possible to view anonymous events in reports&lt;br /&gt;
* MDL-66135 - Add support for custom course fields to Upload courses&lt;br /&gt;
* MDL-59594 - Allow graceful fast exit of cron.php / adhoc_task.php via SIGTERM or SIGINT&lt;br /&gt;
* MDL-65729 - Ad-hoc task processing for automated backups&lt;br /&gt;
* MDL-29693 - Add filtering to the config changes admin report&lt;br /&gt;
* MDL-66925 - Enable cli/adhoc_task.php to be run as a pseudo daemon with --keep-alive=60&lt;br /&gt;
* MDL-67433 - Update admin/tool/task/cli/adhoc_task.php to respect task_adhoc_concurrency_limit&lt;br /&gt;
* MDL-59487 - Re-run a scheduled task from the web&lt;br /&gt;
* MDL-68261 - CLI changes should be included in the config changes report&lt;br /&gt;
* MDL-67456 - Add more options to Maximum number of backups kept&lt;br /&gt;
* MDL-65229 - Allow cron cli option to remotely stop all crons&lt;br /&gt;
* MDL-68256 - Scheduled tasks admin: usability enhancements&lt;br /&gt;
* MDL-67895 - Scheduled tasks admin: show the defaults in the form where you edit the settings for a task&lt;br /&gt;
* MDL-66752 - Develop an automatic approval tool for delete/export of personal data with a standard completion reply&lt;br /&gt;
* MDL-67990 - Increase the Antivirus default chunk size (ClamAV)&lt;br /&gt;
&lt;br /&gt;
===Mobile===&lt;br /&gt;
* MDL-68537 - Update the tool_mobile_disabledfeatures setting with H5P and new blocks supported on the app&lt;br /&gt;
* MDL-68294 - Add a new &amp;quot;Mobile app subscription plan&amp;quot; section in the Moodle app settings&lt;br /&gt;
* MDL-65547 - Enable logging into the mobile app via QR code in the web user profile&lt;br /&gt;
* MDL-67752 - Add new &amp;quot;activeusers&amp;quot; field containing last month active users in registration data&lt;br /&gt;
* MDL-67753 - Enable &amp;quot;Mobile Notifications&amp;quot; when a site is registered&lt;br /&gt;
* MDL-67907 - Site admins should see a warning asking them to enable the Mobile notifications plugin after registering for an Airnotifier key&lt;br /&gt;
&lt;br /&gt;
===Performance===&lt;br /&gt;
* MDL-19711 - Read/Write splitting of DB operations to support primary/replica database configurations&lt;br /&gt;
* MDL-39571 - Improve loading performance of filepicker when loading Recent Files&lt;br /&gt;
* MDL-67689 - Improve theme designer mode performance&lt;br /&gt;
* MDL-67681 - Improve course category tree cache performance by storing against single key instead of multiple&lt;br /&gt;
* MDL-67040 - Improve the performance of the Analytics ML layer when using small datasets&lt;br /&gt;
* MDL-68524 - Add Template and string prefetching&lt;br /&gt;
* MDL-67635 - Speed up file system \core\task\file_trash_cleanup_task&lt;br /&gt;
* MDL-66253 - Reduce the number of full table scans on the event table&lt;br /&gt;
* MDL-68185 - Convert performance report to Check API&lt;br /&gt;
* MDL-67075 - Extra session lock debugging for redis session handler&lt;br /&gt;
* MDL-68577 - Tune the redis session handler to reduce blocking wait time&lt;br /&gt;
&lt;br /&gt;
===Security improvements and new features===&lt;br /&gt;
&lt;br /&gt;
* MDL-67309 - Have options to call check_password_policy on every login&lt;br /&gt;
* MDL-64075 - Antivirus: Support remote scanning using TCP sockets.&lt;br /&gt;
* MDL-67504 - Allow virus checks to be retried if they returned an error state&lt;br /&gt;
* MDL-67362 - Add logging for admin setting changes to antivirus to config log&lt;br /&gt;
* MDL-67545 - New config option for ClamAV scanning errors to prompt user to try again later&lt;br /&gt;
* MDL-63734 - If passwordunmask field is hardcoded in config.php, do not show the value&lt;br /&gt;
&lt;br /&gt;
==For developers==&lt;br /&gt;
&lt;br /&gt;
* MDL-58018 - Reduce session lock contention with opt-in READ_ONLY_SESSION&lt;br /&gt;
* MDL-59562 - Allow plugins to declare which major stable versions of moodle are supported&lt;br /&gt;
* MDL-38511 - Plugins should be able to define new bulk user actions&lt;br /&gt;
* MDL-67052 - Implement a Lock API factory using Mysql / MariaDB&lt;br /&gt;
* MDL-67818 - Create a Check API&lt;br /&gt;
* MDL-68329 - Improve the cache performance footer info even more&lt;br /&gt;
* MDL-67432 - Allow quizaccess plugins to be able to set up external admin pages&lt;br /&gt;
* MDL-67548 - Allow plugins to hook into course category deletion form&lt;br /&gt;
* MDL-67386 - Upgrade boost to use Bootstrap v4.5.0&lt;br /&gt;
* MDL-68386 - Charts API: support for Area Chart fill values from Chart.js&lt;br /&gt;
* MDL-68477 - Charts API: support for legend options for Chart.js&lt;br /&gt;
* MDL-68233 - Code in renderers should not refer to global $PAGE or global $OUTPUT&lt;br /&gt;
* MDL-62757 - Validate boost presets before allowing to pick and use them&lt;br /&gt;
* MDL-68177 - Course renderer UI elements split into different methods&lt;br /&gt;
* MDL-67373 - Upgrade PHPMailer to latest version&lt;br /&gt;
* MDL-67372 - Upgrade HTML Purifier to latest version&lt;br /&gt;
* MDL-67385 - Upgrade MongoDB PHP Library to latest version&lt;br /&gt;
* MDL-67383 - Upgrade VideoJS to latest version&lt;br /&gt;
* MDL-67382 - Upgrade phpCAS to latest version&lt;br /&gt;
* MDL-67378 - Upgrade mustache.js to latest version&lt;br /&gt;
* MDL-67376 - Upgrade loglevel.js to latest version&lt;br /&gt;
* MDL-52846 - Deprecation of legacy cron&lt;br /&gt;
* MDL-65835 - Deprecate plagiarism_get_form_elements()&lt;br /&gt;
* MDL-63580 - Deprecate dupe cron_run_single_task() function&lt;br /&gt;
* MDL-67845 - Deprecate &#039;enrol_database_admin_setting_category&#039; class&lt;br /&gt;
* MDL-67872 - Deprecate and fix plagiarismlib use of config vars&lt;br /&gt;
* MDL-68495 - Allow flexible_table to update dynamically&lt;br /&gt;
&lt;br /&gt;
===Component API upgrades===&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/admin/tool/log/upgrade.txt admin/tool/log/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/admin/tool/upgrade.txt admin/tool/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/auth/shibboleth/upgrade.txt auth/shibboleth/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/auth/upgrade.txt auth/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/badges/upgrade.txt badges/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/blocks/upgrade.txt blocks/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/cache/upgrade.txt cache/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/calendar/upgrade.txt calendar/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/course/format/upgrade.txt course/format/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/course/upgrade.txt course/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/dataformat/upgrade.txt dataformat/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/enrol/upgrade.txt enrol/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/filter/upgrade.txt filter/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/grade/grading/form/upgrade.txt grade/grading/form/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/grade/report/upgrade.txt grade/report/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/grade/upgrade.txt grade/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/lib/upgrade.txt lib/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/media/upgrade.txt media/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/message/upgrade.txt message/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/assign/upgrade.txt mod/assign/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/feedback/upgrade.txt mod/feedback/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/forum/upgrade.txt mod/forum/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/quiz/upgrade.txt mod/quiz/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/scorm/report/basic/upgrade.txt mod/scorm/report/basic/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/scorm/upgrade.txt mod/scorm/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/upgrade.txt mod/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/mod/workshop/upgrade.txt mod/workshop/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/question/format/upgrade.txt question/format/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/report/upgrade.txt report/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/tag/upgrade.txt tag/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/theme/upgrade.txt theme/upgrade.txt]&lt;br /&gt;
* [https://git.in.moodle.com/moodle/moodle/blob/master/user/upgrade.txt user/upgrade.txt]&lt;br /&gt;
 &lt;br /&gt;
==See also==&lt;br /&gt;
*[[Moodle 3.8 release notes]]&lt;br /&gt;
 &lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.9]]&lt;br /&gt;
 &lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 3.9]]&lt;br /&gt;
[[es:Notas de Moodle 3.9]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=56470</id>
		<title>Releases</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Releases&amp;diff=56470"/>
		<updated>2019-09-23T23:36:10Z</updated>

		<summary type="html">&lt;p&gt;Pholden: Correct version string for 2.1.10&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all official releases of Moodle, grouped by branch in reverse chronological order.&lt;br /&gt;
&lt;br /&gt;
==Version support==&lt;br /&gt;
&lt;br /&gt;
From Moodle 2.6 onwards, the end of support, both general and security, happens the second Monday of May and November, observing the 12, 18... month periods, no matter if the major release was delayed or not.&lt;br /&gt;
&lt;br /&gt;
The most recent [https://en.wikipedia.org/wiki/Long-term_support long-term support release (LTS)] version is Moodle 3.5.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Version&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Release status&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Initial release&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:rgba(0, 0, 0, 0.05);&amp;quot; | General support ends&lt;br /&gt;
! style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Security support ends&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.5 (LTS)&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 17 May 2018&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 13 May 2019&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 10 May 2021&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | 3.6&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | 3 December 2018&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | 11 November 2019&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | 11 May 2020&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 3.7&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stable&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 20 May 2019&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 11 May 2020&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | 9 November 2020&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:releasescurrent.png|alt=Release graph]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Release graph key:&amp;lt;/b&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1px solid #dee2e6;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#f98012; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Currently supported stable releases.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#239cae; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Current security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Current release of versions still receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#9cbd50; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Future stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Future point releases receiving bug fixes, as well as security updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#316d5e; color:white; adding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Future security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Future point releases receiving security-only updates.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#686566; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Past stables&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: rgba(0, 0, 0, 0.05);&amp;quot; | Previously released versions containing bug fixes, as well as security updates. Updating to a currently supported version is recommended.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color:#282828; color:white; padding: .3rem 0.5rem 0.3rem 0.5rem;&amp;quot; | Past security&lt;br /&gt;
| style=&amp;quot;vertical-align: top; border-top: 1px solid #dee2e6; background-color: #FFFFFF&amp;quot; | Previously released versions containing security updates only. Updating to a currently supported version is recommended.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==General release calendar==&lt;br /&gt;
&lt;br /&gt;
These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release type&lt;br /&gt;
! Frequency&lt;br /&gt;
! Months&lt;br /&gt;
|-&lt;br /&gt;
| [[Process#Major_release_cycles|Major]] (eg. 3.x)&lt;br /&gt;
| 6 monthly&lt;br /&gt;
| Second Monday of May and November&lt;br /&gt;
|-&lt;br /&gt;
| [[Process#Stable_maintenance_cycles|Minor]] (Point) (eg. 3.x.y)&lt;br /&gt;
| 2 monthly&lt;br /&gt;
| Second Monday of July, September, November, January, March and May&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All releases are preceded by a one week warning. Upcoming release dates can be found in the [https://www.google.com/calendar/ical/moodle.com_p4c2oe7hsb77ltaro5qtihb5d4%40group.calendar.google.com/public/basic.ics Moodle development calendar] (Note, this is an iCAL link that will try to add the dates to your personal calendar. If you just want to browse the dates online, use [https://calendar.google.com/calendar/embed?src=moodle.com_p4c2oe7hsb77ltaro5qtihb5d4@group.calendar.google.com&amp;amp;pli=1 this link].).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.7==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.7&lt;br /&gt;
| 20 May 2019&lt;br /&gt;
| 2019052000&lt;br /&gt;
| [[Moodle 3.7 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/37/en/Upgrading Upgrading to 3.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.7.1&lt;br /&gt;
| 8th July 2019&lt;br /&gt;
| 2019052001&lt;br /&gt;
| [[Moodle 3.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.7.2&lt;br /&gt;
| 9th September 2019&lt;br /&gt;
| 2019052002&lt;br /&gt;
| [[Moodle 3.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.7.x will end 11 May 2020 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.7.x will end 9 November 2020 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.6==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6&lt;br /&gt;
| 3 December 2018&lt;br /&gt;
| 2018120300&lt;br /&gt;
| [[Moodle 3.6 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/36/en/Upgrading Upgrading to 3.6]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.1&lt;br /&gt;
| 5 December 2018&lt;br /&gt;
| 2018120301&lt;br /&gt;
| [[Moodle 3.6.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.2&lt;br /&gt;
| 14 January 2019&lt;br /&gt;
| 2018120302&lt;br /&gt;
| [[Moodle 3.6.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.3&lt;br /&gt;
| 11 March 2019&lt;br /&gt;
| 2018120303&lt;br /&gt;
| [[Moodle 3.6.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.4&lt;br /&gt;
| 13 May 2019&lt;br /&gt;
| 2018120304&lt;br /&gt;
| [[Moodle 3.6.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.5&lt;br /&gt;
| 8th July 2019&lt;br /&gt;
| 2018120305&lt;br /&gt;
| [[Moodle 3.6.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.6.6&lt;br /&gt;
| 9th September 2019&lt;br /&gt;
| 2018120306&lt;br /&gt;
| [[Moodle 3.6.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.6.x will end 11 November 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.6.x will end 11 May 2020 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.5 (LTS)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5&lt;br /&gt;
| 17 May 2018&lt;br /&gt;
| 2018051700&lt;br /&gt;
| [[Moodle 3.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/35/en/Upgrading Upgrading to 3.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.1&lt;br /&gt;
| 9 July 2018&lt;br /&gt;
| 2018051701&lt;br /&gt;
| [[Moodle 3.5.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.2&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 2018051702&lt;br /&gt;
| [[Moodle 3.5.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.3&lt;br /&gt;
| 12 November 2018&lt;br /&gt;
| 2018051703&lt;br /&gt;
| [[Moodle 3.5.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.4&lt;br /&gt;
| 14 January 2019&lt;br /&gt;
| 2018051704&lt;br /&gt;
| [[Moodle 3.5.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.5&lt;br /&gt;
| 11 March 2019&lt;br /&gt;
| 2018051705&lt;br /&gt;
| [[Moodle 3.5.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.6&lt;br /&gt;
| 13 May 2019&lt;br /&gt;
| 2018051706&lt;br /&gt;
| [[Moodle 3.5.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.7&lt;br /&gt;
| 8th July 2019&lt;br /&gt;
| 2018051707&lt;br /&gt;
| [[Moodle 3.5.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.5.8&lt;br /&gt;
| 9th September 2019&lt;br /&gt;
| 2018051708&lt;br /&gt;
| [[Moodle 3.5.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.5.x will end 10 May 2021 (36 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.4==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4&lt;br /&gt;
| 13 November 2017&lt;br /&gt;
| 2017111300&lt;br /&gt;
| [[Moodle 3.4 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/34/en/Upgrading Upgrading to 3.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.1&lt;br /&gt;
| 15 January 2018&lt;br /&gt;
| 2017111301&lt;br /&gt;
| [[Moodle 3.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.2&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 2017111302&lt;br /&gt;
| [[Moodle 3.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.3&lt;br /&gt;
| 17 May 2018&lt;br /&gt;
| 2017111303&lt;br /&gt;
| [[Moodle 3.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.4&lt;br /&gt;
| 9 July 2018&lt;br /&gt;
| 2017111304&lt;br /&gt;
| [[Moodle 3.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.5&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 2017111305&lt;br /&gt;
| [[Moodle 3.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.6&lt;br /&gt;
| 12 November 2018&lt;br /&gt;
| 2017111306&lt;br /&gt;
| [[Moodle 3.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.7&lt;br /&gt;
| 14 January 2019&lt;br /&gt;
| 2017111307&lt;br /&gt;
| [[Moodle 3.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.8&lt;br /&gt;
| 11 March 2019&lt;br /&gt;
| 2017111308&lt;br /&gt;
| [[Moodle 3.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.4.9&lt;br /&gt;
| 13 May 2019&lt;br /&gt;
| 2017111309&lt;br /&gt;
| [[Moodle 3.4.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.4.x ended 12 November 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.4.x ended 13 May 2019 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.3==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3&lt;br /&gt;
| 15 May 2017&lt;br /&gt;
| 2017051500&lt;br /&gt;
| [[Moodle 3.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/33/en/Upgrading Upgrading to 3.3]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.1&lt;br /&gt;
| 10 July 2017&lt;br /&gt;
| 2017051501&lt;br /&gt;
| [[Moodle 3.3.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.2&lt;br /&gt;
| 11 September 2017&lt;br /&gt;
| 2017051502&lt;br /&gt;
| [[Moodle 3.3.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.3&lt;br /&gt;
| 13 November 2017&lt;br /&gt;
| 2017051503&lt;br /&gt;
| [[Moodle 3.3.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.4&lt;br /&gt;
| 15 January 2018&lt;br /&gt;
| 2017051504&lt;br /&gt;
| [[Moodle 3.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.5&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 2017051505&lt;br /&gt;
| [[Moodle 3.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.6&lt;br /&gt;
| 17 May 2018&lt;br /&gt;
| 2017051506&lt;br /&gt;
| [[Moodle 3.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.7&lt;br /&gt;
| 9 July 2018&lt;br /&gt;
| 2017051507&lt;br /&gt;
| [[Moodle 3.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.8&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 2017051508&lt;br /&gt;
| [[Moodle 3.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.3.9&lt;br /&gt;
| 12 November 2018&lt;br /&gt;
| 2017051509&lt;br /&gt;
| [[Moodle 3.3.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.3.x ended 17 May 2018 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.3.x ended 12 November 2018 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.2==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2&lt;br /&gt;
| 5 December 2016&lt;br /&gt;
| 2016120500&lt;br /&gt;
| [[Moodle 3.2 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/32/en/Upgrading Upgrading to 3.2]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.1&lt;br /&gt;
| 9 January 2017&lt;br /&gt;
| 2016120501&lt;br /&gt;
| [[Moodle 3.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.2&lt;br /&gt;
| 13 March 2017&lt;br /&gt;
| 2016120502&lt;br /&gt;
| [[Moodle 3.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.3&lt;br /&gt;
| 8 May 2017&lt;br /&gt;
| 2016120503&lt;br /&gt;
| [[Moodle 3.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.4&lt;br /&gt;
| 10 July 2017&lt;br /&gt;
| 2016120504&lt;br /&gt;
| [[Moodle 3.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.5&lt;br /&gt;
| 11 September 2017&lt;br /&gt;
| 2016120505&lt;br /&gt;
| [[Moodle 3.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.6&lt;br /&gt;
| 13 November 2017&lt;br /&gt;
| 2016120506&lt;br /&gt;
| [[Moodle 3.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.7&lt;br /&gt;
| 15 January 2018&lt;br /&gt;
| 2016120507&lt;br /&gt;
| [[Moodle 3.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.8&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 2016120508&lt;br /&gt;
| [[Moodle 3.2.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.2.9&lt;br /&gt;
| 17 May 2018&lt;br /&gt;
| 2016120509&lt;br /&gt;
| [[Moodle 3.2.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.2.x ended 13 November 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.2.x ended 17 May 2018 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.1 (LTS)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1&lt;br /&gt;
| 23 May 2016&lt;br /&gt;
| 2016052300&lt;br /&gt;
| [[Moodle 3.1 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/31/en/Upgrading Upgrading to 3.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.1&lt;br /&gt;
| 11 July 2016&lt;br /&gt;
| 2016052301&lt;br /&gt;
| [[Moodle 3.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.2&lt;br /&gt;
| 12 September 2016&lt;br /&gt;
| 2016052302&lt;br /&gt;
| [[Moodle 3.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.3&lt;br /&gt;
| 14 November 2016&lt;br /&gt;
| 2016052303&lt;br /&gt;
| [[Moodle 3.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.4&lt;br /&gt;
| 9 January 2017&lt;br /&gt;
| 2016052304&lt;br /&gt;
| [[Moodle 3.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.5&lt;br /&gt;
| 13 March 2017&lt;br /&gt;
| 2016052305&lt;br /&gt;
| [[Moodle 3.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.6&lt;br /&gt;
| 8 May 2017&lt;br /&gt;
| 2016052306&lt;br /&gt;
| [[Moodle 3.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.7&lt;br /&gt;
| 10 July 2017&lt;br /&gt;
| 2016052307&lt;br /&gt;
| [[Moodle 3.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.8&lt;br /&gt;
| 11 September 2017&lt;br /&gt;
| 2016052308&lt;br /&gt;
| [[Moodle 3.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.9&lt;br /&gt;
| 13 November 2017&lt;br /&gt;
| 2016052309&lt;br /&gt;
| [[Moodle 3.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.10&lt;br /&gt;
| 15 January 2018&lt;br /&gt;
| 2016052310&lt;br /&gt;
| [[Moodle 3.1.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.11&lt;br /&gt;
| 19 March 2018&lt;br /&gt;
| 2016052311&lt;br /&gt;
| [[Moodle 3.1.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.12&lt;br /&gt;
| 17 May 2018&lt;br /&gt;
| 2016052312&lt;br /&gt;
| [[Moodle 3.1.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.13&lt;br /&gt;
| 9 July 2018&lt;br /&gt;
| 2016052313&lt;br /&gt;
| [[Moodle 3.1.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.14&lt;br /&gt;
| 10 September 2018&lt;br /&gt;
| 2016052314&lt;br /&gt;
| [[Moodle 3.1.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.15&lt;br /&gt;
| 12 November 2018&lt;br /&gt;
| 2016052315&lt;br /&gt;
| [[Moodle 3.1.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.16&lt;br /&gt;
| 14 January 2019&lt;br /&gt;
| 2016052316&lt;br /&gt;
| [[Moodle 3.1.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.17&lt;br /&gt;
| 11 March 2019&lt;br /&gt;
| 2016052317&lt;br /&gt;
| [[Moodle 3.1.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.1.18&lt;br /&gt;
| 13 May 2019&lt;br /&gt;
| 2016052318&lt;br /&gt;
| [[Moodle 3.1.18 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.1.x ended 8 May 2017 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.1.x ended 13 May 2019 (36 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 3.0==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0&lt;br /&gt;
| 16 November 2015&lt;br /&gt;
| 2015111600&lt;br /&gt;
| [[Moodle 3.0 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/30/en/Upgrading Upgrading to 3.0]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.1&lt;br /&gt;
| 21 December 2015&lt;br /&gt;
| 2015111601&lt;br /&gt;
| [[Moodle 3.0.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.2&lt;br /&gt;
| 11 January 2016&lt;br /&gt;
| 2015111602&lt;br /&gt;
| [[Moodle 3.0.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.3&lt;br /&gt;
| 14 March 2016&lt;br /&gt;
| 2015111603&lt;br /&gt;
| [[Moodle 3.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.4&lt;br /&gt;
| 9 May 2016&lt;br /&gt;
| 2015111604&lt;br /&gt;
| [[Moodle 3.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.5&lt;br /&gt;
| 11 July 2016&lt;br /&gt;
| 2015111605&lt;br /&gt;
| [[Moodle 3.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.6&lt;br /&gt;
| 12 September 2016&lt;br /&gt;
| 2015111606&lt;br /&gt;
| [[Moodle 3.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.7&lt;br /&gt;
| 14 November 2016&lt;br /&gt;
| 2015111607&lt;br /&gt;
| [[Moodle 3.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.8&lt;br /&gt;
| 9 January 2017&lt;br /&gt;
| 2015111608&lt;br /&gt;
| [[Moodle 3.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.9&lt;br /&gt;
| 13 March 2017&lt;br /&gt;
| 2015111609&lt;br /&gt;
| [[Moodle 3.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 3.0.10&lt;br /&gt;
| 8 May 2017&lt;br /&gt;
| 2015111610&lt;br /&gt;
| [[Moodle 3.0.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 3.0.x ended 14 November 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 3.0.x ended 8 May 2017 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.9==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
| 2015051100&lt;br /&gt;
| [[Moodle 2.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/29/en/Upgrading_to_Moodle_2.9 Upgrading to 2.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.1&lt;br /&gt;
| 6 July 2015&lt;br /&gt;
| 2015051101&lt;br /&gt;
| [[Moodle 2.9.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.2&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
| 2015051102&lt;br /&gt;
| [[Moodle 2.9.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.3&lt;br /&gt;
| 9 November 2015&lt;br /&gt;
| 2015051103&lt;br /&gt;
| [[Moodle 2.9.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.4&lt;br /&gt;
| 11 January 2016&lt;br /&gt;
| 2015051104&lt;br /&gt;
| [[Moodle 2.9.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.5&lt;br /&gt;
| 14 March 2016&lt;br /&gt;
| 2015051105&lt;br /&gt;
| [[Moodle 2.9.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.6&lt;br /&gt;
| 9 May 2016&lt;br /&gt;
| 2015051106&lt;br /&gt;
| [[Moodle 2.9.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.7&lt;br /&gt;
| 11 July 2016&lt;br /&gt;
| 2015051107&lt;br /&gt;
| [[Moodle 2.9.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.8&lt;br /&gt;
| 12 September 2016&lt;br /&gt;
| 2015051108&lt;br /&gt;
| [[Moodle 2.9.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.9.9&lt;br /&gt;
| 14 November 2016&lt;br /&gt;
| 2015051109&lt;br /&gt;
| [[Moodle 2.9.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.9.x ended 9 May 2016 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.9.x ended 14 November 2016 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.8==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
| 2014111000&lt;br /&gt;
| [[Moodle 2.8 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/28/en/Upgrading_to_Moodle_2.8 Upgrading to 2.8]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.1&lt;br /&gt;
| 13 November 2014&lt;br /&gt;
| 2014111001&lt;br /&gt;
| [[Moodle 2.8.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.2&lt;br /&gt;
| 12 January 2015&lt;br /&gt;
| 2014111002&lt;br /&gt;
| [[Moodle 2.8.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.3&lt;br /&gt;
| 2 February 2015&lt;br /&gt;
| 2014111003&lt;br /&gt;
| [[Moodle 2.8.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.4&lt;br /&gt;
| 9 March 2015&lt;br /&gt;
| 2014111004&lt;br /&gt;
| [[Moodle 2.8.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.5&lt;br /&gt;
| 10 March 2015&lt;br /&gt;
| 2014111005&lt;br /&gt;
| [[Moodle 2.8.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.6&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
| 2014111006&lt;br /&gt;
| [[Moodle 2.8.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.7&lt;br /&gt;
| 6 July 2015&lt;br /&gt;
| 2014111007&lt;br /&gt;
| [[Moodle 2.8.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.8&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
| 2014111008&lt;br /&gt;
| [[Moodle 2.8.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.9&lt;br /&gt;
| 9 November 2015&lt;br /&gt;
| 2014111009&lt;br /&gt;
| [[Moodle 2.8.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.10&lt;br /&gt;
| 11 January 2016&lt;br /&gt;
| 2014111010&lt;br /&gt;
| [[Moodle 2.8.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.11&lt;br /&gt;
| 14 March 2016&lt;br /&gt;
| 2014111011&lt;br /&gt;
| [[Moodle 2.8.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.8.12&lt;br /&gt;
| 9 May 2016&lt;br /&gt;
| 2014111012&lt;br /&gt;
| [[Moodle 2.8.12 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.7 (LTS)==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
| 2014051200&lt;br /&gt;
| [[Moodle 2.7 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/27/en/Upgrading_to_Moodle_2.7 Upgrading to 2.7]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.1&lt;br /&gt;
| 14 July 2014&lt;br /&gt;
| 2014051201&lt;br /&gt;
| [[Moodle 2.7.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.2&lt;br /&gt;
| 8 September 2014&lt;br /&gt;
| 2014051202&lt;br /&gt;
| [[Moodle 2.7.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.3&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
| 2014051203&lt;br /&gt;
| [[Moodle 2.7.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.4&lt;br /&gt;
| 12 January 2015&lt;br /&gt;
| 2014051204&lt;br /&gt;
| [[Moodle 2.7.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.5&lt;br /&gt;
| 2 February 2015&lt;br /&gt;
| 2014051205&lt;br /&gt;
| [[Moodle 2.7.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.6&lt;br /&gt;
| 9 March 2015&lt;br /&gt;
| 2014051206&lt;br /&gt;
| [[Moodle 2.7.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.7&lt;br /&gt;
| 10 March 2015&lt;br /&gt;
| 2014051207&lt;br /&gt;
| [[Moodle 2.7.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.8&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
| 2014051208&lt;br /&gt;
| [[Moodle 2.7.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.9&lt;br /&gt;
| 6 July 2015&lt;br /&gt;
| 2014051209&lt;br /&gt;
| [[Moodle 2.7.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.10&lt;br /&gt;
| 14 September 2015&lt;br /&gt;
| 2014051210&lt;br /&gt;
| [[Moodle 2.7.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.11&lt;br /&gt;
| 9 November 2015&lt;br /&gt;
| 2014051211&lt;br /&gt;
| [[Moodle 2.7.11 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.12&lt;br /&gt;
| 11 January 2016&lt;br /&gt;
| 2014051212&lt;br /&gt;
| [[Moodle 2.7.12 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.13&lt;br /&gt;
| 14 March 2016&lt;br /&gt;
| 2014051213&lt;br /&gt;
| [[Moodle 2.7.13 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.14&lt;br /&gt;
| 9 May 2016&lt;br /&gt;
| 2014051214&lt;br /&gt;
| [[Moodle 2.7.14 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.15&lt;br /&gt;
| 11 July 2016&lt;br /&gt;
| 2014051215&lt;br /&gt;
| [[Moodle 2.7.15 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.16&lt;br /&gt;
| 12 September 2016&lt;br /&gt;
| 2014051216&lt;br /&gt;
| [[Moodle 2.7.16 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.17&lt;br /&gt;
| 14 November 2016&lt;br /&gt;
| 2014051217&lt;br /&gt;
| [[Moodle 2.7.17 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.18&lt;br /&gt;
| 9 January 2017&lt;br /&gt;
| 2014051218&lt;br /&gt;
| [[Moodle 2.7.18 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.19&lt;br /&gt;
| 13 March 2017&lt;br /&gt;
| 2014051219&lt;br /&gt;
| [[Moodle 2.7.19 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.7.20&lt;br /&gt;
| 8 May 2017&lt;br /&gt;
| 2014051220&lt;br /&gt;
| [[Moodle 2.7.20 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.7.x ended 11 May 2015 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.7.x ended 8 May 2017 (36 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.6==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6&lt;br /&gt;
| 18 November 2013&lt;br /&gt;
| 2013111800&lt;br /&gt;
| [[Moodle 2.6 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/26/en/Upgrading_to_Moodle_2.6 Upgrading to 2.6]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.1&lt;br /&gt;
| 13 January 2014&lt;br /&gt;
| 2013111801&lt;br /&gt;
| [[Moodle 2.6.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.2&lt;br /&gt;
| 10 March 2014&lt;br /&gt;
| 2013111802&lt;br /&gt;
| [[Moodle 2.6.2 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.3&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
| 2013111803&lt;br /&gt;
| [[Moodle 2.6.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.4&lt;br /&gt;
| 14 July 2014&lt;br /&gt;
| 2013111804&lt;br /&gt;
| [[Moodle 2.6.4 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.5&lt;br /&gt;
| 8 September 2014&lt;br /&gt;
| 2013111805&lt;br /&gt;
| [[Moodle 2.6.5 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.6&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
| 2013111806&lt;br /&gt;
| [[Moodle 2.6.6 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.7&lt;br /&gt;
| 12 January 2015&lt;br /&gt;
| 2013111807&lt;br /&gt;
| [[Moodle 2.6.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.8&lt;br /&gt;
| 2 February 2015&lt;br /&gt;
| 2013111808&lt;br /&gt;
| [[Moodle 2.6.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.9&lt;br /&gt;
| 9 March 2015&lt;br /&gt;
| 2013111809&lt;br /&gt;
| [[Moodle 2.6.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.10&lt;br /&gt;
| 10 March 2015&lt;br /&gt;
| 2013111810&lt;br /&gt;
| [[Moodle 2.6.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.6.11&lt;br /&gt;
| 11 May 2015&lt;br /&gt;
| 2013111811&lt;br /&gt;
| [[Moodle 2.6.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.6.x ended 10 November 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.6.x ended 11 May 2015 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.5==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
| 2013051400&lt;br /&gt;
| [[Moodle 2.5 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/25/en/Upgrading_to_Moodle_2.5 Upgrading to 2.5]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.1&lt;br /&gt;
| 8 July 2013&lt;br /&gt;
| 2013051401&lt;br /&gt;
| [[Moodle 2.5.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.2&lt;br /&gt;
| 9 September 2013&lt;br /&gt;
| 2013051402&lt;br /&gt;
| [[Moodle 2.5.2 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.3&lt;br /&gt;
| 11 November 2013&lt;br /&gt;
| 2013051403&lt;br /&gt;
| [[Moodle 2.5.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.4&lt;br /&gt;
| 13 January 2014&lt;br /&gt;
| 2013051404&lt;br /&gt;
| [[Moodle 2.5.4 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.5&lt;br /&gt;
| 10 March 2014&lt;br /&gt;
| 2013051405&lt;br /&gt;
| [[Moodle 2.5.5 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.6&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
| 2013051406&lt;br /&gt;
| [[Moodle 2.5.6 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.7&lt;br /&gt;
| 14 July 2014&lt;br /&gt;
| 2013051407&lt;br /&gt;
| [[Moodle 2.5.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.8&lt;br /&gt;
| 8 September 2014&lt;br /&gt;
| 2013051408&lt;br /&gt;
| [[Moodle 2.5.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.5.9&lt;br /&gt;
| 10 November 2014&lt;br /&gt;
| 2013051409&lt;br /&gt;
| [[Moodle 2.5.9 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.5.x ended May 2014 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.5.x ended 10 November 2014 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.4==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4&lt;br /&gt;
| 3 December 2012&lt;br /&gt;
| 2012120300&lt;br /&gt;
| [[Moodle 2.4 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/24/en/Upgrading_to_Moodle_2.4 Upgrading to 2.4]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.1&lt;br /&gt;
| 14 January 2013&lt;br /&gt;
| 2012120301&lt;br /&gt;
| [[Moodle 2.4.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.2&lt;br /&gt;
| 11 March 2013&lt;br /&gt;
| 2012120302&lt;br /&gt;
| [[Moodle 2.4.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.3&lt;br /&gt;
| 18 March 2013&lt;br /&gt;
| 2012120303&lt;br /&gt;
| [[Moodle 2.4.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.4&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
| 2012120304&lt;br /&gt;
| [[Moodle 2.4.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.5&lt;br /&gt;
| 8 July 2013&lt;br /&gt;
| 2012120305&lt;br /&gt;
| [[Moodle 2.4.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.6&lt;br /&gt;
| 9 September 2013&lt;br /&gt;
| 2012120306&lt;br /&gt;
| [[Moodle 2.4.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.7&lt;br /&gt;
| 11 November 2013&lt;br /&gt;
| 2012120307&lt;br /&gt;
| [[Moodle 2.4.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.8&lt;br /&gt;
| 13 January 2014&lt;br /&gt;
| 2012120308&lt;br /&gt;
| [[Moodle 2.4.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.9&lt;br /&gt;
| 10 March 2014&lt;br /&gt;
| 2012120309&lt;br /&gt;
| [[Moodle 2.4.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.10&lt;br /&gt;
| 12 May 2014&lt;br /&gt;
| 2012120310&lt;br /&gt;
| [[Moodle 2.4.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.4.11&lt;br /&gt;
| 14 July 2014&lt;br /&gt;
| 2012120311&lt;br /&gt;
| [[Moodle 2.4.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.4.x ended December 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.4.x ended June 2014 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.3==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3&lt;br /&gt;
| 25 June 2012&lt;br /&gt;
| 2012062500&lt;br /&gt;
| [[Moodle 2.3 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/23/en/Upgrading_to_Moodle_2.3 Upgrading to 2.3]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.1&lt;br /&gt;
| 9 July 2012&lt;br /&gt;
| 2012062501&lt;br /&gt;
| [[Moodle 2.3.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.2&lt;br /&gt;
| 10 September 2012&lt;br /&gt;
| 2012062502&lt;br /&gt;
| [[Moodle 2.3.2 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.3&lt;br /&gt;
| 12 November 2012&lt;br /&gt;
| 2012062503&lt;br /&gt;
| [[Moodle 2.3.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.4&lt;br /&gt;
| 14 January 2013&lt;br /&gt;
| 2012062504&lt;br /&gt;
| [[Moodle 2.3.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.5&lt;br /&gt;
| 11 March 2013&lt;br /&gt;
| 2012062505&lt;br /&gt;
| [[Moodle 2.3.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.6&lt;br /&gt;
| 18 March 2013&lt;br /&gt;
| 2012062506&lt;br /&gt;
| [[Moodle 2.3.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.7&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
| 2012062507&lt;br /&gt;
| [[Moodle 2.3.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.8&lt;br /&gt;
| 8 July 2013&lt;br /&gt;
| 2012062508&lt;br /&gt;
| [[Moodle 2.3.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.9&lt;br /&gt;
| 9 September 2013&lt;br /&gt;
| 2012062509&lt;br /&gt;
| [[Moodle 2.3.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.10&lt;br /&gt;
| 11 November 2013&lt;br /&gt;
| 2012062510&lt;br /&gt;
| [[Moodle 2.3.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.3.11&lt;br /&gt;
| 13 January 2014&lt;br /&gt;
| 2012062511&lt;br /&gt;
| [[Moodle 2.3.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.3.x ended June 2013 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.3.x ended December 2013 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.2==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2&lt;br /&gt;
| 5 December 2011&lt;br /&gt;
| 2011120500&lt;br /&gt;
| [[Moodle 2.2 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/22/en/Upgrading_to_Moodle_2.2 Upgrading to 2.2]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.1&lt;br /&gt;
| 9 January 2012&lt;br /&gt;
| 2011120501&lt;br /&gt;
| [[Moodle 2.2.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.2&lt;br /&gt;
| 12 March 2012&lt;br /&gt;
| 2011120502&lt;br /&gt;
| [[Moodle 2.2.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.3&lt;br /&gt;
| 14 May 2012&lt;br /&gt;
| 2011120503&lt;br /&gt;
| [[Moodle 2.2.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.4&lt;br /&gt;
| 9 July 2012&lt;br /&gt;
| 2011120504&lt;br /&gt;
| [[Moodle 2.2.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.5&lt;br /&gt;
| 10 September 2012&lt;br /&gt;
| 2011120505&lt;br /&gt;
| [[Moodle 2.2.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.6&lt;br /&gt;
| 12 November 2012&lt;br /&gt;
| 2011120506&lt;br /&gt;
| [[Moodle 2.2.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.7&lt;br /&gt;
| 14 January 2013&lt;br /&gt;
| 2011120507&lt;br /&gt;
| [[Moodle 2.2.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.8&lt;br /&gt;
| 11 March 2013&lt;br /&gt;
| 2011120508&lt;br /&gt;
| [[Moodle 2.2.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.9&lt;br /&gt;
| 18 March 2013&lt;br /&gt;
| 2011120509&lt;br /&gt;
| [[Moodle 2.2.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.10&lt;br /&gt;
| 14 May 2013&lt;br /&gt;
| 2011120510&lt;br /&gt;
| [[Moodle 2.2.10 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.2.11&lt;br /&gt;
| 8 July 2013&lt;br /&gt;
| 2011120511&lt;br /&gt;
| [[Moodle 2.2.11 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.2.x ended December 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.2.x ended June 2013 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.1==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1&lt;br /&gt;
| 1 July 2011&lt;br /&gt;
| 2011070100&lt;br /&gt;
| [[Moodle 2.1 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/21/en/Upgrading_to_Moodle_2.1 Upgrading to 2.1]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.1&lt;br /&gt;
| 1 August 2011&lt;br /&gt;
| 2011070101&lt;br /&gt;
| [[Moodle 2.1.1 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.2&lt;br /&gt;
| 10 October 2011&lt;br /&gt;
| 2011070102&lt;br /&gt;
| [[Moodle 2.1.2 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.3&lt;br /&gt;
| 28 November 2011&lt;br /&gt;
| 2011070103&lt;br /&gt;
| [[Moodle 2.1.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.4&lt;br /&gt;
| 9 January 2012&lt;br /&gt;
| 2011070104&lt;br /&gt;
| [[Moodle 2.1.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.5&lt;br /&gt;
| 12 March 2012&lt;br /&gt;
| 2011070105&lt;br /&gt;
| [[Moodle 2.1.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.6&lt;br /&gt;
| 14 May 2012&lt;br /&gt;
| 2011070106&lt;br /&gt;
| [[Moodle 2.1.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.7&lt;br /&gt;
| 9 July 2012&lt;br /&gt;
| 2011070107&lt;br /&gt;
| [[Moodle 2.1.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.8&lt;br /&gt;
| 10 September 2012&lt;br /&gt;
| 2011070108&lt;br /&gt;
| [[Moodle 2.1.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.9&lt;br /&gt;
| 12 November 2012&lt;br /&gt;
| 2011070109&lt;br /&gt;
| [[Moodle 2.1.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.1.10&lt;br /&gt;
| 14 January 2013&lt;br /&gt;
| 2011070110&lt;br /&gt;
| [[Moodle 2.1.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.1.x ended June 2012 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.1.x ended December 2012 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 2.0==&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0&lt;br /&gt;
| 24 November 2010&lt;br /&gt;
| 2010112400&lt;br /&gt;
| [[Moodle 2.0 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/20/en/Upgrading_to_Moodle_2.0 Upgrading to 2.0]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.1&lt;br /&gt;
| 25 December 2010&lt;br /&gt;
| 2010122500&lt;br /&gt;
| [[Moodle 2.0.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.2&lt;br /&gt;
| 21 February 2011&lt;br /&gt;
| 2011022100&lt;br /&gt;
| [[Moodle 2.0.2 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.3&lt;br /&gt;
| 5 May 2011&lt;br /&gt;
| 2011033003&lt;br /&gt;
| [[Moodle 2.0.3 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.4&lt;br /&gt;
| 1 August 2011&lt;br /&gt;
| 2011033004&lt;br /&gt;
| [[Moodle 2.0.4 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.5&lt;br /&gt;
| 10 October 2011&lt;br /&gt;
| 2011033005&lt;br /&gt;
| [[Moodle 2.0.5 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.6&lt;br /&gt;
| 28 November 2011&lt;br /&gt;
| 2011033006&lt;br /&gt;
| [[Moodle 2.0.6 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.7&lt;br /&gt;
| 9 January 2012&lt;br /&gt;
| 2011033007&lt;br /&gt;
| [[Moodle 2.0.7 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.8&lt;br /&gt;
| 12 March 2012&lt;br /&gt;
| 2011033008&lt;br /&gt;
| [[Moodle 2.0.8 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.9&lt;br /&gt;
| 14 May 2012&lt;br /&gt;
| 2011033009&lt;br /&gt;
| [[Moodle 2.0.9 release notes|Release Notes]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 2.0.10&lt;br /&gt;
| 9 July 2012&lt;br /&gt;
| 2011033010&lt;br /&gt;
| [[Moodle 2.0.10 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 2.0.x ended December 2011 (12 months).&lt;br /&gt;
 Bug fixes for security issues in 2.0.x ended June 2012 (18 months).&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.9==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9&lt;br /&gt;
| 3 March 2008&lt;br /&gt;
| 2007101509 &lt;br /&gt;
| [[Moodle 1.9 release notes|Release Notes]]&lt;br /&gt;
| [https://docs.moodle.org/19/en/Upgrading_to_Moodle_1.9 Upgrading to 1.9]&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.1&lt;br /&gt;
| 15 May 2008&lt;br /&gt;
| 2007101512 &lt;br /&gt;
| [[Moodle 1.9.1 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.2&lt;br /&gt;
| 11 July 2008&lt;br /&gt;
| 2007101520&lt;br /&gt;
| [[Moodle 1.9.2 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.3&lt;br /&gt;
| 15 October 2008&lt;br /&gt;
| 2007101530&lt;br /&gt;
| [[Moodle 1.9.3 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.4&lt;br /&gt;
| 28 January 2009&lt;br /&gt;
| 2007101540&lt;br /&gt;
| [[Moodle 1.9.4 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.5&lt;br /&gt;
| 13 May 2009&lt;br /&gt;
| 2007101550&lt;br /&gt;
| [[Moodle 1.9.5 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.6&lt;br /&gt;
| 21 October 2009&lt;br /&gt;
| 2007101560&lt;br /&gt;
| [[Moodle 1.9.6 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.7&lt;br /&gt;
| 25 November 2009&lt;br /&gt;
| 2007101570&lt;br /&gt;
| [[Moodle 1.9.7 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.8&lt;br /&gt;
| 25 March 2010&lt;br /&gt;
| 2007101580.00&lt;br /&gt;
| [[Moodle 1.9.8 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.9&lt;br /&gt;
| 8 June 2010&lt;br /&gt;
| 2007101590.00&lt;br /&gt;
| [[Moodle 1.9.9 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.10&lt;br /&gt;
| 25 October 2010&lt;br /&gt;
| 2007101591.00&lt;br /&gt;
| [[Moodle 1.9.10 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.11&lt;br /&gt;
| 21 February 2011&lt;br /&gt;
| 2007101591.02&lt;br /&gt;
| [[Moodle 1.9.11 release notes|Release Notes]] &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.12&lt;br /&gt;
| 10 May 2011&lt;br /&gt;
| 2007101591.03&lt;br /&gt;
| [[Moodle 1.9.12 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.13&lt;br /&gt;
| 1 August 2011&lt;br /&gt;
| 2007101591.04&lt;br /&gt;
| [[Moodle 1.9.13 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.14&lt;br /&gt;
| 10 October 2011&lt;br /&gt;
| 2007101591.06&lt;br /&gt;
| [[Moodle 1.9.14 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.15&lt;br /&gt;
| 28 November 2011&lt;br /&gt;
| 2007101591.07&lt;br /&gt;
| [[Moodle 1.9.15 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.16&lt;br /&gt;
| 9 January 2012&lt;br /&gt;
| 2007101591.10&lt;br /&gt;
| [[Moodle 1.9.16 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.17&lt;br /&gt;
| 12 March 2012&lt;br /&gt;
| 2007101591.12&lt;br /&gt;
| [[Moodle 1.9.17 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.18&lt;br /&gt;
| 14 May 2012&lt;br /&gt;
| 2007101591.16&lt;br /&gt;
| [[Moodle 1.9.18 release notes|Release Notes]]&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
! Moodle 1.9.19&lt;br /&gt;
| 9 July 2012&lt;br /&gt;
| 2007101592.00&lt;br /&gt;
| [[Moodle 1.9.19 release notes|Release Notes]]&lt;br /&gt;
| Support has ended&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 Bug fixes for general core bugs in 1.9.x has ended June 2011 (3.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.x by Moodle HQ ended June 2012 (4.5 years).&lt;br /&gt;
 Bug fixes for security issues in 1.9.19+ branch by [http://catalyst.net.nz Catalyst IT] ended [http://moodle.org/mod/forum/discuss.php?d=199706 Dec 2013] (6 years).&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.8==&lt;br /&gt;
*[[Moodle 1.8 release notes|Moodle 1.8]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.8.1 release notes|Moodle 1.8.1]] - 14 June 2007&lt;br /&gt;
*[[Moodle 1.8.2 release notes|Moodle 1.8.2]] - 8 July 2007&lt;br /&gt;
*[[Moodle 1.8.3 release notes|Moodle 1.8.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.8.4 release notes|Moodle 1.8.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.8.5 release notes|Moodle 1.8.5]] - 8 April 2008&lt;br /&gt;
*[[Moodle 1.8.6 release notes|Moodle 1.8.6]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.8.7 release notes|Moodle 1.8.7]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.8.8 release notes|Moodle 1.8.8]] - 28 January 2009&lt;br /&gt;
*[[Moodle 1.8.9 release notes|Moodle 1.8.9]] - 15 May 2009&lt;br /&gt;
*[[Moodle 1.8.10 release notes|Moodle 1.8.10]] - 26 October 2009&lt;br /&gt;
*[[Moodle 1.8.11 release notes|Moodle 1.8.11]] - 25 November 2009&lt;br /&gt;
*[[Moodle 1.8.12 release notes|Moodle 1.8.12]] - 27 March 2010&lt;br /&gt;
*[[Moodle 1.8.13 release notes|Moodle 1.8.13]] - 8 June 2010&lt;br /&gt;
*[[Moodle 1.8.14 release notes|Moodle 1.8.14]] - 3 December 2010&lt;br /&gt;
*Support has ended &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.7==&lt;br /&gt;
*[[Moodle 1.7 release notes|Moodle 1.7]] - 7 November 2006&lt;br /&gt;
*[[Moodle 1.7.1 release notes|Moodle 1.7.1]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.7.2 release notes|Moodle 1.7.2]] - 30 March 2007&lt;br /&gt;
*[[Moodle 1.7.3 release notes|Moodle 1.7.3]] - 11 October 2007&lt;br /&gt;
*[[Moodle 1.7.4 release notes|Moodle 1.7.4]] - 11 January 2008&lt;br /&gt;
*[[Moodle 1.7.5 release notes|Moodle 1.7.5]] - 11 July 2008&lt;br /&gt;
*[[Moodle 1.7.6 release notes|Moodle 1.7.6]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.7.7 release notes|Moodle 1.7.7]] - 28 January 2009&lt;br /&gt;
*Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.6==&lt;br /&gt;
*[[Moodle 1.6 release notes|Moodle 1.6]] - 20 June 2006&lt;br /&gt;
*[[Moodle 1.6.1 release notes|Moodle 1.6.1]] - 20 July 2006&lt;br /&gt;
*[[Moodle 1.6.2 release notes|Moodle 1.6.2]] - 12 September 2006&lt;br /&gt;
*[[Moodle 1.6.3 release notes|Moodle 1.6.3]] - 10 October 2006&lt;br /&gt;
*[[Moodle 1.6.4 release notes|Moodle 1.6.4]] - 17 January 2007&lt;br /&gt;
*[[Moodle 1.6.5 release notes|Moodle 1.6.5]] - 30 March 2007&lt;br /&gt;
*Moodle 1.6.6 - 11 January 2008&lt;br /&gt;
*Moodle 1.6.7 - 11 July 2008&lt;br /&gt;
*[[Moodle 1.6.8 release notes|Moodle 1.6.8]] - 15 October 2008&lt;br /&gt;
*[[Moodle 1.6.9 release notes|Moodle 1.6.9]] - 28 January 2009&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.5==&lt;br /&gt;
*[[Moodle 1.5 release notes|Moodle 1.5]] - 5 June 2005&lt;br /&gt;
*[[Moodle 1.5.1 release notes|Moodle 1.5.1]] - 8 July 2005&lt;br /&gt;
*[[Moodle 1.5.2 release notes|Moodle 1.5.2]] - 16 July 2005&lt;br /&gt;
*[[Moodle 1.5.3 release notes|Moodle 1.5.3]] - 11 November 2005&lt;br /&gt;
*[[Moodle 1.5.4 release notes|Moodle 1.5.4]] - 21 May 2006&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.4==&lt;br /&gt;
*Moodle 1.4 - 31 August 2004&lt;br /&gt;
*Moodle 1.4.1 - 12 September 2004&lt;br /&gt;
*Moodle 1.4.2 - 5 November 2004&lt;br /&gt;
*Moodle 1.4.3 - 21 December 2004&lt;br /&gt;
*Moodle 1.4.4 - 7 March 2005 &lt;br /&gt;
*[[Moodle 1.4.5 release notes|Moodle 1.4.5]] - 7 May 2005&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.3==&lt;br /&gt;
*Moodle 1.3 - 25 May 2004&lt;br /&gt;
*Moodle 1.3.1 - 4 June 2004&lt;br /&gt;
*Moodle 1.3.2 - 9 July 2004&lt;br /&gt;
*Moodle 1.3.3 - 16 July 2004&lt;br /&gt;
*Moodle 1.3.4 - 11 August 2004&lt;br /&gt;
*Moodle 1.3.5 - 9 September 2004&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.2==&lt;br /&gt;
*Moodle 1.2 - 20 March 2004&lt;br /&gt;
*Moodle 1.2.1 - 25 March 2004&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.1==&lt;br /&gt;
*Moodle 1.1 - 29 August 2003&lt;br /&gt;
*Moodle 1.1.1 - 11 September 2003&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==Moodle 1.0==&lt;br /&gt;
*Moodle 1.0 - 20 August 2002&lt;br /&gt;
*Moodle 1.0.1 - 26 August 2002&lt;br /&gt;
*Moodle 1.0.2 - 2 September 2002&lt;br /&gt;
*Moodle 1.0.3 - 5 September 2002&lt;br /&gt;
*Moodle 1.0.4 - 10 September 2002&lt;br /&gt;
*Moodle 1.0.5 - 27 September 2002&lt;br /&gt;
*Moodle 1.0.6 - 26 October 2002&lt;br /&gt;
:: 1.0.6.1 - 6 November 2002&lt;br /&gt;
:: 1.0.6.2 - 11 November 2002&lt;br /&gt;
:: 1.0.6.3 - 14 November 2002&lt;br /&gt;
:: 1.0.6.4 - 25 November 2002&lt;br /&gt;
*Moodle 1.0.7 - 9 December 2002&lt;br /&gt;
*Moodle 1.0.8 - 7 January 2003&lt;br /&gt;
*Moodle 1.0.9 - 30 May 2003&lt;br /&gt;
* Support has ended&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Roadmap]] - future versions&lt;br /&gt;
*[[Moodle versions]] - an explanation of how our versions work plus version numbers for each release (for $plugin-&amp;gt;requires)&lt;br /&gt;
&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Core development]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Historique des versions]]&lt;br /&gt;
[[es:dev/Historia de las versiones]]&lt;br /&gt;
[[de:Versionshistorie]]&lt;/div&gt;</summary>
		<author><name>Pholden</name></author>
	</entry>
</feed>