<?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=FMCorz</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=FMCorz"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/Special:Contributions/FMCorz"/>
	<updated>2026-08-04T00:30:46Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49849</id>
		<title>Competency API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49849"/>
		<updated>2016-04-21T03:23:58Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* Public API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 3.1}}&lt;br /&gt;
The competency API lives in the subsystem &#039;&#039;competency&#039;&#039;, namespaced &amp;lt;code&amp;gt;\core_competency\&amp;lt;/code&amp;gt; and located in the root folder &#039;&#039;competency&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Public API==&lt;br /&gt;
&lt;br /&gt;
The public API is defined by the [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/api.php API class] which contains all the methods publicly available to any code taking action on competency related objects and data. No code should ever directly call the database, or persistent (models) methods, unless they are within an API method. All public API methods MUST perform the capability checks relevant to the actions that they are representing. The API methods can be seen as the controllers, they are a mandatory step to accessing the data, even within the competency API itself.&lt;br /&gt;
&lt;br /&gt;
==External API==&lt;br /&gt;
&lt;br /&gt;
[https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/external.php External functions] are all located in &amp;lt;code&amp;gt;\core_competency\external&amp;lt;/code&amp;gt;, mostly as a proxy to the public API.&lt;br /&gt;
&lt;br /&gt;
==Frontend==&lt;br /&gt;
&lt;br /&gt;
The competency API comes without any frontend, though Moodle core ships with the admin tool &amp;lt;code&amp;gt;tool_lp&amp;lt;/code&amp;gt; which is acting as the default frontend for competencies. It includes templates, javascript (AMD modules) and some additional external functions. It was built split from the backend to easily allow the support for other frontends.&lt;br /&gt;
&lt;br /&gt;
===URL resolver===&lt;br /&gt;
&lt;br /&gt;
As some of the core APIs require a knowledge of the resource URLs, we introduced the concept of a URL resolver. The URL resolver is used to determine the location of a resource from core, without forcing the default frontend to be used.&lt;br /&gt;
&lt;br /&gt;
When referring to a resource from &#039;&#039;core&#039;&#039;, use the corresponding &amp;lt;code&amp;gt;\core_competency\url::my_ressource_name()&amp;lt;/code&amp;gt; method. Note that it is acceptable for a plugin to directly link to resource frontends within itself without using the resolver.&lt;br /&gt;
&lt;br /&gt;
====Defining new URLs====&lt;br /&gt;
&lt;br /&gt;
Create a class and implement each routing method defined in [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/url.php \core_competency\url], though they should not be static, take [https://git.moodle.org/gw?p=moodle.git;a=blob;f=admin/tool/lp/classes/url_resolver.php \tool_lp\url_resolver] as a base or an example.&lt;br /&gt;
&lt;br /&gt;
Then indicate to core what class to use by defining the config variable &amp;lt;code&amp;gt;$CFG-&amp;gt;core_competency_url_resolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;core_competency_url_resolver = &#039;\\your_namespace\\your_class&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal API==&lt;br /&gt;
&lt;br /&gt;
===Persistents, or Models===&lt;br /&gt;
&lt;br /&gt;
The class &amp;lt;code&amp;gt;\core_competency\persistent&amp;lt;/code&amp;gt; represents an object in the database. It is typically what is called a model in general. It contains the list of fields present in the database table, as well as their &amp;lt;code&amp;gt;PARAM_*&amp;lt;/code&amp;gt; types. Basic validation of the param types is automatically performed prior to any database write operation. Additional validation can also be added by developers. In essence, the persistent knows everything about its data and when it is valid or not. Persistents are able to CRUD themselves in the database. They are also the right place to perform complex queries which join multiple persistents together.&lt;br /&gt;
&lt;br /&gt;
There is never any access control performed within the persistent! However, the competency API is oriented towards model-based Access Control List (ACL), therefore some of the persistents contain helper ACL methods (&amp;lt;code&amp;gt;boolean function can_do_the_thing();&amp;lt;/code&amp;gt;). The main benefit of adding ACL methods to the persistent is to avoid repeating the capability names all over the place, and thus reducing code complexity and human errors.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exaustive list of the persistents:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| A single competency&lt;br /&gt;
|-&lt;br /&gt;
| competency_framework&lt;br /&gt;
| A framework of competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency&lt;br /&gt;
| A relationship table (many-to-many) linking courses and competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency_settings&lt;br /&gt;
| The settings related to competencies in a course&lt;br /&gt;
|-&lt;br /&gt;
| course_module_competency&lt;br /&gt;
| A relationship table (many-to-many) linking course modules and competencies&lt;br /&gt;
|-&lt;br /&gt;
| evidence&lt;br /&gt;
| A piece of evidence relating the proficiency of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| plan&lt;br /&gt;
| A group of competencies for a user to achieve, often referred to as &#039;&#039;learning plans&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| plan_competency&lt;br /&gt;
| A relationship table (many-to-many) linking plans and competencies&lt;br /&gt;
|-&lt;br /&gt;
| related_competency&lt;br /&gt;
| A relationship table (many-to-many) linking competencies to other competencies (within the same framework)&lt;br /&gt;
|-&lt;br /&gt;
| template&lt;br /&gt;
| A template for a plan&lt;br /&gt;
|-&lt;br /&gt;
| template_competency&lt;br /&gt;
| A relationship table (many-to-many) linking templates and competencies&lt;br /&gt;
|-&lt;br /&gt;
| template_cohort&lt;br /&gt;
| The cohorts attached to a template, from which we will create plans.&lt;br /&gt;
|-&lt;br /&gt;
| user_competency&lt;br /&gt;
| The record of the proficiency and rating of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_course&lt;br /&gt;
| The record of the rating of a user towards a competency but limited to the scope of a course&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_plan&lt;br /&gt;
| The record of the proficiency and rating of a user within a plan that was archived/completed, understand frozen.&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence&lt;br /&gt;
| A piece of evidence of prior learning&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence_competency&lt;br /&gt;
| Many-to-many relationship between evidence of prior learning and competencies&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Exporters===&lt;br /&gt;
&lt;br /&gt;
When writing external functions and templates we often needed to explicitly specify all the properties of the persistents. For instance, when returning a competency from an external function, when creating a competency from an external function, when preparing the context of a template, when getting the context for a template from an external function, etc... As persistents already define their properties we decided to create &#039;&#039;exporters&#039;&#039; (they are sometimes referred to as &#039;&#039;serialisers&#039;&#039;), and &#039;&#039;persistent-based exporters&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exporters are classes which convert objects to stdClasses. They may add more properties to the objects as they export them (E.g. generating a &#039;&#039;timeago&#039;&#039; property from the &#039;&#039;date&#039;&#039; property of the object). Therefore exporters are aware of and define all the properties that can be read from an object, and all the properties that are saved in an object.&lt;br /&gt;
&lt;br /&gt;
They mainly serve two purposes:&lt;br /&gt;
&lt;br /&gt;
# They export an object consistently wherever they are used, i.e. all properties will always be present&lt;br /&gt;
# They generate the external function &#039;&#039;parameters&#039;&#039; and &#039;&#039;returns&#039;&#039; structure automatically&lt;br /&gt;
#* The &#039;&#039;parameters&#039;&#039; will be the &#039;&#039;update&#039;&#039; structure, which contains the &#039;&#039;real&#039;&#039; fields&lt;br /&gt;
#* The &#039;&#039;returns&#039;&#039; structure will be the &#039;&#039;read&#039;&#039; structure, which contains everything.&lt;br /&gt;
&lt;br /&gt;
Exporters can also define &#039;&#039;related&#039;&#039; objects. When specified those must be set prior to exporting the data, mainly to improve performance. At this stage they may be a bit weak and difficult to work with as adding &#039;&#039;related&#039;&#039; objects to an existing exporter will require all usage of this exporter to be updated. We have raised an issue to try to improve their design: MDL-53052.&lt;br /&gt;
&lt;br /&gt;
Exporters have come in very handy when we had to add new properties to persistents, or to export new properties from an existing object. They greatly simplify the maintainability of external functions and &amp;lt;code&amp;gt;templatable::export_for_template()&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49848</id>
		<title>Competency API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49848"/>
		<updated>2016-04-21T03:17:15Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 3.1}}&lt;br /&gt;
The competency API lives in the subsystem &#039;&#039;competency&#039;&#039;, namespaced &amp;lt;code&amp;gt;\core_competency\&amp;lt;/code&amp;gt; and located in the root folder &#039;&#039;competency&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Public API==&lt;br /&gt;
&lt;br /&gt;
The public [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/api.php API class] contains all the methods which are publicly available to any code taking action on competency related objects and data. No code should ever directly call the database, or persistent (models) methods, unless they are within an API method. All public API methods MUST perform the capability checks relevant to the actions that they are representing. The API methods can be seen as the controllers, they are a mandatory step to accessing the data, even within the competency API itself.&lt;br /&gt;
&lt;br /&gt;
==External API==&lt;br /&gt;
&lt;br /&gt;
[https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/external.php External functions] are all located in &amp;lt;code&amp;gt;\core_competency\external&amp;lt;/code&amp;gt;, mostly as a proxy to the public API.&lt;br /&gt;
&lt;br /&gt;
==Frontend==&lt;br /&gt;
&lt;br /&gt;
The competency API comes without any frontend, though Moodle core ships with the admin tool &amp;lt;code&amp;gt;tool_lp&amp;lt;/code&amp;gt; which is acting as the default frontend for competencies. It includes templates, javascript (AMD modules) and some additional external functions. It was built split from the backend to easily allow the support for other frontends.&lt;br /&gt;
&lt;br /&gt;
===URL resolver===&lt;br /&gt;
&lt;br /&gt;
As some of the core APIs require a knowledge of the resource URLs, we introduced the concept of a URL resolver. The URL resolver is used to determine the location of a resource from core, without forcing the default frontend to be used.&lt;br /&gt;
&lt;br /&gt;
When referring to a resource from &#039;&#039;core&#039;&#039;, use the corresponding &amp;lt;code&amp;gt;\core_competency\url::my_ressource_name()&amp;lt;/code&amp;gt; method. Note that it is acceptable for a plugin to directly link to resource frontends within itself without using the resolver.&lt;br /&gt;
&lt;br /&gt;
====Defining new URLs====&lt;br /&gt;
&lt;br /&gt;
Create a class and implement each routing method defined in [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/url.php \core_competency\url], though they should not be static, take [https://git.moodle.org/gw?p=moodle.git;a=blob;f=admin/tool/lp/classes/url_resolver.php \tool_lp\url_resolver] as a base or an example.&lt;br /&gt;
&lt;br /&gt;
Then indicate to core what class to use by defining the config variable &amp;lt;code&amp;gt;$CFG-&amp;gt;core_competency_url_resolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;core_competency_url_resolver = &#039;\\your_namespace\\your_class&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal API==&lt;br /&gt;
&lt;br /&gt;
===Persistents, or Models===&lt;br /&gt;
&lt;br /&gt;
The class &amp;lt;code&amp;gt;\core_competency\persistent&amp;lt;/code&amp;gt; represents an object in the database. It is typically what is called a model in general. It contains the list of fields present in the database table, as well as their &amp;lt;code&amp;gt;PARAM_*&amp;lt;/code&amp;gt; types. Basic validation of the param types is automatically performed prior to any database write operation. Additional validation can also be added by developers. In essence, the persistent knows everything about its data and when it is valid or not. Persistents are able to CRUD themselves in the database. They are also the right place to perform complex queries which join multiple persistents together.&lt;br /&gt;
&lt;br /&gt;
There is never any access control performed within the persistent! However, the competency API is oriented towards model-based Access Control List (ACL), therefore some of the persistents contain helper ACL methods (&amp;lt;code&amp;gt;boolean function can_do_the_thing();&amp;lt;/code&amp;gt;). The main benefit of adding ACL methods to the persistent is to avoid repeating the capability names all over the place, and thus reducing code complexity and human errors.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exaustive list of the persistents:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| A single competency&lt;br /&gt;
|-&lt;br /&gt;
| competency_framework&lt;br /&gt;
| A framework of competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency&lt;br /&gt;
| A relationship table (many-to-many) linking courses and competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency_settings&lt;br /&gt;
| The settings related to competencies in a course&lt;br /&gt;
|-&lt;br /&gt;
| course_module_competency&lt;br /&gt;
| A relationship table (many-to-many) linking course modules and competencies&lt;br /&gt;
|-&lt;br /&gt;
| evidence&lt;br /&gt;
| A piece of evidence relating the proficiency of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| plan&lt;br /&gt;
| A group of competencies for a user to achieve, often referred to as &#039;&#039;learning plans&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| plan_competency&lt;br /&gt;
| A relationship table (many-to-many) linking plans and competencies&lt;br /&gt;
|-&lt;br /&gt;
| related_competency&lt;br /&gt;
| A relationship table (many-to-many) linking competencies to other competencies (within the same framework)&lt;br /&gt;
|-&lt;br /&gt;
| template&lt;br /&gt;
| A template for a plan&lt;br /&gt;
|-&lt;br /&gt;
| template_competency&lt;br /&gt;
| A relationship table (many-to-many) linking templates and competencies&lt;br /&gt;
|-&lt;br /&gt;
| template_cohort&lt;br /&gt;
| The cohorts attached to a template, from which we will create plans.&lt;br /&gt;
|-&lt;br /&gt;
| user_competency&lt;br /&gt;
| The record of the proficiency and rating of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_course&lt;br /&gt;
| The record of the rating of a user towards a competency but limited to the scope of a course&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_plan&lt;br /&gt;
| The record of the proficiency and rating of a user within a plan that was archived/completed, understand frozen.&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence&lt;br /&gt;
| A piece of evidence of prior learning&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence_competency&lt;br /&gt;
| Many-to-many relationship between evidence of prior learning and competencies&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Exporters===&lt;br /&gt;
&lt;br /&gt;
When writing external functions and templates we often needed to explicitly specify all the properties of the persistents. For instance, when returning a competency from an external function, when creating a competency from an external function, when preparing the context of a template, when getting the context for a template from an external function, etc... As persistents already define their properties we decided to create &#039;&#039;exporters&#039;&#039; (they are sometimes referred to as &#039;&#039;serialisers&#039;&#039;), and &#039;&#039;persistent-based exporters&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exporters are classes which convert objects to stdClasses. They may add more properties to the objects as they export them (E.g. generating a &#039;&#039;timeago&#039;&#039; property from the &#039;&#039;date&#039;&#039; property of the object). Therefore exporters are aware of and define all the properties that can be read from an object, and all the properties that are saved in an object.&lt;br /&gt;
&lt;br /&gt;
They mainly serve two purposes:&lt;br /&gt;
&lt;br /&gt;
# They export an object consistently wherever they are used, i.e. all properties will always be present&lt;br /&gt;
# They generate the external function &#039;&#039;parameters&#039;&#039; and &#039;&#039;returns&#039;&#039; structure automatically&lt;br /&gt;
#* The &#039;&#039;parameters&#039;&#039; will be the &#039;&#039;update&#039;&#039; structure, which contains the &#039;&#039;real&#039;&#039; fields&lt;br /&gt;
#* The &#039;&#039;returns&#039;&#039; structure will be the &#039;&#039;read&#039;&#039; structure, which contains everything.&lt;br /&gt;
&lt;br /&gt;
Exporters can also define &#039;&#039;related&#039;&#039; objects. When specified those must be set prior to exporting the data, mainly to improve performance. At this stage they may be a bit weak and difficult to work with as adding &#039;&#039;related&#039;&#039; objects to an existing exporter will require all usage of this exporter to be updated. We have raised an issue to try to improve their design: MDL-53052.&lt;br /&gt;
&lt;br /&gt;
Exporters have come in very handy when we had to add new properties to persistents, or to export new properties from an existing object. They greatly simplify the maintainability of external functions and &amp;lt;code&amp;gt;templatable::export_for_template()&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49834</id>
		<title>Competency API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49834"/>
		<updated>2016-04-19T08:43:58Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* URL resolver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The competency API lives in the subsystem &#039;&#039;competency&#039;&#039;, namespaced &amp;lt;code&amp;gt;\core_competency\&amp;lt;/code&amp;gt; and located in the root folder &#039;&#039;competency&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Public API==&lt;br /&gt;
&lt;br /&gt;
The public [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/api.php API class] contains all the methods which are publicly available to any code taking action on competency related objects and data. No code should ever directly call the database, or persistent (models) methods, unless they are within an API method. All public API methods MUST perform the capability checks relevant to the actions that they are representing. The API methods can be seen as the controllers, they are a mandatory step to accessing the data, even within the competency API itself.&lt;br /&gt;
&lt;br /&gt;
==External API==&lt;br /&gt;
&lt;br /&gt;
[https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/external.php External functions] are all located in &amp;lt;code&amp;gt;\core_competency\external&amp;lt;/code&amp;gt;, mostly as a proxy to the public API.&lt;br /&gt;
&lt;br /&gt;
==Frontend==&lt;br /&gt;
&lt;br /&gt;
The competency API comes without any frontend, though Moodle core ships with the admin tool &amp;lt;code&amp;gt;tool_lp&amp;lt;/code&amp;gt; which is acting as the default frontend for competencies. It includes templates, javascript (AMD modules) and some additional external functions. It was built split from the backend to easily allow the support for other frontends.&lt;br /&gt;
&lt;br /&gt;
===URL resolver===&lt;br /&gt;
&lt;br /&gt;
As some of the core APIs require a knowledge of the resource URLs, we introduced the concept of a URL resolver. The URL resolver is used to determine the location of a resource from core, without forcing the default frontend to be used.&lt;br /&gt;
&lt;br /&gt;
When referring to a resource from &#039;&#039;core&#039;&#039;, use the corresponding &amp;lt;code&amp;gt;\core_competency\url::my_ressource_name()&amp;lt;/code&amp;gt; method. Note that it is acceptable for a plugin to directly link to resource frontends within itself without using the resolver.&lt;br /&gt;
&lt;br /&gt;
====Defining new URLs====&lt;br /&gt;
&lt;br /&gt;
Create a class and implement each routing method defined in [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/url.php \core_competency\url], though they should not be static, take [https://git.moodle.org/gw?p=moodle.git;a=blob;f=admin/tool/lp/classes/url_resolver.php \tool_lp\url_resolver] as a base or an example.&lt;br /&gt;
&lt;br /&gt;
Then indicate to core what class to use by defining the config variable &amp;lt;code&amp;gt;$CFG-&amp;gt;core_competency_url_resolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;core_competency_url_resolver = &#039;\\your_namespace\\your_class&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal API==&lt;br /&gt;
&lt;br /&gt;
===Persistents, or Models===&lt;br /&gt;
&lt;br /&gt;
The class &amp;lt;code&amp;gt;\core_competency\persistent&amp;lt;/code&amp;gt; represents an object in the database. It is typically what is called a model in general. It contains the list of fields present in the database table, as well as their &amp;lt;code&amp;gt;PARAM_*&amp;lt;/code&amp;gt; types. Basic validation of the param types is automatically performed prior to any database write operation. Additional validation can also be added by developers. In essence, the persistent knows everything about its data and when it is valid or not. Persistents are able to CRUD themselves in the database. They are also the right place to perform complex queries which join multiple persistents together.&lt;br /&gt;
&lt;br /&gt;
There is never any access control performed within the persistent! However, the competency API is oriented towards model-based Access Control List (ACL), therefore some of the persistents contain helper ACL methods (&amp;lt;code&amp;gt;boolean function can_do_the_thing();&amp;lt;/code&amp;gt;). The main benefit of adding ACL methods to the persistent is to avoid repeating the capability names all over the place, and thus reducing code complexity and human errors.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exaustive list of the persistents:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| A single competency&lt;br /&gt;
|-&lt;br /&gt;
| competency_framework&lt;br /&gt;
| A framework of competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency&lt;br /&gt;
| A relationship table (many-to-many) linking courses and competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency_settings&lt;br /&gt;
| The settings related to competencies in a course&lt;br /&gt;
|-&lt;br /&gt;
| course_module_competency&lt;br /&gt;
| A relationship table (many-to-many) linking course modules and competencies&lt;br /&gt;
|-&lt;br /&gt;
| evidence&lt;br /&gt;
| A piece of evidence relating the proficiency of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| plan&lt;br /&gt;
| A group of competencies for a user to achieve, often referred to as &#039;&#039;learning plans&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| plan_competency&lt;br /&gt;
| A relationship table (many-to-many) linking plans and competencies&lt;br /&gt;
|-&lt;br /&gt;
| related_competency&lt;br /&gt;
| A relationship table (many-to-many) linking competencies to other competencies (within the same framework)&lt;br /&gt;
|-&lt;br /&gt;
| template&lt;br /&gt;
| A template for a plan&lt;br /&gt;
|-&lt;br /&gt;
| template_competency&lt;br /&gt;
| A relationship table (many-to-many) linking templates and competencies&lt;br /&gt;
|-&lt;br /&gt;
| template_cohort&lt;br /&gt;
| The cohorts attached to a template, from which we will create plans.&lt;br /&gt;
|-&lt;br /&gt;
| user_competency&lt;br /&gt;
| The record of the proficiency and rating of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_course&lt;br /&gt;
| The record of the rating of a user towards a competency but limited to the scope of a course&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_plan&lt;br /&gt;
| The record of the proficiency and rating of a user within a plan that was archived/completed, understand frozen.&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence&lt;br /&gt;
| A piece of evidence of prior learning&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence_competency&lt;br /&gt;
| Many-to-many relationship between evidence of prior learning and competencies&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Exporters===&lt;br /&gt;
&lt;br /&gt;
When writing external functions and templates we often needed to explicitly specify all the properties of the persistents. For instance, when returning a competency from an external function, when creating a competency from an external function, when preparing the context of a template, when getting the context for a template from an external function, etc... As persistents already define their properties we decided to create &#039;&#039;exporters&#039;&#039; (they are sometimes referred to as &#039;&#039;serialisers&#039;&#039;), and &#039;&#039;persistent-based exporters&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exporters are classes which convert objects to stdClasses. They may add more properties to the objects as they export them (E.g. generating a &#039;&#039;timeago&#039;&#039; property from the &#039;&#039;date&#039;&#039; property of the object). Therefore exporters are aware of and define all the properties that can be read from an object, and all the properties that are saved in an object.&lt;br /&gt;
&lt;br /&gt;
They mainly serve two purposes:&lt;br /&gt;
&lt;br /&gt;
# They export an object consistently wherever they are used, i.e. all properties will always be present&lt;br /&gt;
# They generate the external function &#039;&#039;parameters&#039;&#039; and &#039;&#039;returns&#039;&#039; structure automatically&lt;br /&gt;
#* The &#039;&#039;parameters&#039;&#039; will be the &#039;&#039;update&#039;&#039; structure, which contains the &#039;&#039;real&#039;&#039; fields&lt;br /&gt;
#* The &#039;&#039;returns&#039;&#039; structure will be the &#039;&#039;read&#039;&#039; structure, which contains everything.&lt;br /&gt;
&lt;br /&gt;
Exporters can also define &#039;&#039;related&#039;&#039; objects. When specified those must be set prior to exporting the data, mainly to improve performance. At this stage they may be a bit weak and difficult to work with as adding &#039;&#039;related&#039;&#039; objects to an existing exporter will require all usage of this exporter to be updated. We have raised an issue to try to improve their design: MDL-53052.&lt;br /&gt;
&lt;br /&gt;
Exporters have come in very handy when we had to add new properties to persistents, or to export new properties from an existing object. They greatly simplify the maintainability of external functions and &amp;lt;code&amp;gt;templatable::export_for_template()&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49833</id>
		<title>Competency API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49833"/>
		<updated>2016-04-19T08:34:53Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The competency API lives in the subsystem &#039;&#039;competency&#039;&#039;, namespaced &amp;lt;code&amp;gt;\core_competency\&amp;lt;/code&amp;gt; and located in the root folder &#039;&#039;competency&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Public API==&lt;br /&gt;
&lt;br /&gt;
The public [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/api.php API class] contains all the methods which are publicly available to any code taking action on competency related objects and data. No code should ever directly call the database, or persistent (models) methods, unless they are within an API method. All public API methods MUST perform the capability checks relevant to the actions that they are representing. The API methods can be seen as the controllers, they are a mandatory step to accessing the data, even within the competency API itself.&lt;br /&gt;
&lt;br /&gt;
==External API==&lt;br /&gt;
&lt;br /&gt;
[https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/external.php External functions] are all located in &amp;lt;code&amp;gt;\core_competency\external&amp;lt;/code&amp;gt;, mostly as a proxy to the public API.&lt;br /&gt;
&lt;br /&gt;
==Frontend==&lt;br /&gt;
&lt;br /&gt;
The competency API comes without any frontend, though Moodle core ships with the admin tool &amp;lt;code&amp;gt;tool_lp&amp;lt;/code&amp;gt; which is acting as the default frontend for competencies. It includes templates, javascript (AMD modules) and some additional external functions. It was built split from the backend to easily allow the support for other frontends.&lt;br /&gt;
&lt;br /&gt;
===URL resolver===&lt;br /&gt;
&lt;br /&gt;
As some of the core APIs require to know the URL to a resource, we introduced the concept of a URL resolver. The URL resolver is used to determine the location of a resource from core, without forcing the default frontend to be used.&lt;br /&gt;
&lt;br /&gt;
When referring to a resource from &#039;&#039;core&#039;&#039;, use the corresponding &amp;lt;code&amp;gt;\core_competency\url::my_ressource_name()&amp;lt;/code&amp;gt; method. Note that it is acceptable for a plugin to directly link to resource frontends within itself without using the resolver.&lt;br /&gt;
&lt;br /&gt;
====Defining new URLs====&lt;br /&gt;
&lt;br /&gt;
Create a class and implement each routing method defined in [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/url.php \core_competency\url], though they should not be static, take [https://git.moodle.org/gw?p=moodle.git;a=blob;f=admin/tool/lp/classes/url_resolver.php \tool_lp\url_resolver] as a base or an example.&lt;br /&gt;
&lt;br /&gt;
Then indicate to core what class to use by defining the config variable &amp;lt;code&amp;gt;$CFG-&amp;gt;core_competency_url_resolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;core_competency_url_resolver = &#039;\\your_namespace\\your_class&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal API==&lt;br /&gt;
&lt;br /&gt;
===Persistents, or Models===&lt;br /&gt;
&lt;br /&gt;
The class &amp;lt;code&amp;gt;\core_competency\persistent&amp;lt;/code&amp;gt; represents an object in the database. It is typically what is called a model in general. It contains the list of fields present in the database table, as well as their &amp;lt;code&amp;gt;PARAM_*&amp;lt;/code&amp;gt; types. Basic validation of the param types is automatically performed prior to any database write operation. Additional validation can also be added by developers. In essence, the persistent knows everything about its data and when it is valid or not. Persistents are able to CRUD themselves in the database. They are also the right place to perform complex queries which join multiple persistents together.&lt;br /&gt;
&lt;br /&gt;
There is never any access control performed within the persistent! However, the competency API is oriented towards model-based Access Control List (ACL), therefore some of the persistents contain helper ACL methods (&amp;lt;code&amp;gt;boolean function can_do_the_thing();&amp;lt;/code&amp;gt;). The main benefit of adding ACL methods to the persistent is to avoid repeating the capability names all over the place, and thus reducing code complexity and human errors.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exaustive list of the persistents:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| A single competency&lt;br /&gt;
|-&lt;br /&gt;
| competency_framework&lt;br /&gt;
| A framework of competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency&lt;br /&gt;
| A relationship table (many-to-many) linking courses and competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency_settings&lt;br /&gt;
| The settings related to competencies in a course&lt;br /&gt;
|-&lt;br /&gt;
| course_module_competency&lt;br /&gt;
| A relationship table (many-to-many) linking course modules and competencies&lt;br /&gt;
|-&lt;br /&gt;
| evidence&lt;br /&gt;
| A piece of evidence relating the proficiency of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| plan&lt;br /&gt;
| A group of competencies for a user to achieve, often referred to as &#039;&#039;learning plans&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| plan_competency&lt;br /&gt;
| A relationship table (many-to-many) linking plans and competencies&lt;br /&gt;
|-&lt;br /&gt;
| related_competency&lt;br /&gt;
| A relationship table (many-to-many) linking competencies to other competencies (within the same framework)&lt;br /&gt;
|-&lt;br /&gt;
| template&lt;br /&gt;
| A template for a plan&lt;br /&gt;
|-&lt;br /&gt;
| template_competency&lt;br /&gt;
| A relationship table (many-to-many) linking templates and competencies&lt;br /&gt;
|-&lt;br /&gt;
| template_cohort&lt;br /&gt;
| The cohorts attached to a template, from which we will create plans.&lt;br /&gt;
|-&lt;br /&gt;
| user_competency&lt;br /&gt;
| The record of the proficiency and rating of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_course&lt;br /&gt;
| The record of the rating of a user towards a competency but limited to the scope of a course&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_plan&lt;br /&gt;
| The record of the proficiency and rating of a user within a plan that was archived/completed, understand frozen.&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence&lt;br /&gt;
| A piece of evidence of prior learning&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence_competency&lt;br /&gt;
| Many-to-many relationship between evidence of prior learning and competencies&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Exporters===&lt;br /&gt;
&lt;br /&gt;
When writing external functions and templates we often needed to explicitly specify all the properties of the persistents. For instance, when returning a competency from an external function, when creating a competency from an external function, when preparing the context of a template, when getting the context for a template from an external function, etc... As persistents already define their properties we decided to create &#039;&#039;exporters&#039;&#039; (they are sometimes referred to as &#039;&#039;serialisers&#039;&#039;), and &#039;&#039;persistent-based exporters&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exporters are classes which convert objects to stdClasses. They may add more properties to the objects as they export them (E.g. generating a &#039;&#039;timeago&#039;&#039; property from the &#039;&#039;date&#039;&#039; property of the object). Therefore exporters are aware of and define all the properties that can be read from an object, and all the properties that are saved in an object.&lt;br /&gt;
&lt;br /&gt;
They mainly serve two purposes:&lt;br /&gt;
&lt;br /&gt;
# They export an object consistently wherever they are used, i.e. all properties will always be present&lt;br /&gt;
# They generate the external function &#039;&#039;parameters&#039;&#039; and &#039;&#039;returns&#039;&#039; structure automatically&lt;br /&gt;
#* The &#039;&#039;parameters&#039;&#039; will be the &#039;&#039;update&#039;&#039; structure, which contains the &#039;&#039;real&#039;&#039; fields&lt;br /&gt;
#* The &#039;&#039;returns&#039;&#039; structure will be the &#039;&#039;read&#039;&#039; structure, which contains everything.&lt;br /&gt;
&lt;br /&gt;
Exporters can also define &#039;&#039;related&#039;&#039; objects. When specified those must be set prior to exporting the data, mainly to improve performance. At this stage they may be a bit weak and difficult to work with as adding &#039;&#039;related&#039;&#039; objects to an existing exporter will require all usage of this exporter to be updated. We have raised an issue to try to improve their design: MDL-53052.&lt;br /&gt;
&lt;br /&gt;
Exporters have come in very handy when we had to add new properties to persistents, or to export new properties from an existing object. They greatly simplify the maintainability of external functions and &amp;lt;code&amp;gt;templatable::export_for_template()&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49832</id>
		<title>Competency API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49832"/>
		<updated>2016-04-19T08:31:10Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The competency API lives in the subsystem &#039;&#039;competency&#039;&#039;, namespaced &amp;lt;code&amp;gt;\core_competency\&amp;lt;/code&amp;gt; and located in the root folder &#039;&#039;competency&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Public API==&lt;br /&gt;
&lt;br /&gt;
The public [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/api.php API class] contains all the methods which are publicly available to any code taking action on competency related objects and data. No code should ever directly call the database, or persistent (models) methods, unless they are within an API method. All public API methods MUST perform the capability checks relevant to the actions that they are representing. The API methods can be seen as the controllers, they are a mandatory step to accessing the data, even within the competency API itself.&lt;br /&gt;
&lt;br /&gt;
==External API==&lt;br /&gt;
&lt;br /&gt;
[https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/external.php External functions] are all located in &amp;lt;code&amp;gt;\core_competency\external&amp;lt;/code&amp;gt;, mostly as a proxy to the public API.&lt;br /&gt;
&lt;br /&gt;
==Frontend==&lt;br /&gt;
&lt;br /&gt;
The competency API comes without any frontend, though Moodle core ships with the admin tool &amp;lt;code&amp;gt;tool_lp&amp;lt;/code&amp;gt; which is acting as the default frontend for competencies. It includes templates, javascript (AMD modules) and some additional external functions. It was built split from the backend to easily allow the support for other frontends.&lt;br /&gt;
&lt;br /&gt;
===URL resolver===&lt;br /&gt;
&lt;br /&gt;
As some of the core APIs require to know the URL to a resource, we introduced the concept of a URL resolver. The URL resolver is used to determine the location of a resource from core, without forcing the default frontend to be used.&lt;br /&gt;
&lt;br /&gt;
When referring to a resource from &#039;&#039;core&#039;&#039;, use the corresponding &amp;lt;code&amp;gt;\core_competency\url::my_ressource_name()&amp;lt;/code&amp;gt; method. Note that it is acceptable for a plugin to directly link to resource frontends within itself without using the resolver.&lt;br /&gt;
&lt;br /&gt;
====Defining new URLs====&lt;br /&gt;
&lt;br /&gt;
Create a class and implement each routing method defined in [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/url.php \core_competency\url], though they should not be static, take [https://git.moodle.org/gw?p=moodle.git;a=blob;f=admin/tool/lp/classes/url_resolver.php \tool_lp\url_resolver] as a base or an example.&lt;br /&gt;
&lt;br /&gt;
Then indicate to core what class to use by defining the config variable &amp;lt;code&amp;gt;$CFG-&amp;gt;core_competency_url_resolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;core_competency_url_resolver = &#039;\\your_namespace\\your_class&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal API==&lt;br /&gt;
&lt;br /&gt;
===Persistents, or Models===&lt;br /&gt;
&lt;br /&gt;
The class &amp;lt;code&amp;gt;\core_competency\persistent&amp;lt;/code&amp;gt; represents an object in the database. It is typically what is called a model in general. It contains the list of fields present in the database table, as well as their &amp;lt;code&amp;gt;PARAM_*&amp;lt;/code&amp;gt; types. Basic validation of the param types is automatically performed prior to any database write operation. Additional validation can also be added by developers. In essence, the persistent knows everything about its data and when it is valid or not. Persistents are able to CRUD themselves in the database. They are also the right place to perform complex queries which join multiple persistents together.&lt;br /&gt;
&lt;br /&gt;
There is never any access control performed within the persistent! However, the competency API is oriented towards model-based Access Control List (ACL), therefore some of the persistents contain helper ACL methods (&amp;lt;code&amp;gt;boolean function can_do_the_thing();&amp;lt;/code&amp;gt;). The main benefit of adding ACL methods to the persistent is to avoid repeating the capability names all over the place, and thus reducing code complexity and human errors.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exaustive list of the persistents:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| A single competency&lt;br /&gt;
|-&lt;br /&gt;
| competency_framework&lt;br /&gt;
| A framework of competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency&lt;br /&gt;
| A relationship table (many-to-many) linking courses and competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency_settings&lt;br /&gt;
| The settings related to competencies in a course&lt;br /&gt;
|-&lt;br /&gt;
| course_module_competency&lt;br /&gt;
| A relationship table (many-to-many) linking course modules and competencies&lt;br /&gt;
|-&lt;br /&gt;
| evidence&lt;br /&gt;
| A piece of evidence relating the proficiency of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| plan&lt;br /&gt;
| A group of competencies for a user to achieve, often referred to as &#039;&#039;learning plans&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| plan_competency&lt;br /&gt;
| A relationship table (many-to-many) linking plans and competencies&lt;br /&gt;
|-&lt;br /&gt;
| related_competency&lt;br /&gt;
| A relationship table (many-to-many) linking competencies to other competencies (within the same framework)&lt;br /&gt;
|-&lt;br /&gt;
| template&lt;br /&gt;
| A template for a plan&lt;br /&gt;
|-&lt;br /&gt;
| template_competency&lt;br /&gt;
| A relationship table (many-to-many) linking templates and competencies&lt;br /&gt;
|-&lt;br /&gt;
| template_cohort&lt;br /&gt;
| The cohorts attached to a template, from which we will create plans.&lt;br /&gt;
|-&lt;br /&gt;
| user_competency&lt;br /&gt;
| The record of the proficiency and rating of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_course&lt;br /&gt;
| The record of the rating of a user towards a competency but limited to the scope of a course&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_plan&lt;br /&gt;
| The record of the proficiency and rating of a user within a plan that was archived/completed, understand frozen.&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence&lt;br /&gt;
| A piece of evidence of prior learning&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence_competency&lt;br /&gt;
| Many-to-many relationship between evidence of prior learning and competencies&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Exporters===&lt;br /&gt;
&lt;br /&gt;
When writing external functions and templates we often needed to explicitly specify all the properties of the persistents. For instance, when returning a competency from an external function, when creating a competency from an external function, when preparing the context of a template, when getting the context for a template from an external function, etc... As persistents already define their properties we decided to create &#039;&#039;exporters&#039;&#039; (they are sometimes referred to as &#039;&#039;serialisers&#039;&#039;), and &#039;&#039;persistent-based exporters&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exporters are classes which convert objects to stdClasses. They may add more properties to the objects as they export them (E.g. generating a &#039;&#039;timeago&#039;&#039; property from the &#039;&#039;date&#039;&#039; property of the object). Therefore exporters are aware of and define all the properties that can be read from an object, and all the properties that are saved in an object.&lt;br /&gt;
&lt;br /&gt;
They mainly serve two purposes:&lt;br /&gt;
&lt;br /&gt;
# They export an object consistently wherever they are used, i.e. all properties will always be present&lt;br /&gt;
# They generate the external function &#039;&#039;parameters&#039;&#039; and &#039;&#039;returns&#039;&#039; structure automatically&lt;br /&gt;
#* The &#039;&#039;parameters&#039;&#039; will be the &#039;&#039;update&#039;&#039; structure, which contains the &#039;&#039;real&#039;&#039; fields&lt;br /&gt;
#* The &#039;&#039;returns&#039;&#039; structure will be the &#039;&#039;read&#039;&#039; structure, which contains everything.&lt;br /&gt;
&lt;br /&gt;
Exporters can also define &#039;&#039;related&#039;&#039; objects. When specified those must be set prior to exporting the data, mainly to improve performance. At this stage they may be a bit weak and difficult to work with as adding &#039;&#039;related&#039;&#039; objects to an existing exporter will require all usage of this exporter to be updated. We have raised an issue to try to improve their design: MDL-53052.&lt;br /&gt;
&lt;br /&gt;
Exporters have come very handy when we had to add new properties to persistents, or to export new properties from an existing object. They greatly simplify the maintainability of external functions and &amp;lt;code&amp;gt;templatable::export_for_template()&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49831</id>
		<title>Competency API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_API&amp;diff=49831"/>
		<updated>2016-04-19T08:24:05Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: git commit -m &amp;#039;Initial commit&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The competency API lives in the subsystem &#039;&#039;competency&#039;&#039;, namespaced &amp;lt;code&amp;gt;\core_competency\&amp;lt;/code&amp;gt; and located in the root folder &#039;&#039;competency&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Public API==&lt;br /&gt;
&lt;br /&gt;
The public [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/api.php API class] contains all the methods which are publicly available to any code taking action on competency related objects and data. No code should ever directly call the database, or persistent (models) methods, unless they are within an API method. All public API methods MUST perform the capability checks relevant to the actions that they are representing. The API methods can be seen as the controllers, they are a mandatory step to accessing the data, even within the competency API itself.&lt;br /&gt;
&lt;br /&gt;
==External API==&lt;br /&gt;
&lt;br /&gt;
[https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/external.php External functions] are all located in &amp;lt;code&amp;gt;\core_competency\external&amp;lt;/code&amp;gt;, mostly as a proxy to the public API.&lt;br /&gt;
&lt;br /&gt;
==Frontend==&lt;br /&gt;
&lt;br /&gt;
The competency API comes without any frontend, though Moodle core ships with the admin tool &amp;lt;code&amp;gt;tool_lp&amp;lt;/code&amp;gt; which is acting as the default frontend for competencies. It includes templates, javascript (AMD modules) and some additional external functions. It was built split from the backend to easily allow the support for other frontends.&lt;br /&gt;
&lt;br /&gt;
===URL resolver===&lt;br /&gt;
&lt;br /&gt;
As some of the core APIs require to know the URL to a resource, we introduced the concept of a URL resolver. The URL resolver is used to determine the location of a resource from core, without forcing the default frontend to be used.&lt;br /&gt;
&lt;br /&gt;
When referring to a resource from &#039;&#039;core&#039;&#039;, use the corresponding &amp;lt;code&amp;gt;\core_competency\url::my_ressource_name()&amp;lt;/code&amp;gt; method. Note that it is acceptable for a plugin to directly link to resource frontends within itself without using the resolver.&lt;br /&gt;
&lt;br /&gt;
====Defining new URLs====&lt;br /&gt;
&lt;br /&gt;
Create a class and implement each routing method defined in [https://git.moodle.org/gw?p=moodle.git;a=blob;f=competency/classes/url.php \core_competency\url], though they should not be static, take [https://git.moodle.org/gw?p=moodle.git;a=blob;f=admin/tool/lp/classes/url_resolver.php \tool_lp\url_resolver] as a base or an example.&lt;br /&gt;
&lt;br /&gt;
Then indicate to core what class to use by defining the config variable &amp;lt;code&amp;gt;$CFG-&amp;gt;core_competency_url_resolver&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$CFG-&amp;gt;core_competency_url_resolver = &#039;\\your_namespace\\your_class&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Internal API==&lt;br /&gt;
&lt;br /&gt;
===Persistents, or Models===&lt;br /&gt;
&lt;br /&gt;
The class &amp;lt;code&amp;gt;\core_competency\persistent&amp;lt;/code&amp;gt; represents an object in the database. It is typically what is called a model in general. It contains the list of fields present in the database table, as well as their &amp;lt;code&amp;gt;PARAM_*&amp;lt;/code&amp;gt; types. Basic validation of the param types is automatically performed prior to any database write operation. Additional validation can also be added by developers. In essence, the persistent knows everything about its data and when it is valid or not. Persistents are able to CRUD themselves in the database. They are also the right place to perform complex queries which join multiple persistents together.&lt;br /&gt;
&lt;br /&gt;
There is never any access control performed within the persistent! However, the competency API is oriented towards model-based ACL, therefore some of the persistents contain helper ACL methods (&amp;lt;code&amp;gt;boolean function can_do_the_thing();&amp;lt;/code&amp;gt;). The main benefit of adding ACL methods to the persistent is to avoid repeating the capability names all over the place, and thus reducing code complexity and human errors.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exaustive list of the persistents:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| A single competency&lt;br /&gt;
|-&lt;br /&gt;
| competency_framework&lt;br /&gt;
| A framework of competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency&lt;br /&gt;
| A relationship table (many-to-many) linking courses and competencies&lt;br /&gt;
|-&lt;br /&gt;
| course_competency_settings&lt;br /&gt;
| The settings related to competencies in a course&lt;br /&gt;
|-&lt;br /&gt;
| course_module_competency&lt;br /&gt;
| A relationship table (many-to-many) linking course modules and competencies&lt;br /&gt;
|-&lt;br /&gt;
| evidence&lt;br /&gt;
| A piece of evidence relating the proficiency of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| plan&lt;br /&gt;
| A group of competencies for a user to achieve, often referred to as &#039;&#039;learning plans&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| plan_competency&lt;br /&gt;
| A relationship table (many-to-many) linking plans and competencies&lt;br /&gt;
|-&lt;br /&gt;
| related_competency&lt;br /&gt;
| A relationship table (many-to-many) linking competencies to other competencies (within the same framework)&lt;br /&gt;
|-&lt;br /&gt;
| template&lt;br /&gt;
| A template for a plan&lt;br /&gt;
|-&lt;br /&gt;
| template_competency&lt;br /&gt;
| A relationship table (many-to-many) linking templates and competencies&lt;br /&gt;
|-&lt;br /&gt;
| template_cohort&lt;br /&gt;
| The cohorts attached to a template, from which we will create plans.&lt;br /&gt;
|-&lt;br /&gt;
| user_competency&lt;br /&gt;
| The record of the proficiency and rating of a user towards a competency&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_course&lt;br /&gt;
| The record of the rating of a user towards a competency but limited to the scope of a course&lt;br /&gt;
|-&lt;br /&gt;
| user_competency_plan&lt;br /&gt;
| The record of the proficiency and rating of a user within a plan that was archived/completed, understand frozen.&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence&lt;br /&gt;
| A piece of evidence of prior learning&lt;br /&gt;
|-&lt;br /&gt;
| user_evidence_competency&lt;br /&gt;
| Many-to-many relationship between evidence of prior learning and competencies&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Exporters===&lt;br /&gt;
&lt;br /&gt;
When writing external functions and templates we often needed to explicitly specify all the properties of the persistents. For instance, when returning a competency from an external function, when creating a competency from an external function, when preparing the context of a template, when getting the context for a template from an external function, etc... As persistents already define their properties we decided to create &#039;&#039;exporters&#039;&#039; (they are sometimes referred to as &#039;&#039;serialisers&#039;&#039;), and &#039;&#039;persistent-based exporters&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exporters are classes which convert objects to stdClasses. They may add more properties to the objects as they export them (E.g. generating a &#039;&#039;timeago&#039;&#039; property from the &#039;&#039;date&#039;&#039; property of the object). Therefore exporters are aware of and define all the properties that can be read from an object, and all the properties that are saved in an object.&lt;br /&gt;
&lt;br /&gt;
They mainly serve two purposes:&lt;br /&gt;
&lt;br /&gt;
# They export an object consistently wherever they are used, i.e. all properties will always be present&lt;br /&gt;
# They generate the external function &#039;&#039;parameters&#039;&#039; and &#039;&#039;returns&#039;&#039; structure automatically&lt;br /&gt;
#* The &#039;&#039;parameters&#039;&#039; will be the &#039;&#039;update&#039;&#039; structure, which contains the &#039;&#039;real&#039;&#039; fields&lt;br /&gt;
#* The &#039;&#039;returns&#039;&#039; structure will be the &#039;&#039;read&#039;&#039; structure, which contains everything.&lt;br /&gt;
&lt;br /&gt;
Exporters can also define &#039;&#039;related&#039;&#039; objects. When specified those must be set prior to exporting the data, mainly to improve performance. At this stage they may be a bit weak and difficult to work with as adding &#039;&#039;related&#039;&#039; objects to an existing exporter will require all usage of this exporter to be updated. We have raised an issue to try to improve their design: MDL-53052.&lt;br /&gt;
&lt;br /&gt;
Exporters have come very handy when we had to add new properties to persistents, or to export new properties from an existing object. They greatly simplify the maintainability of external functions and &amp;lt;code&amp;gt;templatable::export_for_template()&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Web_service_API_functions&amp;diff=49830</id>
		<title>Web service API functions</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Web_service_API_functions&amp;diff=49830"/>
		<updated>2016-04-19T06:43:06Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Add core competency web services&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle_2.0}}&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Color meaning&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | Implemented&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdead;&amp;quot;  | Must be implemented&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdfcd;&amp;quot;  | Suggested&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Web service protocols==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Moodle Ver. !!  class=&amp;quot;unsortable&amp;quot; |Description !!  class=&amp;quot;unsortable&amp;quot; |CORS  !! |Issue&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | AMF || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Adobe protocol to communicate with Flash/Flex apps || Not supported || &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | REST (returning XML) || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | XML data accessed through a REST API (not restful) || Supported (3.0 and onwards) || &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | REST (returning JSON) || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.2 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | JSON data accessed through a REST API (not restful) || Supported (3.0 and onwards)|| MDL-29242&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdfcd;&amp;quot;  | REST (returning JSONP) || style=&amp;quot;background:#ffdfcd;&amp;quot;  | 2.X || style=&amp;quot;background:#ffdfcd;&amp;quot;  | Would be very useful for client-side JavaScript ||  Not supported || MDL-29913&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdfcd;&amp;quot;  |  JSON || style=&amp;quot;background:#ffdfcd;&amp;quot;  | 2.X || style=&amp;quot;background:#ffdfcd;&amp;quot;  | JSON server receives a JSON encoded params and return JSON encoded values. ||  Not supported || MDL-21341&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdead;&amp;quot;  | SOAP|| style=&amp;quot;background:#ffdead;&amp;quot;  | 2.0 || style=&amp;quot;background:#ffdead;&amp;quot;  | Very important for interoperating with Java and .Net applications. There was a partial implementation JAVA/.Net in Moodle 2.0, but it does not work for anything but the most trivial functions.  It is fully working with PHP clients.||  Not supported || MDL-20804, MDL-28988, MDL-28989&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | XMLRPC|| style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | XML remote-procedure call. ||  Not supported || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Web service functions==&lt;br /&gt;
&lt;br /&gt;
=== Naming convention ===&lt;br /&gt;
&lt;br /&gt;
We updated (regularised) the naming convention in Moodle 2.2.  See MDL-29106 for those details.&lt;br /&gt;
&lt;br /&gt;
All functions should be named as follows:&lt;br /&gt;
&lt;br /&gt;
* wsfunction = fullcomponent_methodname  &lt;br /&gt;
* fullcomponent = [https://docs.moodle.org/dev/Frankenstyle frankenstyle] (eg core_xxxx or mod_xxx etc)&lt;br /&gt;
* methodname = verb_noun(s)&lt;br /&gt;
* verb = get|create|delete|update&lt;br /&gt;
* noun = moodle objects, usually plural (eg posts, discussions, users, courses etc)&lt;br /&gt;
&lt;br /&gt;
=== Core web service functions ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Area!! Moodle 2.2 name !! Moodle 2.0/2.1 name !! Introduced in !!  class=&amp;quot;unsortable&amp;quot; |Description !!  class=&amp;quot;unsortable&amp;quot; | Issue&lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_create_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_create_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create users - admin function || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  |  core_user_delete_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  |  moodle_user_delete_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete users - admin function || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_update_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_update_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update users || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_get_users_by_id() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_get_users_by_id() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get users by id || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  |  core_user_get_course_user_profiles() || style=&amp;quot;background:#D4FFDF;&amp;quot;  |  moodle_user_get_course_participants_by_id() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get course user profiles by id || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_create_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Create cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_update_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Update cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_delete_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Delete cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_get_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Get cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_add_cohort_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Add members to cohort || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_delete_cohort_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Delete members from cohort || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_get_cohort_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Get cohort members || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_create_competency_framework || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Create a competency framework || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_read_competency_framework || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Fetch a competency framework || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_duplicate_competency_framework || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Duplicate a competency framework || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_competency_framework || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Delete a competency framework || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_update_competency_framework || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Update a competency framework || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_competency_frameworks || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List the competency frameworks || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_competency_frameworks || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count the competency frameworks || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_competency_framework_viewed || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Notify a competency framework as being viewed || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_create_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Create a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_read_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Fetch a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_competency_viewed || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Report a competency as being viewed || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Delete a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_update_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Update a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_competencies || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_competencies_in_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List the competencies of a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_competencies || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count the competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_competencies_in_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count the competencies in a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_search_competencies || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Search for competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_set_parent_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Relocate a competency to another parent || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_move_up_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Move a competency up in its branch || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_move_down_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Move a competency down in its branch || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_course_competencies || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List the competencies in a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_competencies_in_course || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count competencies in a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_courses_using_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count courses using a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_add_competency_to_course || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Add competency to a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_add_competency_to_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Add competency to a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_remove_competency_from_course || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Remove competency from a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_set_course_competency_ruleoutcome || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Set the rule of course competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_remove_competency_from_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Remove competency from template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_reorder_course_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Reorder competencies in a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_reorder_template_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Reorder competencies in a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_create_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Create a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_duplicate_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Duplicate a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_read_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Fetch a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Delete a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_update_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Update a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_templates || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List templates || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_templates_using_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List templates using a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_templates || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count templates || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_count_templates_using_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Count templates using a competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_create_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Create a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_update_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Update a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_complete_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Complete a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_reopen_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Reopen a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_read_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Fetch a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Delete a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_user_plans || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List a user&#039;s learning plans || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_list_plan_competencies || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | List a learning plan&#039;s competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_add_competency_to_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Add a competency to a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_remove_competency_from_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Remove a competency from a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_reorder_plan_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Reopen a competency in a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_plan_request_review || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Request the review of a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_plan_start_review || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Start the review of a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_plan_stop_review || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Stop the review of a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_plan_cancel_review_request || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Cancel the review request of a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_approve_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Approve a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_unapprove_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Unapprove a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_template_has_related_data || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Check whether a template has related data || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_get_scale_values || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Get the values for a scale || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_add_related_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Create a relationship between competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_remove_related_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Remove a relationship between competencies || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_read_user_evidence || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Fetch an evidence of prior learning || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_user_evidence || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Delete an evidence of prior learning || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_create_user_evidence_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Link an evidence of prior learning with a user&#039;s competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_user_evidence_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Remove a link between an evidence of prior learning and a user&#039;s competency  || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_cancel_review_request || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Cancel the review request of a user&#039;s competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_request_review || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Request the review of a user&#039;s competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_start_review || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Start the review of a user&#039;s competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_stop_review || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Stop the review of a user&#039;s competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_viewed || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Report a user&#039;s competency as being viewed || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_viewed_in_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Report a user&#039;s competency as being viewed from a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_viewed_in_course || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Report a user&#039;s competency as being viewed from a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_user_competency_plan_viewed || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Report the archive of user&#039;s competency as being viewed  || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_grade_competency || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Rate a user&#039;s competency || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_grade_competency_in_plan || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Rate a user&#039;s competency in a learning plan || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_grade_competency_in_course || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Rate a user&#039;s competency in a course || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_unlink_plan_from_template || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Unlink a learning plan from a template || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_template_viewed || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Report a template as being viewed || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_request_review_of_user_evidence_linked_competencies || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Request the review of the user&#039;s competencies linked to an evidence of prior learning || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_update_course_competency_settings || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Update the course competency settings || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
| competency&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot; | core_competency_delete_evidence || style=&amp;quot;background:#D4FFDF;&amp;quot; | || style=&amp;quot;background:#D4FFDF;&amp;quot; | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot; | Delete an evidence || MDL-49458&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_course_get_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return course details ||&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_create_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_course_create_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create new courses ||&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_search_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Search courses by (name, module, block, tag). || MDL-49942  &lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_course_module || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return information about a course module. || MDL-51371     &lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_course_module_by_instance || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return information about a given module name and instance id. || MDL-51579    &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_create_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_create_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Creates new groups || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_get_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  |  2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns group details. || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_course_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_get_course_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns all groups in specified course || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_delete_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_delete_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Deletes all specified groups || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_group_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_get_groupmembers() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns group members || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_add_group_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_add_groupmembers() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Adds group members || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_delete_group_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_delete_groupmembers() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Deletes group members || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_activity_allowed_groups || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Gets a list of groups that the user is allowed to access within the specified activity. || MDL-50966    &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_activity_groupmode || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns effective groupmode used in a given activity. || MDL-50964  &lt;br /&gt;
|-&lt;br /&gt;
|role&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_role_assign_roles() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_role_assign() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Manual role assignments || &lt;br /&gt;
|-&lt;br /&gt;
|role&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_role_unassign_roles() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_role_unassign() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Manual role unassignments || &lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | NONE || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_enrol_get_enrolled_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get some minimal information about the users enrolled in a course (DEPRECATED) || &lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_enrol_get_enrolled_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_get_users_by_courseid() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get enrolled users by course id || &lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_enrol_get_users_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_enrol_get_users_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get list of course ids that a user is enrolled in (if you are allowed to see that) ||&lt;br /&gt;
|-&lt;br /&gt;
|enrol_manual&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | enrol_manual_enrol_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_enrol_manual_enrol_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Manual enrol users || &lt;br /&gt;
|-&lt;br /&gt;
|enrol_self&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | enrol_self_enrol_user || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Self enrol the current user in the given course. || MDL-51568  &lt;br /&gt;
|-&lt;br /&gt;
|webservice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_webservice_get_site_info() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_webservice_get_siteinfo() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return some site info / user info / list web service functions || &lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_send_instant_messages() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_message_send_instantmessages() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Send instant messages || &lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_create_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_notes_create_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create notes ||&lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_delete_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete Notes || MDL-30072&lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_get_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve Notes || MDL-30072&lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_update_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update Notes || MDL-30072&lt;br /&gt;
|-&lt;br /&gt;
|files&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_files_get_files() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_file_get_files() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | browse moodle files || &lt;br /&gt;
|-&lt;br /&gt;
|files&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_files_upload() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_file_upload() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | upload a file to moodle (DEPRECATED) || &lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_contents() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.2 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get course content (modules + web service file urls) || MDL-28646&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_delete_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | delete courses || MDL-13130&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_duplicate_course() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | duplicate a course || MDL-32233&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_update_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | update categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_create_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | create categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_delete_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | delete categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_create_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | create groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_update_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | update groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_delete_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | delete groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_assign_grouping() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | assign groups from groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_unassign_grouping() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | unassign groups from groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_course_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get all groupings in specified course || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_get_users_by_field() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve users information for a specified unique field - If you want to do a user search, use core_user_get_users() || MDL-35543&lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_enrol_get_enrolled_users_with_capability() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | For each course and capability specified, return a list of the users that are enrolled in the course and have that capability || MDL-31859&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_import_course() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Import course data from a course into another course. Does not include any user data. || MDL-32919&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_create_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Add contacts to the contact list || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_delete_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Remove contacts from the contact list || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_block_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Block contacts || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_unblock_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Unblock contacts || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_get_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve the contact list || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_search_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Search for contacts || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|external&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_get_string() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return a translated string - similar to core get_string() call || MDL-35997&lt;br /&gt;
|-&lt;br /&gt;
|external&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_get_component_strings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return all raw strings (with {$a-&amp;gt;xxx}) for a specific component - similar to core get_component_strings() call || MDL-35997&lt;br /&gt;
|-&lt;br /&gt;
|external&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_get_strings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return some translated strings - like several core get_string() calls || MDL-35997&lt;br /&gt;
|-&lt;br /&gt;
|calendar&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_calendar_delete_calendar_events() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete calendar events || MDL-37077&lt;br /&gt;
|-&lt;br /&gt;
|calendar&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_calendar_get_calendar_events() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get calendar events || MDL-37100&lt;br /&gt;
|-&lt;br /&gt;
|calendar&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_calendar_create_calendar_events() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create calendar events || MDL-37101&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_grades() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns grades from the assignment || MDL-31873&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_assignments() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the courses and assignments for the users capability || MDL-31873&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_submissions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the submissions for assignments || MDL-31682&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_user_flags || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the user_flags for assignments || MDL-40548&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_set_user_flags || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Sets the specified user_flags for an assignment || MDL-41738&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_user_mappings || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the user_mappings for assignments || MDL-40548&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_revert_submissions_to_draft || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Reverts the list of submissions to draft status || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_lock_submissions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Prevent students from making changes to a list of submissions || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_unlock_submissions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Allow students to make changes to a list of submissions || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_submission || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update the current students submission || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_submit_for_grading || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Submit the current students assignment for grading || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_grade || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Save a grade update for a single student. || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_grades || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Save grade updates for one or more students. || MDL-42425&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_user_extensions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Save a list of assignment extensions || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_reveal_identities || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Reveal the identities for a blind marking assignment || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_book&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_book_view_book || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50013&lt;br /&gt;
|-&lt;br /&gt;
|mod_book&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_book_get_books_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of book instances in a provided set of courses. || MDL-50536 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_get_chats_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of chat instances in a provided set of courses. || MDL-50537 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_view_chat || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_login_user || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Log a user into a chat room in the given chat. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_get_chat_users || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the list of users in the given chat session. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_send_chat_message || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Send a message on the given chat session. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_get_chat_latest_messages || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the latest messages from the given chat sessio. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_get_choices_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of choice instances in a provided set of courses. || MDL-50132  &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_get_choice_results || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve users results for a given choice. || MDL-50944 &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_get_choice_options || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve options for a specific choice. || MDL-50944 &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_submit_choice_response || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Submit responses to a specific choice item. || MDL-50944&lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_view_choice || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status.. || MDL-50944&lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_delete_choice_responses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete the given submitted responses in a choice. || MDL-50944&lt;br /&gt;
|-&lt;br /&gt;
|mod_data&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_data_get_databases_by_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns a list of database instances in a provided set of courses, if no courses are provided then all the database instances the user has access to will be returned. || MDL-49337&lt;br /&gt;
|-&lt;br /&gt;
|mod_folder&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_folder_view_folder || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50008  &lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forums_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of forum instances in a provided set of courses, if no courses are provided then all the forum instances the user has access to will be returned. || MDL-37247&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forum_discussion_posts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns a list of forum posts for a discussion. || MDL-30106&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forum_discussions_paginated() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.8 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns a list of forum discussions optionally sorted and paginated. || MDL-46458&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_view_forum() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Trigger the course_module_viewed event when a user view a forum (this web service will be initially used by the mobile app so information can be logged in the Moodle side when a user see the same page in the app). || MDL-49502&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_view_forum_discussion() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Trigger the discussion_viewed event when a user view a forum discussion (this web service will be initially used by the mobile app so information can be logged in the Moodle side when a user see the same page in the app). || MDL-49503&lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forum_discussions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of forum discussions in a provided set of forums.  (DEPRECATED use mod_forum_get_forum_discussions_paginated instead)  || MDL-30102&lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_add_discussion || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Add a new discussion into an existing forum. || MDL-50994    &lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_add_discussion_post || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create new posts into an existing discussion. || MDL-50995    &lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_glossaries_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the glossaries in courses || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_view_glossary || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Notify that a glossary was viewed || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_view_entry || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Notify that a glossary entry was viewed || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_letter || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using letter filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_date || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using date filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_categories || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get a glossary&#039;s categories || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_category || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using category filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_authors || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the authors in a glossary || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_author || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using author filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_author_id || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using author ID filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_search || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries matching a search query || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_term || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using term filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_to_approve || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries to be approved || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entry_by_id || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get an entry by ID || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_imscp&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_imscp_view_imscp || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50015&lt;br /&gt;
|-&lt;br /&gt;
|mod_imscp&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_imscp_get_imscps_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of imscp instances in a provided set of courses. || MDL-50541   &lt;br /&gt;
|-&lt;br /&gt;
|mod_lti&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_lti_get_ltis_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of lti instances in a provided set of courses. || MDL-50543    &lt;br /&gt;
|-&lt;br /&gt;
|mod_lti&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_lti_view_lti || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-51624 &lt;br /&gt;
|-&lt;br /&gt;
|mod_lti&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_lti_get_tool_launch_data || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return the launch data for a given external tool. || MDL-51615       &lt;br /&gt;
|-&lt;br /&gt;
|mod_page&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_page_view_page || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-49791&lt;br /&gt;
|-&lt;br /&gt;
|mod_resource&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_resource_view_resource || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-49792&lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorms_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of scorm instances in a provided set of courses. || MDL-50349 &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_view_scorm || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status.. || MDL-50427 &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_attempt_count || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return the number of attempts done by a user in the given SCORM. || MDL-51017&lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_sco_tracks || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieves SCO tracking data for the given user id and attempt number. || MDL-50557 &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_insert_scorm_tracks || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Saves a scorm tracking record. || MDL-50353      &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_user_data || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieves user tracking and SCO data and default SCORM values. || MDL-50352&lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_scoes || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list containing all the scoes data related to the given scorm id. || MDL-50351&lt;br /&gt;
|-&lt;br /&gt;
|mod_url&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_url_view_url || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-49793&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_update_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update courses. || MDL-30062&lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_get_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Search users. - If you want to get multiple users for one specific field, use core_user_get_users_by_field(), it&#039;s designed for this purpose and it should be faster. || MDL-29938&lt;br /&gt;
|-&lt;br /&gt;
|grade&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grade_get_definitions() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns grading definitions for the course module ids and areaname provided as parameters. An optionall activeonly parameter can be provided so that only the active grading method is returned. Will be deprecated and replaced by core_grading_get_definitions in 2.6|| MDL-31681&lt;br /&gt;
|-&lt;br /&gt;
|grade&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grade_get_grades() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns student course total grade and grades for activities. This function does not return category or manual items. This function is suitable for managers or teachers not students.|| MDL-30085&lt;br /&gt;
|-&lt;br /&gt;
|grade&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grade_update_grades() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update a grade item and associated student grades.|| MDL-30085&lt;br /&gt;
|-&lt;br /&gt;
|grading&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grading_get_definitions() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns grading definitions for the course module ids and areaname provided as parameters. An optionall activeonly parameter can be provided so that only the active grading method is returned.|| MDL-31890&lt;br /&gt;
|-&lt;br /&gt;
|grading&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grading_get_gradingform_instances() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the instances and fillings for the requested definition id. An optional since parameter allows the number of records returned to be reduced so that only those with a timemodified value &amp;gt;= since are returned|| MDL-31890&lt;br /&gt;
|-&lt;br /&gt;
|grading&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grading_save_definitions() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.8 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Accepts an array of areas as a parameter. The areas contain grading definitions with criteria for inserting and updating|| MDL-31861&lt;br /&gt;
|-&lt;br /&gt;
|comment&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_comment_get_comments() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Return all the comments for an specific component, context. || MDL-49203&lt;br /&gt;
 |-&lt;br /&gt;
|completion&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_get_activities_completion_status() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Return the activities completion status for a user in a course. || MDL-49314&lt;br /&gt;
 |-&lt;br /&gt;
|completion&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_get_course_completion_status() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns course completion status. || MDL-49313&lt;br /&gt;
 |-&lt;br /&gt;
|completion&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_update_activity_completion_status_manually() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Update completion status for the current user in an activity, only for activities with manual tracking. || MDL-49444&lt;br /&gt;
|-&lt;br /&gt;
|completion&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_mark_course_self_completed || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update the course completion status for the current user (if course self-completion is enabled). || MDL-50930    &lt;br /&gt;
 |-&lt;br /&gt;
|course&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_view_course() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Log that the course was viewed || MDL-49453&lt;br /&gt;
 |-&lt;br /&gt;
|group&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_course_user_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns all groups in specified course for the specified user. || MDL-48730&lt;br /&gt;
 |-&lt;br /&gt;
|message&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_get_messages() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.8 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Retrieve a list of messages sent and received by a user (conversations, notifications or both) || MDL-45374&lt;br /&gt;
 |-&lt;br /&gt;
|message&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_mark_message_read() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Mark a single message as read, trigger message_viewed event. || MDL-49501&lt;br /&gt;
 |-&lt;br /&gt;
|notes&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_view_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Simulates the web interface view of notes/index.php: trigger events. || MDL-49504&lt;br /&gt;
 |-&lt;br /&gt;
|rating&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_rating_get_item_ratings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Retrieve all the ratings for an item. || MDL-49347&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_add_user_device() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Store mobile user devices information for PUSH Notifications. || MDL-41914&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_remove_user_device() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Remove a user device from the Moodle database. || MDL-48716&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_view_user_list() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Simulates the web-interface view of user/index.php (triggering events). || MDL-49498&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_view_user_profile() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Simulates the web-interface view of user/view.php and user/profile.php (triggering events). || MDL-49499&lt;br /&gt;
 |-&lt;br /&gt;
|grade_report&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | gradereport_user_get_grades_table() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Get the user/s report grades table for a course || MDL-49036&lt;br /&gt;
 |-&lt;br /&gt;
|grade_report&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | gradereport_user_view_grade_report() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Trigger the grade_report_viewed event when a user view his grade report (this web service will be initially used by the mobile app so information can be logged in the Moodle side when a user see the same page in the app). || MDL-49500&lt;br /&gt;
 |-&lt;br /&gt;
|message&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_get_blocked_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Retrieve a list of users blocked || MDL-48719&lt;br /&gt;
 |-&lt;br /&gt;
|course&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_delete_modules() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Deletes all specified module instances || MDL-30098&lt;br /&gt;
 |-&lt;br /&gt;
|notes&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_get_course_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns all notes in specified course (or site) for the specified user. || MDL-49330&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
This is the list of the integrated core functions. To see the roadmap, see to the tracker issue in the section bellow.&lt;br /&gt;
&lt;br /&gt;
=== API Roadmap===&lt;br /&gt;
Tracker issue: MDL-29934&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
* [[Web services API Changes]]&lt;br /&gt;
* [[How to contribute a web service function to core]]&lt;br /&gt;
* [[Web services|Web services developer documentation]]&lt;br /&gt;
* [[:en:Web services|Web services user documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web Services]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Web_service_API_functions&amp;diff=49829</id>
		<title>Web service API functions</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Web_service_API_functions&amp;diff=49829"/>
		<updated>2016-04-19T05:41:16Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Adding mod_glossary new external functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle_2.0}}&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Color meaning&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | Implemented&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdead;&amp;quot;  | Must be implemented&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdfcd;&amp;quot;  | Suggested&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Web service protocols==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Name !! Moodle Ver. !!  class=&amp;quot;unsortable&amp;quot; |Description !!  class=&amp;quot;unsortable&amp;quot; |CORS  !! |Issue&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | AMF || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Adobe protocol to communicate with Flash/Flex apps || Not supported || &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | REST (returning XML) || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | XML data accessed through a REST API (not restful) || Supported (3.0 and onwards) || &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | REST (returning JSON) || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.2 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | JSON data accessed through a REST API (not restful) || Supported (3.0 and onwards)|| MDL-29242&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdfcd;&amp;quot;  | REST (returning JSONP) || style=&amp;quot;background:#ffdfcd;&amp;quot;  | 2.X || style=&amp;quot;background:#ffdfcd;&amp;quot;  | Would be very useful for client-side JavaScript ||  Not supported || MDL-29913&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdfcd;&amp;quot;  |  JSON || style=&amp;quot;background:#ffdfcd;&amp;quot;  | 2.X || style=&amp;quot;background:#ffdfcd;&amp;quot;  | JSON server receives a JSON encoded params and return JSON encoded values. ||  Not supported || MDL-21341&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#ffdead;&amp;quot;  | SOAP|| style=&amp;quot;background:#ffdead;&amp;quot;  | 2.0 || style=&amp;quot;background:#ffdead;&amp;quot;  | Very important for interoperating with Java and .Net applications. There was a partial implementation JAVA/.Net in Moodle 2.0, but it does not work for anything but the most trivial functions.  It is fully working with PHP clients.||  Not supported || MDL-20804, MDL-28988, MDL-28989&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | XMLRPC|| style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | XML remote-procedure call. ||  Not supported || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Web service functions==&lt;br /&gt;
&lt;br /&gt;
=== Naming convention ===&lt;br /&gt;
&lt;br /&gt;
We updated (regularised) the naming convention in Moodle 2.2.  See MDL-29106 for those details.&lt;br /&gt;
&lt;br /&gt;
All functions should be named as follows:&lt;br /&gt;
&lt;br /&gt;
* wsfunction = fullcomponent_methodname  &lt;br /&gt;
* fullcomponent = [https://docs.moodle.org/dev/Frankenstyle frankenstyle] (eg core_xxxx or mod_xxx etc)&lt;br /&gt;
* methodname = verb_noun(s)&lt;br /&gt;
* verb = get|create|delete|update&lt;br /&gt;
* noun = moodle objects, usually plural (eg posts, discussions, users, courses etc)&lt;br /&gt;
&lt;br /&gt;
=== Core web service functions ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Area!! Moodle 2.2 name !! Moodle 2.0/2.1 name !! Introduced in !!  class=&amp;quot;unsortable&amp;quot; |Description !!  class=&amp;quot;unsortable&amp;quot; | Issue&lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_create_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_create_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create users - admin function || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  |  core_user_delete_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  |  moodle_user_delete_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete users - admin function || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_update_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_update_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update users || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_get_users_by_id() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_get_users_by_id() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get users by id || &lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  |  core_user_get_course_user_profiles() || style=&amp;quot;background:#D4FFDF;&amp;quot;  |  moodle_user_get_course_participants_by_id() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get course user profiles by id || &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_create_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Create cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_update_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Update cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_delete_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Delete cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_get_cohorts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Get cohorts || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_add_cohort_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Add members to cohort || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_delete_cohort_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Delete members from cohort || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|cohort&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_cohort_get_cohort_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Get cohort members || MDL-29472&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_course_get_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return course details ||&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_create_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_course_create_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create new courses ||&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_search_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Search courses by (name, module, block, tag). || MDL-49942  &lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_course_module || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return information about a course module. || MDL-51371     &lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_course_module_by_instance || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return information about a given module name and instance id. || MDL-51579    &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_create_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_create_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Creates new groups || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_get_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  |  2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns group details. || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_course_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_get_course_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns all groups in specified course || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_delete_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_delete_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Deletes all specified groups || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_group_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_get_groupmembers() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns group members || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_add_group_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_add_groupmembers() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Adds group members || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_delete_group_members() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_group_delete_groupmembers() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Deletes group members || &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_activity_allowed_groups || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Gets a list of groups that the user is allowed to access within the specified activity. || MDL-50966    &lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_activity_groupmode || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns effective groupmode used in a given activity. || MDL-50964  &lt;br /&gt;
|-&lt;br /&gt;
|role&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_role_assign_roles() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_role_assign() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Manual role assignments || &lt;br /&gt;
|-&lt;br /&gt;
|role&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_role_unassign_roles() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_role_unassign() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Manual role unassignments || &lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | NONE || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_enrol_get_enrolled_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get some minimal information about the users enrolled in a course (DEPRECATED) || &lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
|  style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_enrol_get_enrolled_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_user_get_users_by_courseid() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get enrolled users by course id || &lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_enrol_get_users_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_enrol_get_users_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get list of course ids that a user is enrolled in (if you are allowed to see that) ||&lt;br /&gt;
|-&lt;br /&gt;
|enrol_manual&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | enrol_manual_enrol_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_enrol_manual_enrol_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Manual enrol users || &lt;br /&gt;
|-&lt;br /&gt;
|enrol_self&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | enrol_self_enrol_user || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Self enrol the current user in the given course. || MDL-51568  &lt;br /&gt;
|-&lt;br /&gt;
|webservice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_webservice_get_site_info() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_webservice_get_siteinfo() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return some site info / user info / list web service functions || &lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_send_instant_messages() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_message_send_instantmessages() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Send instant messages || &lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_create_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_notes_create_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create notes ||&lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_delete_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete Notes || MDL-30072&lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_get_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve Notes || MDL-30072&lt;br /&gt;
|-&lt;br /&gt;
|notes&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_update_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update Notes || MDL-30072&lt;br /&gt;
|-&lt;br /&gt;
|files&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_files_get_files() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_file_get_files() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | browse moodle files || &lt;br /&gt;
|-&lt;br /&gt;
|files&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_files_upload() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | moodle_file_upload() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | upload a file to moodle (DEPRECATED) || &lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_contents() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.2 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get course content (modules + web service file urls) || MDL-28646&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_delete_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | delete courses || MDL-13130&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_duplicate_course() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | duplicate a course || MDL-32233&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_get_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_update_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | update categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_create_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | create categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_delete_categories() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | delete categories || MDL-32941&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_create_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | create groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_update_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | update groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_delete_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | delete groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_assign_grouping() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | assign groups from groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_unassign_grouping() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | unassign groups from groupings || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|group&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_course_groupings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.3 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | get all groupings in specified course || MDL-32662&lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_get_users_by_field() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve users information for a specified unique field - If you want to do a user search, use core_user_get_users() || MDL-35543&lt;br /&gt;
|-&lt;br /&gt;
|enrol&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_enrol_get_enrolled_users_with_capability() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | For each course and capability specified, return a list of the users that are enrolled in the course and have that capability || MDL-31859&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_import_course() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Import course data from a course into another course. Does not include any user data. || MDL-32919&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_create_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Add contacts to the contact list || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_delete_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Remove contacts from the contact list || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_block_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Block contacts || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_unblock_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Unblock contacts || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_get_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve the contact list || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|message&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_search_contacts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Search for contacts || MDL-30070&lt;br /&gt;
|-&lt;br /&gt;
|external&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_get_string() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return a translated string - similar to core get_string() call || MDL-35997&lt;br /&gt;
|-&lt;br /&gt;
|external&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_get_component_strings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return all raw strings (with {$a-&amp;gt;xxx}) for a specific component - similar to core get_component_strings() call || MDL-35997&lt;br /&gt;
|-&lt;br /&gt;
|external&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_get_strings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return some translated strings - like several core get_string() calls || MDL-35997&lt;br /&gt;
|-&lt;br /&gt;
|calendar&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_calendar_delete_calendar_events() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete calendar events || MDL-37077&lt;br /&gt;
|-&lt;br /&gt;
|calendar&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_calendar_get_calendar_events() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get calendar events || MDL-37100&lt;br /&gt;
|-&lt;br /&gt;
|calendar&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_calendar_create_calendar_events() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create calendar events || MDL-37101&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_grades() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns grades from the assignment || MDL-31873&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_assignments() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.4 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the courses and assignments for the users capability || MDL-31873&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_submissions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the submissions for assignments || MDL-31682&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_user_flags || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the user_flags for assignments || MDL-40548&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_set_user_flags || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Sets the specified user_flags for an assignment || MDL-41738&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_get_user_mappings || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the user_mappings for assignments || MDL-40548&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_revert_submissions_to_draft || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Reverts the list of submissions to draft status || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_lock_submissions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Prevent students from making changes to a list of submissions || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_unlock_submissions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Allow students to make changes to a list of submissions || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_submission || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update the current students submission || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_submit_for_grading || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Submit the current students assignment for grading || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_grade || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Save a grade update for a single student. || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_grades || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Save grade updates for one or more students. || MDL-42425&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_save_user_extensions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Save a list of assignment extensions || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_assign&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_assign_reveal_identities || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Reveal the identities for a blind marking assignment || MDL-37148&lt;br /&gt;
|-&lt;br /&gt;
|mod_book&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_book_view_book || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50013&lt;br /&gt;
|-&lt;br /&gt;
|mod_book&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_book_get_books_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of book instances in a provided set of courses. || MDL-50536 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_get_chats_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of chat instances in a provided set of courses. || MDL-50537 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_view_chat || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_login_user || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Log a user into a chat room in the given chat. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_get_chat_users || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the list of users in the given chat session. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_send_chat_message || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Send a message on the given chat session. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_chat&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_chat_get_chat_latest_messages || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the latest messages from the given chat sessio. || MDL-50853 &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_get_choices_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of choice instances in a provided set of courses. || MDL-50132  &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_get_choice_results || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve users results for a given choice. || MDL-50944 &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_get_choice_options || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieve options for a specific choice. || MDL-50944 &lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_submit_choice_response || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Submit responses to a specific choice item. || MDL-50944&lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_view_choice || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status.. || MDL-50944&lt;br /&gt;
|-&lt;br /&gt;
|mod_choice&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_choice_delete_choice_responses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Delete the given submitted responses in a choice. || MDL-50944&lt;br /&gt;
|-&lt;br /&gt;
|mod_data&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_data_get_databases_by_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns a list of database instances in a provided set of courses, if no courses are provided then all the database instances the user has access to will be returned. || MDL-49337&lt;br /&gt;
|-&lt;br /&gt;
|mod_folder&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_folder_view_folder || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50008  &lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forums_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of forum instances in a provided set of courses, if no courses are provided then all the forum instances the user has access to will be returned. || MDL-37247&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forum_discussion_posts() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns a list of forum posts for a discussion. || MDL-30106&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forum_discussions_paginated() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.8 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns a list of forum discussions optionally sorted and paginated. || MDL-46458&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_view_forum() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Trigger the course_module_viewed event when a user view a forum (this web service will be initially used by the mobile app so information can be logged in the Moodle side when a user see the same page in the app). || MDL-49502&lt;br /&gt;
 |-&lt;br /&gt;
|mod_forum&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_view_forum_discussion() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Trigger the discussion_viewed event when a user view a forum discussion (this web service will be initially used by the mobile app so information can be logged in the Moodle side when a user see the same page in the app). || MDL-49503&lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_get_forum_discussions || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of forum discussions in a provided set of forums.  (DEPRECATED use mod_forum_get_forum_discussions_paginated instead)  || MDL-30102&lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_add_discussion || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Add a new discussion into an existing forum. || MDL-50994    &lt;br /&gt;
|-&lt;br /&gt;
|mod_forum&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_forum_add_discussion_post || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Create new posts into an existing discussion. || MDL-50995    &lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_glossaries_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the glossaries in courses || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_view_glossary || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Notify that a glossary was viewed || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_view_entry || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Notify that a glossary entry was viewed || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_letter || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using letter filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_date || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using date filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_categories || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get a glossary&#039;s categories || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_category || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using category filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_authors || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get the authors in a glossary || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_author || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using author filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_author_id || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using author ID filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_search || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries matching a search query || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_by_term || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries using term filtering || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entries_to_approve || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get entries to be approved || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_glossary&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_glossary_get_entry_by_id || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.1 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Get an entry by ID || MDL-50540&lt;br /&gt;
|-&lt;br /&gt;
|mod_imscp&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_imscp_view_imscp || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-50015&lt;br /&gt;
|-&lt;br /&gt;
|mod_imscp&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_imscp_get_imscps_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of imscp instances in a provided set of courses. || MDL-50541   &lt;br /&gt;
|-&lt;br /&gt;
|mod_lti&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_lti_get_ltis_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of lti instances in a provided set of courses. || MDL-50543    &lt;br /&gt;
|-&lt;br /&gt;
|mod_lti&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_lti_view_lti || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-51624 &lt;br /&gt;
|-&lt;br /&gt;
|mod_lti&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_lti_get_tool_launch_data || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return the launch data for a given external tool. || MDL-51615       &lt;br /&gt;
|-&lt;br /&gt;
|mod_page&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_page_view_page || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-49791&lt;br /&gt;
|-&lt;br /&gt;
|mod_resource&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_resource_view_resource || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-49792&lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorms_by_courses || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list of scorm instances in a provided set of courses. || MDL-50349 &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_view_scorm || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status.. || MDL-50427 &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_attempt_count || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Return the number of attempts done by a user in the given SCORM. || MDL-51017&lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_sco_tracks || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieves SCO tracking data for the given user id and attempt number. || MDL-50557 &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_insert_scorm_tracks || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Saves a scorm tracking record. || MDL-50353      &lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_user_data || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Retrieves user tracking and SCO data and default SCORM values. || MDL-50352&lt;br /&gt;
|-&lt;br /&gt;
|mod_scorm&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_scorm_get_scorm_scoes || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns a list containing all the scoes data related to the given scorm id. || MDL-50351&lt;br /&gt;
|-&lt;br /&gt;
|mod_url&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | mod_url_view_url || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Trigger the course module viewed event and update the module completion status. || MDL-49793&lt;br /&gt;
|-&lt;br /&gt;
|course&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_update_courses() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update courses. || MDL-30062&lt;br /&gt;
|-&lt;br /&gt;
|user&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_get_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Search users. - If you want to get multiple users for one specific field, use core_user_get_users_by_field(), it&#039;s designed for this purpose and it should be faster. || MDL-29938&lt;br /&gt;
|-&lt;br /&gt;
|grade&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grade_get_definitions() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns grading definitions for the course module ids and areaname provided as parameters. An optionall activeonly parameter can be provided so that only the active grading method is returned. Will be deprecated and replaced by core_grading_get_definitions in 2.6|| MDL-31681&lt;br /&gt;
|-&lt;br /&gt;
|grade&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grade_get_grades() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns student course total grade and grades for activities. This function does not return category or manual items. This function is suitable for managers or teachers not students.|| MDL-30085&lt;br /&gt;
|-&lt;br /&gt;
|grade&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grade_update_grades() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.7 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update a grade item and associated student grades.|| MDL-30085&lt;br /&gt;
|-&lt;br /&gt;
|grading&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grading_get_definitions() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns grading definitions for the course module ids and areaname provided as parameters. An optionall activeonly parameter can be provided so that only the active grading method is returned.|| MDL-31890&lt;br /&gt;
|-&lt;br /&gt;
|grading&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grading_get_gradingform_instances() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Returns the instances and fillings for the requested definition id. An optional since parameter allows the number of records returned to be reduced so that only those with a timemodified value &amp;gt;= since are returned|| MDL-31890&lt;br /&gt;
|-&lt;br /&gt;
|grading&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_grading_save_definitions() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.8 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Accepts an array of areas as a parameter. The areas contain grading definitions with criteria for inserting and updating|| MDL-31861&lt;br /&gt;
|-&lt;br /&gt;
|comment&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_comment_get_comments() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Return all the comments for an specific component, context. || MDL-49203&lt;br /&gt;
 |-&lt;br /&gt;
|completion&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_get_activities_completion_status() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Return the activities completion status for a user in a course. || MDL-49314&lt;br /&gt;
 |-&lt;br /&gt;
|completion&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_get_course_completion_status() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns course completion status. || MDL-49313&lt;br /&gt;
 |-&lt;br /&gt;
|completion&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_update_activity_completion_status_manually() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Update completion status for the current user in an activity, only for activities with manual tracking. || MDL-49444&lt;br /&gt;
|-&lt;br /&gt;
|completion&lt;br /&gt;
| style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_completion_mark_course_self_completed || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 3.0 || style=&amp;quot;background:#D4FFDF;&amp;quot;  | Update the course completion status for the current user (if course self-completion is enabled). || MDL-50930    &lt;br /&gt;
 |-&lt;br /&gt;
|course&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_view_course() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Log that the course was viewed || MDL-49453&lt;br /&gt;
 |-&lt;br /&gt;
|group&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_group_get_course_user_groups() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns all groups in specified course for the specified user. || MDL-48730&lt;br /&gt;
 |-&lt;br /&gt;
|message&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_get_messages() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.8 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Retrieve a list of messages sent and received by a user (conversations, notifications or both) || MDL-45374&lt;br /&gt;
 |-&lt;br /&gt;
|message&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_mark_message_read() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Mark a single message as read, trigger message_viewed event. || MDL-49501&lt;br /&gt;
 |-&lt;br /&gt;
|notes&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_view_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Simulates the web interface view of notes/index.php: trigger events. || MDL-49504&lt;br /&gt;
 |-&lt;br /&gt;
|rating&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_rating_get_item_ratings() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Retrieve all the ratings for an item. || MDL-49347&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_add_user_device() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.6 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Store mobile user devices information for PUSH Notifications. || MDL-41914&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_remove_user_device() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Remove a user device from the Moodle database. || MDL-48716&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_view_user_list() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Simulates the web-interface view of user/index.php (triggering events). || MDL-49498&lt;br /&gt;
 |-&lt;br /&gt;
|user&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_user_view_user_profile() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Simulates the web-interface view of user/view.php and user/profile.php (triggering events). || MDL-49499&lt;br /&gt;
 |-&lt;br /&gt;
|grade_report&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | gradereport_user_get_grades_table() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Get the user/s report grades table for a course || MDL-49036&lt;br /&gt;
 |-&lt;br /&gt;
|grade_report&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | gradereport_user_view_grade_report() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Trigger the grade_report_viewed event when a user view his grade report (this web service will be initially used by the mobile app so information can be logged in the Moodle side when a user see the same page in the app). || MDL-49500&lt;br /&gt;
 |-&lt;br /&gt;
|message&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_message_get_blocked_users() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Retrieve a list of users blocked || MDL-48719&lt;br /&gt;
 |-&lt;br /&gt;
|course&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_course_delete_modules() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.5 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Deletes all specified module instances || MDL-30098&lt;br /&gt;
 |-&lt;br /&gt;
|notes&lt;br /&gt;
 | style=&amp;quot;background:#D4FFDF;&amp;quot;  | core_notes_get_course_notes() || style=&amp;quot;background:#D4FFDF;&amp;quot;  | || style=&amp;quot;background:#D4FFDF;&amp;quot;  | 2.9 || style=&amp;quot;background:#D4FFDF;&amp;quot;  |Returns all notes in specified course (or site) for the specified user. || MDL-49330&lt;br /&gt;
 |-&lt;br /&gt;
|}&lt;br /&gt;
This is the list of the integrated core functions. To see the roadmap, see to the tracker issue in the section bellow.&lt;br /&gt;
&lt;br /&gt;
=== API Roadmap===&lt;br /&gt;
Tracker issue: MDL-29934&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
* [[Web services API Changes]]&lt;br /&gt;
* [[How to contribute a web service function to core]]&lt;br /&gt;
* [[Web services|Web services developer documentation]]&lt;br /&gt;
* [[:en:Web services|Web services user documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Web Services]]&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.0_release_notes&amp;diff=48943</id>
		<title>Moodle 3.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.0_release_notes&amp;diff=48943"/>
		<updated>2015-11-03T06:56:45Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* For developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: Monday, 16th November 2015&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.0%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.0].&lt;br /&gt;
&lt;br /&gt;
See our [https://docs.moodle.org/30/en/New_features New Features page] for a more user-friendly introduction to Moodle 3.0 with screenshots.&lt;br /&gt;
&lt;br /&gt;
If you are upgrading from previous version, make sure to read the [https://docs.moodle.org/30/en/Upgrading Upgrading] documentation. &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 up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 2.2 or later (if upgrading from earlier versions, you must upgrade to 2.2.11 as a first step)&lt;br /&gt;
* PHP version: minimum PHP 5.4.4 (always use latest PHP 5.4.x or 5.5.x on Windows - http://windows.php.net/download/), PHP 7 is NOT supported&lt;br /&gt;
* Ghostscript should be installed for pdf annotation.&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.1&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 5.5.31&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;
| 2008&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;
| 10.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;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.google.com/intl/en_au/chrome/browser/ Google Chrome]&lt;br /&gt;
| 30.0&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mozilla.org/en-US/ Mozilla Firefox]&lt;br /&gt;
| 25.0&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.apple.com/safari/ Apple Safari]&lt;br /&gt;
| 6&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://windows.microsoft.com/en-AU/internet-explorer/download-ie Microsoft Internet Explorer]&lt;br /&gt;
| 9&lt;br /&gt;
| Latest&lt;br /&gt;
| Version 10 is required for drag-and-drop upload of content from outside the browser into Moodle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
===Highlights===&lt;br /&gt;
&lt;br /&gt;
* MDL-29801 - Allow users to delete personal messages&lt;br /&gt;
* MDL-27177 - Allow students to see each other&#039;s contact details in full profile without global permission if they are able to see each other&#039;s course profile&lt;br /&gt;
* MDL-46455 - Re-introduce backup/restore functionality with new logging system&lt;br /&gt;
* MDL-46878 - Reset Dashboard for all users after changing the default dashboard&lt;br /&gt;
&lt;br /&gt;
===Quiz===&lt;br /&gt;
&lt;br /&gt;
* MDL-47494 - New question types from the OU - [https://docs.moodle.org/30/en/Select_missing_words_question_type Select missing words], [https://docs.moodle.org/30/en/Drag_and_drop_into_text_question_type Drag and drop into text], [https://docs.moodle.org/30/en/Drag_and_drop_onto_image_question_type Drag and drop onto image] and [https://docs.moodle.org/30/en/Drag_and_drop_markers_question_type Drag and drop markers]&lt;br /&gt;
* MDL-38214 - Add MCS, MCVS, MCHS Cloze subquestion types&lt;br /&gt;
* MDL-50127 - By default the list of question types should be sorted with common ones at the top&lt;br /&gt;
* MDL-29771 - Interactive behaviour should show number of tries left in the Try again state&lt;br /&gt;
&lt;br /&gt;
===Forum===&lt;br /&gt;
&lt;br /&gt;
* MDL-49682 - Make forum email template editable&lt;br /&gt;
* MDL-46321 - Uninformative error when moving forum without first selecting destination&lt;br /&gt;
* MDL-50993 - Timed discussions are now displayed to students in a logical order&lt;br /&gt;
* MDL-50430 - Add number of subscribers to forum subscriber list&lt;br /&gt;
&lt;br /&gt;
===Assignment===&lt;br /&gt;
&lt;br /&gt;
* MDL-49176 - Assigment marking guide &#039;flattens&#039; instructions for markers and students&lt;br /&gt;
* MDL-49515 - Upgrade FPDI library in assignfeedback_editpdf to 1.5.4 to fix problems with PDF annotator on some files&lt;br /&gt;
* MDL-50283 - Improve Rubric interface to include the ability to duplicate rows&lt;br /&gt;
&lt;br /&gt;
===Other activity modules===&lt;br /&gt;
&lt;br /&gt;
* MDL-49028 - Wiki: Option to delete pages during course reset&lt;br /&gt;
* MDL-40836 - File resource: New [https://docs.moodle.org/30/en/File_resource_settings file resource setting] option to display upload/modified date&lt;br /&gt;
* MDL-26501 - Glossary: Do not allow to browse by author if author is never displayed&lt;br /&gt;
* MDL-50673 - Workshop: display all participants on &amp;quot;Submisstion phase&amp;quot; page in a table&lt;br /&gt;
* MDL-50664 - Database: add setting to disallow managing of own entries after approval&lt;br /&gt;
* MDL-50658 - LTI: Add support for LTI Memberships service&lt;br /&gt;
* MDL-49581 - Lesson: Remove high scores list feature&lt;br /&gt;
* MDL-49882 - Lesson: Essay questions are not imported into the lesson Module&lt;br /&gt;
* MDL-50720 - Database: Highlight database entries that are not yet approved.&lt;br /&gt;
&lt;br /&gt;
===User interface and usability improvements===&lt;br /&gt;
&lt;br /&gt;
* MDL-51051 - Rename &#039;Categories and items&#039; to &#039;Gradebook setup&#039; and add link&lt;br /&gt;
* MDL-51250 - Show default section name when editing section details with default checkbox being checked&lt;br /&gt;
* MDL-49984 - Add visual blocks outlines to My profile page to help separate information&lt;br /&gt;
* MDL-48947 - Collect all course section editing buttons under one &amp;quot;Edit&amp;quot; dropdown&lt;br /&gt;
* MDL-51087 - Use client-side validation in the signup form&lt;br /&gt;
* MDL-50113 - Improve display of long user and course names in Messaging&lt;br /&gt;
* MDL-50919 - Simplify the Manage tags page, allow to quickly change name, flag and official status of the tags&lt;br /&gt;
* MDL-51013 - Navbar button should appear for smaller screens only when the custom menu or language menu is not empty&lt;br /&gt;
* MDL-51260 - Use the new autocomplete form field for tags&lt;br /&gt;
* MDL-51296 - Add title to page when adding blog post&lt;br /&gt;
* MDL-38763 - Permission override UI should use JS confirmation&lt;br /&gt;
* MDL-29763 - Add description to Portfolio settings page&lt;br /&gt;
&lt;br /&gt;
===Atto editor===&lt;br /&gt;
&lt;br /&gt;
* MDL-45515 - New table editing features in Atto editor&lt;br /&gt;
* MDL-49732 - Keyboard interaction for hyperlink in Atto (Ctrl+K)&lt;br /&gt;
* MDL-50936 - More Atto Math Equation buttons (sum, sqrt, int, etc.)&lt;br /&gt;
* MDL-50142 - Text editor preferences help pop-up&lt;br /&gt;
&lt;br /&gt;
===Enrolments===&lt;br /&gt;
&lt;br /&gt;
* MDL-30674 - Set guest access key from enrolment methods page&lt;br /&gt;
* MDL-30157 - Allow users to start manual enrolments right now&lt;br /&gt;
* MDL-49746 - Allow to sort enrolled users page by last course access&lt;br /&gt;
* MDL-48074 - Group filter in enrolments list should have option &amp;quot;not in any group&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Administration===&lt;br /&gt;
&lt;br /&gt;
* MDL-49329 - Multiple improvements in the plugins installation/update system including ability to install several plugins at the same time&lt;br /&gt;
* MDL-49280 - New configuration setting to allow duplicate email addresses&lt;br /&gt;
* MDL-51330 - Show scheduled tasks component in the cron log&lt;br /&gt;
* MDL-51261 - Upgrade key - mechanism to protect anonymous web access to upgrade screens&lt;br /&gt;
* MDL-50602 - New settings in [https://docs.moodle.org/30/en/Automated_course_backup Automated backup setup] for deleting older backups and keeping a minimum number of backups&lt;br /&gt;
* MDL-48438 - Add real name to email about login failures&lt;br /&gt;
* MDL-30960 - New option in email settings to specify SSL or TLS (SMTPSecure property of PHPMailer)&lt;br /&gt;
* MDL-46623, MDL-51824 - CAS and LDAP: Replace CLI script to synchronise users with a scheduled tasks&lt;br /&gt;
* MDL-39319 - Allow administrator to uninstall several languages in one single action&lt;br /&gt;
* MDL-50155 - Move and rename &amp;quot;Common activities settings&amp;quot; link to be under &amp;quot;Manage activities&amp;quot; for consistency&lt;br /&gt;
* MDL-50631 - Display Moodle ASCII logo in CLI installer&lt;br /&gt;
* MDL-46167 - New option for CLI installation: skip database&lt;br /&gt;
* MDL-50572 - Disable Youtube repository by default since it requires setting up&lt;br /&gt;
* MDL-51739 - Lock theme selector UI when $CFG-&amp;gt;theme is hardcoded in config.php&lt;br /&gt;
* MDL-51478 - Enable Mobile services by default&lt;br /&gt;
* MDL-19748 - Do not allow to edit tags in the default authenticated user role&lt;br /&gt;
* MDL-46398 - Make HTML5 video the default player for capable videos&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
&lt;br /&gt;
* MDL-51132 - Introduce course tagging as a replacement for user-course-tagging in the &amp;quot;Tags&amp;quot; block. See [https://docs.moodle.org/30/en/Tags_block#Course_tagging_changes_in_Moodle_3.0 upgrade documentation]&lt;br /&gt;
* MDL-41042 - Course contacts shown in course listings no longer lag by an hour&lt;br /&gt;
* MDL-44273 - Back-off strategy for RSS feeds &lt;br /&gt;
* MDL-45981 - CAS Auth Config needs way to specify that curl should use SSLv3.&lt;br /&gt;
* MDL-49891 - Add description meta to frontpage&lt;br /&gt;
* MDL-25451 - Go straight to &amp;quot;Permissions&amp;quot; from block context menu instead of &amp;quot;Assign roles&amp;quot; if theya are not available&lt;br /&gt;
* MDL-50647 - Add &#039;not in group&#039; section to group overview page&lt;br /&gt;
* MDL-50956 - Allow main menu block to be displayed &amp;quot;throughout the entire site&amp;quot;&lt;br /&gt;
* MDL-28954 - Allow images and embedded files in the cohort descriptions&lt;br /&gt;
* MDL-50371 - Use $CFG-&amp;gt;gradepointdefault for new manual gradeitems and grade categories&lt;br /&gt;
&lt;br /&gt;
==Security issues==&lt;br /&gt;
&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;
==For developers==&lt;br /&gt;
&lt;br /&gt;
* MDL-46455 - Events must define fields mappings in order to be correctly restored ([https://docs.moodle.org/dev/Event_2#Backup.2Frestore documentation])&lt;br /&gt;
* MDL-50125 - Allow all plugins to inject links in the preferences page ([https://docs.moodle.org/dev/Navigation_API#Course_settings documentation])&lt;br /&gt;
* MDL-51247 - Revive / refresh / rebuild the autocomplete mform element.&lt;br /&gt;
* MDL-50839 - Allow themes to set User menu avatar size ([https://docs.moodle.org/dev/Customising_the_theme_user_menu documentation])&lt;br /&gt;
* MDL-48494 - Make $plugin-&amp;gt;component required for all plugins&lt;br /&gt;
* MDL-43896 - Drop support for $module in version.php files for Moodle 3.0&lt;br /&gt;
* MDL-50645 - Cache the list of available callbacks per plugin&lt;br /&gt;
* MDL-33564 - rss_error() should return a proper HTTP response code&lt;br /&gt;
* MDL-37864 - New method to add help icons to the sortable table headers ([https://docs.moodle.org/dev/lib/tablelib.php documentation])&lt;br /&gt;
* MDL-51737 - Add ability to detect MS Edge in our browser sniffing code&lt;br /&gt;
* MDL-51213 - external_format_text should be safe to call from web or webservice ([https://docs.moodle.org/dev/How_to_contribute_a_web_service_function_to_core documentation])&lt;br /&gt;
* MDL-51413 - Add an additional return field in get_forums_by_courses in order to specify if the current user can create discussions&lt;br /&gt;
* MDL-51217 - Using recaptcha is not possible outside auth_email plugin.&lt;br /&gt;
* MDL-51107 - Add a callback to inject nodes in the category settings navigation ([https://docs.moodle.org/dev/Navigation_API#Category_settings documentation])&lt;br /&gt;
* MDL-50891 - is_web_crawler should be moved to useragent class&lt;br /&gt;
* MDL-50453 - Replace reserved word usage from \core\progress\null (PHP7)&lt;br /&gt;
* MDL-50009 - Prevent scheduled tasks from leaving unfinished db transactions&lt;br /&gt;
* MDL-49821 - Some Web Services miss checks for guest and deleted users&lt;br /&gt;
* MDL-50926 - Upgrade to phpunit 4.x&lt;br /&gt;
* MDL-50491 - New format_text option to exclude particular filters&lt;br /&gt;
* MDL-50783 - Allow some ajax external functions to be called without a session&lt;br /&gt;
* MDL-50150 - Add &amp;quot;Blocks&amp;quot; feature to JS and PHP mustache engines ([https://docs.moodle.org/dev/Templates#Blocks_.28Moodle_3.0_onwards.29 documentation])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.0]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 3.0]]&lt;br /&gt;
[[es:Notas de Moodle 3.0]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_3.0_release_notes&amp;diff=48942</id>
		<title>Moodle 3.0 release notes</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Moodle_3.0_release_notes&amp;diff=48942"/>
		<updated>2015-11-03T06:56:26Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* For developers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
[[Releases]] &amp;gt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Release date: Monday, 16th November 2015&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.0%22%29+ORDER+BY+priority+DESC&amp;amp;runQuery=true&amp;amp;clear=true the full list of fixed issues in 3.0].&lt;br /&gt;
&lt;br /&gt;
See our [https://docs.moodle.org/30/en/New_features New Features page] for a more user-friendly introduction to Moodle 3.0 with screenshots.&lt;br /&gt;
&lt;br /&gt;
If you are upgrading from previous version, make sure to read the [https://docs.moodle.org/30/en/Upgrading Upgrading] documentation. &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 up-to-date.&lt;br /&gt;
&lt;br /&gt;
* Moodle upgrade:  Moodle 2.2 or later (if upgrading from earlier versions, you must upgrade to 2.2.11 as a first step)&lt;br /&gt;
* PHP version: minimum PHP 5.4.4 (always use latest PHP 5.4.x or 5.5.x on Windows - http://windows.php.net/download/), PHP 7 is NOT supported&lt;br /&gt;
* Ghostscript should be installed for pdf annotation.&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.1&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mysql.com/ MySQL]&lt;br /&gt;
| 5.5.31&lt;br /&gt;
| Latest&lt;br /&gt;
|-&lt;br /&gt;
| [https://mariadb.org/ MariaDB]&lt;br /&gt;
| 5.5.31&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;
| 2008&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;
| 10.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;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Browser&lt;br /&gt;
! Minimum version&lt;br /&gt;
! Recommended version&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.google.com/intl/en_au/chrome/browser/ Google Chrome]&lt;br /&gt;
| 30.0&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mozilla.org/en-US/ Mozilla Firefox]&lt;br /&gt;
| 25.0&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.apple.com/safari/ Apple Safari]&lt;br /&gt;
| 6&lt;br /&gt;
| Latest&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [http://windows.microsoft.com/en-AU/internet-explorer/download-ie Microsoft Internet Explorer]&lt;br /&gt;
| 9&lt;br /&gt;
| Latest&lt;br /&gt;
| Version 10 is required for drag-and-drop upload of content from outside the browser into Moodle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Major features==&lt;br /&gt;
&lt;br /&gt;
===Highlights===&lt;br /&gt;
&lt;br /&gt;
* MDL-29801 - Allow users to delete personal messages&lt;br /&gt;
* MDL-27177 - Allow students to see each other&#039;s contact details in full profile without global permission if they are able to see each other&#039;s course profile&lt;br /&gt;
* MDL-46455 - Re-introduce backup/restore functionality with new logging system&lt;br /&gt;
* MDL-46878 - Reset Dashboard for all users after changing the default dashboard&lt;br /&gt;
&lt;br /&gt;
===Quiz===&lt;br /&gt;
&lt;br /&gt;
* MDL-47494 - New question types from the OU - [https://docs.moodle.org/30/en/Select_missing_words_question_type Select missing words], [https://docs.moodle.org/30/en/Drag_and_drop_into_text_question_type Drag and drop into text], [https://docs.moodle.org/30/en/Drag_and_drop_onto_image_question_type Drag and drop onto image] and [https://docs.moodle.org/30/en/Drag_and_drop_markers_question_type Drag and drop markers]&lt;br /&gt;
* MDL-38214 - Add MCS, MCVS, MCHS Cloze subquestion types&lt;br /&gt;
* MDL-50127 - By default the list of question types should be sorted with common ones at the top&lt;br /&gt;
* MDL-29771 - Interactive behaviour should show number of tries left in the Try again state&lt;br /&gt;
&lt;br /&gt;
===Forum===&lt;br /&gt;
&lt;br /&gt;
* MDL-49682 - Make forum email template editable&lt;br /&gt;
* MDL-46321 - Uninformative error when moving forum without first selecting destination&lt;br /&gt;
* MDL-50993 - Timed discussions are now displayed to students in a logical order&lt;br /&gt;
* MDL-50430 - Add number of subscribers to forum subscriber list&lt;br /&gt;
&lt;br /&gt;
===Assignment===&lt;br /&gt;
&lt;br /&gt;
* MDL-49176 - Assigment marking guide &#039;flattens&#039; instructions for markers and students&lt;br /&gt;
* MDL-49515 - Upgrade FPDI library in assignfeedback_editpdf to 1.5.4 to fix problems with PDF annotator on some files&lt;br /&gt;
* MDL-50283 - Improve Rubric interface to include the ability to duplicate rows&lt;br /&gt;
&lt;br /&gt;
===Other activity modules===&lt;br /&gt;
&lt;br /&gt;
* MDL-49028 - Wiki: Option to delete pages during course reset&lt;br /&gt;
* MDL-40836 - File resource: New [https://docs.moodle.org/30/en/File_resource_settings file resource setting] option to display upload/modified date&lt;br /&gt;
* MDL-26501 - Glossary: Do not allow to browse by author if author is never displayed&lt;br /&gt;
* MDL-50673 - Workshop: display all participants on &amp;quot;Submisstion phase&amp;quot; page in a table&lt;br /&gt;
* MDL-50664 - Database: add setting to disallow managing of own entries after approval&lt;br /&gt;
* MDL-50658 - LTI: Add support for LTI Memberships service&lt;br /&gt;
* MDL-49581 - Lesson: Remove high scores list feature&lt;br /&gt;
* MDL-49882 - Lesson: Essay questions are not imported into the lesson Module&lt;br /&gt;
* MDL-50720 - Database: Highlight database entries that are not yet approved.&lt;br /&gt;
&lt;br /&gt;
===User interface and usability improvements===&lt;br /&gt;
&lt;br /&gt;
* MDL-51051 - Rename &#039;Categories and items&#039; to &#039;Gradebook setup&#039; and add link&lt;br /&gt;
* MDL-51250 - Show default section name when editing section details with default checkbox being checked&lt;br /&gt;
* MDL-49984 - Add visual blocks outlines to My profile page to help separate information&lt;br /&gt;
* MDL-48947 - Collect all course section editing buttons under one &amp;quot;Edit&amp;quot; dropdown&lt;br /&gt;
* MDL-51087 - Use client-side validation in the signup form&lt;br /&gt;
* MDL-50113 - Improve display of long user and course names in Messaging&lt;br /&gt;
* MDL-50919 - Simplify the Manage tags page, allow to quickly change name, flag and official status of the tags&lt;br /&gt;
* MDL-51013 - Navbar button should appear for smaller screens only when the custom menu or language menu is not empty&lt;br /&gt;
* MDL-51260 - Use the new autocomplete form field for tags&lt;br /&gt;
* MDL-51296 - Add title to page when adding blog post&lt;br /&gt;
* MDL-38763 - Permission override UI should use JS confirmation&lt;br /&gt;
* MDL-29763 - Add description to Portfolio settings page&lt;br /&gt;
&lt;br /&gt;
===Atto editor===&lt;br /&gt;
&lt;br /&gt;
* MDL-45515 - New table editing features in Atto editor&lt;br /&gt;
* MDL-49732 - Keyboard interaction for hyperlink in Atto (Ctrl+K)&lt;br /&gt;
* MDL-50936 - More Atto Math Equation buttons (sum, sqrt, int, etc.)&lt;br /&gt;
* MDL-50142 - Text editor preferences help pop-up&lt;br /&gt;
&lt;br /&gt;
===Enrolments===&lt;br /&gt;
&lt;br /&gt;
* MDL-30674 - Set guest access key from enrolment methods page&lt;br /&gt;
* MDL-30157 - Allow users to start manual enrolments right now&lt;br /&gt;
* MDL-49746 - Allow to sort enrolled users page by last course access&lt;br /&gt;
* MDL-48074 - Group filter in enrolments list should have option &amp;quot;not in any group&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Administration===&lt;br /&gt;
&lt;br /&gt;
* MDL-49329 - Multiple improvements in the plugins installation/update system including ability to install several plugins at the same time&lt;br /&gt;
* MDL-49280 - New configuration setting to allow duplicate email addresses&lt;br /&gt;
* MDL-51330 - Show scheduled tasks component in the cron log&lt;br /&gt;
* MDL-51261 - Upgrade key - mechanism to protect anonymous web access to upgrade screens&lt;br /&gt;
* MDL-50602 - New settings in [https://docs.moodle.org/30/en/Automated_course_backup Automated backup setup] for deleting older backups and keeping a minimum number of backups&lt;br /&gt;
* MDL-48438 - Add real name to email about login failures&lt;br /&gt;
* MDL-30960 - New option in email settings to specify SSL or TLS (SMTPSecure property of PHPMailer)&lt;br /&gt;
* MDL-46623, MDL-51824 - CAS and LDAP: Replace CLI script to synchronise users with a scheduled tasks&lt;br /&gt;
* MDL-39319 - Allow administrator to uninstall several languages in one single action&lt;br /&gt;
* MDL-50155 - Move and rename &amp;quot;Common activities settings&amp;quot; link to be under &amp;quot;Manage activities&amp;quot; for consistency&lt;br /&gt;
* MDL-50631 - Display Moodle ASCII logo in CLI installer&lt;br /&gt;
* MDL-46167 - New option for CLI installation: skip database&lt;br /&gt;
* MDL-50572 - Disable Youtube repository by default since it requires setting up&lt;br /&gt;
* MDL-51739 - Lock theme selector UI when $CFG-&amp;gt;theme is hardcoded in config.php&lt;br /&gt;
* MDL-51478 - Enable Mobile services by default&lt;br /&gt;
* MDL-19748 - Do not allow to edit tags in the default authenticated user role&lt;br /&gt;
* MDL-46398 - Make HTML5 video the default player for capable videos&lt;br /&gt;
&lt;br /&gt;
===Other improvements===&lt;br /&gt;
&lt;br /&gt;
* MDL-51132 - Introduce course tagging as a replacement for user-course-tagging in the &amp;quot;Tags&amp;quot; block. See [https://docs.moodle.org/30/en/Tags_block#Course_tagging_changes_in_Moodle_3.0 upgrade documentation]&lt;br /&gt;
* MDL-41042 - Course contacts shown in course listings no longer lag by an hour&lt;br /&gt;
* MDL-44273 - Back-off strategy for RSS feeds &lt;br /&gt;
* MDL-45981 - CAS Auth Config needs way to specify that curl should use SSLv3.&lt;br /&gt;
* MDL-49891 - Add description meta to frontpage&lt;br /&gt;
* MDL-25451 - Go straight to &amp;quot;Permissions&amp;quot; from block context menu instead of &amp;quot;Assign roles&amp;quot; if theya are not available&lt;br /&gt;
* MDL-50647 - Add &#039;not in group&#039; section to group overview page&lt;br /&gt;
* MDL-50956 - Allow main menu block to be displayed &amp;quot;throughout the entire site&amp;quot;&lt;br /&gt;
* MDL-28954 - Allow images and embedded files in the cohort descriptions&lt;br /&gt;
* MDL-50371 - Use $CFG-&amp;gt;gradepointdefault for new manual gradeitems and grade categories&lt;br /&gt;
&lt;br /&gt;
==Security issues==&lt;br /&gt;
&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;
==For developers==&lt;br /&gt;
&lt;br /&gt;
* MDL-46455 - Events must define fields mappings in order to be correctly restored ([https://docs.moodle.org/dev/Event_2#Backup.2Frestore documentation])&lt;br /&gt;
* MDL-50125 - Allow all plugins to inject links in the preferences page ([https://docs.moodle.org/dev/Navigation_API#Course_settings documention])&lt;br /&gt;
* MDL-51247 - Revive / refresh / rebuild the autocomplete mform element.&lt;br /&gt;
* MDL-50839 - Allow themes to set User menu avatar size ([https://docs.moodle.org/dev/Customising_the_theme_user_menu documentation])&lt;br /&gt;
* MDL-48494 - Make $plugin-&amp;gt;component required for all plugins&lt;br /&gt;
* MDL-43896 - Drop support for $module in version.php files for Moodle 3.0&lt;br /&gt;
* MDL-50645 - Cache the list of available callbacks per plugin&lt;br /&gt;
* MDL-33564 - rss_error() should return a proper HTTP response code&lt;br /&gt;
* MDL-37864 - New method to add help icons to the sortable table headers ([https://docs.moodle.org/dev/lib/tablelib.php documentation])&lt;br /&gt;
* MDL-51737 - Add ability to detect MS Edge in our browser sniffing code&lt;br /&gt;
* MDL-51213 - external_format_text should be safe to call from web or webservice ([https://docs.moodle.org/dev/How_to_contribute_a_web_service_function_to_core documentation])&lt;br /&gt;
* MDL-51413 - Add an additional return field in get_forums_by_courses in order to specify if the current user can create discussions&lt;br /&gt;
* MDL-51217 - Using recaptcha is not possible outside auth_email plugin.&lt;br /&gt;
* MDL-51107 - Add a callback to inject nodes in the category settings navigation ([https://docs.moodle.org/dev/Navigation_API#Category_settings documention])&lt;br /&gt;
* MDL-50891 - is_web_crawler should be moved to useragent class&lt;br /&gt;
* MDL-50453 - Replace reserved word usage from \core\progress\null (PHP7)&lt;br /&gt;
* MDL-50009 - Prevent scheduled tasks from leaving unfinished db transactions&lt;br /&gt;
* MDL-49821 - Some Web Services miss checks for guest and deleted users&lt;br /&gt;
* MDL-50926 - Upgrade to phpunit 4.x&lt;br /&gt;
* MDL-50491 - New format_text option to exclude particular filters&lt;br /&gt;
* MDL-50783 - Allow some ajax external functions to be called without a session&lt;br /&gt;
* MDL-50150 - Add &amp;quot;Blocks&amp;quot; feature to JS and PHP mustache engines ([https://docs.moodle.org/dev/Templates#Blocks_.28Moodle_3.0_onwards.29 documentation])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Release notes]]&lt;br /&gt;
[[Category:Moodle 3.0]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Notes de mise à jour de Moodle 3.0]]&lt;br /&gt;
[[es:Notas de Moodle 3.0]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=48941</id>
		<title>Navigation API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Navigation_API&amp;diff=48941"/>
		<updated>2015-11-03T06:52:12Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Adding settings navigation callback (user, category, course and frontpage)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
The Navigation API allows for the manipulation of the navigation system used in Moodle.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is==&lt;br /&gt;
It&#039;s very important to understand what the navigation is exactly within Moodle. One of the goals for Moodle 2.0 was to standardise navigation throughout Moodle and try to bring order to the structure of a Moodle site.  Navigation is available through the page object &#039;&#039;&#039;$PAGE&#039;&#039;&#039;, against which you set the heading for the page, the title, any JavaScript requirements, etc.  The navigation structure uses the information $PAGE contains to generate a navigation structure for the site.  The navigation or settings [[blocks]] are interpretations of the navigation structure Moodle creates.&lt;br /&gt;
&lt;br /&gt;
This navigation structure is available through three variables:&lt;br /&gt;
&lt;br /&gt;
; $PAGE-&amp;gt;navigation : This is the main navigation structure, it will contain items that will allow the user to browse to the other available pages.&lt;br /&gt;
; $PAGE-&amp;gt;settingsnav : This is the settings navigation structure contains items that will allow the user to edit settings.&lt;br /&gt;
; $PAGE-&amp;gt;navbar : The navbar is a special structure for page breadcrumbs.&lt;br /&gt;
&lt;br /&gt;
==What the navigation is not==&lt;br /&gt;
The navigation is &#039;&#039;&#039;NOT&#039;&#039;&#039; the navigation block or the settings block!  These two blocks were created to display the navigation structure. The navigation block looks at &#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;, and the settings block looks at &#039;&#039;$PAGE-&amp;gt;settingsnav&#039;&#039;.  Both blocks interpret their data into an HTML structure and render it.&lt;br /&gt;
&lt;br /&gt;
# The navigation is a back-end structure that is built behind the scenes and has no immediate method of display.&lt;br /&gt;
# The navigation and settings blocks display the back-end navigation structure but add nothing to it at all.&lt;br /&gt;
::In the [[model-view-controller pattern]], $PAGE-&amp;gt;navigation, $PAGE-&amp;gt;settingsnav, and $PAGE-&amp;gt;navbar are the models, and the blocks are views.&lt;br /&gt;
&lt;br /&gt;
The navbar is just the path to the active navigation or settings item. The navbar is not displayed by a block; instead it is added into the theme&#039;s layout files and displayed by the core renderer. &lt;br /&gt;
&lt;br /&gt;
==How the navigation works==&lt;br /&gt;
&lt;br /&gt;
The main navigation structure can be accessed through &#039;&#039;&#039;$PAGE-&amp;gt;navigation&#039;&#039;&#039;.  The navigation and settings are contextual in that they will relate to the page that the user is viewing. This is determined by other $PAGE object properties:&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;context&#039;&#039;&#039; is a Moodle context that immediately outlines the nature of the page the user is viewing.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;course&#039;&#039;&#039; is the course the user is viewing.  This is essential if the context is CONTEXT_COURSE or greater.  However, it is also useful in other contexts such as CONTEXT_USER.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;cm&#039;&#039;&#039; is the course module instance.  This is essential if the context is CONTEXT_MODULE or greater.&lt;br /&gt;
* &#039;&#039;&#039;$PAGE-&amp;gt;url&#039;&#039;&#039; is used to match the active navigation item. &lt;br /&gt;
&lt;br /&gt;
Nearly every page sets $PAGE-&amp;gt;url through a call to &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; however not many explicitly set the context, course, or cm. When you call &#039;&#039;&#039;require_login&#039;&#039;&#039; with a course or cm it automatically calls the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
if ($cm) {&lt;br /&gt;
    $PAGE-&amp;gt;set_cm($cm, $course); // sets up global $COURSE&lt;br /&gt;
} else {&lt;br /&gt;
    $PAGE-&amp;gt;set_course($course);// sets up global $COURSE&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A page will only be required to explicitly set a context, course, or cm under one of these conditions:&lt;br /&gt;
# &#039;&#039;&#039;require_login&#039;&#039;&#039; is NOT being called correctly&lt;br /&gt;
# The page is using CONTEXT_SYSTEM, CONTEXT_COURSECAT, or CONTEXT_USER (call &#039;&#039;&#039;$PAGE-&amp;gt;set_context&#039;&#039;&#039; ).&lt;br /&gt;
# The page is using a course or cm but it is also using one of the above contexts (call &#039;&#039;&#039;$PAGE-&amp;gt;set_course&#039;&#039;&#039; or &#039;&#039;&#039;$PAGE-&amp;gt;set_cm&#039;&#039;&#039; ).&lt;br /&gt;
&lt;br /&gt;
The navigation structure cannot be generated before the $PAGE object is configured. It is only generated when it is first used, either when something tries to access the structure or when code tries to add to it.  The navigation is initialised in a specific order:&lt;br /&gt;
# Main navigation structure&lt;br /&gt;
# Settings navigation&lt;br /&gt;
# Navbar (does not need to be generated because of its simple contents and rendering)&lt;br /&gt;
&lt;br /&gt;
==Extending the navigation==&lt;br /&gt;
&lt;br /&gt;
===Code extension===&lt;br /&gt;
This method of extending is when the code arbitrarily extends the navigation during its execution. Extending the navigation through this means allows you to extend the navigation anywhere easily, however it will only be shown on pages where your extending code gets called (you should probably put it in a function within lib.php).&lt;br /&gt;
&lt;br /&gt;
These examples are taken from the [http://moodle.org/mod/forum/discuss.php?d=152391 General Developer Forum: Moodle 2 - how to set up breadcrumbs for a module page]. It has further information that is well worth reading.&lt;br /&gt;
====Navigation====&lt;br /&gt;
This is extending the main navigation structure.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$previewnode = $PAGE-&amp;gt;navigation-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $previewnode-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above lines of code adds a preview node to the bottom of the navigation and then adds a thingnode to the previewnode (adding a leaf to our tree).&lt;br /&gt;
The final line of code makes the thingnode active so that the navbar finds it however if the URL you give it is the same as the url you set for the page it will automatically be marked active and you won&#039;t need this call.&lt;br /&gt;
&lt;br /&gt;
Next extending the navigation for the course.&lt;br /&gt;
For this you will need to know the course id and have called require_login($courseorid); so that the navigation is loaded for the course.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$coursenode = $PAGE-&amp;gt;navigation-&amp;gt;find($courseid, navigation_node::TYPE_COURSE);&lt;br /&gt;
$thingnode = $coursenode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The new bit of code here really is the first line which simply finds the course node, to do this we give it the course id and the node type in this case TYPE_COURSE.&lt;br /&gt;
What we are doing here is relying on the navigation to generate the navigation up to the course and then just adding to the course.&lt;br /&gt;
&lt;br /&gt;
Note that Moodle loads plugins in alphabetical order. Therefore plugin_b can find a node added by plugin_a but not the other way around.&lt;br /&gt;
====Settings navigation====&lt;br /&gt;
Adding to the settings navigation is very similar to navigation&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$settingnode = $PAGE-&amp;gt;settingsnav-&amp;gt;add(get_string(&#039;setting&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;), navigation_node::TYPE_CONTAINER);&lt;br /&gt;
$thingnode = $settingnode-&amp;gt;add(get_string(&#039;Name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$thingnode-&amp;gt;make_active();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Add Settings folder to navigation====&lt;br /&gt;
&lt;br /&gt;
An example of a settings folder in a module can be see by navigating to Site administration / Plugins / Activity modules / Assignment. &lt;br /&gt;
&lt;br /&gt;
[[File:assignmentmenu.png]]&lt;br /&gt;
&lt;br /&gt;
An example of adding a navigation folder to a settings.php for a block with a link to the settings page and a external page is bellow.&lt;br /&gt;
&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;
// Create folder / submenu in block menu, modsettings for activity modules, localplugins for Local plugins. &lt;br /&gt;
// The default folders are defined in admin/settings/plugins.php.&lt;br /&gt;
$ADMIN-&amp;gt;add(&#039;blocksettings&#039;, new admin_category(&#039;blocksamplefolder&#039;,&lt;br /&gt;
        get_string(&#039;pluginname&#039;, &#039;mod_sample&#039;)));&lt;br /&gt;
&lt;br /&gt;
// Create settings block.&lt;br /&gt;
$settings = new admin_settingpage($section, get_string(&#039;settings&#039;, &#039;block_sample&#039;));&lt;br /&gt;
if ($ADMIN-&amp;gt;fulltree) {&lt;br /&gt;
    $settings-&amp;gt;add(new admin_setting_configcheckbox(&#039;block_sample_checkbox&#039;, get_string(&#039;checkbox&#039;, &#039;block_sample&#039;),&lt;br /&gt;
        get_string(&#039;checkboxdescription&#039;, &#039;block_kronoshtml&#039;), 0));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// This adds the settings link to the folder/submenu.&lt;br /&gt;
$ADMIN-&amp;gt;add(&#039;blocksamplefolder&#039;, $settings);&lt;br /&gt;
// This adds a link to an external page.&lt;br /&gt;
$ADMIN-&amp;gt;add(&#039;blocksamplefolder&#039;, new admin_externalpage(&#039;block_sample_page&#039;, get_string(&#039;externalpage&#039;, &#039;block_sample&#039;),&lt;br /&gt;
        $CFG-&amp;gt;wwwroot.&#039;/blocks/sample/sample.php&#039;));&lt;br /&gt;
// Prevent Moodle from adding settings block in standard location.&lt;br /&gt;
$settings = null;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Navbar====&lt;br /&gt;
This is extending the settings navigation.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;ignore_active();&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;preview&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
$PAGE-&amp;gt;navbar-&amp;gt;add(get_string(&#039;name of thing&#039;), new moodle_url(&#039;/a/link/if/you/want/one.php&#039;));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
The above code tells the navbar to ignore what ever the active page was and just use what you add, at which point we add two items as shown.&lt;br /&gt;
===Plugin Callbacks===&lt;br /&gt;
These are specific functions that the navigation looks for and calls if they exist for the plugin, presently only three plugin types can extend the navigation through these call-backs.&lt;br /&gt;
&lt;br /&gt;
Ideally all entries in &amp;quot;Administration / Site administration&amp;quot; tree should be done via settings.php files but sometimes it may be easier to directly modify the navigation structure created from the admin settings tree (such as when adding links to external pages).&lt;br /&gt;
&lt;br /&gt;
====Module====&lt;br /&gt;
Modules have two call-back methods, first to extend the navigation, and second to extend the settings. These call-backs get called when ever the user is viewing a page within the module and should only extend the navigation for the module.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function {modulename}_extend_navigation(${modulename}node, $course, $module, $cm)&lt;br /&gt;
function {modulename}_extend_settings_navigation($settings, ${modulename}node)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Course Formats====&lt;br /&gt;
Course formats are able to completely redefine the way in which navigation is generated for a course, as well as this they also have several methods to ensure the navigation is generated correctly.&lt;br /&gt;
&lt;br /&gt;
====Course Reports====&lt;br /&gt;
By default reports don&#039;t add themselves or anything else to the navigation however there is a call-back that can be implemented to allow them to do so.&lt;br /&gt;
&lt;br /&gt;
====Local Plugins====&lt;br /&gt;
{{Moodle 2.9}}Local plugins have two call-back methods, first to extend the navigation, and second to extend the settings.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function local_{pluginname}_extend_navigation(global_navigation $nav)&lt;br /&gt;
function local_{pluginname}_extend_settings_navigation(settings_navigation $nav, context $context)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In versions before Moodle 2.9, the supported callbacks have &amp;lt;tt&amp;gt;_extends_&amp;lt;/tt&amp;gt; (not imperative mood) in their names. This was a consistency bug fixed in MDL-49643.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function local_{pluginname}_extends_navigation(global_navigation $nav)&lt;br /&gt;
function local_{pluginname}_extends_settings_navigation(settings_navigation $nav, context $context)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Course settings====&lt;br /&gt;
{{Moodle 3.0}}&lt;br /&gt;
Any plugin implementing the following callback in lib.php can extend the course settings navigation. Prior to 3.0 only &#039;&#039;reports&#039;&#039; and &#039;&#039;admin tools&#039;&#039; could extend the course settings navigation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function &amp;lt;component&amp;gt;_extend_navigation_course(navigation_node $parentnode, stdClass $course, context_course $context);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====User settings====&lt;br /&gt;
{{Moodle 3.0}}&lt;br /&gt;
Any plugin implementing the following callback in lib.php can extend the user settings navigation. Prior to 3.0 only &#039;&#039;admin tools&#039;&#039; could extend the user settings navigation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function &amp;lt;component&amp;gt;_extend_navigation_user_settings(navigation_node $parentnode, stdClass $user, context_user $context, stdClass $course, context_course $coursecontext);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Category settings====&lt;br /&gt;
{{Moodle 3.0}}&lt;br /&gt;
Any plugin implementing the following callback in lib.php can extend the category settings navigation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function &amp;lt;component&amp;gt;_extend_navigation_category_settings(navigation_node $parentnode, context_coursecat $context);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Frontpage settings====&lt;br /&gt;
{{Moodle 3.0}}&lt;br /&gt;
Any plugin implementing the following callback in lib.php can extend the frontpage settings navigation. Prior to 3.0 only &#039;&#039;admin tools&#039;&#039; could extend the frontpage settings navigation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
function &amp;lt;component&amp;gt;_extend_navigation_frontpage(navigation_node $parentnode, stdClass $course, context_course $context);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==FAQ&#039;s and troubleshooting==&lt;br /&gt;
&#039;&#039;&#039;Q.&#039;&#039;&#039; My page is on the navigation but it doesn&#039;t find it?&lt;br /&gt;
&lt;br /&gt;
The first thing to do here is check the URL you are setting for the page. It should match the URL your page has within the navigation. If it doesn&#039;t you have two options, first change your &#039;&#039;&#039;$PAGE-&amp;gt;set_url&#039;&#039;&#039; call, or second override the URL the navigation is using to find the active node as shown below:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
navigation_node::override_active_url(new moodle_url(&#039;/your/url/here.php&#039;, array(&#039;param&#039;=&amp;gt;&#039;value&#039;)));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
* [https://moodle.org/mod/forum/discuss.php?d=170325&amp;amp;parent=753095 Forum discussion - adding navigation to local plugins]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Template:Moodle_3.0&amp;diff=48940</id>
		<title>Template:Moodle 3.0</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Template:Moodle_3.0&amp;diff=48940"/>
		<updated>2015-11-03T06:51:50Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Creating the template for 3.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;small-info-right&amp;quot;&amp;gt;Moodle &amp;lt;span class=&amp;quot;text-big new&amp;quot;&amp;gt;3.0&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Category:Moodle 3.0]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;This template will categorize articles that include it into [[:Category:Moodle 3.0]].&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48848</id>
		<title>Competency Based Education</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48848"/>
		<updated>2015-10-28T02:40:13Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* Students */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = Framework for competency-based education (CBE) in Moodle&lt;br /&gt;
|state = In Progress&lt;br /&gt;
|tracker = MDL-49458&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=316151&lt;br /&gt;
|assignee = [[User:Damyon Wiese]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
=Framework for competency-based education (CBE) in Moodle=&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
This specification describes our plan to improve support for outcomes-based education in Moodle core. There have been many other attempts to add such systems to Moodle but they all use different data structures and processes and are incompatible. Our aim here is to build basic central structures and APIs to store and manipulate this data, allowing the Moodle community to build innovative custom interfaces on top of it.&lt;br /&gt;
&lt;br /&gt;
This design is based on input from many existing implementations of outcomes/competencies and learning plans including:&lt;br /&gt;
&lt;br /&gt;
* “Outcomes 2” in Joule&lt;br /&gt;
* Totara&lt;br /&gt;
* Referentiel Activity Module (Skills Repository)&lt;br /&gt;
* ELIS&lt;br /&gt;
&lt;br /&gt;
The goal is to implement a system that supports competency based education in a flexible way so that it can be used effectively by the many different target audiences. &lt;br /&gt;
&lt;br /&gt;
The two main concepts are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Competencies&#039;&#039;&#039; - a unit of learning, such as &amp;quot;Can make exceptional beer&amp;quot;. Competencies can be assigned as goals of courses &amp;amp;ldquo;This course will teach you to make exceptional beer&amp;amp;rdquo;, and also to users: &amp;amp;ldquo;Billy can make exceptional beer&amp;amp;rdquo;. &lt;br /&gt;
Competencies can also be hierarchical, so that the competency above might be marked proficient when some combination of sub-competencies has been marked proficient. &lt;br /&gt;
For example : Can make exceptional beer ( Can choose good malt / Can choose good yeasts / Can brew beer in the good temperature / etc..)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Learning plans&#039;&#039;&#039; - a set of competencies that can be assigned to a student (or cohorts of students). Initially, they will all be marked &amp;quot;incomplete&amp;quot;. As students achieve each competency it is marked complete, thereby showing their progress towards finishing all of them. Students achieve competencies either automatically (by successfully completing a course with that competency) or manually (by proving to someone that they are competent via portfolio items etc).&lt;br /&gt;
&lt;br /&gt;
== Competencies ==&lt;br /&gt;
&lt;br /&gt;
A competency is a unit of learning. All competencies belong to a competency framework, and it is likely that a competency framework will be defined by an external body such as an academic standards board.&lt;br /&gt;
&lt;br /&gt;
To create a competency, you first define the framework and then add the competency to it.&lt;br /&gt;
&lt;br /&gt;
Competency frameworks are defined by “Framework Administrators” at the site level, or at a category level. To create and edit competency frameworks, go to “Site administration” -&amp;amp;gt; “Competency Frameworks”, or &amp;quot;Category administration -&amp;amp;gt; Competency frameworks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec21_v2.jpg|frame|center|Manage competency frameworks]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec19_v3.jpg|frame|center|Add new competency framework]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose “Add new competency framework” and create a new competency framework.&lt;br /&gt;
&lt;br /&gt;
The scale defines how a competency is marked as complete. Each competency framework can define which of the standard Moodle scales should be used when marking a competency. In addition, the “default” value from the scale (the one automatically set when a course is completed) can be configured, and the items from the scale that are deemed to be “proficient” can be defined. A &amp;quot;default&amp;quot; value and at least one &amp;quot;proficient&amp;quot; value must be defined.&lt;br /&gt;
&lt;br /&gt;
A competency framework may be available to the entire site - or limited to a course category. &lt;br /&gt;
&lt;br /&gt;
The taxonomy refers to the naming for each level in the framework. Up to 4 levels are supported, and the name for each level can be set from the following list:&lt;br /&gt;
Domain, Competency, Behaviour, Indicator, Outcome, Level, Concept, Value, Practice, Skill, Proficiency&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec02.jpg|frame|center|Configure scale]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to add competencies to the framework. We can import these from a file, or create them from scratch, or import them from Moodle outcomes. When importing competencies, any existing competencies with a matching idnumber will be updated.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec15.jpg|frame|center|Import competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be imported from the following formats:&lt;br /&gt;
&lt;br /&gt;
 (TBD - start with import from CSV).&lt;br /&gt;
&lt;br /&gt;
To see the competencies for a framework, click on the competency framework name.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec06_v2.jpg|frame|center|Manage competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where we can add and edit competencies in a framework. To edit an existing competency, select it in the competencies tree browser and choose “Edit” from the action menu in the selected competency panel.&lt;br /&gt;
&lt;br /&gt;
To add a new competency, first select the competency that should be the “parent” of this competency from the tree of competencies, and then click “Add Indicator” (the name comes from the taxonomy) from the selected competency panel. Competencies can have a maximum of 3 descendants (4 levels). Tags can be used to categorise competencies for easy searching, e.g. year level, subject. Tags used for competencies are kept in a separate “tagcloud” (see https://tracker.moodle.org/browse/MDL-50851).&lt;br /&gt;
&lt;br /&gt;
A competency framework can be duplicated, and there is an admin tool for migrating courses from one framework to another (as long as the idnumbers between the competencies in the frameworks can be matched).&lt;br /&gt;
&lt;br /&gt;
If a competency has sub-competencies, you can configure the completion rule for the competency. The default completion rule is “Completed when all sub-competencies are complete”. For more complex rules - you can use a points based system to say when to complete or recommend a competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec23.jpg|frame|center|Add a competency]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be “related” to other competencies within the same framework. The only effect of this is that the related competencies are listed in the summary of each competency, whenever it is displayed in Moodle. To add a “related” competency to an existing competency, select it from the competency framework and choose “Add related competency” from the action menu.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec03_v2.jpg|frame|center|Relating competencies to each other]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learning plan templates ==&lt;br /&gt;
&lt;br /&gt;
It would be cumbersome to individually add competencies to a large group of students, and it would be awkward if you made a mistake and had to change the competencies for all the students at a later date. To make this manageable, you can create a “Learning plan template” and assign it to many students. An example of a learning plan template could be: “Computer science, Undergraduate” which lists all the required competencies for a first year computer science student, or it could be more fine grained.&lt;br /&gt;
&lt;br /&gt;
Templates are created by a ”Learning Plan Administrator”. Templates can be imported and exported via CSV. Learning plan templates can be created at a course category, or a site level.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec22_v2.jpg|frame|center|Manage Learning Plan Templates]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have created a template, you can add competencies to it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec18.jpg|frame|center|List competencies in a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec00.jpg|frame|center|Add competency to a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding competencies to a template will update all the learning plans based on that template.&lt;br /&gt;
&lt;br /&gt;
== User learning plans ==&lt;br /&gt;
&lt;br /&gt;
A user learning plan is a collection of all the competencies they should achieve, optionally before a certain date.&lt;br /&gt;
&lt;br /&gt;
Any user can create their own learning plan, if they have the capability on their own context.&lt;br /&gt;
&lt;br /&gt;
A “Learning Plan Administrator” can create learning plans for other users. They can create the plans individually though another users profile page, or they can create learning plans in bulk from a learning plan template.&lt;br /&gt;
&lt;br /&gt;
Users learning plans can be in one of 3 states, Draft, Active or Completed. Only someone with the capability tool/lp:planmanage (or tool/lp:planmanageown if it’s their own plan) capability can approve learning plans.&lt;br /&gt;
&lt;br /&gt;
A plan can be manually set to completed, by someone with the capabilities listed above, or it will be set to completed when the due date for the plan expires.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec07.jpg|frame|center|Single users learning plans page]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec16.jpg|frame|center|Bulk create user learning plans]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that sites using enrolment plugins can create a cohort based on the enrolments of a set of courses using the admin tool “Course cohorts”. More detail required here.&lt;br /&gt;
&lt;br /&gt;
Competencies can be added to a users learning plan, or to the template the plan was created from and they will automatically appear in the users learning plan. Competencies that exist in the template cannot be removed from the users learning plan. If a single student requires e.g. exemptions from certain competencies - their learning plan can be &amp;quot;unlinked&amp;quot; from the template. This plan will no longer show up in reports generated from the learning plan template - but can now be freely edited.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec12.jpg|frame|center|User learning plan competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, there can be multiple types of evidence for the same competency. E.g. 2 courses may provide evidence for the same competency and both courses were completed. In this case - both would show as evidence. There can also be multiple examples of &amp;amp;quot;Evidence of prior learning&amp;amp;quot; attached to each competency.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Each competency in the table is colour coded to indicate one of the following:&lt;br /&gt;
&lt;br /&gt;
* brown - competency not met, and no evidence or enrolled courses cover this competency&lt;br /&gt;
* orange - the competency is not met, but there is evidence, or “in-progress” courses that cover this competency&lt;br /&gt;
* green - the competency has been met&lt;br /&gt;
&lt;br /&gt;
If you have the capability tool/lp:planaddevidence you can upload files and urls against a competency in your plan as evidence of prior learning. You can also request that a someone with the capability tool/lp:planmanage reviews the evidence and either rejects or accepts the evidence and changes the status for the competency in the plan.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec25.jpg|frame|center|Provide evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec08.jpg|frame|center|Link evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view all the current requests for review, a new “Learning plans” block can be added to an “approvers” dashboard.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec10.jpg|frame|center|Dashboard Block]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A User with the capability “tool/lp:competencygrade” (at the context of another users plan) can review and approve competency approval requests. A competency approval request is a request for someone to review the evidence that a user has provided against a specific competency and make a decision whether the user has either met or not met the competency. The valid statuses for a review are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There can only be one “review” per competency for each user (if a review is rejected, and then a new request is made, the previous review will be changed from “Rejected” to “Waiting for review”).&lt;br /&gt;
&lt;br /&gt;
Following the link in the Learning Plans dashboard block, the approver goes to a page that lists all the requests waiting to be approved, and from here they can approve or reject each request. They can also leave comments that will be visible to the student, or to any other reviewers.&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a review an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a review, or a review is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
When a completion rule triggers a “recommendation” - the evidence will be added to the competency, and the system will request a “review” of this competency.&lt;br /&gt;
&lt;br /&gt;
TODO Define a new page for assigning roles relative to a user. In totara, there is a “positions” page which does this. This will also be useful for “Mentees”.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec11.jpg|frame|center|Review competency requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If users have the capability to create their own draft learning plans, but not approve them themselves, someone will need to review all the draft learning plan requests and decide whether or not to make them active. This user can be anyone with “tool/lp:planmanage” capability (at the context of each user with a plan to approve) and they can view all the “Learning plans to approve” link in the Learning Plans dashboard block.&lt;br /&gt;
&lt;br /&gt;
A learning plan approval request made by a user with a draft learning plan from their “Manage learning plans page”. Once a request has been made, the valid statuses for a learning plan approval request are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a learning plans approval request an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a learning plan approval request, or a learning plan approval request is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec04.jpg|frame|center|Review Learning Plan Approval Requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Course Competencies ==&lt;br /&gt;
&lt;br /&gt;
Competencies can also be linked to a course. This means that when a student completes a course (see course completion) - all of the linked competencies will be marked as “complete” or “recommended” in any of the students active learning plans and the course will be added as evidence against that competency. If the competency is already “met”, the course will still be added as evidence for that competency. If the competency is only set to “recommend” the course will be added as evidence and a review request will be created.&lt;br /&gt;
&lt;br /&gt;
The competency will be given the default value from the competency scale. You can select multiple competencies and add them all at once.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec17.jpg|frame|center|Course Competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teacher in a course, can manually mark the students against the course competencies. For each competency, the teacher will see all of the evidence linked to that competency for the student. They then can assign a value from the competency scale for the student, and optionally make a comment. A record of the teacher marking this competency will be added to the evidence of completion for this competency and the status of the competency will be updated in all active learning plans for the student.&lt;br /&gt;
&lt;br /&gt;
TODO - see how the information from the coverage report can be shown when linking course competencies.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec14.jpg|frame|center|Grading competencies within a course]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When manually marking a competency, it is recorded as evidence ie: &amp;amp;quot;Teacher X manually specified this value in this course&amp;amp;quot; - so if the same competency is linked to multiple course it can be marked in each, and this will show up as 2 pieces of evidence.&lt;br /&gt;
&lt;br /&gt;
Reports&lt;br /&gt;
&lt;br /&gt;
Students&lt;br /&gt;
&lt;br /&gt;
For an active Learning Plan, students can see a report of the competencies that are covered/not covered by their current list of enrolled courses. For each competency, they should also be able to see which courses they could enrol in to meet that competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec24.jpg|frame|center|Student Learning Plan Competencies page shows progress, and course discovery]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Students can see a list of their active learning plans on their dashboard, with a visual indication of progress (a progress bar). Each learning plan is a link to the learning plan report shown above.&lt;br /&gt;
&lt;br /&gt;
Teachers&lt;br /&gt;
&lt;br /&gt;
For teachers and course designers building a set of courses against a competency framework, they should be able to identify competencies that are over/underrepresented by a set of courses. To do this they access a learning plan template, and view the coverage report for that template. This competency coverage report initially shows the coverage from all courses that link to one of the competencies in the template, but the teacher can remove some courses from the selection and regenerate the report.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec09.jpg|frame|center|Coverage report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers and course designers can also see some statistics about a learning plan template. From the learning plan template page, they choose “Statistics” from the action menu to see the number of active/completed learning plans using this template, and the average completion % for the learning plans.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec13.jpg|frame|center|Statistics for Learning Plan Template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also see a report in a course that shows for each course competency, which users have completed or not completed it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec05.jpg|frame|center|Breakdown report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User roles and capabilities ==&lt;br /&gt;
&lt;br /&gt;
In this system, the actions a user can perform are governed by various capabilities, and are checked at one of several different context levels.&lt;br /&gt;
&lt;br /&gt;
As a reference, the relevant context levels in Moodle are organised in a tree like structure and an example is shown below:&lt;br /&gt;
&lt;br /&gt;
* Site&lt;br /&gt;
** User A&lt;br /&gt;
** User B&lt;br /&gt;
** Category A&lt;br /&gt;
*** Course A&lt;br /&gt;
*** Course B&lt;br /&gt;
** Category B&lt;br /&gt;
*** Category C&lt;br /&gt;
**** Course C&lt;br /&gt;
**** Course D&lt;br /&gt;
&lt;br /&gt;
=== Framework Administrators ===&lt;br /&gt;
&lt;br /&gt;
Competency framework administrators are the central people responsible for creating and maintaining the system wide competency frameworks.&lt;br /&gt;
&lt;br /&gt;
The actions a competency framework administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency within a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark a competency as related to another competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
=== Learning Plan Administrators ===&lt;br /&gt;
&lt;br /&gt;
Learning plan administrators are responsible for creating and maintaining learning plan templates relating to e.g. a specific faculty, set of courses, degree or certification.&lt;br /&gt;
&lt;br /&gt;
The actions a learning plan administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add and remove competencies from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign a user a learning plan from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planmanage“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View coverage report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpcoverage:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View statistics report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpstatistics:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View breakdown report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpbreakdown:view“ capability defined on the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve draft learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planapprove“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve competency review requests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencygrade“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
=== Teachers ===&lt;br /&gt;
&lt;br /&gt;
Teachers create and teach courses, that provide evidence of competencies.&lt;br /&gt;
&lt;br /&gt;
The actions a teacher can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign competencies to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencymanage” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manually grade competencies linked to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencygrade” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
=== Students ===&lt;br /&gt;
&lt;br /&gt;
Students are users that can have learning plans.&lt;br /&gt;
&lt;br /&gt;
The actions a student can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View their own learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planviewown” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create their own draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreateown” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request approval for their draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreateown&amp;quot; capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Provide evidence of prior learning for a competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planaddevidence” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request for someone to grade them for a specific competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancompetencyrequestreview” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
== Further work (out of scope for first release) ==&lt;br /&gt;
&lt;br /&gt;
Add a rule to award badges when certain competencies are met&lt;br /&gt;
&lt;br /&gt;
This is a simple addition to the existing rules that can be configured to award a badge.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec20.jpg|frame|center|Custom badge condition]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linking activities as evidence of competencies ===&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec01.jpg|frame|center|Linking an activity to some course competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also quickly find resources and activities that have not been mapped to any competencies. This is done on the competency mapping report which shows all resources and activities for the course, as well as the linked competencies for each. This report will also list any course competencies that are not linked to any activities or resources.&lt;br /&gt;
&lt;br /&gt;
=== Alternative ways to “automatically complete” competencies ===&lt;br /&gt;
&lt;br /&gt;
* Trigger based on activity completion. Configured when linking competencies to a course.&lt;br /&gt;
&lt;br /&gt;
=== Additional reports ===&lt;br /&gt;
&lt;br /&gt;
E.g. https://moodle.org/mod/forum/discuss.php?d=316151#p1266980&lt;br /&gt;
&lt;br /&gt;
== Interaction with the existing Moodle “Outcomes” ==&lt;br /&gt;
&lt;br /&gt;
Description of existing “Outcomes”&lt;br /&gt;
&lt;br /&gt;
Outcomes define a set of system wide scales that can be used to grade activities. The value chosen from the scale is pushed to the gradebook for each activity and a custom report will show the average of outcomes across a course, or the entire site. Not all activities and resources support outcomes, only scorm, quiz, lti, lesson, glossary, data, chat, assign and forum.&lt;br /&gt;
&lt;br /&gt;
Any activity that has an outcome attached receives a new column in the gradebook where that outcome is assessed for that activity.&lt;br /&gt;
&lt;br /&gt;
Outcomes has some features that would need to be “removed” in order to make sense with competency frameworks (mainly pushing of grades to the gradebook) - this means we cannot build on outcomes, and maintain backwards compatibility. It is therefore recommended to provide:&lt;br /&gt;
&lt;br /&gt;
* A site wide setting to allow competencies - allow either/or but the default will be competencies with no outcomes.&lt;br /&gt;
* A simple way to create a competency framework from an existing set of outcomes.&lt;br /&gt;
* (optional - requires activity level competencies) A way to import existing outcomes grades as evidence for competencies.&lt;br /&gt;
&lt;br /&gt;
== Open questions for further feedback ==&lt;br /&gt;
&lt;br /&gt;
* Would you expect a teacher to be able to create their own competencies (limited to their own course)? Would competencies that are visible only to a single course (and potentially conflicting with competencies from another course) be really useful?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual questions?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual items on a rubric/marking guide?&lt;br /&gt;
* How should self-evaluation of competencies work?&lt;br /&gt;
&lt;br /&gt;
== Outstanding work for this spec ==&lt;br /&gt;
&lt;br /&gt;
* The examples should use consistent names for user types, competencies and courses. It would be easier to use a real example of competencies from a real framework&lt;br /&gt;
* The terminology for child/parent relationships should consistently be:&lt;br /&gt;
** Parent&lt;br /&gt;
** Sub-competency&lt;br /&gt;
* Technical spec (this doc is the requirements).&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Comment_API&amp;diff=48805</id>
		<title>Comment API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Comment_API&amp;diff=48805"/>
		<updated>2015-10-16T06:26:14Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Adding component to example.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Moodle 2.0}}==Objectives==&lt;br /&gt;
&lt;br /&gt;
The goals of Comment API:&lt;br /&gt;
&lt;br /&gt;
* Manage comments centrally&lt;br /&gt;
* Use a consistent approach for all comments throughout Moodle&lt;br /&gt;
* Easily integrate Comment API with existing modules&lt;br /&gt;
* Works no matter Javascript is enabled or not&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
Comment API provides following functionalities:&lt;br /&gt;
# Add comments&lt;br /&gt;
# Manage comments&lt;br /&gt;
# Delete comments&lt;br /&gt;
&lt;br /&gt;
And provides a fancy ajax interface to add/delete comments without reloading page.&lt;br /&gt;
&lt;br /&gt;
==Comment API database table==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field&lt;br /&gt;
! Type&lt;br /&gt;
! Default&lt;br /&gt;
! Info&lt;br /&gt;
|-&lt;br /&gt;
| id&lt;br /&gt;
| int(10)&lt;br /&gt;
| auto-incrementing&lt;br /&gt;
| The unique ID for this comment.&lt;br /&gt;
|-&lt;br /&gt;
| userid&lt;br /&gt;
| int(10)&lt;br /&gt;
|&lt;br /&gt;
| who wrote this comment&lt;br /&gt;
|-&lt;br /&gt;
| contextid&lt;br /&gt;
| int(10)&lt;br /&gt;
|&lt;br /&gt;
| The context id defined in context table - identifies the instance of plugin owning the comment.&lt;br /&gt;
|-&lt;br /&gt;
| itemid&lt;br /&gt;
| int(10)&lt;br /&gt;
|&lt;br /&gt;
| Some plugin specific item id (eg. forum post, blog entry or assignment submission)&lt;br /&gt;
|-&lt;br /&gt;
| commentarea&lt;br /&gt;
| int(10)&lt;br /&gt;
|&lt;br /&gt;
| for example, in user profile, you can comment user&#039;s description or interests, but they share the same itemid(==userid), we need comment_area to separate them&lt;br /&gt;
|-&lt;br /&gt;
| timecreated&lt;br /&gt;
| int(10)&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| timemodified&lt;br /&gt;
| int(10)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| content&lt;br /&gt;
| text&lt;br /&gt;
|&lt;br /&gt;
| content of comment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Use Comment API==&lt;br /&gt;
&lt;br /&gt;
===Add an option to format_text function===&lt;br /&gt;
&lt;br /&gt;
Using this format_text function will add a comment icon automatically at the end of the text:&lt;br /&gt;
&lt;br /&gt;
For example, using the following code in the forum module will add a comment icon to every post:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$cmt = new stdclass;&lt;br /&gt;
$cmt-&amp;gt;contextid = $modcontext-&amp;gt;id;&lt;br /&gt;
$cmt-&amp;gt;area      = &#039;format_post&#039;;&lt;br /&gt;
$cmt-&amp;gt;itemid    = $post-&amp;gt;id;&lt;br /&gt;
$options-&amp;gt;comments = $cmt;&lt;br /&gt;
echo format_text($post-&amp;gt;message, $post-&amp;gt;messageformat, $options, $course-&amp;gt;id).&amp;quot;&amp;lt;hr /&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Use comment class===&lt;br /&gt;
To use Comment API elsewhere, using following code:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$options-&amp;gt;area    = &#039;database_entry&#039;;&lt;br /&gt;
$options-&amp;gt;context = $context;&lt;br /&gt;
$options-&amp;gt;itemid  = $record-&amp;gt;id;&lt;br /&gt;
$options-&amp;gt;component = &#039;mod_data&#039;;&lt;br /&gt;
$options-&amp;gt;showcount = true;&lt;br /&gt;
$comment = new comment($options);&lt;br /&gt;
$comment-&amp;gt;output(false);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comment API overview==&lt;br /&gt;
&lt;br /&gt;
Generally speaking, only two functions you need to know to get comment API worked:&lt;br /&gt;
# Use comment::init to initialize Comment API&lt;br /&gt;
# Use $comment-&amp;gt;output to display comments&lt;br /&gt;
&lt;br /&gt;
The comment class has been implemented in comment/lib.php.&lt;br /&gt;
===class comment()===&lt;br /&gt;
====__construct($contextid, $comment_area, $itemid))====&lt;br /&gt;
Initialize class members&lt;br /&gt;
&lt;br /&gt;
====init()====&lt;br /&gt;
It is a static function used to initialize comments, setting up languages, which must be called before html head printed&lt;br /&gt;
&lt;br /&gt;
====output($return = false)====&lt;br /&gt;
Will print the html snippet for commenting interface, if set $return as true, it will return html string instead of printing out.&lt;br /&gt;
&lt;br /&gt;
====print_comments($params = array())====&lt;br /&gt;
Used by non-javascript comment interface, will print a list of comments.&lt;br /&gt;
&lt;br /&gt;
====add($content)====&lt;br /&gt;
Public instance funciton, add a comment to database, used in comment/comment_ajax.php&lt;br /&gt;
&lt;br /&gt;
====count()====&lt;br /&gt;
Counting the number of comments&lt;br /&gt;
&lt;br /&gt;
====delete($id)====&lt;br /&gt;
Delete a comment from database, used in comment/comment_ajax.php&lt;br /&gt;
&lt;br /&gt;
====delete_comments====&lt;br /&gt;
Delete all comments in a specific contexts (like all comments belonging to a forum post)&lt;br /&gt;
&lt;br /&gt;
==Javascript API==&lt;br /&gt;
Comment API implemented a YUI3 module M.core_comment to deal with the communication between browsers and moodle.&lt;br /&gt;
It can be found in comment/comment.js&lt;br /&gt;
&lt;br /&gt;
Call M.core_comment.init will create an instance of CommentHelper class. You don&#039;t need to make any calls to this instance, it simply works out of box.&lt;br /&gt;
&lt;br /&gt;
== Moodle modules callback ==&lt;br /&gt;
Comment API allows modules/blocks/blog to decide how comments display.&lt;br /&gt;
&lt;br /&gt;
=== Data validation ===&lt;br /&gt;
This callback method is required, it must be implemented. Otherwise, new comment will be rejected by default.&lt;br /&gt;
Plugins must implement pluginname_comment_validate callback to validate comments parameters, it must return true to pass validation.&lt;br /&gt;
&lt;br /&gt;
===Permission control===&lt;br /&gt;
Modules must implement function &#039;&#039;&#039;pluginname_comment_permissions&#039;&#039;&#039; to return post and view permission.&lt;br /&gt;
&lt;br /&gt;
Blocks need to overwrite &#039;&#039;&#039;blockname_comment_permissions&#039;&#039;&#039; function of block_base.&lt;br /&gt;
&lt;br /&gt;
Blog need to implement &#039;&#039;&#039;blog_comment_permissions&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
This function will return an array: array(&#039;post&#039;=&amp;gt;true, &#039;view&#039;=&amp;gt;true)&lt;br /&gt;
&lt;br /&gt;
=== Check new added comment ===&lt;br /&gt;
The callback function allows you to change the comment content before inserting into database or reject this comment.&lt;br /&gt;
&lt;br /&gt;
It takes two arguments, the comment object which contains comment details, and $params which contains context and course information.&lt;br /&gt;
&lt;br /&gt;
Modules can implement a function named &#039;&#039;&#039;modname_comment_add&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Blocks need to overwrite &#039;&#039;&#039;blockname_comment_add&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
Blog need to implement &#039;&#039;&#039;blog_comment_add&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
This function should return a boolean value. &lt;br /&gt;
&lt;br /&gt;
=== Filter/format comments ===&lt;br /&gt;
This callback allows modules check/format comments when user request to display comments.&lt;br /&gt;
&lt;br /&gt;
It takes the same arguments as pluginname_comment_add&lt;br /&gt;
&lt;br /&gt;
Modules can implement a function named &#039;&#039;&#039;pluginname_comment_display&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Blocks need to overwrite &#039;&#039;&#039;blockname_comment_display&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
Blog need to implement &#039;&#039;&#039;blog_comment_display&#039;&#039;&#039; function.&lt;br /&gt;
&lt;br /&gt;
It will return the comment object.&lt;br /&gt;
&lt;br /&gt;
=== Define a comment template ===&lt;br /&gt;
Modules can implement a function named &#039;&#039;&#039;pluginname_comment_template&#039;&#039;&#039;, which allow modules define a comment template.&lt;br /&gt;
The template must have 4 embedding variables, ___id___, ___content___, ___time___, ___name___, they will be replaced with html id, comments content, comment time and commenter name&lt;br /&gt;
&lt;br /&gt;
== Backup and Restore ==&lt;br /&gt;
Comments will automatically be included in the activity/course backups and restored provided the itemids can be updated during the restore process. To do this either:&lt;br /&gt;
&lt;br /&gt;
* do not use item ids and rely just on the context&lt;br /&gt;
* make the commentarea the same as one of the mappings in the restore (set_mapping); or&lt;br /&gt;
* override the function &amp;quot;get_comment_mapping_itemname&amp;quot; in the restore activity class&lt;br /&gt;
&lt;br /&gt;
If you do not do one of these the comments will be silently ignored on restore.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
* MDL-19118 - Comment API issue&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Developer_meeting_October_2015&amp;diff=48739</id>
		<title>Developer meeting October 2015</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Developer_meeting_October_2015&amp;diff=48739"/>
		<updated>2015-10-13T12:06:21Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* Agenda draft */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Developer meetings]] &amp;gt; October 2015 meeting notes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Time&lt;br /&gt;
| [http://www.timeanddate.com/worldclock/fixedtime.html?year=2015&amp;amp;month=10&amp;amp;day=21&amp;amp;hour=07&amp;amp;min=0&amp;amp;sec=0 07:00 UTC on Wednesday, 21 October 2015] [http://www.google.com/calendar/event?action=TEMPLATE&amp;amp;text=Moodle+General+developer+meeting&amp;amp;dates=20151021T070000Z/20151021T090000Z&amp;amp;details=https://docs.moodle.org/dev/Developer_meeting_October_2015&amp;amp;location= &amp;lt;span class=&amp;quot;btn btn-info&amp;quot;&amp;gt;Add to my calendar&amp;lt;/span&amp;gt;]&lt;br /&gt;
|-&lt;br /&gt;
| Meeting room&lt;br /&gt;
| Live stream at YouTube (TODO link)&lt;br /&gt;
|-&lt;br /&gt;
| Forum discussion&lt;br /&gt;
| Thread in GDF at moodle.org (TODO link)&lt;br /&gt;
|-&lt;br /&gt;
| Chat&lt;br /&gt;
| Moodle Jabber dev chat (TODO link)&lt;br /&gt;
|-&lt;br /&gt;
| Twitter&lt;br /&gt;
| [https://twitter.com/search?q=%23moodledev #moodledev]&lt;br /&gt;
|-&lt;br /&gt;
| Social event page&lt;br /&gt;
| Google+ page (TODO link)&lt;br /&gt;
|-&lt;br /&gt;
| Meeting notes&lt;br /&gt;
| [https://devpad.moodle.org/p/gdm151021 devpad]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Agenda draft ==&lt;br /&gt;
&lt;br /&gt;
* Upcoming changes in Moodle 3.0 from Moodle contributor&#039;s perspective (both core and plugins development) - Damyon / Marina / David Mu&lt;br /&gt;
* MDL-50565, MDL-51011, MDL-51155 Moving towards PHP7 - to be confirmed.&lt;br /&gt;
* MDL-50645 Caching the list of callbacks and ability to use them much more often without worrying about performance - David Mo, to be confirmed.&lt;br /&gt;
* MDL-51213 Safely callable external_format_text() - Damyon, to be confirmed.&lt;br /&gt;
* MDL-51107 Ability to inject nodes in the category settings navigation - Fred&lt;br /&gt;
* Plugins versioning schemes - David Mu, to be confirmed.&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Please feel encouraged to raise topics you would like to present / discuss during these meetings. Contact [https://moodle.org/user/profile.php?id=1601 David Mudrák] for details.&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48649</id>
		<title>Competency Based Education</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48649"/>
		<updated>2015-10-02T02:46:46Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* User learning plans */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = Framework for competency-based education (CBE) in Moodle&lt;br /&gt;
|state = In Progress&lt;br /&gt;
|tracker = MDL-49458&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=316151&lt;br /&gt;
|assignee = [[User:Damyon Wiese]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
=Framework for competency-based education (CBE) in Moodle=&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
This specification describes our plan to improve support for outcomes-based education in Moodle core. There have been many other attempts to add such systems to Moodle but they all use different data structures and processes and are incompatible. Our aim here is to build basic central structures and APIs to store and manipulate this data, allowing the Moodle community to build innovative custom interfaces on top of it.&lt;br /&gt;
&lt;br /&gt;
This design is based on input from many existing implementations of outcomes/competencies and learning plans including:&lt;br /&gt;
&lt;br /&gt;
* “Outcomes 2” in Joule&lt;br /&gt;
* Totara&lt;br /&gt;
* Referentiel Activity Module (Skills Repository)&lt;br /&gt;
* ELIS&lt;br /&gt;
&lt;br /&gt;
The goal is to implement a system that supports competency based education in a flexible way so that it can be used effectively by the many different target audiences. &lt;br /&gt;
&lt;br /&gt;
The two main concepts are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Competencies&#039;&#039;&#039; - a unit of learning, such as &amp;quot;Can make exceptional beer&amp;quot;. Competencies can be assigned as goals of courses &amp;amp;ldquo;This course will teach you to make exceptional beer&amp;amp;rdquo;, and also to users: &amp;amp;ldquo;Billy can make exceptional beer&amp;amp;rdquo;. &lt;br /&gt;
Competencies can also be hierarchical, so that the competency above might be marked proficient when some combination of sub-competencies has been marked proficient. &lt;br /&gt;
For example : Can make exceptional beer ( Can choose good malt / Can choose good yeasts / Can brew beer in the good temperature / etc..)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Learning plans&#039;&#039;&#039; - a set of competencies that can be assigned to a student (or cohorts of students). Initially, they will all be marked &amp;quot;incomplete&amp;quot;. As students achieve each competency it is marked complete, thereby showing their progress towards finishing all of them. Students achieve competencies either automatically (by successfully completing a course with that competency) or manually (by proving to someone that they are competent via portfolio items etc).&lt;br /&gt;
&lt;br /&gt;
== Competencies ==&lt;br /&gt;
&lt;br /&gt;
A competency is a unit of learning. All competencies belong to a competency framework, and it is likely that a competency framework will be defined by an external body such as an academic standards board.&lt;br /&gt;
&lt;br /&gt;
To create a competency, you first define the framework and then add the competency to it.&lt;br /&gt;
&lt;br /&gt;
Competency frameworks are defined by “Framework Administrators” at the site level, or at a category level. To create and edit competency frameworks, go to “Site administration” -&amp;amp;gt; “Competency Frameworks”, or &amp;quot;Category administration -&amp;amp;gt; Competency frameworks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec21_v2.jpg|frame|center|Manage competency frameworks]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec19_v3.jpg|frame|center|Add new competency framework]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose “Add new competency framework” and create a new competency framework.&lt;br /&gt;
&lt;br /&gt;
The scale defines how a competency is marked as complete. Each competency framework can define which of the standard Moodle scales should be used when marking a competency. In addition, the “default” value from the scale (the one automatically set when a course is completed) can be configured, and the items from the scale that are deemed to be “proficient” can be defined. A &amp;quot;default&amp;quot; value and at least one &amp;quot;proficient&amp;quot; value must be defined.&lt;br /&gt;
&lt;br /&gt;
A competency framework may be available to the entire site - or limited to a course category. &lt;br /&gt;
&lt;br /&gt;
The taxonomy refers to the naming for each level in the framework. Up to 4 levels are supported, and the name for each level can be set from the following list:&lt;br /&gt;
Domain, Competency, Behaviour, Indicator, Outcome, Level, Concept, Value, Practice, Skill, Proficiency&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec02.jpg|frame|center|Configure scale]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to add competencies to the framework. We can import these from a file, or create them from scratch, or import them from Moodle outcomes. When importing competencies, any existing competencies with a matching idnumber will be updated.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec15.jpg|frame|center|Import competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be imported from the following formats:&lt;br /&gt;
&lt;br /&gt;
 (TBD - start with import from CSV).&lt;br /&gt;
&lt;br /&gt;
To see the competencies for a framework, click on the competency framework name.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec06_v2.jpg|frame|center|Manage competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where we can add and edit competencies in a framework. To edit an existing competency, select it in the competencies tree browser and choose “Edit” from the action menu in the selected competency panel.&lt;br /&gt;
&lt;br /&gt;
To add a new competency, first select the competency that should be the “parent” of this competency from the tree of competencies, and then click “Add Indicator” (the name comes from the taxonomy) from the selected competency panel. Competencies can have a maximum of 3 descendants (4 levels). Tags can be used to categorise competencies for easy searching, e.g. year level, subject. Tags used for competencies are kept in a separate “tagcloud” (see https://tracker.moodle.org/browse/MDL-50851).&lt;br /&gt;
&lt;br /&gt;
A competency framework can be duplicated, and there is an admin tool for migrating courses from one framework to another (as long as the idnumbers between the competencies in the frameworks can be matched).&lt;br /&gt;
&lt;br /&gt;
If a competency has sub-competencies, you can configure the completion rule for the competency. The default completion rule is “Completed when all sub-competencies are complete”. For more complex rules - you can use a points based system to say when to complete or recommend a competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec23.jpg|frame|center|Add a competency]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be “related” to other competencies within the same framework. The only effect of this is that the related competencies are listed in the summary of each competency, whenever it is displayed in Moodle. To add a “related” competency to an existing competency, select it from the competency framework and choose “Add related competency” from the action menu.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec03_v2.jpg|frame|center|Relating competencies to each other]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learning plan templates ==&lt;br /&gt;
&lt;br /&gt;
It would be cumbersome to individually add competencies to a large group of students, and it would be awkward if you made a mistake and had to change the competencies for all the students at a later date. To make this manageable, you can create a “Learning plan template” and assign it to many students. An example of a learning plan template could be: “Computer science, Undergraduate” which lists all the required competencies for a first year computer science student, or it could be more fine grained.&lt;br /&gt;
&lt;br /&gt;
Templates are created by a ”Learning Plan Administrator”. Templates can be imported and exported via CSV. Learning plan templates can be created at a course category, or a site level.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec22_v2.jpg|frame|center|Manage Learning Plan Templates]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have created a template, you can add competencies to it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec18.jpg|frame|center|List competencies in a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec00.jpg|frame|center|Add competency to a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding competencies to a template will update all the learning plans based on that template.&lt;br /&gt;
&lt;br /&gt;
== User learning plans ==&lt;br /&gt;
&lt;br /&gt;
A user learning plan is a collection of all the competencies they should achieve, optionally before a certain date.&lt;br /&gt;
&lt;br /&gt;
Any user can create their own learning plan, if they have the capability on their own context.&lt;br /&gt;
&lt;br /&gt;
A “Learning Plan Administrator” can create learning plans for other users. They can create the plans individually though another users profile page, or they can create learning plans in bulk from a learning plan template.&lt;br /&gt;
&lt;br /&gt;
Users learning plans can be in one of 3 states, Draft, Active or Completed. Only someone with the capability tool/lp:planmanage (or tool/lp:planmanageown if it’s their own plan) capability can approve learning plans.&lt;br /&gt;
&lt;br /&gt;
A plan can be manually set to completed, by someone with the capabilities listed above, or it will be set to completed when the due date for the plan expires.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec07.jpg|frame|center|Single users learning plans page]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec16.jpg|frame|center|Bulk create user learning plans]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that sites using enrolment plugins can create a cohort based on the enrolments of a set of courses using the admin tool “Course cohorts”. More detail required here.&lt;br /&gt;
&lt;br /&gt;
Competencies can be added to a users learning plan, or to the template the plan was created from and they will automatically appear in the users learning plan. Competencies that exist in the template cannot be removed from the users learning plan. If a single student requires e.g. exemptions from certain competencies - their learning plan can be &amp;quot;unlinked&amp;quot; from the template. This plan will no longer show up in reports generated from the learning plan template - but can now be freely edited.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec12.jpg|frame|center|User learning plan competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, there can be multiple types of evidence for the same competency. E.g. 2 courses may provide evidence for the same competency and both courses were completed. In this case - both would show as evidence. There can also be multiple examples of &amp;amp;quot;Evidence of prior learning&amp;amp;quot; attached to each competency.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Each competency in the table is colour coded to indicate one of the following:&lt;br /&gt;
&lt;br /&gt;
* brown - competency not met, and no evidence or enrolled courses cover this competency&lt;br /&gt;
* orange - the competency is not met, but there is evidence, or “in-progress” courses that cover this competency&lt;br /&gt;
* green - the competency has been met&lt;br /&gt;
&lt;br /&gt;
If you have the capability tool/lp:planaddevidence you can upload files and urls against a competency in your plan as evidence of prior learning. You can also request that a someone with the capability tool/lp:planmanage reviews the evidence and either rejects or accepts the evidence and changes the status for the competency in the plan.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec25.jpg|frame|center|Provide evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec08.jpg|frame|center|Link evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view all the current requests for review, a new “Learning plans” block can be added to an “approvers” dashboard.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec10.jpg|frame|center|Dashboard Block]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A User with the capability “tool/lp:competencygrade” (at the context of another users plan) can review and approve competency approval requests. A competency approval request is a request for someone to review the evidence that a user has provided against a specific competency and make a decision whether the user has either met or not met the competency. The valid statuses for a review are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There can only be one “review” per competency for each user (if a review is rejected, and then a new request is made, the previous review will be changed from “Rejected” to “Waiting for review”).&lt;br /&gt;
&lt;br /&gt;
Following the link in the Learning Plans dashboard block, the approver goes to a page that lists all the requests waiting to be approved, and from here they can approve or reject each request. They can also leave comments that will be visible to the student, or to any other reviewers.&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a review an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a review, or a review is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
When a completion rule triggers a “recommendation” - the evidence will be added to the competency, and the system will request a “review” of this competency.&lt;br /&gt;
&lt;br /&gt;
TODO Define a new page for assigning roles relative to a user. In totara, there is a “positions” page which does this. This will also be useful for “Mentees”.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec11.jpg|frame|center|Review competency requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If users have the capability to create their own draft learning plans, but not approve them themselves, someone will need to review all the draft learning plan requests and decide whether or not to make them active. This user can be anyone with “tool/lp:planmanage” capability (at the context of each user with a plan to approve) and they can view all the “Learning plans to approve” link in the Learning Plans dashboard block.&lt;br /&gt;
&lt;br /&gt;
A learning plan approval request made by a user with a draft learning plan from their “Manage learning plans page”. Once a request has been made, the valid statuses for a learning plan approval request are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a learning plans approval request an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a learning plan approval request, or a learning plan approval request is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec04.jpg|frame|center|Review Learning Plan Approval Requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Course Competencies ==&lt;br /&gt;
&lt;br /&gt;
Competencies can also be linked to a course. This means that when a student completes a course (see course completion) - all of the linked competencies will be marked as “complete” or “recommended” in any of the students active learning plans and the course will be added as evidence against that competency. If the competency is already “met”, the course will still be added as evidence for that competency. If the competency is only set to “recommend” the course will be added as evidence and a review request will be created.&lt;br /&gt;
&lt;br /&gt;
The competency will be given the default value from the competency scale. You can select multiple competencies and add them all at once.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec17.jpg|frame|center|Course Competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teacher in a course, can manually mark the students against the course competencies. For each competency, the teacher will see all of the evidence linked to that competency for the student. They then can assign a value from the competency scale for the student, and optionally make a comment. A record of the teacher marking this competency will be added to the evidence of completion for this competency and the status of the competency will be updated in all active learning plans for the student.&lt;br /&gt;
&lt;br /&gt;
TODO - see how the information from the coverage report can be shown when linking course competencies.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec14.jpg|frame|center|Grading competencies within a course]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When manually marking a competency, it is recorded as evidence ie: &amp;amp;quot;Teacher X manually specified this value in this course&amp;amp;quot; - so if the same competency is linked to multiple course it can be marked in each, and this will show up as 2 pieces of evidence.&lt;br /&gt;
&lt;br /&gt;
Reports&lt;br /&gt;
&lt;br /&gt;
Students&lt;br /&gt;
&lt;br /&gt;
For an active Learning Plan, students can see a report of the competencies that are covered/not covered by their current list of enrolled courses. For each competency, they should also be able to see which courses they could enrol in to meet that competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec24.jpg|frame|center|Student Learning Plan Competencies page shows progress, and course discovery]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Students can see a list of their active learning plans on their dashboard, with a visual indication of progress (a progress bar). Each learning plan is a link to the learning plan report shown above.&lt;br /&gt;
&lt;br /&gt;
Teachers&lt;br /&gt;
&lt;br /&gt;
For teachers and course designers building a set of courses against a competency framework, they should be able to identify competencies that are over/underrepresented by a set of courses. To do this they access a learning plan template, and view the coverage report for that template. This competency coverage report initially shows the coverage from all courses that link to one of the competencies in the template, but the teacher can remove some courses from the selection and regenerate the report.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec09.jpg|frame|center|Coverage report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers and course designers can also see some statistics about a learning plan template. From the learning plan template page, they choose “Statistics” from the action menu to see the number of active/completed learning plans using this template, and the average completion % for the learning plans.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec13.jpg|frame|center|Statistics for Learning Plan Template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also see a report in a course that shows for each course competency, which users have completed or not completed it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec05.jpg|frame|center|Breakdown report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User roles and capabilities ==&lt;br /&gt;
&lt;br /&gt;
In this system, the actions a user can perform are governed by various capabilities, and are checked at one of several different context levels.&lt;br /&gt;
&lt;br /&gt;
As a reference, the relevant context levels in Moodle are organised in a tree like structure and an example is shown below:&lt;br /&gt;
&lt;br /&gt;
* Site&lt;br /&gt;
** User A&lt;br /&gt;
** User B&lt;br /&gt;
** Category A&lt;br /&gt;
*** Course A&lt;br /&gt;
*** Course B&lt;br /&gt;
** Category B&lt;br /&gt;
*** Category C&lt;br /&gt;
**** Course C&lt;br /&gt;
**** Course D&lt;br /&gt;
&lt;br /&gt;
=== Framework Administrators ===&lt;br /&gt;
&lt;br /&gt;
Competency framework administrators are the central people responsible for creating and maintaining the system wide competency frameworks.&lt;br /&gt;
&lt;br /&gt;
The actions a competency framework administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency within a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark a competency as related to another competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
=== Learning Plan Administrators ===&lt;br /&gt;
&lt;br /&gt;
Learning plan administrators are responsible for creating and maintaining learning plan templates relating to e.g. a specific faculty, set of courses, degree or certification.&lt;br /&gt;
&lt;br /&gt;
The actions a learning plan administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add and remove competencies from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign a user a learning plan from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planmanage“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View coverage report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpcoverage:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View statistics report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpstatistics:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View breakdown report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpbreakdown:view“ capability defined on the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve draft learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planapprove“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve competency review requests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencygrade“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
=== Teachers ===&lt;br /&gt;
&lt;br /&gt;
Teachers create and teach courses, that provide evidence of competencies.&lt;br /&gt;
&lt;br /&gt;
The actions a teacher can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign competencies to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencymanage” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manually grade competencies linked to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencygrade” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
=== Students ===&lt;br /&gt;
&lt;br /&gt;
Students are users that can have learning plans.&lt;br /&gt;
&lt;br /&gt;
The actions a student can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View their own learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planviewown” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create their own draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request approval for their draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Provide evidence of prior learning for a competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planaddevidence” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request for someone to grade them for a specific competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancompetencyrequestreview” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
== Further work (out of scope for first release) ==&lt;br /&gt;
&lt;br /&gt;
Add a rule to award badges when certain competencies are met&lt;br /&gt;
&lt;br /&gt;
This is a simple addition to the existing rules that can be configured to award a badge.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec20.jpg|frame|center|Custom badge condition]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linking activities as evidence of competencies ===&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec01.jpg|frame|center|Linking an activity to some course competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also quickly find resources and activities that have not been mapped to any competencies. This is done on the competency mapping report which shows all resources and activities for the course, as well as the linked competencies for each. This report will also list any course competencies that are not linked to any activities or resources.&lt;br /&gt;
&lt;br /&gt;
=== Alternative ways to “automatically complete” competencies ===&lt;br /&gt;
&lt;br /&gt;
* Trigger based on activity completion. Configured when linking competencies to a course.&lt;br /&gt;
&lt;br /&gt;
=== Additional reports ===&lt;br /&gt;
&lt;br /&gt;
E.g. https://moodle.org/mod/forum/discuss.php?d=316151#p1266980&lt;br /&gt;
&lt;br /&gt;
== Interaction with the existing Moodle “Outcomes” ==&lt;br /&gt;
&lt;br /&gt;
Description of existing “Outcomes”&lt;br /&gt;
&lt;br /&gt;
Outcomes define a set of system wide scales that can be used to grade activities. The value chosen from the scale is pushed to the gradebook for each activity and a custom report will show the average of outcomes across a course, or the entire site. Not all activities and resources support outcomes, only scorm, quiz, lti, lesson, glossary, data, chat, assign and forum.&lt;br /&gt;
&lt;br /&gt;
Any activity that has an outcome attached receives a new column in the gradebook where that outcome is assessed for that activity.&lt;br /&gt;
&lt;br /&gt;
Outcomes has some features that would need to be “removed” in order to make sense with competency frameworks (mainly pushing of grades to the gradebook) - this means we cannot build on outcomes, and maintain backwards compatibility. It is therefore recommended to provide:&lt;br /&gt;
&lt;br /&gt;
* A site wide setting to allow competencies - allow either/or but the default will be competencies with no outcomes.&lt;br /&gt;
* A simple way to create a competency framework from an existing set of outcomes.&lt;br /&gt;
* (optional - requires activity level competencies) A way to import existing outcomes grades as evidence for competencies.&lt;br /&gt;
&lt;br /&gt;
== Open questions for further feedback ==&lt;br /&gt;
&lt;br /&gt;
* Would you expect a teacher to be able to create their own competencies (limited to their own course)? Would competencies that are visible only to a single course (and potentially conflicting with competencies from another course) be really useful?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual questions?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual items on a rubric/marking guide?&lt;br /&gt;
* How should self-evaluation of competencies work?&lt;br /&gt;
&lt;br /&gt;
== Outstanding work for this spec ==&lt;br /&gt;
&lt;br /&gt;
* The examples should use consistent names for user types, competencies and courses. It would be easier to use a real example of competencies from a real framework&lt;br /&gt;
* The terminology for child/parent relationships should consistently be:&lt;br /&gt;
** Parent&lt;br /&gt;
** Sub-competency&lt;br /&gt;
* Technical spec (this doc is the requirements).&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48647</id>
		<title>Competency Based Education</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48647"/>
		<updated>2015-10-01T13:08:38Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Related competencies and parent limit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = Framework for competency-based education (CBE) in Moodle&lt;br /&gt;
|state = In Progress&lt;br /&gt;
|tracker = MDL-49458&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=316151&lt;br /&gt;
|assignee = [[User:Damyon Wiese]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
=Framework for competency-based education (CBE) in Moodle=&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
This specification describes our plan to improve support for outcomes-based education in Moodle core. There have been many other attempts to add such systems to Moodle but they all use different data structures and processes and are incompatible. Our aim here is to build basic central structures and APIs to store and manipulate this data, allowing the Moodle community to build innovative custom interfaces on top of it.&lt;br /&gt;
&lt;br /&gt;
This design is based on input from many existing implementations of outcomes/competencies and learning plans including:&lt;br /&gt;
&lt;br /&gt;
* “Outcomes 2” in Joule&lt;br /&gt;
* Totara&lt;br /&gt;
* Referentiel Activity Module (Skills Repository)&lt;br /&gt;
* ELIS&lt;br /&gt;
&lt;br /&gt;
The goal is to implement a system that supports competency based education in a flexible way so that it can be used effectively by the many different target audiences. &lt;br /&gt;
&lt;br /&gt;
The two main concepts are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Competencies&#039;&#039;&#039; - a unit of learning, such as &amp;quot;Can make exceptional beer&amp;quot;. Competencies can be assigned as goals of courses &amp;amp;ldquo;This course will teach you to make exceptional beer&amp;amp;rdquo;, and also to users: &amp;amp;ldquo;Billy can make exceptional beer&amp;amp;rdquo;. &lt;br /&gt;
Competencies can also be hierarchical, so that the competency above might be marked proficient when some combination of sub-competencies has been marked proficient. &lt;br /&gt;
For example : Can make exceptional beer ( Can choose good malt / Can choose good yeasts / Can brew beer in the good temperature / etc..)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Learning plans&#039;&#039;&#039; - a set of competencies that can be assigned to a student (or cohorts of students). Initially, they will all be marked &amp;quot;incomplete&amp;quot;. As students achieve each competency it is marked complete, thereby showing their progress towards finishing all of them. Students achieve competencies either automatically (by successfully completing a course with that competency) or manually (by proving to someone that they are competent via portfolio items etc).&lt;br /&gt;
&lt;br /&gt;
== Competencies ==&lt;br /&gt;
&lt;br /&gt;
A competency is a unit of learning. All competencies belong to a competency framework, and it is likely that a competency framework will be defined by an external body such as an academic standards board.&lt;br /&gt;
&lt;br /&gt;
To create a competency, you first define the framework and then add the competency to it.&lt;br /&gt;
&lt;br /&gt;
Competency frameworks are defined by “Framework Administrators” at the site level, or at a category level. To create and edit competency frameworks, go to “Site administration” -&amp;amp;gt; “Competency Frameworks”, or &amp;quot;Category administration -&amp;amp;gt; Competency frameworks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec21_v2.jpg|frame|center|Manage competency frameworks]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec19_v3.jpg|frame|center|Add new competency framework]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose “Add new competency framework” and create a new competency framework.&lt;br /&gt;
&lt;br /&gt;
The scale defines how a competency is marked as complete. Each competency framework can define which of the standard Moodle scales should be used when marking a competency. In addition, the “default” value from the scale (the one automatically set when a course is completed) can be configured, and the items from the scale that are deemed to be “proficient” can be defined. A &amp;quot;default&amp;quot; value and at least one &amp;quot;proficient&amp;quot; value must be defined.&lt;br /&gt;
&lt;br /&gt;
A competency framework may be available to the entire site - or limited to a course category. &lt;br /&gt;
&lt;br /&gt;
The taxonomy refers to the naming for each level in the framework. Up to 4 levels are supported, and the name for each level can be set from the following list:&lt;br /&gt;
Domain, Competency, Behaviour, Indicator, Outcome, Level, Concept, Value, Practice, Skill, Proficiency&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec02.jpg|frame|center|Configure scale]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to add competencies to the framework. We can import these from a file, or create them from scratch, or import them from Moodle outcomes. When importing competencies, any existing competencies with a matching idnumber will be updated.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec15.jpg|frame|center|Import competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be imported from the following formats:&lt;br /&gt;
&lt;br /&gt;
 (TBD - start with import from CSV).&lt;br /&gt;
&lt;br /&gt;
To see the competencies for a framework, click on the competency framework name.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec06_v2.jpg|frame|center|Manage competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where we can add and edit competencies in a framework. To edit an existing competency, select it in the competencies tree browser and choose “Edit” from the action menu in the selected competency panel.&lt;br /&gt;
&lt;br /&gt;
To add a new competency, first select the competency that should be the “parent” of this competency from the tree of competencies, and then click “Add Indicator” (the name comes from the taxonomy) from the selected competency panel. Competencies can have a maximum of 3 descendants (4 levels). Tags can be used to categorise competencies for easy searching, e.g. year level, subject. Tags used for competencies are kept in a separate “tagcloud” (see https://tracker.moodle.org/browse/MDL-50851).&lt;br /&gt;
&lt;br /&gt;
A competency framework can be duplicated, and there is an admin tool for migrating courses from one framework to another (as long as the idnumbers between the competencies in the frameworks can be matched).&lt;br /&gt;
&lt;br /&gt;
If a competency has sub-competencies, you can configure the completion rule for the competency. The default completion rule is “Completed when all sub-competencies are complete”. For more complex rules - you can use a points based system to say when to complete or recommend a competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec23.jpg|frame|center|Add a competency]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be “related” to other competencies within the same framework. The only effect of this is that the related competencies are listed in the summary of each competency, whenever it is displayed in Moodle. To add a “related” competency to an existing competency, select it from the competency framework and choose “Add related competency” from the action menu.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec03_v2.jpg|frame|center|Relating competencies to each other]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learning plan templates ==&lt;br /&gt;
&lt;br /&gt;
It would be cumbersome to individually add competencies to a large group of students, and it would be awkward if you made a mistake and had to change the competencies for all the students at a later date. To make this manageable, you can create a “Learning plan template” and assign it to many students. An example of a learning plan template could be: “Computer science, Undergraduate” which lists all the required competencies for a first year computer science student, or it could be more fine grained.&lt;br /&gt;
&lt;br /&gt;
Templates are created by a ”Learning Plan Administrator”. Templates can be imported and exported via CSV. Learning plan templates can be created at a course category, or a site level.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec22_v2.jpg|frame|center|Manage Learning Plan Templates]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have created a template, you can add competencies to it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec18.jpg|frame|center|List competencies in a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec00.jpg|frame|center|Add competency to a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding competencies to a template will update all the learning plans based on that template.&lt;br /&gt;
&lt;br /&gt;
== User learning plans ==&lt;br /&gt;
&lt;br /&gt;
A user learning plan is a collection of all the competencies they should achieve, optionally before a certain date.&lt;br /&gt;
&lt;br /&gt;
Any user can create their own learning plan, if they have the capability on their own context.&lt;br /&gt;
&lt;br /&gt;
A “Learning Plan Administrator” can create learning plans for other users. They can create the plans individually though another users profile page, or they can create learning plans in bulk from a learning plan template.&lt;br /&gt;
&lt;br /&gt;
Users learning plans can be in one of 3 states, Draft, Active or Completed. Only someone with the capability tool/lp:planmanage (or tool/lp:planmanageown if it’s their own plan) capability can approve learning plans.&lt;br /&gt;
&lt;br /&gt;
A plan can be manually set to completed, by someone with the capabilities listed above, or it will be set to completed when the due date for the plan expires.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec07.jpg|frame|center|Single users learning plans page]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec16.jpg|frame|center|Bulk create user learning plans]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that sites using enrolment plugins can create a cohort based on the enrolments of a set of courses using the admin tool “Course cohorts”. More detail required here.&lt;br /&gt;
&lt;br /&gt;
Competencies can be added to a users learning plan, or to the template the plan was created from and they will automatically appear in the users learning plan. Competencies that exist in the template cannot be removed from the users learning plan. If a single student requires e.g. exemptions from certain competencies - their learning plan can be &amp;quot;unlinked&amp;quot; from the template. This plan will no longer show up in reports generated from the learning plan template - but can now be freely edited.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec12.jpg|frame|center|User learning plan competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, there can be multiple types of evidence for the same competency. E.g. 2 courses may provide evidence for the same competency and both courses were completed. In this case - both would show as evidence. There can also be multiple examples of &amp;amp;quot;Evidence of prior learning&amp;amp;quot; attached to each competency.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Each competency in the table is colour coded to indicate one of the following:&lt;br /&gt;
&lt;br /&gt;
* brown - competency not met, and no evidence or enrolled courses cover this competency&lt;br /&gt;
* orange - the competency is not met, but there is evidence, or “in-progress” courses that cover this competency&lt;br /&gt;
* green - the competency has been met&lt;br /&gt;
&lt;br /&gt;
If you have the capability tool/lp:planaddevidence you can upload files and urls against a competency in your plan as evidence of prior learning. You can also request that a someone with the capability tool/lp:planmanage reviews the evidence and either rejects or accepts the evidence and changes the status for the competency in the plan.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec25.jpg|frame|center|Provide evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec08.jpg|frame|center|Link evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view all the current requests for review, a new “Learning plans” block can be added to an “approvers” dashboard.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec10.jpg|frame|center|Dashboard Block]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A User with the capability “tool/lp:planmanage” (at the context of another users plan) can review and approve competency approval requests. A competency approval request is a request for someone to review the evidence that a user has provided against a specific competency and make a decision whether the user has either met or not met the competency. The valid statuses for a review are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There can only be one “review” per competency for each user (if a review is rejected, and then a new request is made, the previous review will be changed from “Rejected” to “Waiting for review”).&lt;br /&gt;
&lt;br /&gt;
Following the link in the Learning Plans dashboard block, the approver goes to a page that lists all the requests waiting to be approved, and from here they can approve or reject each request. They can also leave comments that will be visible to the student, or to any other reviewers.&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a review an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a review, or a review is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
When a completion rule triggers a “recommendation” - the evidence will be added to the competency, and the system will request a “review” of this competency.&lt;br /&gt;
&lt;br /&gt;
TODO Define a new page for assigning roles relative to a user. In totara, there is a “positions” page which does this. This will also be useful for “Mentees”.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec11.jpg|frame|center|Review competency requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If users have the capability to create their own draft learning plans, but not approve them themselves, someone will need to review all the draft learning plan requests and decide whether or not to make them active. This user can be anyone with “tool/lp:planmanage” capability (at the context of each user with a plan to approve) and they can view all the “Learning plans to approve” link in the Learning Plans dashboard block.&lt;br /&gt;
&lt;br /&gt;
A learning plan approval request made by a user with a draft learning plan from their “Manage learning plans page”. Once a request has been made, the valid statuses for a learning plan approval request are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a learning plans approval request an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a learning plan approval request, or a learning plan approval request is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec04.jpg|frame|center|Review Learning Plan Approval Requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Course Competencies ==&lt;br /&gt;
&lt;br /&gt;
Competencies can also be linked to a course. This means that when a student completes a course (see course completion) - all of the linked competencies will be marked as “complete” or “recommended” in any of the students active learning plans and the course will be added as evidence against that competency. If the competency is already “met”, the course will still be added as evidence for that competency. If the competency is only set to “recommend” the course will be added as evidence and a review request will be created.&lt;br /&gt;
&lt;br /&gt;
The competency will be given the default value from the competency scale. You can select multiple competencies and add them all at once.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec17.jpg|frame|center|Course Competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teacher in a course, can manually mark the students against the course competencies. For each competency, the teacher will see all of the evidence linked to that competency for the student. They then can assign a value from the competency scale for the student, and optionally make a comment. A record of the teacher marking this competency will be added to the evidence of completion for this competency and the status of the competency will be updated in all active learning plans for the student.&lt;br /&gt;
&lt;br /&gt;
TODO - see how the information from the coverage report can be shown when linking course competencies.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec14.jpg|frame|center|Grading competencies within a course]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When manually marking a competency, it is recorded as evidence ie: &amp;amp;quot;Teacher X manually specified this value in this course&amp;amp;quot; - so if the same competency is linked to multiple course it can be marked in each, and this will show up as 2 pieces of evidence.&lt;br /&gt;
&lt;br /&gt;
Reports&lt;br /&gt;
&lt;br /&gt;
Students&lt;br /&gt;
&lt;br /&gt;
For an active Learning Plan, students can see a report of the competencies that are covered/not covered by their current list of enrolled courses. For each competency, they should also be able to see which courses they could enrol in to meet that competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec24.jpg|frame|center|Student Learning Plan Competencies page shows progress, and course discovery]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Students can see a list of their active learning plans on their dashboard, with a visual indication of progress (a progress bar). Each learning plan is a link to the learning plan report shown above.&lt;br /&gt;
&lt;br /&gt;
Teachers&lt;br /&gt;
&lt;br /&gt;
For teachers and course designers building a set of courses against a competency framework, they should be able to identify competencies that are over/underrepresented by a set of courses. To do this they access a learning plan template, and view the coverage report for that template. This competency coverage report initially shows the coverage from all courses that link to one of the competencies in the template, but the teacher can remove some courses from the selection and regenerate the report.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec09.jpg|frame|center|Coverage report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers and course designers can also see some statistics about a learning plan template. From the learning plan template page, they choose “Statistics” from the action menu to see the number of active/completed learning plans using this template, and the average completion % for the learning plans.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec13.jpg|frame|center|Statistics for Learning Plan Template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also see a report in a course that shows for each course competency, which users have completed or not completed it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec05.jpg|frame|center|Breakdown report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User roles and capabilities ==&lt;br /&gt;
&lt;br /&gt;
In this system, the actions a user can perform are governed by various capabilities, and are checked at one of several different context levels.&lt;br /&gt;
&lt;br /&gt;
As a reference, the relevant context levels in Moodle are organised in a tree like structure and an example is shown below:&lt;br /&gt;
&lt;br /&gt;
* Site&lt;br /&gt;
** User A&lt;br /&gt;
** User B&lt;br /&gt;
** Category A&lt;br /&gt;
*** Course A&lt;br /&gt;
*** Course B&lt;br /&gt;
** Category B&lt;br /&gt;
*** Category C&lt;br /&gt;
**** Course C&lt;br /&gt;
**** Course D&lt;br /&gt;
&lt;br /&gt;
=== Framework Administrators ===&lt;br /&gt;
&lt;br /&gt;
Competency framework administrators are the central people responsible for creating and maintaining the system wide competency frameworks.&lt;br /&gt;
&lt;br /&gt;
The actions a competency framework administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency within a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark a competency as related to another competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
=== Learning Plan Administrators ===&lt;br /&gt;
&lt;br /&gt;
Learning plan administrators are responsible for creating and maintaining learning plan templates relating to e.g. a specific faculty, set of courses, degree or certification.&lt;br /&gt;
&lt;br /&gt;
The actions a learning plan administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add and remove competencies from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign a user a learning plan from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planmanage“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View coverage report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpcoverage:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View statistics report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpstatistics:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View breakdown report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpbreakdown:view“ capability defined on the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve draft learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planapprove“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve competency review requests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencygrade“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
=== Teachers ===&lt;br /&gt;
&lt;br /&gt;
Teachers create and teach courses, that provide evidence of competencies.&lt;br /&gt;
&lt;br /&gt;
The actions a teacher can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign competencies to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencymanage” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manually grade competencies linked to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencygrade” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
=== Students ===&lt;br /&gt;
&lt;br /&gt;
Students are users that can have learning plans.&lt;br /&gt;
&lt;br /&gt;
The actions a student can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View their own learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planviewown” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create their own draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request approval for their draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Provide evidence of prior learning for a competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planaddevidence” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request for someone to grade them for a specific competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancompetencyrequestreview” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
== Further work (out of scope for first release) ==&lt;br /&gt;
&lt;br /&gt;
Add a rule to award badges when certain competencies are met&lt;br /&gt;
&lt;br /&gt;
This is a simple addition to the existing rules that can be configured to award a badge.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec20.jpg|frame|center|Custom badge condition]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linking activities as evidence of competencies ===&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec01.jpg|frame|center|Linking an activity to some course competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also quickly find resources and activities that have not been mapped to any competencies. This is done on the competency mapping report which shows all resources and activities for the course, as well as the linked competencies for each. This report will also list any course competencies that are not linked to any activities or resources.&lt;br /&gt;
&lt;br /&gt;
=== Alternative ways to “automatically complete” competencies ===&lt;br /&gt;
&lt;br /&gt;
* Trigger based on activity completion. Configured when linking competencies to a course.&lt;br /&gt;
&lt;br /&gt;
=== Additional reports ===&lt;br /&gt;
&lt;br /&gt;
E.g. https://moodle.org/mod/forum/discuss.php?d=316151#p1266980&lt;br /&gt;
&lt;br /&gt;
== Interaction with the existing Moodle “Outcomes” ==&lt;br /&gt;
&lt;br /&gt;
Description of existing “Outcomes”&lt;br /&gt;
&lt;br /&gt;
Outcomes define a set of system wide scales that can be used to grade activities. The value chosen from the scale is pushed to the gradebook for each activity and a custom report will show the average of outcomes across a course, or the entire site. Not all activities and resources support outcomes, only scorm, quiz, lti, lesson, glossary, data, chat, assign and forum.&lt;br /&gt;
&lt;br /&gt;
Any activity that has an outcome attached receives a new column in the gradebook where that outcome is assessed for that activity.&lt;br /&gt;
&lt;br /&gt;
Outcomes has some features that would need to be “removed” in order to make sense with competency frameworks (mainly pushing of grades to the gradebook) - this means we cannot build on outcomes, and maintain backwards compatibility. It is therefore recommended to provide:&lt;br /&gt;
&lt;br /&gt;
* A site wide setting to allow competencies - allow either/or but the default will be competencies with no outcomes.&lt;br /&gt;
* A simple way to create a competency framework from an existing set of outcomes.&lt;br /&gt;
* (optional - requires activity level competencies) A way to import existing outcomes grades as evidence for competencies.&lt;br /&gt;
&lt;br /&gt;
== Open questions for further feedback ==&lt;br /&gt;
&lt;br /&gt;
* Would you expect a teacher to be able to create their own competencies (limited to their own course)? Would competencies that are visible only to a single course (and potentially conflicting with competencies from another course) be really useful?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual questions?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual items on a rubric/marking guide?&lt;br /&gt;
* How should self-evaluation of competencies work?&lt;br /&gt;
&lt;br /&gt;
== Outstanding work for this spec ==&lt;br /&gt;
&lt;br /&gt;
* The examples should use consistent names for user types, competencies and courses. It would be easier to use a real example of competencies from a real framework&lt;br /&gt;
* The terminology for child/parent relationships should consistently be:&lt;br /&gt;
** Parent&lt;br /&gt;
** Sub-competency&lt;br /&gt;
* Technical spec (this doc is the requirements).&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48510</id>
		<title>Competency Based Education</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48510"/>
		<updated>2015-09-17T06:05:04Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Clarifying how a scale must be configured&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = Framework for competency-based education (CBE) in Moodle&lt;br /&gt;
|state = In Progress&lt;br /&gt;
|tracker = MDL-49458&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=316151&lt;br /&gt;
|assignee = [[User:Damyon Wiese]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
=Framework for competency-based education (CBE) in Moodle=&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
This specification describes our plan to improve support for outcomes-based education in Moodle core. There have been many other attempts to add such systems to Moodle but they all use different data structures and processes and are incompatible. Our aim here is to build basic central structures and APIs to store and manipulate this data, allowing the Moodle community to build innovative custom interfaces on top of it.&lt;br /&gt;
&lt;br /&gt;
This design is based on input from many existing implementations of outcomes/competencies and learning plans including:&lt;br /&gt;
&lt;br /&gt;
* “Outcomes 2” in Joule&lt;br /&gt;
* Totara&lt;br /&gt;
* Referentiel Activity Module (Skills Repository)&lt;br /&gt;
* ELIS&lt;br /&gt;
&lt;br /&gt;
The goal is to implement a system that supports competency based education in a flexible way so that it can be used effectively by the many different target audiences. &lt;br /&gt;
&lt;br /&gt;
The two main concepts are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Competencies&#039;&#039;&#039; - a unit of learning, such as &amp;quot;Can make exceptional beer&amp;quot;. Competencies can be assigned as goals of courses &amp;amp;ldquo;This course will teach you to make exceptional beer&amp;amp;rdquo;, and also to users: &amp;amp;ldquo;Billy can make exceptional beer&amp;amp;rdquo;. &lt;br /&gt;
Competencies can also be hierarchical, so that the competency above might be marked proficient when some combination of sub-competencies has been marked proficient. &lt;br /&gt;
For example : Can make exceptional beer ( Can choose good malt / Can choose good yeasts / Can brew beer in the good temperature / etc..)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Learning plans&#039;&#039;&#039; - a set of competencies that can be assigned to a student (or cohorts of students). Initially, they will all be marked &amp;quot;incomplete&amp;quot;. As students achieve each competency it is marked complete, thereby showing their progress towards finishing all of them. Students achieve competencies either automatically (by successfully completing a course with that competency) or manually (by proving to someone that they are competent via portfolio items etc).&lt;br /&gt;
&lt;br /&gt;
== Competencies ==&lt;br /&gt;
&lt;br /&gt;
A competency is a unit of learning. All competencies belong to a competency framework, and it is likely that a competency framework will be defined by an external body such as an academic standards board.&lt;br /&gt;
&lt;br /&gt;
To create a competency, you first define the framework and then add the competency to it.&lt;br /&gt;
&lt;br /&gt;
Competency frameworks are defined by “Framework Administrators” at the site level, or at a category level. To create and edit competency frameworks, go to “Site administration” -&amp;amp;gt; “Competency Frameworks”, or &amp;quot;Category administration -&amp;amp;gt; Competency frameworks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec21_v2.jpg|frame|center|Manage competency frameworks]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec19_v3.jpg|frame|center|Add new competency framework]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose “Add new competency framework” and create a new competency framework.&lt;br /&gt;
&lt;br /&gt;
The scale defines how a competency is marked as complete. Each competency framework can define which of the standard Moodle scales should be used when marking a competency. In addition, the “default” value from the scale (the one automatically set when a course is completed) can be configured, and the items from the scale that are deemed to be “proficient” can be defined. A &amp;quot;default&amp;quot; value and at least one &amp;quot;proficient&amp;quot; value must be defined.&lt;br /&gt;
&lt;br /&gt;
A competency framework may be available to the entire site - or limited to a course category. &lt;br /&gt;
&lt;br /&gt;
The taxonomy refers to the naming for each level in the framework. Up to 4 levels are supported, and the name for each level can be set from the following list:&lt;br /&gt;
Domain, Competency, Behaviour, Indicator, Outcome, Level, Concept, Value, Practice, Skill, Proficiency&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec02.jpg|frame|center|Configure scale]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to add competencies to the framework. We can import these from a file, or create them from scratch, or import them from Moodle outcomes. When importing competencies, any existing competencies with a matching idnumber will be updated.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec15.jpg|frame|center|Import competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be imported from the following formats:&lt;br /&gt;
&lt;br /&gt;
 (TBD - start with import from CSV).&lt;br /&gt;
&lt;br /&gt;
To see the competencies for a framework, click on the competency framework name.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec06_v2.jpg|frame|center|Manage competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where we can add and edit competencies in a framework. To edit an existing competency, select it in the competencies tree browser and choose “Edit” from the action menu in the selected competency panel.&lt;br /&gt;
&lt;br /&gt;
To add a new competency, first select the competency that should be the “parent” of this competency from the tree of competencies, and then click “Add Indicator” (the name comes from the taxonomy) from the selected competency panel. Tags can be used to categorise competencies for easy searching, e.g. year level, subject. Tags used for competencies are kept in a separate “tagcloud” (see https://tracker.moodle.org/browse/MDL-50851).&lt;br /&gt;
&lt;br /&gt;
A competency framework can be duplicated, and there is an admin tool for migrating courses from one framework to another (as long as the idnumbers between the competencies in the frameworks can be matched).&lt;br /&gt;
&lt;br /&gt;
If a competency has sub-competencies, you can configure the completion rule for the competency. The default completion rule is “Completed when all sub-competencies are complete”. For more complex rules - you can use a points based system to say when to complete or recommend a competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec23.jpg|frame|center|Add a competency]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be “related” to other competencies. The only effect of this is that the related competencies are listed in the summary of each competency, whenever it is displayed in Moodle. To add a “related” competency to an existing competency, select it from the competency framework and choose “Add related competency” from the action menu.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec03_v2.jpg|frame|center|Relating competencies to each other]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learning plan templates ==&lt;br /&gt;
&lt;br /&gt;
It would be cumbersome to individually add competencies to a large group of students, and it would be awkward if you made a mistake and had to change the competencies for all the students at a later date. To make this manageable, you can create a “Learning plan template” and assign it to many students. An example of a learning plan template could be: “Computer science, Undergraduate” which lists all the required competencies for a first year computer science student, or it could be more fine grained.&lt;br /&gt;
&lt;br /&gt;
Templates are created by a ”Learning Plan Administrator”. Templates can be imported and exported via CSV. Learning plan templates can be created at a course category, or a site level.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec22_v2.jpg|frame|center|Manage Learning Plan Templates]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have created a template, you can add competencies to it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec18.jpg|frame|center|List competencies in a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec00.jpg|frame|center|Add competency to a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding competencies to a template will update all the learning plans based on that template.&lt;br /&gt;
&lt;br /&gt;
== User learning plans ==&lt;br /&gt;
&lt;br /&gt;
A user learning plan is a collection of all the competencies they should achieve, optionally before a certain date.&lt;br /&gt;
&lt;br /&gt;
Any user can create their own learning plan, if they have the capability on their own context.&lt;br /&gt;
&lt;br /&gt;
A “Learning Plan Administrator” can create learning plans for other users. They can create the plans individually though another users profile page, or they can create learning plans in bulk from a learning plan template.&lt;br /&gt;
&lt;br /&gt;
Users learning plans can be in one of 3 states, Draft, Active or Completed. Only someone with the capability tool/lp:planmanage (or tool/lp:planmanageown if it’s their own plan) capability can approve learning plans.&lt;br /&gt;
&lt;br /&gt;
A plan can be manually set to completed, by someone with the capabilities listed above, or it will be set to completed when the due date for the plan expires.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec07.jpg|frame|center|Single users learning plans page]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec16.jpg|frame|center|Bulk create user learning plans]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that sites using enrolment plugins can create a cohort based on the enrolments of a set of courses using the admin tool “Course cohorts”. More detail required here.&lt;br /&gt;
&lt;br /&gt;
Competencies can be added to a users learning plan, or to the template the plan was created from and they will automatically appear in the users learning plan. Competencies that exist in the template cannot be removed from the users learning plan. If a single student requires e.g. exemptions from certain competencies - their learning plan can be &amp;quot;unlinked&amp;quot; from the template. This plan will no longer show up in reports generated from the learning plan template - but can now be freely edited.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec12.jpg|frame|center|User learning plan competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, there can be multiple types of evidence for the same competency. E.g. 2 courses may provide evidence for the same competency and both courses were completed. In this case - both would show as evidence. There can also be multiple examples of &amp;amp;quot;Evidence of prior learning&amp;amp;quot; attached to each competency.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Each competency in the table is colour coded to indicate one of the following:&lt;br /&gt;
&lt;br /&gt;
* brown - competency not met, and no evidence or enrolled courses cover this competency&lt;br /&gt;
* orange - the competency is not met, but there is evidence, or “in-progress” courses that cover this competency&lt;br /&gt;
* green - the competency has been met&lt;br /&gt;
&lt;br /&gt;
If you have the capability tool/lp:planaddevidence you can upload files and urls against a competency in your plan as evidence of prior learning. You can also request that a someone with the capability tool/lp:planmanage reviews the evidence and either rejects or accepts the evidence and changes the status for the competency in the plan.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec25.jpg|frame|center|Provide evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec08.jpg|frame|center|Link evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view all the current requests for review, a new “Learning plans” block can be added to an “approvers” dashboard.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec10.jpg|frame|center|Dashboard Block]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A User with the capability “tool/lp:planmanage” (at the context of another users plan) can review and approve competency approval requests. A competency approval request is a request for someone to review the evidence that a user has provided against a specific competency and make a decision whether the user has either met or not met the competency. The valid statuses for a review are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There can only be one “review” per competency for each user (if a review is rejected, and then a new request is made, the previous review will be changed from “Rejected” to “Waiting for review”).&lt;br /&gt;
&lt;br /&gt;
Following the link in the Learning Plans dashboard block, the approver goes to a page that lists all the requests waiting to be approved, and from here they can approve or reject each request. They can also leave comments that will be visible to the student, or to any other reviewers.&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a review an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a review, or a review is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
When a completion rule triggers a “recommendation” - the evidence will be added to the competency, and the system will request a “review” of this competency.&lt;br /&gt;
&lt;br /&gt;
TODO Define a new page for assigning roles relative to a user. In totara, there is a “positions” page which does this. This will also be useful for “Mentees”.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec11.jpg|frame|center|Review competency requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If users have the capability to create their own draft learning plans, but not approve them themselves, someone will need to review all the draft learning plan requests and decide whether or not to make them active. This user can be anyone with “tool/lp:planmanage” capability (at the context of each user with a plan to approve) and they can view all the “Learning plans to approve” link in the Learning Plans dashboard block.&lt;br /&gt;
&lt;br /&gt;
A learning plan approval request made by a user with a draft learning plan from their “Manage learning plans page”. Once a request has been made, the valid statuses for a learning plan approval request are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a learning plans approval request an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a learning plan approval request, or a learning plan approval request is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec04.jpg|frame|center|Review Learning Plan Approval Requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Course Competencies ==&lt;br /&gt;
&lt;br /&gt;
Competencies can also be linked to a course. This means that when a student completes a course (see course completion) - all of the linked competencies will be marked as “complete” or “recommended” in any of the students active learning plans and the course will be added as evidence against that competency. If the competency is already “met”, the course will still be added as evidence for that competency. If the competency is only set to “recommend” the course will be added as evidence and a review request will be created.&lt;br /&gt;
&lt;br /&gt;
The competency will be given the default value from the competency scale. You can select multiple competencies and add them all at once.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec17.jpg|frame|center|Course Competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teacher in a course, can manually mark the students against the course competencies. For each competency, the teacher will see all of the evidence linked to that competency for the student. They then can assign a value from the competency scale for the student, and optionally make a comment. A record of the teacher marking this competency will be added to the evidence of completion for this competency and the status of the competency will be updated in all active learning plans for the student.&lt;br /&gt;
&lt;br /&gt;
TODO - see how the information from the coverage report can be shown when linking course competencies.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec14.jpg|frame|center|Grading competencies within a course]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When manually marking a competency, it is recorded as evidence ie: &amp;amp;quot;Teacher X manually specified this value in this course&amp;amp;quot; - so if the same competency is linked to multiple course it can be marked in each, and this will show up as 2 pieces of evidence.&lt;br /&gt;
&lt;br /&gt;
Reports&lt;br /&gt;
&lt;br /&gt;
Students&lt;br /&gt;
&lt;br /&gt;
For an active Learning Plan, students can see a report of the competencies that are covered/not covered by their current list of enrolled courses. For each competency, they should also be able to see which courses they could enrol in to meet that competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec24.jpg|frame|center|Student Learning Plan Competencies page shows progress, and course discovery]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Students can see a list of their active learning plans on their dashboard, with a visual indication of progress (a progress bar). Each learning plan is a link to the learning plan report shown above.&lt;br /&gt;
&lt;br /&gt;
Teachers&lt;br /&gt;
&lt;br /&gt;
For teachers and course designers building a set of courses against a competency framework, they should be able to identify competencies that are over/underrepresented by a set of courses. To do this they access a learning plan template, and view the coverage report for that template. This competency coverage report initially shows the coverage from all courses that link to one of the competencies in the template, but the teacher can remove some courses from the selection and regenerate the report.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec09.jpg|frame|center|Coverage report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers and course designers can also see some statistics about a learning plan template. From the learning plan template page, they choose “Statistics” from the action menu to see the number of active/completed learning plans using this template, and the average completion % for the learning plans.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec13.jpg|frame|center|Statistics for Learning Plan Template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also see a report in a course that shows for each course competency, which users have completed or not completed it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec05.jpg|frame|center|Breakdown report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User roles and capabilities ==&lt;br /&gt;
&lt;br /&gt;
In this system, the actions a user can perform are governed by various capabilities, and are checked at one of several different context levels.&lt;br /&gt;
&lt;br /&gt;
As a reference, the relevant context levels in Moodle are organised in a tree like structure and an example is shown below:&lt;br /&gt;
&lt;br /&gt;
* Site&lt;br /&gt;
** User A&lt;br /&gt;
** User B&lt;br /&gt;
** Category A&lt;br /&gt;
*** Course A&lt;br /&gt;
*** Course B&lt;br /&gt;
** Category B&lt;br /&gt;
*** Category C&lt;br /&gt;
**** Course C&lt;br /&gt;
**** Course D&lt;br /&gt;
&lt;br /&gt;
=== Framework Administrators ===&lt;br /&gt;
&lt;br /&gt;
Competency framework administrators are the central people responsible for creating and maintaining the system wide competency frameworks.&lt;br /&gt;
&lt;br /&gt;
The actions a competency framework administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency within a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark a competency as related to another competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
=== Learning Plan Administrators ===&lt;br /&gt;
&lt;br /&gt;
Learning plan administrators are responsible for creating and maintaining learning plan templates relating to e.g. a specific faculty, set of courses, degree or certification.&lt;br /&gt;
&lt;br /&gt;
The actions a learning plan administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add and remove competencies from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign a user a learning plan from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planmanage“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View coverage report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpcoverage:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View statistics report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpstatistics:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View breakdown report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpbreakdown:view“ capability defined on the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve draft learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planapprove“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve competency review requests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencygrade“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
=== Teachers ===&lt;br /&gt;
&lt;br /&gt;
Teachers create and teach courses, that provide evidence of competencies.&lt;br /&gt;
&lt;br /&gt;
The actions a teacher can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign competencies to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencymanage” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manually grade competencies linked to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencygrade” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
=== Students ===&lt;br /&gt;
&lt;br /&gt;
Students are users that can have learning plans.&lt;br /&gt;
&lt;br /&gt;
The actions a student can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View their own learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planviewown” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create their own draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request approval for their draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Provide evidence of prior learning for a competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planaddevidence” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request for someone to grade them for a specific competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancompetencyrequestreview” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
== Further work (out of scope for first release) ==&lt;br /&gt;
&lt;br /&gt;
Add a rule to award badges when certain competencies are met&lt;br /&gt;
&lt;br /&gt;
This is a simple addition to the existing rules that can be configured to award a badge.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec20.jpg|frame|center|Custom badge condition]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linking activities as evidence of competencies ===&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec01.jpg|frame|center|Linking an activity to some course competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also quickly find resources and activities that have not been mapped to any competencies. This is done on the competency mapping report which shows all resources and activities for the course, as well as the linked competencies for each. This report will also list any course competencies that are not linked to any activities or resources.&lt;br /&gt;
&lt;br /&gt;
=== Alternative ways to “automatically complete” competencies ===&lt;br /&gt;
&lt;br /&gt;
* Trigger based on activity completion. Configured when linking competencies to a course.&lt;br /&gt;
&lt;br /&gt;
=== Additional reports ===&lt;br /&gt;
&lt;br /&gt;
E.g. https://moodle.org/mod/forum/discuss.php?d=316151#p1266980&lt;br /&gt;
&lt;br /&gt;
== Interaction with the existing Moodle “Outcomes” ==&lt;br /&gt;
&lt;br /&gt;
Description of existing “Outcomes”&lt;br /&gt;
&lt;br /&gt;
Outcomes define a set of system wide scales that can be used to grade activities. The value chosen from the scale is pushed to the gradebook for each activity and a custom report will show the average of outcomes across a course, or the entire site. Not all activities and resources support outcomes, only scorm, quiz, lti, lesson, glossary, data, chat, assign and forum.&lt;br /&gt;
&lt;br /&gt;
Any activity that has an outcome attached receives a new column in the gradebook where that outcome is assessed for that activity.&lt;br /&gt;
&lt;br /&gt;
Outcomes has some features that would need to be “removed” in order to make sense with competency frameworks (mainly pushing of grades to the gradebook) - this means we cannot build on outcomes, and maintain backwards compatibility. It is therefore recommended to provide:&lt;br /&gt;
&lt;br /&gt;
* A site wide setting to allow competencies - allow either/or but the default will be competencies with no outcomes.&lt;br /&gt;
* A simple way to create a competency framework from an existing set of outcomes.&lt;br /&gt;
* (optional - requires activity level competencies) A way to import existing outcomes grades as evidence for competencies.&lt;br /&gt;
&lt;br /&gt;
== Open questions for further feedback ==&lt;br /&gt;
&lt;br /&gt;
* Would you expect a teacher to be able to create their own competencies (limited to their own course)? Would competencies that are visible only to a single course (and potentially conflicting with competencies from another course) be really useful?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual questions?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual items on a rubric/marking guide?&lt;br /&gt;
* How should self-evaluation of competencies work?&lt;br /&gt;
&lt;br /&gt;
== Outstanding work for this spec ==&lt;br /&gt;
&lt;br /&gt;
* The examples should use consistent names for user types, competencies and courses. It would be easier to use a real example of competencies from a real framework&lt;br /&gt;
* The terminology for child/parent relationships should consistently be:&lt;br /&gt;
** Parent&lt;br /&gt;
** Sub-competency&lt;br /&gt;
* Technical spec (this doc is the requirements).&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48509</id>
		<title>Competency Based Education</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Competency_Based_Education&amp;diff=48509"/>
		<updated>2015-09-17T05:08:39Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Clarifying that competency frameworks can be created at category level&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Project&lt;br /&gt;
|name = Framework for competency-based education (CBE) in Moodle&lt;br /&gt;
|state = In Progress&lt;br /&gt;
|tracker = MDL-49458&lt;br /&gt;
|discussion = https://moodle.org/mod/forum/discuss.php?d=316151&lt;br /&gt;
|assignee = [[User:Damyon Wiese]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Work in progress}}&lt;br /&gt;
&lt;br /&gt;
=Framework for competency-based education (CBE) in Moodle=&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
This specification describes our plan to improve support for outcomes-based education in Moodle core. There have been many other attempts to add such systems to Moodle but they all use different data structures and processes and are incompatible. Our aim here is to build basic central structures and APIs to store and manipulate this data, allowing the Moodle community to build innovative custom interfaces on top of it.&lt;br /&gt;
&lt;br /&gt;
This design is based on input from many existing implementations of outcomes/competencies and learning plans including:&lt;br /&gt;
&lt;br /&gt;
* “Outcomes 2” in Joule&lt;br /&gt;
* Totara&lt;br /&gt;
* Referentiel Activity Module (Skills Repository)&lt;br /&gt;
* ELIS&lt;br /&gt;
&lt;br /&gt;
The goal is to implement a system that supports competency based education in a flexible way so that it can be used effectively by the many different target audiences. &lt;br /&gt;
&lt;br /&gt;
The two main concepts are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Competencies&#039;&#039;&#039; - a unit of learning, such as &amp;quot;Can make exceptional beer&amp;quot;. Competencies can be assigned as goals of courses &amp;amp;ldquo;This course will teach you to make exceptional beer&amp;amp;rdquo;, and also to users: &amp;amp;ldquo;Billy can make exceptional beer&amp;amp;rdquo;. &lt;br /&gt;
Competencies can also be hierarchical, so that the competency above might be marked proficient when some combination of sub-competencies has been marked proficient. &lt;br /&gt;
For example : Can make exceptional beer ( Can choose good malt / Can choose good yeasts / Can brew beer in the good temperature / etc..)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Learning plans&#039;&#039;&#039; - a set of competencies that can be assigned to a student (or cohorts of students). Initially, they will all be marked &amp;quot;incomplete&amp;quot;. As students achieve each competency it is marked complete, thereby showing their progress towards finishing all of them. Students achieve competencies either automatically (by successfully completing a course with that competency) or manually (by proving to someone that they are competent via portfolio items etc).&lt;br /&gt;
&lt;br /&gt;
== Competencies ==&lt;br /&gt;
&lt;br /&gt;
A competency is a unit of learning. All competencies belong to a competency framework, and it is likely that a competency framework will be defined by an external body such as an academic standards board.&lt;br /&gt;
&lt;br /&gt;
To create a competency, you first define the framework and then add the competency to it.&lt;br /&gt;
&lt;br /&gt;
Competency frameworks are defined by “Framework Administrators” at the site level, or at a category level. To create and edit competency frameworks, go to “Site administration” -&amp;amp;gt; “Competency Frameworks”, or &amp;quot;Category administration -&amp;amp;gt; Competency frameworks&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec21_v2.jpg|frame|center|Manage competency frameworks]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec19_v3.jpg|frame|center|Add new competency framework]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose “Add new competency framework” and create a new competency framework.&lt;br /&gt;
&lt;br /&gt;
The scale defines how a competency is marked as complete. Each competency framework can define which of the standard Moodle scales should be used when marking a competency. In addition, the “default” value from the scale (the one automatically set when a course is completed) can be configured, and the items from the scale that are deemed to be “proficient” can be defined. &lt;br /&gt;
&lt;br /&gt;
A competency framework may be available to the entire site - or limited to a course category. &lt;br /&gt;
&lt;br /&gt;
The taxonomy refers to the naming for each level in the framework. Up to 4 levels are supported, and the name for each level can be set from the following list:&lt;br /&gt;
Domain, Competency, Behaviour, Indicator, Outcome, Level, Concept, Value, Practice, Skill, Proficiency&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec02.jpg|frame|center|Configure scale]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to add competencies to the framework. We can import these from a file, or create them from scratch, or import them from Moodle outcomes. When importing competencies, any existing competencies with a matching idnumber will be updated.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec15.jpg|frame|center|Import competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be imported from the following formats:&lt;br /&gt;
&lt;br /&gt;
 (TBD - start with import from CSV).&lt;br /&gt;
&lt;br /&gt;
To see the competencies for a framework, click on the competency framework name.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec06_v2.jpg|frame|center|Manage competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is where we can add and edit competencies in a framework. To edit an existing competency, select it in the competencies tree browser and choose “Edit” from the action menu in the selected competency panel.&lt;br /&gt;
&lt;br /&gt;
To add a new competency, first select the competency that should be the “parent” of this competency from the tree of competencies, and then click “Add Indicator” (the name comes from the taxonomy) from the selected competency panel. Tags can be used to categorise competencies for easy searching, e.g. year level, subject. Tags used for competencies are kept in a separate “tagcloud” (see https://tracker.moodle.org/browse/MDL-50851).&lt;br /&gt;
&lt;br /&gt;
A competency framework can be duplicated, and there is an admin tool for migrating courses from one framework to another (as long as the idnumbers between the competencies in the frameworks can be matched).&lt;br /&gt;
&lt;br /&gt;
If a competency has sub-competencies, you can configure the completion rule for the competency. The default completion rule is “Completed when all sub-competencies are complete”. For more complex rules - you can use a points based system to say when to complete or recommend a competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec23.jpg|frame|center|Add a competency]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Competencies can be “related” to other competencies. The only effect of this is that the related competencies are listed in the summary of each competency, whenever it is displayed in Moodle. To add a “related” competency to an existing competency, select it from the competency framework and choose “Add related competency” from the action menu.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec03_v2.jpg|frame|center|Relating competencies to each other]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Learning plan templates ==&lt;br /&gt;
&lt;br /&gt;
It would be cumbersome to individually add competencies to a large group of students, and it would be awkward if you made a mistake and had to change the competencies for all the students at a later date. To make this manageable, you can create a “Learning plan template” and assign it to many students. An example of a learning plan template could be: “Computer science, Undergraduate” which lists all the required competencies for a first year computer science student, or it could be more fine grained.&lt;br /&gt;
&lt;br /&gt;
Templates are created by a ”Learning Plan Administrator”. Templates can be imported and exported via CSV. Learning plan templates can be created at a course category, or a site level.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec22_v2.jpg|frame|center|Manage Learning Plan Templates]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have created a template, you can add competencies to it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec18.jpg|frame|center|List competencies in a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec00.jpg|frame|center|Add competency to a template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adding competencies to a template will update all the learning plans based on that template.&lt;br /&gt;
&lt;br /&gt;
== User learning plans ==&lt;br /&gt;
&lt;br /&gt;
A user learning plan is a collection of all the competencies they should achieve, optionally before a certain date.&lt;br /&gt;
&lt;br /&gt;
Any user can create their own learning plan, if they have the capability on their own context.&lt;br /&gt;
&lt;br /&gt;
A “Learning Plan Administrator” can create learning plans for other users. They can create the plans individually though another users profile page, or they can create learning plans in bulk from a learning plan template.&lt;br /&gt;
&lt;br /&gt;
Users learning plans can be in one of 3 states, Draft, Active or Completed. Only someone with the capability tool/lp:planmanage (or tool/lp:planmanageown if it’s their own plan) capability can approve learning plans.&lt;br /&gt;
&lt;br /&gt;
A plan can be manually set to completed, by someone with the capabilities listed above, or it will be set to completed when the due date for the plan expires.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec07.jpg|frame|center|Single users learning plans page]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec16.jpg|frame|center|Bulk create user learning plans]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that sites using enrolment plugins can create a cohort based on the enrolments of a set of courses using the admin tool “Course cohorts”. More detail required here.&lt;br /&gt;
&lt;br /&gt;
Competencies can be added to a users learning plan, or to the template the plan was created from and they will automatically appear in the users learning plan. Competencies that exist in the template cannot be removed from the users learning plan. If a single student requires e.g. exemptions from certain competencies - their learning plan can be &amp;quot;unlinked&amp;quot; from the template. This plan will no longer show up in reports generated from the learning plan template - but can now be freely edited.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec12.jpg|frame|center|User learning plan competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, there can be multiple types of evidence for the same competency. E.g. 2 courses may provide evidence for the same competency and both courses were completed. In this case - both would show as evidence. There can also be multiple examples of &amp;amp;quot;Evidence of prior learning&amp;amp;quot; attached to each competency.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;Each competency in the table is colour coded to indicate one of the following:&lt;br /&gt;
&lt;br /&gt;
* brown - competency not met, and no evidence or enrolled courses cover this competency&lt;br /&gt;
* orange - the competency is not met, but there is evidence, or “in-progress” courses that cover this competency&lt;br /&gt;
* green - the competency has been met&lt;br /&gt;
&lt;br /&gt;
If you have the capability tool/lp:planaddevidence you can upload files and urls against a competency in your plan as evidence of prior learning. You can also request that a someone with the capability tool/lp:planmanage reviews the evidence and either rejects or accepts the evidence and changes the status for the competency in the plan.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec25.jpg|frame|center|Provide evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec08.jpg|frame|center|Link evidence]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To view all the current requests for review, a new “Learning plans” block can be added to an “approvers” dashboard.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec10.jpg|frame|center|Dashboard Block]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A User with the capability “tool/lp:planmanage” (at the context of another users plan) can review and approve competency approval requests. A competency approval request is a request for someone to review the evidence that a user has provided against a specific competency and make a decision whether the user has either met or not met the competency. The valid statuses for a review are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There can only be one “review” per competency for each user (if a review is rejected, and then a new request is made, the previous review will be changed from “Rejected” to “Waiting for review”).&lt;br /&gt;
&lt;br /&gt;
Following the link in the Learning Plans dashboard block, the approver goes to a page that lists all the requests waiting to be approved, and from here they can approve or reject each request. They can also leave comments that will be visible to the student, or to any other reviewers.&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a review an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a review, or a review is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
When a completion rule triggers a “recommendation” - the evidence will be added to the competency, and the system will request a “review” of this competency.&lt;br /&gt;
&lt;br /&gt;
TODO Define a new page for assigning roles relative to a user. In totara, there is a “positions” page which does this. This will also be useful for “Mentees”.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec11.jpg|frame|center|Review competency requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If users have the capability to create their own draft learning plans, but not approve them themselves, someone will need to review all the draft learning plan requests and decide whether or not to make them active. This user can be anyone with “tool/lp:planmanage” capability (at the context of each user with a plan to approve) and they can view all the “Learning plans to approve” link in the Learning Plans dashboard block.&lt;br /&gt;
&lt;br /&gt;
A learning plan approval request made by a user with a draft learning plan from their “Manage learning plans page”. Once a request has been made, the valid statuses for a learning plan approval request are:&lt;br /&gt;
&lt;br /&gt;
* Waiting for review&lt;br /&gt;
* In review&lt;br /&gt;
* Accepted&lt;br /&gt;
* Rejected&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:review_flow_v2.jpg|frame|center|Flow chart of review process]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To allow multiple authorisers to work together, when looking at a learning plans approval request an authoriser can click on a “Start review” button which will change the status of the request to “In review” and assign them as the reviewer for the request.&lt;br /&gt;
&lt;br /&gt;
Whenever a comment is made against a learning plan approval request, or a learning plan approval request is accepted or rejected, the student will receive a message about the change.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec04.jpg|frame|center|Review Learning Plan Approval Requests]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Course Competencies ==&lt;br /&gt;
&lt;br /&gt;
Competencies can also be linked to a course. This means that when a student completes a course (see course completion) - all of the linked competencies will be marked as “complete” or “recommended” in any of the students active learning plans and the course will be added as evidence against that competency. If the competency is already “met”, the course will still be added as evidence for that competency. If the competency is only set to “recommend” the course will be added as evidence and a review request will be created.&lt;br /&gt;
&lt;br /&gt;
The competency will be given the default value from the competency scale. You can select multiple competencies and add them all at once.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec17.jpg|frame|center|Course Competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teacher in a course, can manually mark the students against the course competencies. For each competency, the teacher will see all of the evidence linked to that competency for the student. They then can assign a value from the competency scale for the student, and optionally make a comment. A record of the teacher marking this competency will be added to the evidence of completion for this competency and the status of the competency will be updated in all active learning plans for the student.&lt;br /&gt;
&lt;br /&gt;
TODO - see how the information from the coverage report can be shown when linking course competencies.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec14.jpg|frame|center|Grading competencies within a course]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When manually marking a competency, it is recorded as evidence ie: &amp;amp;quot;Teacher X manually specified this value in this course&amp;amp;quot; - so if the same competency is linked to multiple course it can be marked in each, and this will show up as 2 pieces of evidence.&lt;br /&gt;
&lt;br /&gt;
Reports&lt;br /&gt;
&lt;br /&gt;
Students&lt;br /&gt;
&lt;br /&gt;
For an active Learning Plan, students can see a report of the competencies that are covered/not covered by their current list of enrolled courses. For each competency, they should also be able to see which courses they could enrol in to meet that competency.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec24.jpg|frame|center|Student Learning Plan Competencies page shows progress, and course discovery]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Students can see a list of their active learning plans on their dashboard, with a visual indication of progress (a progress bar). Each learning plan is a link to the learning plan report shown above.&lt;br /&gt;
&lt;br /&gt;
Teachers&lt;br /&gt;
&lt;br /&gt;
For teachers and course designers building a set of courses against a competency framework, they should be able to identify competencies that are over/underrepresented by a set of courses. To do this they access a learning plan template, and view the coverage report for that template. This competency coverage report initially shows the coverage from all courses that link to one of the competencies in the template, but the teacher can remove some courses from the selection and regenerate the report.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec09.jpg|frame|center|Coverage report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers and course designers can also see some statistics about a learning plan template. From the learning plan template page, they choose “Statistics” from the action menu to see the number of active/completed learning plans using this template, and the average completion % for the learning plans.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec13.jpg|frame|center|Statistics for Learning Plan Template]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also see a report in a course that shows for each course competency, which users have completed or not completed it.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec05.jpg|frame|center|Breakdown report]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User roles and capabilities ==&lt;br /&gt;
&lt;br /&gt;
In this system, the actions a user can perform are governed by various capabilities, and are checked at one of several different context levels.&lt;br /&gt;
&lt;br /&gt;
As a reference, the relevant context levels in Moodle are organised in a tree like structure and an example is shown below:&lt;br /&gt;
&lt;br /&gt;
* Site&lt;br /&gt;
** User A&lt;br /&gt;
** User B&lt;br /&gt;
** Category A&lt;br /&gt;
*** Course A&lt;br /&gt;
*** Course B&lt;br /&gt;
** Category B&lt;br /&gt;
*** Category C&lt;br /&gt;
**** Course C&lt;br /&gt;
**** Course D&lt;br /&gt;
&lt;br /&gt;
=== Framework Administrators ===&lt;br /&gt;
&lt;br /&gt;
Competency framework administrators are the central people responsible for creating and maintaining the system wide competency frameworks.&lt;br /&gt;
&lt;br /&gt;
The actions a competency framework administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a competency within a competency framework&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mark a competency as related to another competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencymanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
=== Learning Plan Administrators ===&lt;br /&gt;
&lt;br /&gt;
Learning plan administrators are responsible for creating and maintaining learning plan templates relating to e.g. a specific faculty, set of courses, degree or certification.&lt;br /&gt;
&lt;br /&gt;
The actions a learning plan administrator can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create/Edit/Delete a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Add and remove competencies from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:templatemanage” capability defined at the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign a user a learning plan from a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planmanage“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View coverage report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpcoverage:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View statistics report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpstatistics:view“ capability defined on the “Site” or &amp;quot;Course Category&amp;quot; context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View breakdown report for a learning plan template&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “report/lpbreakdown:view“ capability defined on the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve draft learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planapprove“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Approve competency review requests&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:competencygrade“ capability defined on the “User” context level.&lt;br /&gt;
&lt;br /&gt;
=== Teachers ===&lt;br /&gt;
&lt;br /&gt;
Teachers create and teach courses, that provide evidence of competencies.&lt;br /&gt;
&lt;br /&gt;
The actions a teacher can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assign competencies to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencymanage” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manually grade competencies linked to a course&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:coursecompetencygrade” capability defined at the “Course” context level.&lt;br /&gt;
&lt;br /&gt;
=== Students ===&lt;br /&gt;
&lt;br /&gt;
Students are users that can have learning plans.&lt;br /&gt;
&lt;br /&gt;
The actions a student can take are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;View their own learning plans&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planviewown” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create their own draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request approval for their draft learning plan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancreatedraft” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Provide evidence of prior learning for a competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:planaddevidence” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Request for someone to grade them for a specific competency&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Requires “tool/lp:plancompetencyrequestreview” capability defined at the “User” context level.&lt;br /&gt;
&lt;br /&gt;
== Further work (out of scope for first release) ==&lt;br /&gt;
&lt;br /&gt;
Add a rule to award badges when certain competencies are met&lt;br /&gt;
&lt;br /&gt;
This is a simple addition to the existing rules that can be configured to award a badge.&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec20.jpg|frame|center|Custom badge condition]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Linking activities as evidence of competencies ===&lt;br /&gt;
&lt;br /&gt;
[[Image:cbe_spec01.jpg|frame|center|Linking an activity to some course competencies]]&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teachers can also quickly find resources and activities that have not been mapped to any competencies. This is done on the competency mapping report which shows all resources and activities for the course, as well as the linked competencies for each. This report will also list any course competencies that are not linked to any activities or resources.&lt;br /&gt;
&lt;br /&gt;
=== Alternative ways to “automatically complete” competencies ===&lt;br /&gt;
&lt;br /&gt;
* Trigger based on activity completion. Configured when linking competencies to a course.&lt;br /&gt;
&lt;br /&gt;
=== Additional reports ===&lt;br /&gt;
&lt;br /&gt;
E.g. https://moodle.org/mod/forum/discuss.php?d=316151#p1266980&lt;br /&gt;
&lt;br /&gt;
== Interaction with the existing Moodle “Outcomes” ==&lt;br /&gt;
&lt;br /&gt;
Description of existing “Outcomes”&lt;br /&gt;
&lt;br /&gt;
Outcomes define a set of system wide scales that can be used to grade activities. The value chosen from the scale is pushed to the gradebook for each activity and a custom report will show the average of outcomes across a course, or the entire site. Not all activities and resources support outcomes, only scorm, quiz, lti, lesson, glossary, data, chat, assign and forum.&lt;br /&gt;
&lt;br /&gt;
Any activity that has an outcome attached receives a new column in the gradebook where that outcome is assessed for that activity.&lt;br /&gt;
&lt;br /&gt;
Outcomes has some features that would need to be “removed” in order to make sense with competency frameworks (mainly pushing of grades to the gradebook) - this means we cannot build on outcomes, and maintain backwards compatibility. It is therefore recommended to provide:&lt;br /&gt;
&lt;br /&gt;
* A site wide setting to allow competencies - allow either/or but the default will be competencies with no outcomes.&lt;br /&gt;
* A simple way to create a competency framework from an existing set of outcomes.&lt;br /&gt;
* (optional - requires activity level competencies) A way to import existing outcomes grades as evidence for competencies.&lt;br /&gt;
&lt;br /&gt;
== Open questions for further feedback ==&lt;br /&gt;
&lt;br /&gt;
* Would you expect a teacher to be able to create their own competencies (limited to their own course)? Would competencies that are visible only to a single course (and potentially conflicting with competencies from another course) be really useful?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual questions?&lt;br /&gt;
* Do we need to allow competencies to be linked to individual items on a rubric/marking guide?&lt;br /&gt;
* How should self-evaluation of competencies work?&lt;br /&gt;
&lt;br /&gt;
== Outstanding work for this spec ==&lt;br /&gt;
&lt;br /&gt;
* The examples should use consistent names for user types, competencies and courses. It would be easier to use a real example of competencies from a real framework&lt;br /&gt;
* The terminology for child/parent relationships should consistently be:&lt;br /&gt;
** Parent&lt;br /&gt;
** Sub-competency&lt;br /&gt;
* Technical spec (this doc is the requirements).&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=47772</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=47772"/>
		<updated>2015-05-06T04:04:13Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Adding Amazon S3&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.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000-2006 John Lim (&#039;&#039;jlim AT natsoft DOT com DOT my&#039;&#039;)&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;
==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-dev&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&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;
==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;
==FPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/fpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 1.53&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: Freeware&lt;br /&gt;
&lt;br /&gt;
==GeoIP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geoip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for precessing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 1.6&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.maxmind.com/app/php&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;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text.php&#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: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  Mark Wilton-Jones&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://roundcube.net/&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;
==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;
==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;
==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;
==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.4&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;
==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;
==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;
==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;
==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;
==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;
==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;
==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 1.73&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;
&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.0b9 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2004 , John Gruber&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 , Michel Fortin&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&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;
==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;
==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;
==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;
==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: 2.3.0&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;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=47771</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=47771"/>
		<updated>2015-05-06T03:59:02Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* ADOdb */&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.19&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000-2006 John Lim (&#039;&#039;jlim AT natsoft DOT com DOT my&#039;&#039;)&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;
==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;
==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;
==FPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/fpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 1.53&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: Freeware&lt;br /&gt;
&lt;br /&gt;
==GeoIP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geoip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for precessing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 1.6&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.maxmind.com/app/php&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;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text.php&#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: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  Mark Wilton-Jones&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://roundcube.net/&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;
==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;
==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;
==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;
==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.4&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;
==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;
==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;
==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;
==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;
==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;
==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;
==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 1.73&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;
&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.0b9 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2004 , John Gruber&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 , Michel Fortin&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&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;
==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;
==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;
==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;
==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: 2.3.0&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;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Moodle_libraries_credits&amp;diff=47770</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=47770"/>
		<updated>2015-05-06T03:55:12Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* Typo3 Character Set Class */&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: 4.93&lt;br /&gt;
&lt;br /&gt;
Copyright © 2000-2006 John Lim (&#039;&#039;jlim AT natsoft DOT com DOT my&#039;&#039;)&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;
==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;
==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;
==FPDF Class==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/fpdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Class to generate PDF files&lt;br /&gt;
&lt;br /&gt;
Version: 1.53&lt;br /&gt;
&lt;br /&gt;
Copyright Olivier PLATHEY&lt;br /&gt;
&lt;br /&gt;
License: Freeware&lt;br /&gt;
&lt;br /&gt;
==GeoIP==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/geoip&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Library for precessing of GeoIP data files&lt;br /&gt;
&lt;br /&gt;
Version: 1.6&lt;br /&gt;
&lt;br /&gt;
Copyright MaxMind&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.maxmind.com/app/php&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;
==html2text==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;lib/html2text.php&#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: 1.0 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2002  Mark Wilton-Jones&lt;br /&gt;
&lt;br /&gt;
License: GNU GPL&lt;br /&gt;
&lt;br /&gt;
http://roundcube.net/&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;
==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;
==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;
==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;
==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.4&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;
==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;
==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;
==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;
==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;
==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;
==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;
==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 1.73&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;
&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.0b9 (with modifications)&lt;br /&gt;
&lt;br /&gt;
Copyright © 2003-2004 , John Gruber&lt;br /&gt;
&lt;br /&gt;
Copyright © 2004 , Michel Fortin&lt;br /&gt;
&lt;br /&gt;
License: LGPL&lt;br /&gt;
&lt;br /&gt;
http://www.michelf.com/projects/php-markdown/&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;
==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;
==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;
==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;
==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: 2.3.0&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;
[[Category:Credits]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Message_API&amp;diff=47653</id>
		<title>Message API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Message_API&amp;diff=47653"/>
		<updated>2015-04-23T05:19:27Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Example of message popup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is this document?==&lt;br /&gt;
&lt;br /&gt;
This document describes how to make use of the Moodle Messaging API to send messages to Moodle users.&lt;br /&gt;
&lt;br /&gt;
If you are after a general introduction on using the Moodle Messaging system go to [[:en:Messaging|messaging user documentation]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for details of how the Messaging system&#039;s internal structure was implemented, go to [[Messaging 2.0]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for instructions on the implementation of a custom message processor (a component that receives messages sent to a user), go to [[Messaging custom components]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for instructions on sending messages programatically within Moodle then read on...&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
Moodle components have the ability to send messages to users via the Moodle messaging system. Any type of component, for example a plugin or block, can register as a message producer then send messages to users.&lt;br /&gt;
&lt;br /&gt;
==File locations==&lt;br /&gt;
&lt;br /&gt;
The Message API code is contained within lib/messagelib.php and is automatically included for you during page setup.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
&lt;br /&gt;
message_send() is the primary point of contact for the message API. Call it to send a message to a user. You can find a full description of the arguments that must be supplied at (link to phpdocs). There is also an example below.&lt;br /&gt;
&lt;br /&gt;
==Message popup==&lt;br /&gt;
{{Moodle_2.9}}&lt;br /&gt;
A Javascript popup can be displayed through a link to invite a user to message another. In order to use this feature, you need to require the Javascript libraries using &#039;&#039;message_messenger_requirejs()&#039;&#039; and create a link with the attributes returned by &#039;&#039;message_messenger_sendmessage_link_params()&#039;&#039;. More in the examples.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===How to register as a message producer===&lt;br /&gt;
&lt;br /&gt;
The messages produced by a message provider is defined in the /db/messages.php file of a component. Below is code from the quiz module&#039;s messages.php file, shown as an example.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
$messageproviders = array (&lt;br /&gt;
    // Notify teacher that a student has submitted a quiz attempt&lt;br /&gt;
    &#039;submission&#039; =&amp;gt; array (&lt;br /&gt;
        &#039;capability&#039;  =&amp;gt; &#039;mod/quiz:emailnotifysubmission&#039;&lt;br /&gt;
    ),&lt;br /&gt;
    // Confirm a student&#039;s quiz attempt&lt;br /&gt;
    &#039;confirmation&#039; =&amp;gt; array (&lt;br /&gt;
        &#039;capability&#039;  =&amp;gt; &#039;mod/quiz:emailconfirmsubmission&#039;&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The quiz can send two kinds of messages, quiz &amp;quot;submission&amp;quot; and &amp;quot;confirmation&amp;quot; notifications. Each message type is only available to users with the appropriate capability. Please note that the capability is checked at the system level context. Users who have this capability will have this message listed in their messaging preferences. You can omit the capability section if your message should be visible for all users. For example forum post notifications are available to all users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$messageproviders = array (&lt;br /&gt;
    // Ordinary single forum posts&lt;br /&gt;
    &#039;posts&#039; =&amp;gt; array (&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When displaying your message types in a user&#039;s messaging preferences it will use a string from your component&#039;s language file called &amp;quot;messageprovider:messagename&amp;quot;. For example here are the relevant strings from the quiz&#039;s language file.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$string[&#039;messageprovider:confirmation&#039;] = &#039;Confirmation of your own quiz submissions&#039;;&lt;br /&gt;
$string[&#039;messageprovider:submission&#039;] = &#039;Notification of quiz submissions&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once your messages.php is complete you need to increase the version number of your component in its version.php. That will cause Moodle to check messages.php looking for new or changed message definitions. Log in as an admin and go to /admin/index.php (the Notifications page) to start the upgrade process.&lt;br /&gt;
&lt;br /&gt;
===How to send a message===&lt;br /&gt;
&lt;br /&gt;
Here is example code showing you how to actually send a message. The example shows the construction of a object with specific properties, which is then passed to the message_send() function that uses the information to send a message.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$eventdata = new stdClass();&lt;br /&gt;
$eventdata-&amp;gt;component         = &#039;mod_quiz&#039;; //your component name&lt;br /&gt;
$eventdata-&amp;gt;name              = &#039;submission&#039;; //this is the message name from messages.php&lt;br /&gt;
$eventdata-&amp;gt;userfrom          = $USER;&lt;br /&gt;
$eventdata-&amp;gt;userto            = $touser;&lt;br /&gt;
$eventdata-&amp;gt;subject           = $subject;&lt;br /&gt;
$eventdata-&amp;gt;fullmessage       = $message;&lt;br /&gt;
$eventdata-&amp;gt;fullmessageformat = FORMAT_PLAIN;&lt;br /&gt;
$eventdata-&amp;gt;fullmessagehtml   = &#039;&#039;;&lt;br /&gt;
$eventdata-&amp;gt;smallmessage      = &#039;&#039;;&lt;br /&gt;
$eventdata-&amp;gt;notification      = 1; //this is only set to 0 for personal messages between users&lt;br /&gt;
message_send($eventdata);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How to set-up the message popup===&lt;br /&gt;
&lt;br /&gt;
Here is example code showing you how to set-up the Javascript popup link.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
require_once(&#039;message/lib.php&#039;);&lt;br /&gt;
$userid = 2;&lt;br /&gt;
$userto = $DB-&amp;gt;get_record(&#039;user&#039;, array(&#039;id&#039; =&amp;gt; $userid));&lt;br /&gt;
&lt;br /&gt;
message_messenger_requirejs();&lt;br /&gt;
$url = new moodle_url(&#039;message/index.php&#039;, array(&#039;id&#039; =&amp;gt; $userto-&amp;gt;id));&lt;br /&gt;
$attributes = message_messenger_sendmessage_link_params($userto);&lt;br /&gt;
echo html_writer::link($url, &#039;Send a message&#039;, $attributes);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Messaging]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Message_API&amp;diff=47652</id>
		<title>Message API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Message_API&amp;diff=47652"/>
		<updated>2015-04-23T05:12:41Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Adding docs about the message popup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is this document?==&lt;br /&gt;
&lt;br /&gt;
This document describes how to make use of the Moodle Messaging API to send messages to Moodle users.&lt;br /&gt;
&lt;br /&gt;
If you are after a general introduction on using the Moodle Messaging system go to [[:en:Messaging|messaging user documentation]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for details of how the Messaging system&#039;s internal structure was implemented, go to [[Messaging 2.0]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for instructions on the implementation of a custom message processor (a component that receives messages sent to a user), go to [[Messaging custom components]].&lt;br /&gt;
&lt;br /&gt;
If you are looking for instructions on sending messages programatically within Moodle then read on...&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
Moodle components have the ability to send messages to users via the Moodle messaging system. Any type of component, for example a plugin or block, can register as a message producer then send messages to users.&lt;br /&gt;
&lt;br /&gt;
==File locations==&lt;br /&gt;
&lt;br /&gt;
The Message API code is contained within lib/messagelib.php and is automatically included for you during page setup.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
&lt;br /&gt;
message_send() is the primary point of contact for the message API. Call it to send a message to a user. You can find a full description of the arguments that must be supplied at (link to phpdocs). There is also an example below.&lt;br /&gt;
&lt;br /&gt;
==Message popup==&lt;br /&gt;
{{Moodle_2.9}}&lt;br /&gt;
A Javascript popup can be displayed through a link to invite a user to message another. In order to use this feature, you need to require the Javascript libraries using &#039;&#039;message_messenger_requirejs()&#039;&#039; and create a link with the attributes returned by &#039;&#039;message_messenger_sendmessage_link_params()&#039;&#039;. More in the examples.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&lt;br /&gt;
===How to register as a message producer===&lt;br /&gt;
&lt;br /&gt;
The messages produced by a message provider is defined in the /db/messages.php file of a component. Below is code from the quiz module&#039;s messages.php file, shown as an example.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
defined(&#039;MOODLE_INTERNAL&#039;) || die();&lt;br /&gt;
$messageproviders = array (&lt;br /&gt;
    // Notify teacher that a student has submitted a quiz attempt&lt;br /&gt;
    &#039;submission&#039; =&amp;gt; array (&lt;br /&gt;
        &#039;capability&#039;  =&amp;gt; &#039;mod/quiz:emailnotifysubmission&#039;&lt;br /&gt;
    ),&lt;br /&gt;
    // Confirm a student&#039;s quiz attempt&lt;br /&gt;
    &#039;confirmation&#039; =&amp;gt; array (&lt;br /&gt;
        &#039;capability&#039;  =&amp;gt; &#039;mod/quiz:emailconfirmsubmission&#039;&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The quiz can send two kinds of messages, quiz &amp;quot;submission&amp;quot; and &amp;quot;confirmation&amp;quot; notifications. Each message type is only available to users with the appropriate capability. Please note that the capability is checked at the system level context. Users who have this capability will have this message listed in their messaging preferences. You can omit the capability section if your message should be visible for all users. For example forum post notifications are available to all users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$messageproviders = array (&lt;br /&gt;
    // Ordinary single forum posts&lt;br /&gt;
    &#039;posts&#039; =&amp;gt; array (&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When displaying your message types in a user&#039;s messaging preferences it will use a string from your component&#039;s language file called &amp;quot;messageprovider:messagename&amp;quot;. For example here are the relevant strings from the quiz&#039;s language file.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$string[&#039;messageprovider:confirmation&#039;] = &#039;Confirmation of your own quiz submissions&#039;;&lt;br /&gt;
$string[&#039;messageprovider:submission&#039;] = &#039;Notification of quiz submissions&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once your messages.php is complete you need to increase the version number of your component in its version.php. That will cause Moodle to check messages.php looking for new or changed message definitions. Log in as an admin and go to /admin/index.php (the Notifications page) to start the upgrade process.&lt;br /&gt;
&lt;br /&gt;
===How to send a message===&lt;br /&gt;
&lt;br /&gt;
Here is example code showing you how to actually send a message. The example shows the construction of a object with specific properties, which is then passed to the message_send() function that uses the information to send a message.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$eventdata = new stdClass();&lt;br /&gt;
$eventdata-&amp;gt;component         = &#039;mod_quiz&#039;; //your component name&lt;br /&gt;
$eventdata-&amp;gt;name              = &#039;submission&#039;; //this is the message name from messages.php&lt;br /&gt;
$eventdata-&amp;gt;userfrom          = $USER;&lt;br /&gt;
$eventdata-&amp;gt;userto            = $touser;&lt;br /&gt;
$eventdata-&amp;gt;subject           = $subject;&lt;br /&gt;
$eventdata-&amp;gt;fullmessage       = $message;&lt;br /&gt;
$eventdata-&amp;gt;fullmessageformat = FORMAT_PLAIN;&lt;br /&gt;
$eventdata-&amp;gt;fullmessagehtml   = &#039;&#039;;&lt;br /&gt;
$eventdata-&amp;gt;smallmessage      = &#039;&#039;;&lt;br /&gt;
$eventdata-&amp;gt;notification      = 1; //this is only set to 0 for personal messages between users&lt;br /&gt;
message_send($eventdata);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Core APIs]]&lt;br /&gt;
&lt;br /&gt;
[[Category:API]]&lt;br /&gt;
[[Category:Tutorial]]&lt;br /&gt;
[[Category:Plugins]]&lt;br /&gt;
[[Category:Messaging]]&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User:Fr%C3%A9d%C3%A9ric_Massart_2&amp;diff=46755</id>
		<title>User:Frédéric Massart 2</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User:Fr%C3%A9d%C3%A9ric_Massart_2&amp;diff=46755"/>
		<updated>2014-11-10T10:03:21Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* test http://google.com */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= test http://google.com =&lt;br /&gt;
1&lt;br /&gt;
= test http://google.com =&lt;br /&gt;
3&lt;br /&gt;
= test http://google.com =&lt;br /&gt;
4&lt;br /&gt;
= test http://google.com =&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=User:Fr%C3%A9d%C3%A9ric_Massart_2&amp;diff=46754</id>
		<title>User:Frédéric Massart 2</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=User:Fr%C3%A9d%C3%A9ric_Massart_2&amp;diff=46754"/>
		<updated>2014-11-10T10:02:59Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Created page with &amp;quot;==== test http://google.com ====&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== test http://google.com ====&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Cache_API&amp;diff=46301</id>
		<title>Cache API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Cache_API&amp;diff=46301"/>
		<updated>2014-09-24T09:36:38Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: /* Creating a definition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document details the Cache API aka MUC aka Moodle&#039;s Universal Cache.&lt;br /&gt;
I&#039;ve chosen to use a tutorial/example flow for this document always working with a theoretical module plugin called myplugin.&lt;br /&gt;
There is also a [[Cache API - Quick reference]] if you would rather read that.&lt;br /&gt;
&lt;br /&gt;
==Basic usage==&lt;br /&gt;
It&#039;s very easy to get started with the Cache API. It is designed to be as easy and as quick to use as possible and is predominantely self contained.&lt;br /&gt;
All you need to do is add a definition for your cache and you are ready to start working with the Cache API.&lt;br /&gt;
&lt;br /&gt;
===Creating a definition===&lt;br /&gt;
Cache definitions exist within the db/caches.php file for a component/plugin.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the case of core that is the moodle/lib/db/caches.php file, in the case of a module that would be moodle/mod/myplugin/db/caches.php.&lt;br /&gt;
&lt;br /&gt;
The definition is used API in order to understand a little about the cache and what it is being used for, it also allows the administrator to set things up especially for the definition if they want.&lt;br /&gt;
From a development point of view the definition allows you to tell the API about your cache, what it requires, and any (if any) advanced features you want it to have.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following shows a basic definition containing just the bare minimum:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
// moodle/mod/myplugin/db/caches.php&lt;br /&gt;
$definitions = array(&lt;br /&gt;
    &#039;somedata&#039; =&amp;gt; array(&lt;br /&gt;
        &#039;mode&#039; =&amp;gt; cache_store::MODE_APPLICATION&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This informs the API that the myplugin module has a cache called &#039;&#039;somedata&#039;&#039; and that it is an application (globally shared) cache.&amp;lt;br /&amp;gt;&lt;br /&gt;
When creating a definition thats the bare minimum, to provide an area &#039;&#039;(somedata)&#039;&#039; and declare the type of the cache application, session, or request.&amp;lt;br /&amp;gt;&lt;br /&gt;
:An application cache is a shared cache, all users can access it.&amp;lt;br /&amp;gt;&lt;br /&gt;
:Session caches are, well, just stores in the users session.&amp;lt;br /&amp;gt;&lt;br /&gt;
:Request caches you can think of as static caches, only available to the user owning the request, and only alive until the end of the request.&amp;lt;br /&amp;gt;&lt;br /&gt;
There are of course many more options available that allow you to really take the cache by the reigns, you can read about some of the important ones further on, or skip ahead to [[#The definition]] section which details the available options in full.&lt;br /&gt;
&lt;br /&gt;
Please note that for each definition a language string with the name &#039;&#039;cachedef_&#039;&#039; followed by the name of the definition is expected. Using the example above you would have to define:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
// moodle/mod/myplugin/lang/en/mod_myplugin.php&lt;br /&gt;
$string[&#039;cachedef_somedata&#039;] = &#039;This is the description of the cache somedata&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Getting a cache object===&lt;br /&gt;
Once your definition has been created you should bump the version number so that Moodle upgrades and processes the definitions file at which point your definition will be useable.&lt;br /&gt;
&lt;br /&gt;
Now within code you can get a cache object to interact with in the following manner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$cache = cache::make(&#039;mod_myplugin&#039;, &#039;mycache&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The cache::make method is a factory method, it will create a cache object to allow you to work with your cache. The cache object will be one of several classes chosen by the API based upon what your definition contains. All of these classes will extend the base cache class, and in nearly all cases you will get one of cache_application, cache_session, or cache_request depending upon the mode you selected.&lt;br /&gt;
&lt;br /&gt;
===Using your cache object===&lt;br /&gt;
Once you have a cache object (will extend the cache class and implements cache_loader) you are ready to start interacting with the cache.&lt;br /&gt;
&lt;br /&gt;
Of course there are three basic basic operations. get, set, and delete.&lt;br /&gt;
&lt;br /&gt;
The first is to send something to the cache.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$result = $cache-&amp;gt;set(&#039;key&#039;, &#039;value&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Easy enough. The key must an int or a string. The value can be absolutely anything your want.&lt;br /&gt;
The result is true if the operation was a success, false otherwise.&lt;br /&gt;
&lt;br /&gt;
The second is to fetch something from the cache.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$data = $cache-&amp;gt;get(&#039;key&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
$data will either be what ever was being stored in the cache, or false if the cache could not find the key.&lt;br /&gt;
&lt;br /&gt;
The third and final operation is delete.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$result = $cache-&amp;gt;delete(&#039;key&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Again just like set the result will either be true if the operation was a success, or false otherwise.&lt;br /&gt;
&lt;br /&gt;
You can also set, get, and delete multiple key=&amp;gt;value pairs in a single transaction.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$result = $cache-&amp;gt;set_many(array(&lt;br /&gt;
    &#039;key1&#039; =&amp;gt; &#039;data1&#039;,&lt;br /&gt;
    &#039;key3&#039; =&amp;gt; &#039;data3&#039;&lt;br /&gt;
));&lt;br /&gt;
// $result will be the number of pairs sucessfully set.&lt;br /&gt;
&lt;br /&gt;
$result = $cache-&amp;gt;get_many(array(&#039;key1&#039;, &#039;key2&#039;, &#039;key3&#039;));&lt;br /&gt;
print_r($result);&lt;br /&gt;
// Will print the following:&lt;br /&gt;
// array(&lt;br /&gt;
//     &#039;key1&#039; =&amp;gt; &#039;data1&#039;,&lt;br /&gt;
//     &#039;key2&#039; =&amp;gt; false,&lt;br /&gt;
//     &#039;key3&#039; =&amp;gt; &#039;data3&#039;&lt;br /&gt;
// )&lt;br /&gt;
&lt;br /&gt;
$result = $cache-&amp;gt;delete_many(array(&#039;key1&#039;, &#039;key3&#039;);&lt;br /&gt;
// $result will be the number of records sucessfully deleted.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That covers the basic operation of the Cache API.&amp;lt;br /&amp;gt;&lt;br /&gt;
In many situations there is not going to be any more to it than that.&lt;br /&gt;
&lt;br /&gt;
==Ad-hoc Caches==&lt;br /&gt;
This is the alternative method of using the cache API.&amp;lt;br /&amp;gt;&lt;br /&gt;
It involves creating a cache using just the required params at the time that it is required. It doesn&#039;t require that a definition exists making it quicker and easier to use, however it can only use the default settings and is only recommended for insignificant caches (rarely used during operation, never to be mapped or customised, only existsing in a single place in code).&lt;br /&gt;
&lt;br /&gt;
Once a cache object has been retrieved it operates exactly as the same as a cache that has been created for a definition.&lt;br /&gt;
&lt;br /&gt;
To create an ad-hoc cache you would use the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$cache = cache::make_from_params(cache_store::MODE_APPLICATION, &#039;mod_myplugin&#039;, &#039;mycache&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Really don&#039;t be lazy, if you don&#039;t have a good reason to use an ad-hoc cache you should be spending a extra 5 minutes creating a definition.&lt;br /&gt;
&lt;br /&gt;
==The definition==&lt;br /&gt;
&lt;br /&gt;
The above section illustrated how to create a basic definition, specifying just the area name (the key) and the mode for the definition. Those being the two required properties for a definition.&amp;lt;br /&amp;gt;&lt;br /&gt;
There are many other options that will let you make the most of the Cache API and will undoubtedly be required when implementing and converting cache solutions to the Cache API.&lt;br /&gt;
&lt;br /&gt;
The following details the options available to a definition and their defaults if not applied:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$definitions = array(&lt;br /&gt;
    // The name of the cache area is the key. The component/plugin will be picked up from the file location.&lt;br /&gt;
    &#039;area&#039; =&amp;gt; array(&lt;br /&gt;
        &#039;mode&#039; =&amp;gt; cache_store::MODE_*,&lt;br /&gt;
        &#039;simplekeys&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;simpledata&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requireidentifiers&#039; =&amp;gt; array(&#039;ident1&#039;, &#039;ident2&#039;),&lt;br /&gt;
        &#039;requiredataguarantee&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requiremultipleidentifiers&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requirelockingread&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requirelockingwrite&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;maxsize&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;overrideclass&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;overrideclassfile&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;datasource&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;datasourcefile&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;staticacceleration&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;staticaccelerationsize&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;ttl&#039; =&amp;gt; 0,&lt;br /&gt;
        &#039;mappingsonly&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;invalidationevents&#039; =&amp;gt; array(&#039;event1&#039;, &#039;event2&#039;),&lt;br /&gt;
        &#039;sharingoptions&#039; =&amp;gt; cache_definition::SHARING_DEFAULT,&lt;br /&gt;
        &#039;defaultsharing&#039; =&amp;gt; cache_definition::SHARING_DEFAULT,&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Setting requirements===&lt;br /&gt;
The definition can specify several requirements for the cache.&amp;lt;br /&amp;gt;&lt;br /&gt;
This includes identifiers that must be provided when creating the cache object, that the store guarantees data stored in it will remain there until removed, a store that supports multiple identifiers, and finally read/write locking.&lt;br /&gt;
The options for these are as follows:&lt;br /&gt;
&lt;br /&gt;
; simplekeys : [bool] Set to true if your cache will only use simple keys for its items.&amp;lt;br /&amp;gt;Simple keys consist of digits, underscores and the 26 chars of the english language. a-zA-Z0-9_&amp;lt;br /&amp;gt;If true the keys won&#039;t be hashed before being passed to the cache store for gets/sets/deletes. It will be better for performance and possible only because we know the keys are safe.&lt;br /&gt;
; simpledata : [bool] If set to true we know that the data is scalar or array of scalar.&lt;br /&gt;
; requireidentifiers : [array] An array of identifiers that must be provided to the cache when it is created.&lt;br /&gt;
; requiredataguarantee : [bool] If set to true then only stores that can guarantee data will remain available once set will be used.&lt;br /&gt;
; requiremultipleidentifiers : [bool] If set to true then only stores that support multiple identifiers will be used.&lt;br /&gt;
; requirelockingread : [bool] If set to true then a lock will be gained before reading from the cache store. It is recommended not to use this setting unless 100% absolutely positively required.&amp;lt;br /&amp;gt;Remember 99.9% of caches will NOT need this setting.&amp;lt;br /&amp;gt;This setting will only be used for application caches presently.&lt;br /&gt;
; requirelockingwrite : [bool] If set to true then a lock will be gained before writing to the cache store. As above this is not recommended unless truly needed. Please think about the order of your code and deal with race conditions there first.&amp;lt;br /&amp;gt;This setting will only be used for application caches presently.&lt;br /&gt;
&lt;br /&gt;
===Cache modifiers===&lt;br /&gt;
You are also to modify the way in which the cache is going to operate when working for your definition.&amp;lt;br /&amp;gt;&lt;br /&gt;
By enabling the static option the Cache API will only ever generate a single cache object for your definition on the first request for it, further requests will be returned the original instance.&amp;lt;br /&amp;gt;This greatly speeds up the collecting of a cache object.&amp;lt;br /&amp;gt;&lt;br /&gt;
Enabling persistence also enables a static store within the cache object, anything set to the cache, or retrieved from it will be stored in that static array for the life of the request.&lt;br /&gt;
This makes the persistence options some of the most powerful. If you know you are going to be using you cache over and over again or if you know you will be making lots of requests for the same items then this will provide a great performance boost.&lt;br /&gt;
Of course the static storage of cache objects and of data is costly in terms of memory and should only be used when actually required, as such it is turned off by default.&lt;br /&gt;
As well as persistence you can also set a maximum number of items that the cache should store (not a hard limit, its up to each store) and a time to live (ttl) although both are discouraged as efficient design negates the need for both in most situations.&lt;br /&gt;
&lt;br /&gt;
; staticacceleration : [bool] This setting does two important things. First it tells the cache API to only instantiate the cache structure for this definition once, further requests will be given the original instance.&amp;lt;br /&amp;gt;Second the cache loader will keep an array of the items set and retrieved to the cache during the request.&amp;lt;br /&amp;gt;This has several advantages including better performance without needing to start passing the cache instance between function calls, the downside is that the cache instance + the items used stay within memory.&amp;lt;br /&amp;gt;Consider using this setting when you know that there are going to be many calls to the cache for the same information or when you are converting existing code to the cache and need to access the cache within functions but don&#039;t want to add it as an argument to the function.&lt;br /&gt;
; staticaccelerationsize : [int] This supplements the above setting by limiting the number of items in the caches persistent array of items.&amp;lt;br /&amp;gt;Tweaking this setting lower will allow you to minimise the memory implications above while hopefully still managing to offset calls to the cache store.&lt;br /&gt;
; ttl : [int] A time to live for the data (in seconds). It is strongly recommended that you don&#039;t make use of this and instead try to create an event driven invalidation system (even if the event is just time expiring, better not to rely on ttl).&amp;lt;br /&amp;gt;Not all cache stores will support this natively and there are undesired performance impacts if the cache store does not.&lt;br /&gt;
; maxsize : [int] If set this will be used as the maximum number of entries within the cache store for this definition.&amp;lt;br /&amp;gt;Its important to note that cache stores don&#039;t actually have to acknowledge this setting or maintain it as a hard limit.&lt;br /&gt;
&lt;br /&gt;
===Overriding a cache loader===&lt;br /&gt;
This is a super advanced feature and should not be done. ever. Unless you have an very good reason to do so.&lt;br /&gt;
It allows you to create your own cache loader and have it be used instead of the default cache loader class. The cache object you get back from the make operations will be an instance of this class.&lt;br /&gt;
&lt;br /&gt;
; overrideclass : [string] A class to use as the loader for this cache. This is an advanced setting and will allow the developer of the definition to take 100% control of the caching solution.&amp;lt;br /&amp;gt;Any class used here must inherit the cache_loader interface and must extend default cache loader for the mode they are using.&lt;br /&gt;
; overrideclassfile : [string] Suplements the above setting indicated the file containing the class to be used. This file is included when required.&lt;br /&gt;
&lt;br /&gt;
===Specifying a data source===&lt;br /&gt;
This is a great wee feature, especially if your code is object orientated.&amp;lt;br /&amp;gt;&lt;br /&gt;
It allows you to specify a class that must inherit the cache_data_source object and will be used to load any information requested from the cache that is not already being stored.&amp;lt;br /&amp;gt;&lt;br /&gt;
When the requested key cannot be found in the cache the data source will be asked to load it. The data source will then return the information to the cache, the cache will store it, and it will then return it to the user as a request of their get request. Essentially no get request should ever fail if you have a data source specified.&lt;br /&gt;
&lt;br /&gt;
; datasource : [string] A class to use as the data loader for this definition.&amp;lt;br /&amp;gt;Any class used here must inherit the cache_data_loader interface.&lt;br /&gt;
; datasourcefile : [string] Suplements the above setting indicated the file containing the class to be used. This file is included when required.&lt;br /&gt;
&lt;br /&gt;
===Misc settings===&lt;br /&gt;
The following are stand along settings that don&#039;t fall into any of the above categories.&lt;br /&gt;
&lt;br /&gt;
; invalidationevents : [array] An array of events that should cause this cache to invalidate some or all of the items within it.&lt;br /&gt;
; mappingsonly : [bool] If set to true only the mapped cache store(s) will be used and the default mode store will not. This is a super advanced setting and should not be used unless absolutely required. It allows you to avoid the default stores for one reason or another.&lt;br /&gt;
; sharingoptions : [int] The sharing options that are appropriate for this definition. Should be the sum of the possible options.&lt;br /&gt;
; defaultsharing : [int] The default sharing option to use. It&#039;s highly recommended that you don&#039;t set this unless there is a very specific reason not to use the system default.&lt;br /&gt;
&lt;br /&gt;
==The loader==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using a data source==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Developing cache plugins==&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/dev/index.php?title=Cache_API&amp;diff=46300</id>
		<title>Cache API</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/dev/index.php?title=Cache_API&amp;diff=46300"/>
		<updated>2014-09-24T09:35:32Z</updated>

		<summary type="html">&lt;p&gt;FMCorz: Adding language string requirements details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document details the Cache API aka MUC aka Moodle&#039;s Universal Cache.&lt;br /&gt;
I&#039;ve chosen to use a tutorial/example flow for this document always working with a theoretical module plugin called myplugin.&lt;br /&gt;
There is also a [[Cache API - Quick reference]] if you would rather read that.&lt;br /&gt;
&lt;br /&gt;
==Basic usage==&lt;br /&gt;
It&#039;s very easy to get started with the Cache API. It is designed to be as easy and as quick to use as possible and is predominantely self contained.&lt;br /&gt;
All you need to do is add a definition for your cache and you are ready to start working with the Cache API.&lt;br /&gt;
&lt;br /&gt;
===Creating a definition===&lt;br /&gt;
Cache definitions exist within the db/caches.php file for a component/plugin.&amp;lt;br /&amp;gt;&lt;br /&gt;
In the case of core that is the moodle/lib/db/caches.php file, in the case of a module that would be moodle/mod/myplugin/db/caches.php.&lt;br /&gt;
&lt;br /&gt;
The definition is used API in order to understand a little about the cache and what it is being used for, it also allows the administrator to set things up especially for the definition if they want.&lt;br /&gt;
From a development point of view the definition allows you to tell the API about your cache, what it requires, and any (if any) advanced features you want it to have.&amp;lt;br /&amp;gt;&lt;br /&gt;
The following shows a basic definition containing just the bare minimum:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
// moodle/mod/myplugin/db/caches.php&lt;br /&gt;
$definitions = array(&lt;br /&gt;
    &#039;somedata&#039; =&amp;gt; array(&lt;br /&gt;
        &#039;mode&#039; =&amp;gt; cache_store::MODE_APPLICATION&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
This informs the API that the myplugin module has a cache called &#039;&#039;somedata&#039;&#039; and that it is an application (globally shared) cache.&amp;lt;br /&amp;gt;&lt;br /&gt;
When creating a definition thats the bare minimum, to provide an area &#039;&#039;(somedata)&#039;&#039; and declare the type of the cache application, session, or request.&amp;lt;br /&amp;gt;&lt;br /&gt;
:An application cache is a shared cache, all users can access it.&amp;lt;br /&amp;gt;&lt;br /&gt;
:Session caches are, well, just stores in the users session.&amp;lt;br /&amp;gt;&lt;br /&gt;
:Request caches you can think of as static caches, only available to the user owning the request, and only alive until the end of the request.&amp;lt;br /&amp;gt;&lt;br /&gt;
There are of course many more options available that allow you to really take the cache by the reigns, you can read about some of the important ones further on, or skip ahead to [[#The definition]] section which details the available options in full.&lt;br /&gt;
&lt;br /&gt;
Please note that for each definition a language string with the name &#039;&#039;cachedef_&#039;&#039; followed by the name of the definition is expected. Using the example above you would have to define:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$string[&#039;cachedef_somedata&#039;] = &#039;This is the description of the cache somedata&#039;;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Getting a cache object===&lt;br /&gt;
Once your definition has been created you should bump the version number so that Moodle upgrades and processes the definitions file at which point your definition will be useable.&lt;br /&gt;
&lt;br /&gt;
Now within code you can get a cache object to interact with in the following manner.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$cache = cache::make(&#039;mod_myplugin&#039;, &#039;mycache&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The cache::make method is a factory method, it will create a cache object to allow you to work with your cache. The cache object will be one of several classes chosen by the API based upon what your definition contains. All of these classes will extend the base cache class, and in nearly all cases you will get one of cache_application, cache_session, or cache_request depending upon the mode you selected.&lt;br /&gt;
&lt;br /&gt;
===Using your cache object===&lt;br /&gt;
Once you have a cache object (will extend the cache class and implements cache_loader) you are ready to start interacting with the cache.&lt;br /&gt;
&lt;br /&gt;
Of course there are three basic basic operations. get, set, and delete.&lt;br /&gt;
&lt;br /&gt;
The first is to send something to the cache.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$result = $cache-&amp;gt;set(&#039;key&#039;, &#039;value&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Easy enough. The key must an int or a string. The value can be absolutely anything your want.&lt;br /&gt;
The result is true if the operation was a success, false otherwise.&lt;br /&gt;
&lt;br /&gt;
The second is to fetch something from the cache.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$data = $cache-&amp;gt;get(&#039;key&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
$data will either be what ever was being stored in the cache, or false if the cache could not find the key.&lt;br /&gt;
&lt;br /&gt;
The third and final operation is delete.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$result = $cache-&amp;gt;delete(&#039;key&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Again just like set the result will either be true if the operation was a success, or false otherwise.&lt;br /&gt;
&lt;br /&gt;
You can also set, get, and delete multiple key=&amp;gt;value pairs in a single transaction.&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$result = $cache-&amp;gt;set_many(array(&lt;br /&gt;
    &#039;key1&#039; =&amp;gt; &#039;data1&#039;,&lt;br /&gt;
    &#039;key3&#039; =&amp;gt; &#039;data3&#039;&lt;br /&gt;
));&lt;br /&gt;
// $result will be the number of pairs sucessfully set.&lt;br /&gt;
&lt;br /&gt;
$result = $cache-&amp;gt;get_many(array(&#039;key1&#039;, &#039;key2&#039;, &#039;key3&#039;));&lt;br /&gt;
print_r($result);&lt;br /&gt;
// Will print the following:&lt;br /&gt;
// array(&lt;br /&gt;
//     &#039;key1&#039; =&amp;gt; &#039;data1&#039;,&lt;br /&gt;
//     &#039;key2&#039; =&amp;gt; false,&lt;br /&gt;
//     &#039;key3&#039; =&amp;gt; &#039;data3&#039;&lt;br /&gt;
// )&lt;br /&gt;
&lt;br /&gt;
$result = $cache-&amp;gt;delete_many(array(&#039;key1&#039;, &#039;key3&#039;);&lt;br /&gt;
// $result will be the number of records sucessfully deleted.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That covers the basic operation of the Cache API.&amp;lt;br /&amp;gt;&lt;br /&gt;
In many situations there is not going to be any more to it than that.&lt;br /&gt;
&lt;br /&gt;
==Ad-hoc Caches==&lt;br /&gt;
This is the alternative method of using the cache API.&amp;lt;br /&amp;gt;&lt;br /&gt;
It involves creating a cache using just the required params at the time that it is required. It doesn&#039;t require that a definition exists making it quicker and easier to use, however it can only use the default settings and is only recommended for insignificant caches (rarely used during operation, never to be mapped or customised, only existsing in a single place in code).&lt;br /&gt;
&lt;br /&gt;
Once a cache object has been retrieved it operates exactly as the same as a cache that has been created for a definition.&lt;br /&gt;
&lt;br /&gt;
To create an ad-hoc cache you would use the following:&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$cache = cache::make_from_params(cache_store::MODE_APPLICATION, &#039;mod_myplugin&#039;, &#039;mycache&#039;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Really don&#039;t be lazy, if you don&#039;t have a good reason to use an ad-hoc cache you should be spending a extra 5 minutes creating a definition.&lt;br /&gt;
&lt;br /&gt;
==The definition==&lt;br /&gt;
&lt;br /&gt;
The above section illustrated how to create a basic definition, specifying just the area name (the key) and the mode for the definition. Those being the two required properties for a definition.&amp;lt;br /&amp;gt;&lt;br /&gt;
There are many other options that will let you make the most of the Cache API and will undoubtedly be required when implementing and converting cache solutions to the Cache API.&lt;br /&gt;
&lt;br /&gt;
The following details the options available to a definition and their defaults if not applied:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code php&amp;gt;&lt;br /&gt;
$definitions = array(&lt;br /&gt;
    // The name of the cache area is the key. The component/plugin will be picked up from the file location.&lt;br /&gt;
    &#039;area&#039; =&amp;gt; array(&lt;br /&gt;
        &#039;mode&#039; =&amp;gt; cache_store::MODE_*,&lt;br /&gt;
        &#039;simplekeys&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;simpledata&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requireidentifiers&#039; =&amp;gt; array(&#039;ident1&#039;, &#039;ident2&#039;),&lt;br /&gt;
        &#039;requiredataguarantee&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requiremultipleidentifiers&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requirelockingread&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;requirelockingwrite&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;maxsize&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;overrideclass&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;overrideclassfile&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;datasource&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;datasourcefile&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;staticacceleration&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;staticaccelerationsize&#039; =&amp;gt; null,&lt;br /&gt;
        &#039;ttl&#039; =&amp;gt; 0,&lt;br /&gt;
        &#039;mappingsonly&#039; =&amp;gt; false,&lt;br /&gt;
        &#039;invalidationevents&#039; =&amp;gt; array(&#039;event1&#039;, &#039;event2&#039;),&lt;br /&gt;
        &#039;sharingoptions&#039; =&amp;gt; cache_definition::SHARING_DEFAULT,&lt;br /&gt;
        &#039;defaultsharing&#039; =&amp;gt; cache_definition::SHARING_DEFAULT,&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Setting requirements===&lt;br /&gt;
The definition can specify several requirements for the cache.&amp;lt;br /&amp;gt;&lt;br /&gt;
This includes identifiers that must be provided when creating the cache object, that the store guarantees data stored in it will remain there until removed, a store that supports multiple identifiers, and finally read/write locking.&lt;br /&gt;
The options for these are as follows:&lt;br /&gt;
&lt;br /&gt;
; simplekeys : [bool] Set to true if your cache will only use simple keys for its items.&amp;lt;br /&amp;gt;Simple keys consist of digits, underscores and the 26 chars of the english language. a-zA-Z0-9_&amp;lt;br /&amp;gt;If true the keys won&#039;t be hashed before being passed to the cache store for gets/sets/deletes. It will be better for performance and possible only because we know the keys are safe.&lt;br /&gt;
; simpledata : [bool] If set to true we know that the data is scalar or array of scalar.&lt;br /&gt;
; requireidentifiers : [array] An array of identifiers that must be provided to the cache when it is created.&lt;br /&gt;
; requiredataguarantee : [bool] If set to true then only stores that can guarantee data will remain available once set will be used.&lt;br /&gt;
; requiremultipleidentifiers : [bool] If set to true then only stores that support multiple identifiers will be used.&lt;br /&gt;
; requirelockingread : [bool] If set to true then a lock will be gained before reading from the cache store. It is recommended not to use this setting unless 100% absolutely positively required.&amp;lt;br /&amp;gt;Remember 99.9% of caches will NOT need this setting.&amp;lt;br /&amp;gt;This setting will only be used for application caches presently.&lt;br /&gt;
; requirelockingwrite : [bool] If set to true then a lock will be gained before writing to the cache store. As above this is not recommended unless truly needed. Please think about the order of your code and deal with race conditions there first.&amp;lt;br /&amp;gt;This setting will only be used for application caches presently.&lt;br /&gt;
&lt;br /&gt;
===Cache modifiers===&lt;br /&gt;
You are also to modify the way in which the cache is going to operate when working for your definition.&amp;lt;br /&amp;gt;&lt;br /&gt;
By enabling the static option the Cache API will only ever generate a single cache object for your definition on the first request for it, further requests will be returned the original instance.&amp;lt;br /&amp;gt;This greatly speeds up the collecting of a cache object.&amp;lt;br /&amp;gt;&lt;br /&gt;
Enabling persistence also enables a static store within the cache object, anything set to the cache, or retrieved from it will be stored in that static array for the life of the request.&lt;br /&gt;
This makes the persistence options some of the most powerful. If you know you are going to be using you cache over and over again or if you know you will be making lots of requests for the same items then this will provide a great performance boost.&lt;br /&gt;
Of course the static storage of cache objects and of data is costly in terms of memory and should only be used when actually required, as such it is turned off by default.&lt;br /&gt;
As well as persistence you can also set a maximum number of items that the cache should store (not a hard limit, its up to each store) and a time to live (ttl) although both are discouraged as efficient design negates the need for both in most situations.&lt;br /&gt;
&lt;br /&gt;
; staticacceleration : [bool] This setting does two important things. First it tells the cache API to only instantiate the cache structure for this definition once, further requests will be given the original instance.&amp;lt;br /&amp;gt;Second the cache loader will keep an array of the items set and retrieved to the cache during the request.&amp;lt;br /&amp;gt;This has several advantages including better performance without needing to start passing the cache instance between function calls, the downside is that the cache instance + the items used stay within memory.&amp;lt;br /&amp;gt;Consider using this setting when you know that there are going to be many calls to the cache for the same information or when you are converting existing code to the cache and need to access the cache within functions but don&#039;t want to add it as an argument to the function.&lt;br /&gt;
; staticaccelerationsize : [int] This supplements the above setting by limiting the number of items in the caches persistent array of items.&amp;lt;br /&amp;gt;Tweaking this setting lower will allow you to minimise the memory implications above while hopefully still managing to offset calls to the cache store.&lt;br /&gt;
; ttl : [int] A time to live for the data (in seconds). It is strongly recommended that you don&#039;t make use of this and instead try to create an event driven invalidation system (even if the event is just time expiring, better not to rely on ttl).&amp;lt;br /&amp;gt;Not all cache stores will support this natively and there are undesired performance impacts if the cache store does not.&lt;br /&gt;
; maxsize : [int] If set this will be used as the maximum number of entries within the cache store for this definition.&amp;lt;br /&amp;gt;Its important to note that cache stores don&#039;t actually have to acknowledge this setting or maintain it as a hard limit.&lt;br /&gt;
&lt;br /&gt;
===Overriding a cache loader===&lt;br /&gt;
This is a super advanced feature and should not be done. ever. Unless you have an very good reason to do so.&lt;br /&gt;
It allows you to create your own cache loader and have it be used instead of the default cache loader class. The cache object you get back from the make operations will be an instance of this class.&lt;br /&gt;
&lt;br /&gt;
; overrideclass : [string] A class to use as the loader for this cache. This is an advanced setting and will allow the developer of the definition to take 100% control of the caching solution.&amp;lt;br /&amp;gt;Any class used here must inherit the cache_loader interface and must extend default cache loader for the mode they are using.&lt;br /&gt;
; overrideclassfile : [string] Suplements the above setting indicated the file containing the class to be used. This file is included when required.&lt;br /&gt;
&lt;br /&gt;
===Specifying a data source===&lt;br /&gt;
This is a great wee feature, especially if your code is object orientated.&amp;lt;br /&amp;gt;&lt;br /&gt;
It allows you to specify a class that must inherit the cache_data_source object and will be used to load any information requested from the cache that is not already being stored.&amp;lt;br /&amp;gt;&lt;br /&gt;
When the requested key cannot be found in the cache the data source will be asked to load it. The data source will then return the information to the cache, the cache will store it, and it will then return it to the user as a request of their get request. Essentially no get request should ever fail if you have a data source specified.&lt;br /&gt;
&lt;br /&gt;
; datasource : [string] A class to use as the data loader for this definition.&amp;lt;br /&amp;gt;Any class used here must inherit the cache_data_loader interface.&lt;br /&gt;
; datasourcefile : [string] Suplements the above setting indicated the file containing the class to be used. This file is included when required.&lt;br /&gt;
&lt;br /&gt;
===Misc settings===&lt;br /&gt;
The following are stand along settings that don&#039;t fall into any of the above categories.&lt;br /&gt;
&lt;br /&gt;
; invalidationevents : [array] An array of events that should cause this cache to invalidate some or all of the items within it.&lt;br /&gt;
; mappingsonly : [bool] If set to true only the mapped cache store(s) will be used and the default mode store will not. This is a super advanced setting and should not be used unless absolutely required. It allows you to avoid the default stores for one reason or another.&lt;br /&gt;
; sharingoptions : [int] The sharing options that are appropriate for this definition. Should be the sum of the possible options.&lt;br /&gt;
; defaultsharing : [int] The default sharing option to use. It&#039;s highly recommended that you don&#039;t set this unless there is a very specific reason not to use the system default.&lt;br /&gt;
&lt;br /&gt;
==The loader==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using a data source==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Developing cache plugins==&lt;/div&gt;</summary>
		<author><name>FMCorz</name></author>
	</entry>
</feed>