<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.moodle.org/310/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jenny-gray</id>
	<title>MoodleDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.moodle.org/310/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jenny-gray"/>
	<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/Special:Contributions/Jenny-gray"/>
	<updated>2026-04-17T12:12:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=105959</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=105959"/>
		<updated>2013-07-08T13:23:55Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English, Hebrew, Mexican spanish and German.  &lt;br /&gt;
&lt;br /&gt;
If using the german language pack, you will need to copy the star0.png file from rate_course/lang/de_utf8 into rate_course/graphic to replace the one there with english text included.  Hopefully we&#039;ll improve this to dynamically include the language some time!&lt;br /&gt;
&lt;br /&gt;
===Integrating the Questionnaire module===&lt;br /&gt;
&lt;br /&gt;
In the Moodle 2.x compatible version of this block, you can edit the block settings to add a link to a Questionnaire.  If you do not have the questionnaire module installed, or do not wish to use this feature, simply leave the block setting empty.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.  You can also add it to the myMoodle course information by editing the print_overview() function in course/lib.php;&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block is maintained by Jenny Gray at the UK Open University.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;br /&gt;
&lt;br /&gt;
[[es:Bloque de valoración de curso]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=95861</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=95861"/>
		<updated>2012-02-14T16:33:19Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Contributor/Maintainer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English, Hebrew and German.  &lt;br /&gt;
&lt;br /&gt;
If using the german language pack, you will need to copy the star0.png file from rate_course/lang/de_utf8 into rate_course/graphic to replace the one there with english text included.  Hopefully we&#039;ll improve this to dynamically include the language some time!&lt;br /&gt;
&lt;br /&gt;
===Integrating the Questionnaire module===&lt;br /&gt;
&lt;br /&gt;
In the Moodle 2.x compatible version of this block, you can edit the block settings to add a link to a Questionnaire.  If you do not have the questionnaire module installed, or do not wish to use this feature, simply leave the block setting empty.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.  You can also add it to the myMoodle course information by editing the print_overview() function in course/lib.php;&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray at the UK Open University, however we are no longer using this block on Moodle 2.x and would be grateful for any volunteers to collaborate or take over maintenance of this block.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=86622</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=86622"/>
		<updated>2011-07-28T12:29:04Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English, Hebrew and German.  &lt;br /&gt;
&lt;br /&gt;
If using the german language pack, you will need to copy the star0.png file from rate_course/lang/de_utf8 into rate_course/graphic to replace the one there with english text included.  Hopefully we&#039;ll improve this to dynamically include the language some time!&lt;br /&gt;
&lt;br /&gt;
===Integrating the Questionnaire module===&lt;br /&gt;
&lt;br /&gt;
In the Moodle 2.x compatible version of this block, you can edit the block settings to add a link to a Questionnaire.  If you do not have the questionnaire module installed, or do not wish to use this feature, simply leave the block setting empty.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.  You can also add it to the myMoodle course information by editing the print_overview() function in course/lib.php;&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82917</id>
		<title>Development:Survey 2 brainstorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82917"/>
		<updated>2011-04-21T15:58:08Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Question management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for collecting feature requests for a new Survey module that replaces Survey, Questionnaire and Feedback.&lt;br /&gt;
&lt;br /&gt;
==General features of the Module==&lt;br /&gt;
* translate previously built survey1, feedback and questionnaire at installation time&lt;br /&gt;
* upload exported feedback or questionnaires (survey1 doesn&#039;t export questionnaires templates)&lt;br /&gt;
* save instances of survey2 as a template to reuse it or export it&lt;br /&gt;
* import saved survey2 templates&lt;br /&gt;
* support for groups and groupings&lt;br /&gt;
* custom user survey2 page layout (custom html and css, as it already is in database module)&lt;br /&gt;
* download of submissions in txt, xls and ods&lt;br /&gt;
* conditional branching&lt;br /&gt;
* handle more than one input form layout (and find a way to allow this or that layout to this or that user).&lt;br /&gt;
* order survey fields in editing mode&lt;br /&gt;
* group fields in the page layout with fieldset&lt;br /&gt;
* relations between tables (Example: one record for the profile of my company one related record for each intervention request submitted by my company)&lt;br /&gt;
* email submissions to students/teachers/both/none&lt;br /&gt;
* full web accessibility features to the same level as elsewhere in Moodle e.g. labels on text fields, fieldsets on groups of radio buttons &amp;amp; checkboxes.&lt;br /&gt;
* gradebook integration (to allow simple polls to control conditional activities)&lt;br /&gt;
&lt;br /&gt;
==Instance settings page==&lt;br /&gt;
* Access section: 20 types of survey, distinguished by:&lt;br /&gt;
:-&amp;gt; ppl who is allowed to R/O,&lt;br /&gt;
:-&amp;gt; ppl who is allowed to R/W,&lt;br /&gt;
:-&amp;gt; ppl who is allowed to delete a record&lt;br /&gt;
The reationale is: once a record has been submitted by a user, who is allowed to see it (R/O access)?, who is allowed to edit it (R/W access)?, who is allowed to delete it?&lt;br /&gt;
&lt;br /&gt;
Combining all the options the come out 20 cases are defined as follows where:&lt;br /&gt;
:ALL means, all the people accessing the survey;&lt;br /&gt;
:GROUP means people belonging to the group of the user who submitted the record;&lt;br /&gt;
:OWNER is the user who submitted the record;&lt;br /&gt;
:NONE is none.&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! type&lt;br /&gt;
! R/O&lt;br /&gt;
! R/W&lt;br /&gt;
! delete&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| ALL&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* option: allow/deny save without submission (save and restart)&lt;br /&gt;
* option: anonymous survey or named responses&lt;br /&gt;
* option: allow access to records any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
* opening and closing submission dates&lt;br /&gt;
* number of maximun allowed submission&lt;br /&gt;
* option whether to show results immediately after submission, or a thank you message with link to results.&lt;br /&gt;
&lt;br /&gt;
==Field level settings==&lt;br /&gt;
* type of field (char(n), text, number, alphanumeric, boolean, date, picture, file, email, url...) with type check at submit time (and number of digit check for char(n) fields). This information may not be used at field definition time but is useful for data verification/check.&lt;br /&gt;
&lt;br /&gt;
(Example: Please, enter your card ID: _______ This field should be defined, for instance, as char(7))&lt;br /&gt;
* option: mandatory/non mandatory field&lt;br /&gt;
* free text description field for further description and advices to the completer&lt;br /&gt;
*define a range of valid answers for fields allowing this (see next examples)&lt;br /&gt;
(Example 1:&lt;br /&gt;
Please, enter your seniority. (limited between 0 and 50 years)&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
Date of birth: (limited between 18 and 100 years ago))&lt;br /&gt;
*define fields default to be loaded at &amp;quot;new record&amp;quot; display time&lt;br /&gt;
*optional &amp;quot;other&amp;quot; text field for drop down menu/radio button/check box. (see next example)&lt;br /&gt;
(Example for drop down:&lt;br /&gt;
&lt;br /&gt;
 Where were you born? &amp;lt;code&amp;gt;&amp;lt;select name=&amp;quot;dropdown_14&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Spain&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;France&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;3&amp;quot; &amp;gt;other, please specify&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;dropdown_14_other&amp;quot; size=&amp;quot;10&amp;quot; maxlength=&amp;quot;10&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;quot;other&amp;quot; in the drop down menu the field will be enabled and become mandatory, otherwise it will be disabled.&lt;br /&gt;
)&lt;br /&gt;
* custom question numbers&lt;br /&gt;
* question name to name columns header in the downloaded document&lt;br /&gt;
&lt;br /&gt;
==Question types==&lt;br /&gt;
&lt;br /&gt;
Question types should be plug-ins so that they can be extended locally if required.  The following list covers types which exist in at least one of the current survey modules.&lt;br /&gt;
&lt;br /&gt;
* radio buttons (horizontal &amp;amp; vertical display)&lt;br /&gt;
* short text entry&lt;br /&gt;
* long text entry&lt;br /&gt;
* checkbox&lt;br /&gt;
* drop down menu&lt;br /&gt;
* customisable likert scale for rating&lt;br /&gt;
* date (Example: When were you born?)&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
* short date (with month and years only, to answer question like: When had you the first evidence of this disease?)&lt;br /&gt;
* time&lt;br /&gt;
(Example:&lt;br /&gt;
When do you usually take breakfast?&lt;br /&gt;
)&lt;br /&gt;
* &amp;quot;static text&amp;quot;/&amp;quot;read only&amp;quot; fields (auto filled by the software) like, current_date, user_name, record_ID, counter...&lt;br /&gt;
* allocation (Drag and drop)&lt;br /&gt;
* ranking&lt;br /&gt;
&lt;br /&gt;
==Result display==&lt;br /&gt;
&lt;br /&gt;
* report per survey, per user and per question&lt;br /&gt;
* report about non-respondent users&lt;br /&gt;
* choose for a question whether to display results as&lt;br /&gt;
** a table&lt;br /&gt;
** a bar chart&lt;br /&gt;
** a pie chart&lt;br /&gt;
&lt;br /&gt;
==Question management==&lt;br /&gt;
&lt;br /&gt;
* questions can be copied within an activity&lt;br /&gt;
* question sets can be created as templates for re-use [maybe later]&lt;br /&gt;
* question sets can be used across multiple courses [maybe later]&lt;br /&gt;
* questions can be re-ordered within an activity&lt;br /&gt;
* question sets can be combined to create a template&lt;br /&gt;
* questions can be deleted from an activity, but there should be an &amp;quot;are you sure&amp;quot; check first.&lt;br /&gt;
&lt;br /&gt;
==Answer Piping &amp;amp; Conditional Questions==&lt;br /&gt;
&lt;br /&gt;
*Allow follow on questions related to the previous.&lt;br /&gt;
*Do You Smoke? Yes/No If Yes is selected a conditional question appears, How Many per Day, if No is selected move on to question 6 appears&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Answer Piping such as:&lt;br /&gt;
*Q1 Which dog breed do you prefer?&lt;br /&gt;
*Labrador&lt;br /&gt;
*Spaniel&lt;br /&gt;
*Collie&lt;br /&gt;
*Other&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Q2 In question 1 you stated you prefer the (Q1 Answer) as a breed, what do you like about it. [Where (Q1 Answer) is replaced with the chosen answer such as &#039;Labrador&#039;&lt;br /&gt;
*Temperament&lt;br /&gt;
*Looks&lt;br /&gt;
*Colour&lt;br /&gt;
*Other&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82655</id>
		<title>Development:Survey 2 brainstorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82655"/>
		<updated>2011-04-08T13:39:56Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* General features of the Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for collecting feature requests for a new Survey module that replaces Survey, Questionnaire and Feedback.&lt;br /&gt;
&lt;br /&gt;
==General features of the Module==&lt;br /&gt;
* translate previously built survey1, feedback and questionnaire at installation time&lt;br /&gt;
* upload exported feedback or questionnaires (survey1 doesn&#039;t export questionnaires templates)&lt;br /&gt;
* save instances of survey2 as a template to reuse it or export it&lt;br /&gt;
* import saved survey2 templates&lt;br /&gt;
* support for groups and groupings&lt;br /&gt;
* custom user survey2 page layout (custom html and css, as it already is in database module)&lt;br /&gt;
* download of submissions in txt, xls and ods&lt;br /&gt;
* conditional branching&lt;br /&gt;
* handle more than one input form layout (and find a way to allow this or that layout to this or that user).&lt;br /&gt;
* order survey fields in editing mode&lt;br /&gt;
* group fields in the page layout with fieldset&lt;br /&gt;
* relations between tables (Example: one record for the profile of my company one related record for each intervention request submitted by my company)&lt;br /&gt;
* email submissions to students/teachers/both/none&lt;br /&gt;
* full web accessibility features to the same level as elsewhere in Moodle e.g. labels on text fields, fieldsets on groups of radio buttons &amp;amp; checkboxes.&lt;br /&gt;
* gradebook integration (to allow simple polls to control conditional activities)&lt;br /&gt;
&lt;br /&gt;
==Instance settings page==&lt;br /&gt;
* Access section: 20 types of survey, distinguished by:&lt;br /&gt;
:-&amp;gt; ppl who is allowed to R/O,&lt;br /&gt;
:-&amp;gt; ppl who is allowed to R/W,&lt;br /&gt;
:-&amp;gt; ppl who is allowed to delete a record&lt;br /&gt;
The reationale is: once a record has been submitted by a user, who is allowed to see it (R/O access)?, who is allowed to edit it (R/W access)?, who is allowed to delete it?&lt;br /&gt;
&lt;br /&gt;
Combining all the options the come out 20 cases are defined as follows where:&lt;br /&gt;
:ALL means, all the people accessing the survey;&lt;br /&gt;
:GROUP means people belonging to the group of the user who submitted the record;&lt;br /&gt;
:OWNER is the user who submitted the record;&lt;br /&gt;
:NONE is none.&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! type&lt;br /&gt;
! R/O&lt;br /&gt;
! R/W&lt;br /&gt;
! delete&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| ALL&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* option: allow/deny save without submission (save and restart)&lt;br /&gt;
* option: anonymous survey or named responses&lt;br /&gt;
* option: allow access to records any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
* opening and closing submission dates&lt;br /&gt;
* number of maximun allowed submission&lt;br /&gt;
* option whether to show results immediately after submission, or a thank you message with link to results.&lt;br /&gt;
&lt;br /&gt;
==Field level settings==&lt;br /&gt;
* type of field (char(n), text, number, alphanumeric, boolean, date, picture, file, email, url...) with type check at submit time (and number of digit check for char(n) fields). This information may not be used at field definition time but is useful for data verification/check.&lt;br /&gt;
&lt;br /&gt;
(Example: Please, enter your card ID: _______ This field should be defined, for instance, as char(7))&lt;br /&gt;
* option: mandatory/non mandatory field&lt;br /&gt;
* free text description field for further description and advices to the completer&lt;br /&gt;
*define a range of valid answers for fields allowing this (see next examples)&lt;br /&gt;
(Example 1:&lt;br /&gt;
Please, enter your seniority. (limited between 0 and 50 years)&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
Date of birth: (limited between 18 and 100 years ago))&lt;br /&gt;
*define fields default to be loaded at &amp;quot;new record&amp;quot; display time&lt;br /&gt;
*optional &amp;quot;other&amp;quot; text field for drop down menu/radio button/check box. (see next example)&lt;br /&gt;
(Example for drop down:&lt;br /&gt;
&lt;br /&gt;
 Where were you born? &amp;lt;code&amp;gt;&amp;lt;select name=&amp;quot;dropdown_14&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Spain&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;France&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;3&amp;quot; &amp;gt;other, please specify&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;dropdown_14_other&amp;quot; size=&amp;quot;10&amp;quot; maxlength=&amp;quot;10&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;quot;other&amp;quot; in the drop down menu the field will be enabled and become mandatory, otherwise it will be disabled.&lt;br /&gt;
)&lt;br /&gt;
* custom question numbers&lt;br /&gt;
* question name to name columns header in the downloaded document&lt;br /&gt;
&lt;br /&gt;
==Question types==&lt;br /&gt;
&lt;br /&gt;
Question types should be plug-ins so that they can be extended locally if required.  The following list covers types which exist in at least one of the current survey modules.&lt;br /&gt;
&lt;br /&gt;
* radio buttons (horizontal &amp;amp; vertical display)&lt;br /&gt;
* short text entry&lt;br /&gt;
* long text entry&lt;br /&gt;
* checkbox&lt;br /&gt;
* drop down menu&lt;br /&gt;
* customisable likert scale for rating&lt;br /&gt;
* date (Example: When were you born?)&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
* short date (with month and years only, to answer question like: When had you the first evidence of this disease?)&lt;br /&gt;
* time&lt;br /&gt;
(Example:&lt;br /&gt;
When do you usually take breakfast?&lt;br /&gt;
)&lt;br /&gt;
* &amp;quot;static text&amp;quot;/&amp;quot;read only&amp;quot; fields (auto filled by the software) like, current_date, user_name, record_ID, counter...&lt;br /&gt;
* allocation (Drag and drop)&lt;br /&gt;
* ranking&lt;br /&gt;
&lt;br /&gt;
==Result display==&lt;br /&gt;
&lt;br /&gt;
* report per survey, per user and per question&lt;br /&gt;
* report about non-respondent users&lt;br /&gt;
* choose for a question whether to display results as&lt;br /&gt;
** a table&lt;br /&gt;
** a bar chart&lt;br /&gt;
** a pie chart&lt;br /&gt;
&lt;br /&gt;
==Question management==&lt;br /&gt;
&lt;br /&gt;
* questions can be copied within an activity&lt;br /&gt;
* question sets can be created as templates for re-use [maybe later]&lt;br /&gt;
* question sets can be used across multiple courses [maybe later]&lt;br /&gt;
* questions can be re-ordered within an activity&lt;br /&gt;
* question sets can be combined to create a template&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Answer Piping &amp;amp; Conditional Questions==&lt;br /&gt;
&lt;br /&gt;
*Allow follow on questions related to the previous.&lt;br /&gt;
*Do You Smoke? Yes/No If Yes is selected a conditional question appears, How Many per Day, if No is selected move on to question 6 appears&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Answer Piping such as:&lt;br /&gt;
*Q1 Which dog breed do you prefer?&lt;br /&gt;
*Labrador&lt;br /&gt;
*Spaniel&lt;br /&gt;
*Collie&lt;br /&gt;
*Other&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Q2 In question 1 you stated you prefer the (Q1 Answer) as a breed, what do you like about it. [Where (Q1 Answer) is replaced with the chosen answer such as &#039;Labrador&#039;&lt;br /&gt;
*Temperament&lt;br /&gt;
*Looks&lt;br /&gt;
*Colour&lt;br /&gt;
*Other&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82593</id>
		<title>Development:Survey 2 brainstorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82593"/>
		<updated>2011-04-06T12:38:26Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* General features of the Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for collecting feature requests for a new Survey module that replaces Survey, Questionnaire and Feedback.&lt;br /&gt;
&lt;br /&gt;
==General features of the Module==&lt;br /&gt;
* translate previously built survey1, feedback and questionnaire at installation time&lt;br /&gt;
* upload exported feedback or questionnaires (survey1 doesn&#039;t export questionnaires templates)&lt;br /&gt;
* save instances of survey2 as a template to reuse it or export it&lt;br /&gt;
* import saved survey2 templates&lt;br /&gt;
* support for groups and groupings&lt;br /&gt;
* custom user survey2 page layout (custom html and css, as it already is in database module)&lt;br /&gt;
* download of submissions in txt, xls and ods&lt;br /&gt;
* conditional branching&lt;br /&gt;
* handle more than one input form layout (and find a way to allow this or that layout to this or that user).&lt;br /&gt;
* order survey fields in editing mode&lt;br /&gt;
* group fields in the page layout with fieldset&lt;br /&gt;
* relations between tables (Example: one record for the profile of my company one related record for each intervention request submitted by my company)&lt;br /&gt;
* email submissions to students/teachers/both/none&lt;br /&gt;
* full web accessibility features to the same level as elsewhere in Moodle e.g. labels on text fields, fieldsets on groups of radio buttons &amp;amp; checkboxes.&lt;br /&gt;
&lt;br /&gt;
==Instance settings page==&lt;br /&gt;
* Access section: 20 types of survey, distinguished by:&lt;br /&gt;
:-&amp;gt; ppl who is allowed to R/O,&lt;br /&gt;
:-&amp;gt; ppl who is allowed to R/W,&lt;br /&gt;
:-&amp;gt; ppl who is allowed to delete a record&lt;br /&gt;
The reationale is: once a record has been submitted by a user, who is allowed to see it (R/O access)?, who is allowed to edit it (R/W access)?, who is allowed to delete it?&lt;br /&gt;
&lt;br /&gt;
Combining all the options the come out 20 cases are defined as follows where:&lt;br /&gt;
:ALL means, all the people accessing the survey;&lt;br /&gt;
:GROUP means people belonging to the group of the user who submitted the record;&lt;br /&gt;
:OWNER is the user who submitted the record;&lt;br /&gt;
:NONE is none.&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! type&lt;br /&gt;
! R/O&lt;br /&gt;
! R/W&lt;br /&gt;
! delete&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ALL&lt;br /&gt;
| ALL&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| ALL&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| ALL&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| ALL&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| GROUP&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| GROUP&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| GROUP&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 17&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| OWNER&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 19&lt;br /&gt;
| OWNER&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
| NONE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* option: allow/deny save without submission (save and restart)&lt;br /&gt;
* option: anonymous survey or named responses&lt;br /&gt;
* option: allow access to records any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
* opening and closing submission dates&lt;br /&gt;
* number of maximun allowed submission&lt;br /&gt;
* option whether to show results immediately after submission, or a thank you message with link to results.&lt;br /&gt;
&lt;br /&gt;
==Field level settings==&lt;br /&gt;
* type of field (char(n), text, number, alphanumeric, boolean, date, picture, file, email, url...) with type check at submit time (and number of digit check for char(n) fields). This information may not be used at field definition time but is useful for data verification/check.&lt;br /&gt;
&lt;br /&gt;
(Example: Please, enter your card ID: _______ This field should be defined, for instance, as char(7))&lt;br /&gt;
* option: mandatory/non mandatory field&lt;br /&gt;
* free text description field for further description and advices to the completer&lt;br /&gt;
*define a range of valid answers for fields allowing this (see next examples)&lt;br /&gt;
(Example 1:&lt;br /&gt;
Please, enter your seniority. (limited between 0 and 50 years)&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
Date of birth: (limited between 18 and 100 years ago))&lt;br /&gt;
*define fields default to be loaded at &amp;quot;new record&amp;quot; display time&lt;br /&gt;
*optional &amp;quot;other&amp;quot; text field for drop down menu/radio button/check box. (see next example)&lt;br /&gt;
(Example for drop down:&lt;br /&gt;
&lt;br /&gt;
 Where were you born? &amp;lt;code&amp;gt;&amp;lt;select name=&amp;quot;dropdown_14&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Spain&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;France&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;3&amp;quot; &amp;gt;other, please specify&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;dropdown_14_other&amp;quot; size=&amp;quot;10&amp;quot; maxlength=&amp;quot;10&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;quot;other&amp;quot; in the drop down menu the field will be enabled and become mandatory, otherwise it will be disabled.&lt;br /&gt;
)&lt;br /&gt;
* custom question numbers&lt;br /&gt;
* question name to name columns header in the downloaded document&lt;br /&gt;
&lt;br /&gt;
==Question types==&lt;br /&gt;
&lt;br /&gt;
Question types should be plug-ins so that they can be extended locally if required.  The following list covers types which exist in at least one of the current survey modules.&lt;br /&gt;
&lt;br /&gt;
* radio buttons (horizontal &amp;amp; vertical display)&lt;br /&gt;
* short text entry&lt;br /&gt;
* long text entry&lt;br /&gt;
* checkbox&lt;br /&gt;
* drop down menu&lt;br /&gt;
* customisable likert scale for rating&lt;br /&gt;
* date (Example: When were you born?)&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
* short date (with month and years only, to answer question like: When had you the first evidence of this disease?)&lt;br /&gt;
* time&lt;br /&gt;
(Example:&lt;br /&gt;
When do you usually take breakfast?&lt;br /&gt;
)&lt;br /&gt;
* &amp;quot;static text&amp;quot;/&amp;quot;read only&amp;quot; fields (auto filled by the software) like, current_date, user_name, record_ID, counter...&lt;br /&gt;
* allocation (Drag and drop)&lt;br /&gt;
* ranking&lt;br /&gt;
&lt;br /&gt;
==Result display==&lt;br /&gt;
&lt;br /&gt;
* report per survey, per user and per question&lt;br /&gt;
* report about non-respondent users&lt;br /&gt;
* choose for a question whether to display results as&lt;br /&gt;
** a table&lt;br /&gt;
** a bar chart&lt;br /&gt;
** a pie chart&lt;br /&gt;
&lt;br /&gt;
==Question management==&lt;br /&gt;
&lt;br /&gt;
* questions can be copied within an activity&lt;br /&gt;
* question sets can be created as templates for re-use [maybe later]&lt;br /&gt;
* question sets can be used across multiple courses [maybe later]&lt;br /&gt;
* questions can be re-ordered within an activity&lt;br /&gt;
* question sets can be combined to create a template&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Answer Piping &amp;amp; Conditional Questions==&lt;br /&gt;
&lt;br /&gt;
*Allow follow on questions related to the previous.&lt;br /&gt;
*Do You Smoke? Yes/No If Yes is selected a conditional question appears, How Many per Day, if No is selected move on to question 6 appears&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Answer Piping such as:&lt;br /&gt;
*Q1 Which dog breed do you prefer?&lt;br /&gt;
*Labrador&lt;br /&gt;
*Spaniel&lt;br /&gt;
*Collie&lt;br /&gt;
*Other&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Q2 In question 1 you stated you prefer the (Q1 Answer) as a breed, what do you like about it. [Where (Q1 Answer) is replaced with the chosen answer such as &#039;Labrador&#039;&lt;br /&gt;
*Temperament&lt;br /&gt;
*Looks&lt;br /&gt;
*Colour&lt;br /&gt;
*Other&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82243</id>
		<title>Development:Survey 2 brainstorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=82243"/>
		<updated>2011-03-24T14:04:57Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Result display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for collecting feature requests for a new Survey module that replaces Survey, Questionnaire and Feedback.&lt;br /&gt;
&lt;br /&gt;
==Module settings page==&lt;br /&gt;
*option: allow/deny save without submission&lt;br /&gt;
*option: anonymous survey or named responses&lt;br /&gt;
*option: allow/deny record modification after submission&lt;br /&gt;
*option: allow/deny the read only access to submitted records (see next example)&lt;br /&gt;
(Example: This option should appear like:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Submitted answers are available/visible &amp;lt;select name=&amp;quot;dropdown_7&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;to all users&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1&amp;quot; &amp;gt;to submitter only&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;to submitter group only&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
)&lt;br /&gt;
*option: allow/deny submitted record deletion&lt;br /&gt;
*custom form and css&lt;br /&gt;
*download of submitted records in some standard format&lt;br /&gt;
* option: allow access to results any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
** fine-grain control for result display at question level also&lt;br /&gt;
*type of field (char(n), text, number, alphanumeric, boolean, date, picture, file, email, url...) with type check at submit time (and number of digit check for char(n) fields).&lt;br /&gt;
&lt;br /&gt;
This information may not be used at field definition time but is useful for data verification/check. (see next example)&lt;br /&gt;
&lt;br /&gt;
(Example:&lt;br /&gt;
Please, enter your card ID: _______&lt;br /&gt;
This field should be defined, for instance, as char(7))&lt;br /&gt;
*opening and closing submission dates (displayed on calendar)&lt;br /&gt;
*relations between tables&lt;br /&gt;
(Example:&lt;br /&gt;
one record for the profile of my company&lt;br /&gt;
one related record for each intervention request submitted by my company)&lt;br /&gt;
&lt;br /&gt;
=== Standard module settings ===&lt;br /&gt;
&lt;br /&gt;
* support for groups and groupings&lt;br /&gt;
* permission control for which roles can create surveys&lt;br /&gt;
&lt;br /&gt;
==Field level settings==&lt;br /&gt;
*mandatory/non mandatory field option&lt;br /&gt;
*free text description field for further description and advice to the completer&lt;br /&gt;
*define a range of valid answers for fields allowing this (see next examples)&lt;br /&gt;
(Example 1:&lt;br /&gt;
Please, enter your seniority. (limited between 0 and 50 years)&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
Date of birth: (limited between 18 and 100 years ago))&lt;br /&gt;
*define fields default to be loaded at &amp;quot;new record&amp;quot; display time&lt;br /&gt;
*optional &amp;quot;other&amp;quot; text field for drop down menu/radio button/check box. (see next example)&lt;br /&gt;
(Example for drop down:&lt;br /&gt;
&lt;br /&gt;
 Where were you born? &amp;lt;code&amp;gt;&amp;lt;select name=&amp;quot;dropdown_14&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Spain&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;France&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;3&amp;quot; &amp;gt;other, please specify&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;dropdown_14_other&amp;quot; size=&amp;quot;10&amp;quot; maxlength=&amp;quot;10&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;quot;other&amp;quot; in the drop down menu the field will be enabled and become mandatory, otherwise it will be disabled.&lt;br /&gt;
)&lt;br /&gt;
*define read-only fields (auto filled by the software) like, current_date, user_name, record_ID...&lt;br /&gt;
* option: allow access to results any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
&lt;br /&gt;
==Question types==&lt;br /&gt;
&lt;br /&gt;
Question types should be plug-ins so that they can be extended locally if required.  The following list covers types which exist in at least one of the current survey modules.&lt;br /&gt;
&lt;br /&gt;
* radio buttons&lt;br /&gt;
** horizontal &amp;amp; vertical&lt;br /&gt;
* short text entry&lt;br /&gt;
* long text entry&lt;br /&gt;
* allocation&lt;br /&gt;
* checkbox&lt;br /&gt;
* customisable likert scale for rating&lt;br /&gt;
* ranking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===New question types===&lt;br /&gt;
*short date (with month and years only, to answer question like: When had you the first evidence of this disease?)&lt;br /&gt;
*order list. A list of available items and the answer is supposed to order them.&lt;br /&gt;
*time (see next example)&lt;br /&gt;
&lt;br /&gt;
(Example:&lt;br /&gt;
When do you usually take breakfast?&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
==Result display==&lt;br /&gt;
&lt;br /&gt;
* choose for a question whether to display results as&lt;br /&gt;
** a table&lt;br /&gt;
** a bar chart&lt;br /&gt;
** a pie chart&lt;br /&gt;
* option whether to show results immediately after submission, or a thank you message with link to results.&lt;br /&gt;
&lt;br /&gt;
==Question management==&lt;br /&gt;
&lt;br /&gt;
* questions can be copied within an activity&lt;br /&gt;
* question sets can be created as templates for re-use&lt;br /&gt;
* question sets can be used across multiple courses&lt;br /&gt;
* questions can be re-ordered within an activity&lt;br /&gt;
* question sets can be combined to create a questionnaire&lt;br /&gt;
&lt;br /&gt;
==Uncategorised requested features==&lt;br /&gt;
*handle more than one view_single/view_list/find/input layout (and allow this or that layout to users on the basis of capabilities).&lt;br /&gt;
&lt;br /&gt;
The idea is: On the basis of capability you will access your specific layout with only a field subset.&lt;br /&gt;
If you have this capability, you will find all the fields of the survey, otherwise you will find only a subset of them.&lt;br /&gt;
&lt;br /&gt;
The same feature may be provided in the following way:&lt;br /&gt;
At fields level definition the course creator should be allowed to mark the field &amp;quot;field1&amp;quot; as&lt;br /&gt;
#visible and enabled to all&lt;br /&gt;
#visible to all but enabled to users with view_field1 capability only&lt;br /&gt;
#visible and enabled to users with view_field1 capability only&lt;br /&gt;
&lt;br /&gt;
*allow update of submitted questionnaire as an option (not just a clean slate on the next go-round)&lt;br /&gt;
*allow course creator to add custom number to question inside layouts (i.e.: 1, 2, 2a, 2b, 3...) to respect questions hierarchy&lt;br /&gt;
*allow course creator to indent questions inside layouts to respect questions hierarchy (as it is already possible the indent of resources inside courses)&lt;br /&gt;
*conditional branching (see next example)&lt;br /&gt;
(Example:&lt;br /&gt;
&lt;br /&gt;
 1. Gender: &amp;lt;code&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;0&amp;quot; checked=&amp;quot;checked&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;F  &amp;lt;code&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;M&lt;br /&gt;
 1a. How many pregnancies have you had? &amp;lt;code&amp;gt;&amp;lt;select&amp;gt;&amp;lt;option value=&amp;quot;0&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;0&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;more&amp;quot;&amp;gt;more&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;/code&amp;gt; (should be disabled when answer 1 == F)&lt;br /&gt;
 1b. Question relevant only for males? &amp;lt;code&amp;gt;&amp;lt;select disabled=&amp;quot;disabled&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;aa&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;aa&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;bb&amp;quot;&amp;gt;bb&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;cc&amp;quot;&amp;gt;cc&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;more&amp;quot;&amp;gt;other&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;/code&amp;gt; (should be disabled when answer 1 == M)&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
==Answer Piping &amp;amp; Conditional Questions==&lt;br /&gt;
&lt;br /&gt;
*Allow follow on questions related to the previous.&lt;br /&gt;
*Do You Smoke? Yes/No If Yes is selected a conditional question appears, How Many per Day, if No is selected move on to question 6 appears&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Answer Piping such as:&lt;br /&gt;
*Q1 Which dog breed do you prefer?&lt;br /&gt;
*Labrador&lt;br /&gt;
*Spaniel&lt;br /&gt;
*Collie&lt;br /&gt;
*Other&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Q2 In question 1 you stated you prefer the (Q1 Answer) as a breed, what do you like about it. [Where (Q1 Answer) is replaced with the chosen answer such as &#039;Labrador&#039;&lt;br /&gt;
*Temperament&lt;br /&gt;
*Looks&lt;br /&gt;
*Colour&lt;br /&gt;
*Other&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=81906</id>
		<title>Development:Survey 2 brainstorm</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Survey_2_brainstorm&amp;diff=81906"/>
		<updated>2011-03-14T13:59:08Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is for collecting feature requests for a new Survey module that replaces Survey, Questionnaire and Feedback.&lt;br /&gt;
&lt;br /&gt;
==Module settings page==&lt;br /&gt;
*option: allow/deny save without submission&lt;br /&gt;
*option: anonymous survey or named responses&lt;br /&gt;
*option: allow/deny record modification after submission&lt;br /&gt;
*option: allow/deny the read only access to submitted records (see next example)&lt;br /&gt;
(Example: This option should appear like:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Submitted answers are available/visible &amp;lt;select name=&amp;quot;dropdown_7&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;0&amp;quot;&amp;gt;to all users&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;1&amp;quot; &amp;gt;to submitter only&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;to submitter group only&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
)&lt;br /&gt;
*option: allow/deny submitted record deletion&lt;br /&gt;
*custom form and css&lt;br /&gt;
*download of submitted records in some standard format&lt;br /&gt;
* option: allow access to results any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
** fine-grain control for result display at question level also&lt;br /&gt;
*type of field (char(n), text, number, alphanumeric, boolean, date, picture, file, email, url...) with type check at submit time (and number of digit check for char(n) fields).&lt;br /&gt;
&lt;br /&gt;
This information may not be used at field definition time but is useful for data verification/check. (see next example)&lt;br /&gt;
&lt;br /&gt;
(Example:&lt;br /&gt;
Please, enter your card ID: _______&lt;br /&gt;
This field should be defined, for instance, as char(7))&lt;br /&gt;
*opening and closing submission dates (displayed on calendar)&lt;br /&gt;
*relations between tables&lt;br /&gt;
(Example:&lt;br /&gt;
one record for the profile of my company&lt;br /&gt;
one related record for each intervention request submitted by my company)&lt;br /&gt;
&lt;br /&gt;
=== Standard module settings ===&lt;br /&gt;
&lt;br /&gt;
* support for groups and groupings&lt;br /&gt;
* permission control for which roles can create surveys&lt;br /&gt;
&lt;br /&gt;
==Field level settings==&lt;br /&gt;
*mandatory/non mandatory field option&lt;br /&gt;
*free text description field for further description and advice to the completer&lt;br /&gt;
*define a range of valid answers for fields allowing this (see next examples)&lt;br /&gt;
(Example 1:&lt;br /&gt;
Please, enter your seniority. (limited between 0 and 50 years)&lt;br /&gt;
&lt;br /&gt;
Example 2:&lt;br /&gt;
Date of birth: (limited between 18 and 100 years ago))&lt;br /&gt;
*define fields default to be loaded at &amp;quot;new record&amp;quot; display time&lt;br /&gt;
*optional &amp;quot;other&amp;quot; text field for drop down menu/radio button/check box. (see next example)&lt;br /&gt;
(Example for drop down:&lt;br /&gt;
&lt;br /&gt;
 Where were you born? &amp;lt;code&amp;gt;&amp;lt;select name=&amp;quot;dropdown_14&amp;quot; size=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;Spain&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot; &amp;gt;France&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;3&amp;quot; &amp;gt;other, please specify&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;  &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;dropdown_14_other&amp;quot; size=&amp;quot;10&amp;quot; maxlength=&amp;quot;10&amp;quot; value=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you choose &amp;quot;other&amp;quot; in the drop down menu the field will be enabled and become mandatory, otherwise it will be disabled.&lt;br /&gt;
)&lt;br /&gt;
*define read-only fields (auto filled by the software) like, current_date, user_name, record_ID...&lt;br /&gt;
* option: allow access to results any time/after you&#039;ve submitted/after close date/never&lt;br /&gt;
&lt;br /&gt;
==Fields types==&lt;br /&gt;
&lt;br /&gt;
Field types should be plug-ins so that they can be extended locally if required.  The following list covers types which exist in at least one of the current survey modules.&lt;br /&gt;
&lt;br /&gt;
* radio buttons&lt;br /&gt;
** horizontal &amp;amp; vertical&lt;br /&gt;
* short text entry&lt;br /&gt;
* long text entry&lt;br /&gt;
* allocation&lt;br /&gt;
* checkbox&lt;br /&gt;
* customisable likert scale for rating&lt;br /&gt;
* ranking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===New field types===&lt;br /&gt;
*short date (with month and years only, to answer question like: When had you the first evidence of this disease?)&lt;br /&gt;
*order list. A list of available items and the answer is supposed to order them.&lt;br /&gt;
*time (see next example)&lt;br /&gt;
&lt;br /&gt;
(Example:&lt;br /&gt;
When do you usually take breakfast?&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
==Result display==&lt;br /&gt;
&lt;br /&gt;
* choose for a question whether to display results as&lt;br /&gt;
** a table&lt;br /&gt;
** a bar chart&lt;br /&gt;
** a pie chart&lt;br /&gt;
&lt;br /&gt;
==Question management==&lt;br /&gt;
&lt;br /&gt;
* questions can be copied within an activity&lt;br /&gt;
* question sets can be created as templates for re-use&lt;br /&gt;
* question sets can be used across multiple courses&lt;br /&gt;
* questions can be re-ordered within an activity&lt;br /&gt;
&lt;br /&gt;
==Uncategorised requested features==&lt;br /&gt;
*handle more than one view_single/view_list/find/input layout (and allow this or that layout to users on the basis of capabilities).&lt;br /&gt;
&lt;br /&gt;
The idea is: On the basis of capability you will access your specific layout with only a field subset.&lt;br /&gt;
If you have this capability, you will find all the fields of the survey, otherwise you will find only a subset of them.&lt;br /&gt;
&lt;br /&gt;
The same feature may be provided in the following way:&lt;br /&gt;
At fields level definition the course creator should be allowed to mark the field &amp;quot;field1&amp;quot; as&lt;br /&gt;
#visible and enabled to all&lt;br /&gt;
#visible to all but enabled to users with view_field1 capability only&lt;br /&gt;
#visible and enabled to users with view_field1 capability only&lt;br /&gt;
&lt;br /&gt;
*allow course creator to add custom number to question inside layouts (i.e.: 1, 2, 2a, 2b, 3...) to respect questions hierarchy&lt;br /&gt;
*allow course creator to indent questions inside layouts to respect questions hierarchy (as it is already possible the indent of resources inside courses)&lt;br /&gt;
*conditional branching (see next example)&lt;br /&gt;
(Example:&lt;br /&gt;
&lt;br /&gt;
 1. Gender: &amp;lt;code&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;0&amp;quot; checked=&amp;quot;checked&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;F  &amp;lt;code&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;gender&amp;quot; value=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;/code&amp;gt;M&lt;br /&gt;
 1a. How many pregnancies have you had? &amp;lt;code&amp;gt;&amp;lt;select&amp;gt;&amp;lt;option value=&amp;quot;0&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;0&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;1&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;2&amp;quot;&amp;gt;2&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;more&amp;quot;&amp;gt;more&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;/code&amp;gt; (should be disabled when answer 1 == F)&lt;br /&gt;
 1b. Question relevant only for males? &amp;lt;code&amp;gt;&amp;lt;select disabled=&amp;quot;disabled&amp;quot;&amp;gt;&amp;lt;option value=&amp;quot;aa&amp;quot; selected=&amp;quot;selected&amp;quot;&amp;gt;aa&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;bb&amp;quot;&amp;gt;bb&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;cc&amp;quot;&amp;gt;cc&amp;lt;/option&amp;gt;&amp;lt;option value=&amp;quot;more&amp;quot;&amp;gt;other&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;&amp;lt;/code&amp;gt; (should be disabled when answer 1 == M)&lt;br /&gt;
)&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81905</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81905"/>
		<updated>2011-03-14T13:29:34Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Defining the form */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in.  Each plug-in would offer its own settings screen, and would place links to that screen at suitable place(s) in their own user interface.   Additionally, a link to the settings screen would be  automatically added to the profile section of the settings block, wherever it appears.  This would gather together user preferences in a single location, making them easy to find.&lt;br /&gt;
&lt;br /&gt;
When the user views the settings screen, their current settings will be displayed.  An Edit button will allow them to make changes.  &lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
=== User interface mock-ups ===&lt;br /&gt;
&lt;br /&gt;
1.  a custom plug-in&#039;s main screen - showing its link to its settings screen&lt;br /&gt;
&lt;br /&gt;
[[Image:userprefs_pluginscreen.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
2.  a custom plug-in&#039;s setting screen in read mode - also showing the settings block with links to other settings&lt;br /&gt;
&lt;br /&gt;
[[Image:Userprefs_readscreen.png]]&lt;br /&gt;
&lt;br /&gt;
3.  a custom plug-in&#039;s setting screen in edit mode&lt;br /&gt;
&lt;br /&gt;
[[Image:Userprefs_edit.png]]&lt;br /&gt;
&lt;br /&gt;
4.  forum settings&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_forum.png]]&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
Initially I thought that the user/edit.php pages should display the Settings block.  Given that the settings block and the &amp;quot;my profile&amp;quot; section is available all over the place, I&#039;m not sure this is strictly necessary.  When you&#039;re editing your profile, so you really need to jump to other places?  You don&#039;t have the block there already with your &amp;quot;change password&amp;quot; link.  &lt;br /&gt;
&lt;br /&gt;
If we do want the settings block on the edit profile screen, it&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189.  Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  &lt;br /&gt;
&lt;br /&gt;
A new class of user_settingpage will be set up, so that the userpreferences.php file will start with: &lt;br /&gt;
&lt;br /&gt;
    $settings = new user_settingpage(&#039;format_studyplan&#039;, get_string(&#039;pluginname&#039;,&#039;format_studyplan&#039;));&lt;br /&gt;
&lt;br /&gt;
Then each setting will be added like this:&lt;br /&gt;
&lt;br /&gt;
    $settings-&amp;gt;add(new user_setting_checkbox(&#039;format_studyplan_enablenotes&#039;, get_string(&#039;enablenotes_label&#039;, &#039;format_studyplan&#039;), get_string(&#039;enablenotes_prompt&#039;, &#039;format_studyplan&#039;), get_string(&#039;enablenotes_help&#039;, &#039;format_studyplan&#039;), true, PARAM_INT));&lt;br /&gt;
&lt;br /&gt;
To be completed - I&#039;m not sure yet what the user_setting classes would need to do (how much can they inherit from admin_setting), and what we&#039;d need to write so that when a user clicks on plugin/userpreferences.php link in the website they get the form rendered correctly.&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If the user visits their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor (possibly some new ones coming related to this too)&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81904</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81904"/>
		<updated>2011-03-14T13:20:37Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* User interface mock-ups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in.  Each plug-in would offer its own settings screen, and would place links to that screen at suitable place(s) in their own user interface.   Additionally, a link to the settings screen would be  automatically added to the profile section of the settings block, wherever it appears.  This would gather together user preferences in a single location, making them easy to find.&lt;br /&gt;
&lt;br /&gt;
When the user views the settings screen, their current settings will be displayed.  An Edit button will allow them to make changes.  &lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
=== User interface mock-ups ===&lt;br /&gt;
&lt;br /&gt;
1.  a custom plug-in&#039;s main screen - showing its link to its settings screen&lt;br /&gt;
&lt;br /&gt;
[[Image:userprefs_pluginscreen.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
2.  a custom plug-in&#039;s setting screen in read mode - also showing the settings block with links to other settings&lt;br /&gt;
&lt;br /&gt;
[[Image:Userprefs_readscreen.png]]&lt;br /&gt;
&lt;br /&gt;
3.  a custom plug-in&#039;s setting screen in edit mode&lt;br /&gt;
&lt;br /&gt;
[[Image:Userprefs_edit.png]]&lt;br /&gt;
&lt;br /&gt;
4.  forum settings&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_forum.png]]&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
Initially I thought that the user/edit.php pages should display the Settings block.  Given that the settings block and the &amp;quot;my profile&amp;quot; section is available all over the place, I&#039;m not sure this is strictly necessary.  When you&#039;re editing your profile, so you really need to jump to other places?  You don&#039;t have the block there already with your &amp;quot;change password&amp;quot; link.  &lt;br /&gt;
&lt;br /&gt;
If we do want the settings block on the edit profile screen, it&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189.  Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If the user visits their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor (possibly some new ones coming related to this too)&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:Userpref_forum.png&amp;diff=81903</id>
		<title>File:Userpref forum.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:Userpref_forum.png&amp;diff=81903"/>
		<updated>2011-03-14T13:19:16Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81902</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81902"/>
		<updated>2011-03-14T12:38:11Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* User interface mock-ups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in.  Each plug-in would offer its own settings screen, and would place links to that screen at suitable place(s) in their own user interface.   Additionally, a link to the settings screen would be  automatically added to the profile section of the settings block, wherever it appears.  This would gather together user preferences in a single location, making them easy to find.&lt;br /&gt;
&lt;br /&gt;
When the user views the settings screen, their current settings will be displayed.  An Edit button will allow them to make changes.  &lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
=== User interface mock-ups ===&lt;br /&gt;
&lt;br /&gt;
1.  a custom plug-in&#039;s main screen - showing its link to its settings screen&lt;br /&gt;
&lt;br /&gt;
[[Image:userprefs_pluginscreen.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
2.  a custom plug-in&#039;s setting screen in read mode&lt;br /&gt;
&lt;br /&gt;
[[Image:Userprefs_readscreen.png]]&lt;br /&gt;
&lt;br /&gt;
3.  a custom plug-in&#039;s setting screen in edit mode&lt;br /&gt;
&lt;br /&gt;
[[Image:Userprefs_edit.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4.  forum settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.  the user profile page&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
Initially I thought that the user/edit.php pages should display the Settings block.  Given that the settings block and the &amp;quot;my profile&amp;quot; section is available all over the place, I&#039;m not sure this is strictly necessary.  When you&#039;re editing your profile, so you really need to jump to other places?  You don&#039;t have the block there already with your &amp;quot;change password&amp;quot; link.  &lt;br /&gt;
&lt;br /&gt;
If we do want the settings block on the edit profile screen, it&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189.  Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If the user visits their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor (possibly some new ones coming related to this too)&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:Userprefs_edit.png&amp;diff=81901</id>
		<title>File:Userprefs edit.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:Userprefs_edit.png&amp;diff=81901"/>
		<updated>2011-03-14T12:32:37Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:Userprefs_readscreen.png&amp;diff=81900</id>
		<title>File:Userprefs readscreen.png</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:Userprefs_readscreen.png&amp;diff=81900"/>
		<updated>2011-03-14T12:31:49Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81899</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81899"/>
		<updated>2011-03-14T12:14:45Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* User interface mock-ups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in.  Each plug-in would offer its own settings screen, and would place links to that screen at suitable place(s) in their own user interface.   Additionally, a link to the settings screen would be  automatically added to the profile section of the settings block, wherever it appears.  This would gather together user preferences in a single location, making them easy to find.&lt;br /&gt;
&lt;br /&gt;
When the user views the settings screen, their current settings will be displayed.  An Edit button will allow them to make changes.  &lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
=== User interface mock-ups ===&lt;br /&gt;
&lt;br /&gt;
1.  a custom plug-in&#039;s main screen - showing its link to its settings screen&lt;br /&gt;
&lt;br /&gt;
[[Image:userprefs_pluginscreen.jpg]]&lt;br /&gt;
&lt;br /&gt;
2.  a custom plug-in&#039;s setting screen in read mode&lt;br /&gt;
&lt;br /&gt;
3.  a custom plug-in&#039;s setting screen in edit mode&lt;br /&gt;
&lt;br /&gt;
4.  forum settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.  the user profile page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.  the course home page&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
Initially I thought that the user/edit.php pages should display the Settings block.  Given that the settings block and the &amp;quot;my profile&amp;quot; section is available all over the place, I&#039;m not sure this is strictly necessary.  When you&#039;re editing your profile, so you really need to jump to other places?  You don&#039;t have the block there already with your &amp;quot;change password&amp;quot; link.  &lt;br /&gt;
&lt;br /&gt;
If we do want the settings block on the edit profile screen, it&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189.  Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If the user visits their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor (possibly some new ones coming related to this too)&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:userprefs_pluginscreen.jpg&amp;diff=81898</id>
		<title>File:userprefs pluginscreen.jpg</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:userprefs_pluginscreen.jpg&amp;diff=81898"/>
		<updated>2011-03-14T12:13:57Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81897</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81897"/>
		<updated>2011-03-14T10:44:51Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in.  Each plug-in would offer its own settings screen, and would place links to that screen at suitable place(s) in their own user interface.   Additionally, a link to the settings screen would be  automatically added to the profile section of the settings block, wherever it appears.  This would gather together user preferences in a single location, making them easy to find.&lt;br /&gt;
&lt;br /&gt;
When the user views the settings screen, their current settings will be displayed.  An Edit button will allow them to make changes.  &lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
=== User interface mock-ups ===&lt;br /&gt;
&lt;br /&gt;
1.  a custom plug-in&#039;s main screen - showing its link to its settings screen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.  a custom plug-in&#039;s setting screen in read mode&lt;br /&gt;
&lt;br /&gt;
3.  a custom plug-in&#039;s setting screen in edit mode&lt;br /&gt;
&lt;br /&gt;
4.  forum settings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.  the user profile page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.  the course home page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
Initially I thought that the user/edit.php pages should display the Settings block.  Given that the settings block and the &amp;quot;my profile&amp;quot; section is available all over the place, I&#039;m not sure this is strictly necessary.  When you&#039;re editing your profile, so you really need to jump to other places?  You don&#039;t have the block there already with your &amp;quot;change password&amp;quot; link.  &lt;br /&gt;
&lt;br /&gt;
If we do want the settings block on the edit profile screen, it&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189.  Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If the user visits their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor (possibly some new ones coming related to this too)&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81895</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81895"/>
		<updated>2011-03-14T10:03:03Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in.  Each plug-in would offer its own settings screen, and would place links to that screen at suitable place(s) in their own user interface.   Additionally, a link to the settings screen would be  automatically added to the profile section of the settings block.  This would gather together user preferences in a single location, making them easy to find.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
The user/edit.php pages will need to display the Settings block.  It&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189. &lt;br /&gt;
&lt;br /&gt;
Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81864</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81864"/>
		<updated>2011-03-11T09:44:26Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Generated settings form */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
The user/edit.php pages will need to display the Settings block.  It&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189. &lt;br /&gt;
&lt;br /&gt;
Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
Example plug-in form:&lt;br /&gt;
&lt;br /&gt;
[[Image:userpref_Studyplansettings.gif]]&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:userpref_Studyplansettings.gif&amp;diff=81863</id>
		<title>File:userpref Studyplansettings.gif</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:userpref_Studyplansettings.gif&amp;diff=81863"/>
		<updated>2011-03-11T09:43:42Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81862</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81862"/>
		<updated>2011-03-11T09:42:18Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Settings block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Userpref_settingblock.gif]]&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
The user/edit.php pages will need to display the Settings block.  It&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189. &lt;br /&gt;
&lt;br /&gt;
Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.&lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:Userpref_settingblock.gif&amp;diff=81861</id>
		<title>File:Userpref settingblock.gif</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:Userpref_settingblock.gif&amp;diff=81861"/>
		<updated>2011-03-11T09:41:43Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81543</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81543"/>
		<updated>2011-02-23T09:38:20Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* set_user_preferences */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Update&#039;&#039; Tim points out that you&#039;d be unlikely to want to set multiple plug-ins at the same time, which is very true.  Its probably not something we should encourage either.  So maybe it would be better to simply add another parameter (optional, default null as with set_user_preference()) with the plugin name.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
The user/edit.php pages will need to display the Settings block.  It&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189. &lt;br /&gt;
&lt;br /&gt;
Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.  &lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81542</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81542"/>
		<updated>2011-02-23T09:36:25Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin (or maybe component if that&#039;s newer moodle style)&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
The user/edit.php pages will need to display the Settings block.  It&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189. &lt;br /&gt;
&lt;br /&gt;
Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.  &lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81483</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81483"/>
		<updated>2011-02-22T10:49:01Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
====Structure====&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The Settings block currently includes a Profile section, which expands to offer a link to edit profile.  Users with the right permissions also see change password, roles and security key links.  &lt;br /&gt;
&lt;br /&gt;
This profile section will be extended to add a link to each of the user preferences screens defined by plugins.  The link will be highlighted with CSS to indicate the currently open page.&lt;br /&gt;
&lt;br /&gt;
The links can be added in navigationlib.php by adding a loop through all enabled plugins (of all types) looking for an appropriately named file (see below) defining a user preferences form.  If found, a function call would check whether the link should be added (see below), and if returns true a link to the form will be included in the profile navigation.&lt;br /&gt;
&lt;br /&gt;
==== Block display ====&lt;br /&gt;
&lt;br /&gt;
The user/edit.php pages will need to display the Settings block.  It&#039;s pagelayout will need to be set to something that displays user blocks to match the profile page. The user/edit page already has user pagetype, but a course context.  This will cause difficulties with the block display and overlaps with issues Sam has reported in MDL-25189. &lt;br /&gt;
&lt;br /&gt;
Some core themes (e.g. boxxie - it may be the only one, I haven&#039;t checked) add blocks on the user/edit.php page.  These would need to be updated to remove that control, as being no longer necessary.  &lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
====Defining the form====&lt;br /&gt;
&lt;br /&gt;
An optional file (userpreferences.php) will be added to each plugin which wants to define a user preferences interface.  &lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file will create a new form.   This will not be a complete moodleform definition but a simpler definition similar to the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.  (??? because of that would it actually be simpler to add a proper moodleform ???)&lt;br /&gt;
&lt;br /&gt;
The exact definition of these files is the main part of this specification which requires further work - I thought it best to wait until the general principle could be agreed before spending too much time on that!&lt;br /&gt;
&lt;br /&gt;
====Admin override====&lt;br /&gt;
&lt;br /&gt;
It is possible that system administrators may want to hide the user preferences for simplicity.  The userpreferences.php file (or the plug-in class definition??) will include a function (plugin_userprefs_link maybe??) which indicates whether or not the settings block profile link should be included.  This will return true by default for all plugins.&lt;br /&gt;
&lt;br /&gt;
However, plug-in developers making use of this feature should include an admin settings screen with an on/off checkbox, and then their choice would be returned rather than the default true.&lt;br /&gt;
&lt;br /&gt;
As an extension of this, plug-in developers might give administrators the option to switch on and off individual settings within the plug-in&#039;s user preferences form.  If all individual settings were disabled, the plugin_userprefs_link function should check this situation and return false regardless of the general admin on/off setting. &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81480</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81480"/>
		<updated>2011-02-22T10:19:28Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
This function takes an array of key/value pairs and saves all of them in the user_preferences table.  This would be extended to optionally take an array of arrays of key/value pairs.  &lt;br /&gt;
&lt;br /&gt;
The first array would be indexed with the plugin name, so $array[&#039;plugin1&#039;] contains all the key/value pairs for plugin1.  &lt;br /&gt;
&lt;br /&gt;
If an array of arrays is received, then each array&#039;s key/value pairs are inserted with the array&#039;s index inserted as the plugin value in the database row.  If a simple array of key/value pairs is received, these are inserted with a null plugin value.&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
Where these plugins are not enabled, the settings page would not be included in the profile settings navigation.&lt;br /&gt;
&lt;br /&gt;
The user/edit.php page will need to display the Settings block.  Therefore, its pagelayout would need to be set to something that displayed user blocks as they are displayed on the view profile page.  Core themes (like boxxie) which add blocks on the user/edit.php page would need to be updated to remove that control.  &lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The code within userpreferences.php would be an extension of the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.&lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file would create a new form, which would appear in the user profile section of the Settings block as an extra link below Edit profile.  The link will be highlighted with CSS to indicate the currently open page – in the same way as currently happens for edit profile.  &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be moved and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
Here is a list of current user profile fields which fall into this situation - most would problably move to a &amp;quot;general&amp;quot; tab as they affect multiple plugins.  In particular, I&#039;m not sure what to do with the messaging ones, as they shouldn&#039;t be disabled if system private messaging is disabled, but they don&#039;t belong just with forum.&lt;br /&gt;
&lt;br /&gt;
*	General&lt;br /&gt;
**	Use HTML editor&lt;br /&gt;
**	Ajax and JavaScript&lt;br /&gt;
**	Screen reader&lt;br /&gt;
**	Preferred language&lt;br /&gt;
*	Messaging &lt;br /&gt;
**	Email format&lt;br /&gt;
**	Email display&lt;br /&gt;
**	Email digest type&lt;br /&gt;
*	Forum&lt;br /&gt;
**	Forum autosubscribe&lt;br /&gt;
**	Forum tracking&lt;br /&gt;
&lt;br /&gt;
=== Generated settings form ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures, so no further extension will be required.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81479</id>
		<title>Development:User preferences for plug-ins</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:User_preferences_for_plug-ins&amp;diff=81479"/>
		<updated>2011-02-22T10:10:18Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: New page: This page is associated with discussion about allowing plug-ins to declare their own user settings screens.  * Forum thread http://moodle.org/mod/forum/discuss.php?d=168322 * Tracker issue...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is associated with discussion about allowing plug-ins to declare their own user settings screens.&lt;br /&gt;
&lt;br /&gt;
* Forum thread http://moodle.org/mod/forum/discuss.php?d=168322&lt;br /&gt;
* Tracker issue http://tracker.moodle.org/browse/MDL-26347&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
One strand of development for the Open University UK&#039;s next generation VLE focusses on features which allow the student to be able to personalise their experience with various different parts of the system.  What it boils down to is them being able to switch bits on and off.&lt;br /&gt;
&lt;br /&gt;
What I&#039;d like is for a plug-in (module, block, course format, local plug-in...) to be able to define a user settings screen that relates to the plug-in and have that screen automatically added to the profile section of the settings block.&lt;br /&gt;
&lt;br /&gt;
=== Discarded thoughts ===&lt;br /&gt;
&lt;br /&gt;
Initially I thought this could be done through the custom user profile fields, where each plug-in would define a custom profile category (only editable through code) and each category would be displayed as a separate item in the profile settings navigation.  &lt;br /&gt;
&lt;br /&gt;
There was a lot of concern (see MDL-26347 comments) from Eloy and Petr about interdependence of functionality.  &lt;br /&gt;
&lt;br /&gt;
This new proposal builds on a suggestion from Tim in the forum thread to use user_preferences instead, since this does not have a UI for admins to interact with.  Tim, Sam and I have worked together to rough this outline for further discussion...&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
&lt;br /&gt;
User preferences will be stored in the existing core user_preferences table, rather than in tables associated with the plug-in.  &lt;br /&gt;
&lt;br /&gt;
The user_preferences table will be extended to add a plug-in column, for improved data integrity (optional - the rest of this design could work without this change, either in the short term to allow an early inclusion in 2.0.x or for ever).&lt;br /&gt;
&lt;br /&gt;
Current best practice is to include the plug-in name in the name of the user_preference, so this extension will simplify that.  The table will be populated as follows&lt;br /&gt;
&lt;br /&gt;
*	Userid&lt;br /&gt;
**      the id number for current $USER&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*       plugin&lt;br /&gt;
**      frankenstyle name&lt;br /&gt;
**      allowed null for backward compatibility&lt;br /&gt;
*	Name&lt;br /&gt;
**      the setting being stored&lt;br /&gt;
**      as currently defined&lt;br /&gt;
*	value&lt;br /&gt;
**      the user&#039;s choice&lt;br /&gt;
**      as currently defined&lt;br /&gt;
&lt;br /&gt;
====Get and Set functions====&lt;br /&gt;
&lt;br /&gt;
The data continues to be accessed through the existing functions which are extended to cope with the optional plugin parameter.&lt;br /&gt;
&lt;br /&gt;
===== get_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be checked when accessing the data.  Otherwise, just the name and user parameters, and a null plugin value will be checked.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preference =====&lt;br /&gt;
&lt;br /&gt;
An additional optional plugin parameter will be added.  This will default to null if no parameter is passed, for backward compatibility.&lt;br /&gt;
&lt;br /&gt;
If the plugin parameter is received then this, as well as the name and user parameters will be inserted in the database.  Otherwise, just the name and user parameters, and a null plugin value will be inserted.&lt;br /&gt;
&lt;br /&gt;
===== set_user_preferences =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Settings block ===&lt;br /&gt;
&lt;br /&gt;
The user/edit.php page will need to display the Settings block.  Therefore, its pagelayout would need to be set to something that displayed user blocks as they are displayed on the view profile page.  Core themes (like boxxie) which add blocks on the user/edit.php page would need to be updated to remove that control.  &lt;br /&gt;
&lt;br /&gt;
===Plug-in interface===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The code within userpreferences.php would be an extension of the way admin configuration settings.php files work.  However, since the forms will be aimed at users rather than admins, the form fields will optionally need additional help text.&lt;br /&gt;
&lt;br /&gt;
Each userpreferences.php file would create a new form, which would appear in the user profile section of the Settings block as an extra link below Edit profile.  The link will be highlighted with CSS to indicate the currently open page – in the same way as currently happens for edit profile.  &lt;br /&gt;
&lt;br /&gt;
=== Further tidying up possible ===&lt;br /&gt;
&lt;br /&gt;
A number of fields on the current user profile form could be removed and placed more appropriately with their plug-ins, or into a new form for general preferences.  This would leave the main profile form solely responsible for personal data about the user. &lt;br /&gt;
&lt;br /&gt;
•	General&lt;br /&gt;
o	Use HTML editor&lt;br /&gt;
o	Ajax and JavaScript&lt;br /&gt;
o	Screen reader&lt;br /&gt;
o	Preferred language&lt;br /&gt;
•	Messaging&lt;br /&gt;
o	Email format&lt;br /&gt;
o	Email display&lt;br /&gt;
o	Email digest type&lt;br /&gt;
•	Forum&lt;br /&gt;
o	Forum autosubscribe&lt;br /&gt;
o	Forum tracking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Generated settings form===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The save and cancel buttons should intuitively take you back to the course home page.  If they visit their profile from a course home or content page, the global $COURSE variable will be available and the id property can be used to define the redirect.  Alternatively, the lastcourseaccess property of the global $USER variable stores the last visit on all their available courses, and so can be used to identify the last course they looked at for the definition of the redirect.  If the lastcourseaccess property of the global $USER variable is empty, the user should be redirected to the latest course on which they were enrolled.&lt;br /&gt;
&lt;br /&gt;
===Backup and restore===&lt;br /&gt;
&lt;br /&gt;
User settings, because they are stored using the core user_preferences functionality are already catered for in backup and restore procedures.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{CategoryDeveloper}}&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Migrating_to_2.0_checklist&amp;diff=80882</id>
		<title>Development:Migrating to 2.0 checklist</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Migrating_to_2.0_checklist&amp;diff=80882"/>
		<updated>2011-01-27T15:04:26Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* General */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are things that OU developers have found so far to check/do in code we&#039;re migrating from Moodle 1.9 to 2.0.  All information on the detail of this checklist can be found elsewhere in Moodle Docs, and particularly from the [[Development:Migrating_contrib_code_to_2.0]]&lt;br /&gt;
&lt;br /&gt;
Not all these things are essential for a rush job, but if you did all of them, then that&#039;d be great.  We should really mark each one with a priority of some sort!&lt;br /&gt;
&lt;br /&gt;
Please add/edit this list!&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* 	Leave empty db/update.php file&lt;br /&gt;
* 	New $DB global objects with functions replace old db functions&lt;br /&gt;
* 	$DB parameters swapped to ? &lt;br /&gt;
* 	Add and strip slashes no longer required&lt;br /&gt;
* 	Remove use of ENUM and ENUMVALUES in install.xml file&lt;br /&gt;
* 	check use of sql_substr() &lt;br /&gt;
* 	Get_records() etc now always returning arrays, empty array in case of no records found. &lt;br /&gt;
* 	Db functions throw errors not return false on error&lt;br /&gt;
* 	DB functions offer strictness parameters e.g MUST_EXIST&lt;br /&gt;
* 	Update version.php numbers (esp required)&lt;br /&gt;
&lt;br /&gt;
==Page display==&lt;br /&gt;
&lt;br /&gt;
* 	New $OUTPUT header and footer functions&lt;br /&gt;
* Navigation links need to use $PAGE-&amp;gt;navbar&lt;br /&gt;
* 	Make sure that you instantiate the moodle form before any call to $OUTPUT-&amp;gt;header()&lt;br /&gt;
* 	Create a renderer&lt;br /&gt;
*       Change the way image urls are displayed (not $CFG-&amp;gt;pixpath any more)&lt;br /&gt;
*       CSS changes&lt;br /&gt;
**      Change styles.php to styles.css&lt;br /&gt;
**      Change page id to new structure e.g. course-format-studyplan to page-course-view-studyplan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Roles and Permissions:==&lt;br /&gt;
&lt;br /&gt;
* 	array name to $capabilities in access.php&lt;br /&gt;
* 	Remove references to admin in access.php&lt;br /&gt;
* 	Rename legacy to archetypes in access.php&lt;br /&gt;
* 	Add manager archetype in access.php&lt;br /&gt;
* 	Ensure require_login as well as require_capability checks&lt;br /&gt;
*       isguest() is depreicated, use !isloggedin() || isguestuser() instead&lt;br /&gt;
&lt;br /&gt;
==Language strings==&lt;br /&gt;
&lt;br /&gt;
* 	Rename language folder&lt;br /&gt;
* 	Change $a to {$a} in language files&lt;br /&gt;
* 	Change popup help files to _help lang strings and shorten&lt;br /&gt;
* 	Add $string[‘pluginname’] to lang file&lt;br /&gt;
* 	Add $string[‘pluginadministration’] to lang file&lt;br /&gt;
&lt;br /&gt;
==Forms==&lt;br /&gt;
&lt;br /&gt;
* 	Param_clean parameter type removed&lt;br /&gt;
* 	type required parameter for optional_and required_param&lt;br /&gt;
* 	Replace file form elements with new filepicker&lt;br /&gt;
* 	Replace htmleditor with editor form field type&lt;br /&gt;
*       Change setHelpButton to addHelpButton. (You need to change the arguments, but the new ones are simpler.)&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
&lt;br /&gt;
* 	Swap config_ files to edit and settings php files&lt;br /&gt;
* 	Fix whitespace &amp;amp; coding style&lt;br /&gt;
* 	rs_fetch_next_record($rs) is deprecated, in favour of the simple foreach($rs as $var). Calls to rs_close() must be replaced by $rs-&amp;gt;close();&lt;br /&gt;
* 	Check functions deprecated list: https://docs.moodle.org/en/Development:Deprecated_functions_in_2.0&lt;br /&gt;
* 	Use print_error() or throw new moodle_exception not error()&lt;br /&gt;
* 	Replace all url strings e.g. in redirect() calls with moodle_url instances&lt;br /&gt;
* Move install/uninstall functions from lib to db/install.php, lib/uninstall.php&lt;br /&gt;
* Move images into pix folder (especially icon.gif), get path by calling $OUTPUT-&amp;gt;pix_url(&#039;icon&#039;, &#039;local_whatever&#039;);&lt;br /&gt;
* Add &#039;supports&#039; function in lib (modname_supports()) for modules (and blocks?).&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Migrating_to_2.0_checklist&amp;diff=80881</id>
		<title>Development:Migrating to 2.0 checklist</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Migrating_to_2.0_checklist&amp;diff=80881"/>
		<updated>2011-01-27T15:02:48Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These are things that OU developers have found so far to check/do in code we&#039;re migrating from Moodle 1.9 to 2.0.  All information on the detail of this checklist can be found elsewhere in Moodle Docs, and particularly from the [[Development:Migrating_contrib_code_to_2.0]]&lt;br /&gt;
&lt;br /&gt;
Not all these things are essential for a rush job, but if you did all of them, then that&#039;d be great.  We should really mark each one with a priority of some sort!&lt;br /&gt;
&lt;br /&gt;
Please add/edit this list!&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
&lt;br /&gt;
* 	Leave empty db/update.php file&lt;br /&gt;
* 	New $DB global objects with functions replace old db functions&lt;br /&gt;
* 	$DB parameters swapped to ? &lt;br /&gt;
* 	Add and strip slashes no longer required&lt;br /&gt;
* 	Remove use of ENUM and ENUMVALUES in install.xml file&lt;br /&gt;
* 	check use of sql_substr() &lt;br /&gt;
* 	Get_records() etc now always returning arrays, empty array in case of no records found. &lt;br /&gt;
* 	Db functions throw errors not return false on error&lt;br /&gt;
* 	DB functions offer strictness parameters e.g MUST_EXIST&lt;br /&gt;
* 	Update version.php numbers (esp required)&lt;br /&gt;
&lt;br /&gt;
==Page display==&lt;br /&gt;
&lt;br /&gt;
* 	New $OUTPUT header and footer functions&lt;br /&gt;
* Navigation links need to use $PAGE-&amp;gt;navbar&lt;br /&gt;
* 	Make sure that you instantiate the moodle form before any call to $OUTPUT-&amp;gt;header()&lt;br /&gt;
* 	Create a renderer&lt;br /&gt;
*       Change the way image urls are displayed (not $CFG-&amp;gt;pixpath any more)&lt;br /&gt;
*       CSS changes&lt;br /&gt;
**      Change styles.php to styles.css&lt;br /&gt;
**      Change page id to new structure e.g. course-format-studyplan to page-course-view-studyplan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Roles and Permissions:==&lt;br /&gt;
&lt;br /&gt;
* 	array name to $capabilities in access.php&lt;br /&gt;
* 	Remove references to admin in access.php&lt;br /&gt;
* 	Rename legacy to archetypes in access.php&lt;br /&gt;
* 	Add manager archetype in access.php&lt;br /&gt;
* 	Ensure require_login as well as require_capability checks&lt;br /&gt;
*       isguest() is depreicated, use !isloggedin() || isguestuser() instead&lt;br /&gt;
&lt;br /&gt;
==Language strings==&lt;br /&gt;
&lt;br /&gt;
* 	Rename language folder&lt;br /&gt;
* 	Change $a to {$a} in language files&lt;br /&gt;
* 	Change popup help files to _help lang strings and shorten&lt;br /&gt;
* 	Add $string[‘pluginname’] to lang file&lt;br /&gt;
* 	Add $string[‘pluginadministration’] to lang file&lt;br /&gt;
&lt;br /&gt;
==Forms==&lt;br /&gt;
&lt;br /&gt;
* 	Param_clean parameter type removed&lt;br /&gt;
* 	type required parameter for optional_and required_param&lt;br /&gt;
* 	Replace file form elements with new filepicker&lt;br /&gt;
* 	Replace htmleditor with editor form field type&lt;br /&gt;
*       Change setHelpButton to addHelpButton. (You need to change the arguments, but the new ones are simpler.)&lt;br /&gt;
&lt;br /&gt;
==General==&lt;br /&gt;
&lt;br /&gt;
* 	Swap config_ files to edit and settings php files&lt;br /&gt;
* 	Fix whitespace &amp;amp; coding style&lt;br /&gt;
* 	rs_fetch_next_record($rs) is deprecated, in favour of the simple foreach($rs as $var). Calls to rs_close() must be replaced by $rs-&amp;gt;close();&lt;br /&gt;
* 	Check functions deprecated list: https://docs.moodle.org/en/Development:Deprecated_functions_in_2.0&lt;br /&gt;
* 	Use print_error() or throw new moodle_exception not error()&lt;br /&gt;
* 	Replace all url strings e.g. in redirect() calls with moodle_url instances&lt;br /&gt;
* Move install/uninstall functions from lib to db/install.php, lib/uninstall.php&lt;br /&gt;
* Move images into pix folder (especially icon.gif), get path by calling $OUTPUT-&amp;gt;pix_url(&#039;icon&#039;, &#039;local_whatever&#039;);&lt;br /&gt;
* Update the code template at the top of each file (see [[Code template guidelines]] for details&lt;br /&gt;
* Add &#039;supports&#039; function in lib (modname_supports()) for modules (and blocks?).&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Migrating_to_2.0_checklist&amp;diff=80880</id>
		<title>Development:Migrating to 2.0 checklist</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Migrating_to_2.0_checklist&amp;diff=80880"/>
		<updated>2011-01-27T15:01:44Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: New page: h1. Plugin migration checklist  These are things that OU developers have found so far to check/do in code we&amp;#039;re migrating from Moodle 1.9 to 2.0.  All information on the detail of this che...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;h1. Plugin migration checklist&lt;br /&gt;
&lt;br /&gt;
These are things that OU developers have found so far to check/do in code we&#039;re migrating from Moodle 1.9 to 2.0.  All information on the detail of this checklist can be found elsewhere in Moodle Docs, and particularly from the [[]]&lt;br /&gt;
&lt;br /&gt;
Not all these things are essential for a rush job, but if you did all of them, then that&#039;d be great.  We should really mark each one with a priority of some sort!&lt;br /&gt;
&lt;br /&gt;
Please add/edit this list!&lt;br /&gt;
&lt;br /&gt;
h2.	Database&lt;br /&gt;
&lt;br /&gt;
* 	Leave empty db/update.php file&lt;br /&gt;
* 	New $DB global objects with functions replace old db functions&lt;br /&gt;
* 	$DB parameters swapped to ? &lt;br /&gt;
* 	Add and strip slashes no longer required&lt;br /&gt;
* 	Remove use of ENUM and ENUMVALUES in install.xml file&lt;br /&gt;
* 	check use of sql_substr() &lt;br /&gt;
* 	Get_records() etc now always returning arrays, empty array in case of no records found. &lt;br /&gt;
* 	Db functions throw errors not return false on error&lt;br /&gt;
* 	DB functions offer strictness parameters e.g MUST_EXIST&lt;br /&gt;
* 	Update version.php numbers (esp required)&lt;br /&gt;
&lt;br /&gt;
h2.	Page display&lt;br /&gt;
&lt;br /&gt;
* 	New $OUTPUT header and footer functions&lt;br /&gt;
* Navigation links need to use $PAGE-&amp;gt;navbar&lt;br /&gt;
* 	Make sure that you instantiate the moodle form before any call to $OUTPUT-&amp;gt;header()&lt;br /&gt;
* 	Create a renderer&lt;br /&gt;
*       Change the way image urls are displayed (not $CFG-&amp;gt;pixpath any more)&lt;br /&gt;
*       CSS changes&lt;br /&gt;
**      Change styles.php to styles.css&lt;br /&gt;
**      Change page id to new structure e.g. course-format-studyplan to page-course-view-studyplan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
h2.	Roles and Permissions:&lt;br /&gt;
&lt;br /&gt;
* 	array name to $capabilities in access.php&lt;br /&gt;
* 	Remove references to admin in access.php&lt;br /&gt;
* 	Rename legacy to archetypes in access.php&lt;br /&gt;
* 	Add manager archetype in access.php&lt;br /&gt;
* 	Ensure require_login as well as require_capability checks&lt;br /&gt;
*       isguest() is depreicated, use !isloggedin() || isguestuser() instead&lt;br /&gt;
&lt;br /&gt;
h2.	Language strings&lt;br /&gt;
&lt;br /&gt;
* 	Rename language folder&lt;br /&gt;
* 	Change $a to {$a} in language files&lt;br /&gt;
* 	Change popup help files to _help lang strings and shorten&lt;br /&gt;
* 	Add $string[‘pluginname’] to lang file&lt;br /&gt;
* 	Add $string[‘pluginadministration’] to lang file&lt;br /&gt;
&lt;br /&gt;
h2.	Forms&lt;br /&gt;
&lt;br /&gt;
* 	Param_clean parameter type removed&lt;br /&gt;
* 	type required parameter for optional_and required_param&lt;br /&gt;
* 	Replace file form elements with new filepicker&lt;br /&gt;
* 	Replace htmleditor with editor form field type&lt;br /&gt;
*       Change setHelpButton to addHelpButton. (You need to change the arguments, but the new ones are simpler.)&lt;br /&gt;
&lt;br /&gt;
h2.	General&lt;br /&gt;
&lt;br /&gt;
* 	Swap config_ files to edit and settings php files&lt;br /&gt;
* 	Fix whitespace &amp;amp; coding style&lt;br /&gt;
* 	rs_fetch_next_record($rs) is deprecated, in favour of the simple foreach($rs as $var). Calls to rs_close() must be replaced by $rs-&amp;gt;close();&lt;br /&gt;
* 	Check functions deprecated list: https://docs.moodle.org/en/Development:Deprecated_functions_in_2.0&lt;br /&gt;
* 	Use print_error() or throw new moodle_exception not error()&lt;br /&gt;
* 	Replace all url strings e.g. in redirect() calls with moodle_url instances&lt;br /&gt;
* Move install/uninstall functions from lib to db/install.php, lib/uninstall.php&lt;br /&gt;
* Move images into pix folder (especially icon.gif), get path by calling $OUTPUT-&amp;gt;pix_url(&#039;icon&#039;, &#039;local_whatever&#039;);&lt;br /&gt;
* Update the code template at the top of each file (see [[Code template guidelines]] for details&lt;br /&gt;
* Add &#039;supports&#039; function in lib (modname_supports()) for modules (and blocks?).&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Migrating_contrib_code_to_2.0&amp;diff=80879</id>
		<title>Development:Migrating contrib code to 2.0</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Migrating_contrib_code_to_2.0&amp;diff=80879"/>
		<updated>2011-01-27T15:00:01Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
The goal of this page is to provide a checklist of tasks to be considered to upgrade CONTRIB code to Moodle 2.0. Several significant changes have taken place including the File API, DB Layer, Navigation, Output renderer, etc. It would be good if we had a list that contributors could follow to help move them toward being able to migrate the code. Any help in building up this list is greatly appreciated. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please add useful links...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The &#039;requires&#039; version in the plugin&#039;s version.php is checked to make sure it looks like Moodle 2.0. You should change this value to &#039;2010112400&#039; or later otherwise plugin installation will abort.&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
* [[Development:DB_layer_2.0_migration_docs]]&lt;br /&gt;
&lt;br /&gt;
== File system ==&lt;br /&gt;
&lt;br /&gt;
== Forms API ==&lt;br /&gt;
* [[Development:Using the File API in Moodle forms]]&lt;br /&gt;
* [[Development:Using_the_file_API]]&lt;br /&gt;
&lt;br /&gt;
== Themes ==&lt;br /&gt;
* [[Development:Output_renderers]]&lt;br /&gt;
* [[Development:Text formats 2.0|Text formats 2.0]] how user-entered content is handled.&lt;br /&gt;
* [[Development:Migrating_your_code_to_the_2.0_rendering_API]] (n.b., some info outdated and may need updating)&lt;br /&gt;
* [[Development:Themes_2.0]]&lt;br /&gt;
&lt;br /&gt;
Some details of how to re-design image CSS for plugin code are in the main themes documentation: [[Development:Themes_2.0_creating_your_first_theme#Using_images_within_CSS]]&lt;br /&gt;
&lt;br /&gt;
Be aware that themes are now cached on the server and so emptying your browser cache will not refresh the CSS. This can only be done by going to the site administration-&amp;gt;appearance-&amp;gt;themes-&amp;gt;theme selector page and clicking the &#039;invalidate theme caches&#039; button.&lt;br /&gt;
&lt;br /&gt;
== JavaScript ==&lt;br /&gt;
JavaScript is included in different ways now and will need to be migrated, see the PHPDoc comments in /lib/outputrequirements.lib and some (slightly outdated) advice here: [[Development:JavaScript_guidelines]]&lt;br /&gt;
&lt;br /&gt;
== Backup and Restore ==&lt;br /&gt;
&lt;br /&gt;
* [[Backup_2.0_for_developers]]&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
There are other coding changes such as:&lt;br /&gt;
* MDL-24063 which eliminates PARAM_CLEAN &lt;br /&gt;
* MDL-24058 about no longer using stripslashes or addslashes&lt;br /&gt;
* [[Deprecated_functions_in_2.0]]&lt;br /&gt;
&lt;br /&gt;
Please feel free to add others that come to mind. CONTRIB maintainers should check their 2.0 versions for these and make sure that they are appropriately handled. &lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle_2.0_release_notes]]&lt;br /&gt;
* CONTRIB-1988&lt;br /&gt;
* http://cvs.moodle.org/moodle/blocks/upgrade.txt?view=markup&lt;br /&gt;
* http://cvs.moodle.org/moodle/mod/upgrade.txt?view=markup&lt;br /&gt;
* [[User:Frank_Ralf/Experience_of_converting_a_module_to_Moodle_2|Experience of converting a module to Moodle 2]] by Sam Marshall (perhaps that documentation should better live here? --[[User:Frank Ralf|Frank Ralf]] 16:36, 15 November 2010 (UTC))&lt;br /&gt;
* [[Development:Local_customisation]]&lt;br /&gt;
* [[Development:Migrating to 2.0 checklist]] list of things to look out for when upgrading a plug-in&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Migrating_contrib_code_to_2.0&amp;diff=80716</id>
		<title>Development:Migrating contrib code to 2.0</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Migrating_contrib_code_to_2.0&amp;diff=80716"/>
		<updated>2011-01-21T11:53:58Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
The goal of this page is to provide a checklist of tasks to be considered to upgrade CONTRIB code to Moodle 2.0. Several significant changes have taken place including the File API, DB Layer, Navigation, Output renderer, etc. It would be good if we had a list that contributors could follow to help move them toward being able to migrate the code. Any help in building up this list is greatly appreciated. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Please add useful links...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The &#039;requires&#039; version in the plugin&#039;s version.php is checked to make sure it looks like Moodle 2.0. You should change this value to &#039;2010112400&#039; or later otherwise plugin installation will abort.&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
* [[Development:DB_layer_2.0_migration_docs]]&lt;br /&gt;
&lt;br /&gt;
== File system ==&lt;br /&gt;
&lt;br /&gt;
== Forms API ==&lt;br /&gt;
* [[Development:Using the File API in Moodle forms]]&lt;br /&gt;
* [[Development:Using_the_file_API]]&lt;br /&gt;
&lt;br /&gt;
== Themes ==&lt;br /&gt;
* [[Development:Output_renderers]]&lt;br /&gt;
* [[Development:Text formats 2.0|Text formats 2.0]] how user-entered content is handled.&lt;br /&gt;
* [[Development:Migrating_your_code_to_the_2.0_rendering_API]] (n.b., some info outdated and may need updating)&lt;br /&gt;
* [[Development:Themes_2.0]]&lt;br /&gt;
&lt;br /&gt;
Some details of how to re-design image CSS for plugin code are in the main themes documentation: [[Development:Themes_2.0_creating_your_first_theme#Using_images_within_CSS]]&lt;br /&gt;
&lt;br /&gt;
Be aware that themes are now cached on the server and so emptying your browser cache will not refresh the CSS. This can only be done by going to the site administration-&amp;gt;appearance-&amp;gt;themes-&amp;gt;theme selector page and clicking the &#039;invalidate theme caches&#039; button.&lt;br /&gt;
&lt;br /&gt;
== JavaScript ==&lt;br /&gt;
JavaScript is included in different ways now and will need to be migrated, see the PHPDoc comments in /lib/outputrequirements.lib and some (slightly outdated) advice here: [[Development:JavaScript_guidelines]]&lt;br /&gt;
&lt;br /&gt;
== Backup and Restore ==&lt;br /&gt;
&lt;br /&gt;
* [[Backup_2.0_for_developers]]&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
There are other coding changes such as:&lt;br /&gt;
* MDL-24063 which eliminates PARAM_CLEAN &lt;br /&gt;
* MDL-24058 about no longer using stripslashes or addslashes&lt;br /&gt;
* [[Deprecated_functions_in_2.0]]&lt;br /&gt;
&lt;br /&gt;
Please feel free to add others that come to mind. CONTRIB maintainers should check their 2.0 versions for these and make sure that they are appropriately handled. &lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Moodle_2.0_release_notes]]&lt;br /&gt;
* CONTRIB-1988&lt;br /&gt;
* http://cvs.moodle.org/moodle/blocks/upgrade.txt?view=markup&lt;br /&gt;
* http://cvs.moodle.org/moodle/mod/upgrade.txt?view=markup&lt;br /&gt;
* [[User:Frank_Ralf/Experience_of_converting_a_module_to_Moodle_2|Experience of converting a module to Moodle 2]] by Sam Marshall (perhaps that documentation should better live here? --[[User:Frank Ralf|Frank Ralf]] 16:36, 15 November 2010 (UTC))&lt;br /&gt;
* [[Development:Local_customisation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=73200</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=73200"/>
		<updated>2010-06-18T14:57:47Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
Most users will want to download the &amp;quot;for Moodle 1.9&amp;quot; version, since the latest version (in CVS HEAD) is compatible with Moodle 2.0 which has not yet been released.&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English and German.  If using the german language pack, you will need to copy the star0.png file from rate_course/lang/de_utf8 into rate_course/graphic to replace the one there with english text included.  Hopefully we&#039;ll improve this to dynamically include the language some time!&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.  You can also add it to the myMoodle course information by editing the print_overview() function in course/lib.php;&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=72896</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=72896"/>
		<updated>2010-06-11T12:54:08Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Languages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
Most users will want to download the &amp;quot;for Moodle 1.9&amp;quot; version, since the latest version (in CVS HEAD) is compatible with Moodle 2.0 which has not yet been released.&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English and German only.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.  You can also add it to the myMoodle course information by editing the print_overview() function in course/lib.php;&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=64427</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=64427"/>
		<updated>2009-10-15T12:51:47Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: how to display on mymoodle page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
Most users will want to download the &amp;quot;for Moodle 1.9&amp;quot; version, since the latest version (in CVS HEAD) is compatible with Moodle 2.0 which has not yet been released.&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English only.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.  You can also add it to the myMoodle course information by editing the print_overview() function in course/lib.php;&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59421</id>
		<title>Development:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59421"/>
		<updated>2009-07-06T15:47:26Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Harvest courses */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PROJECT STATE: Proposal&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAIN TRACKER ISSUE&#039;&#039;&#039;: MDL-19309&lt;br /&gt;
* &#039;&#039;&#039;DISCUSSION AND COMMENTS&#039;&#039;&#039;: [http://moodle.org/mod/forum/view.php?id=7330 Hub servers] forum in Using Moodle&lt;br /&gt;
* &#039;&#039;&#039;MAIN AUTHORS&#039;&#039;&#039;: [[User:Martin_Dougiamas|Martin Dougiamas]] and [[User:jerome_mouneyrac|Jerome Mouneyrac]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page describes an overall functional specification for the &amp;quot;Moodle Community Hub&amp;quot; project, which consists of a new system (the Moodle Hub Server) and several new features in Moodle 2.0. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Goals and rationale =&lt;br /&gt;
&lt;br /&gt;
The main goals of the Community hub project are:&lt;br /&gt;
&lt;br /&gt;
# to allow people to easily find courses around the world that they want to enrol in:&lt;br /&gt;
#* educators want to find &#039;&#039;&#039;communities of practice&#039;&#039;&#039; that are subject or region-oriented, so that they can associate with their peers on a long-term basis.&lt;br /&gt;
#* other learners want to find and study courses on various other subjects&lt;br /&gt;
# to make it easy for educators to find and download &#039;&#039;&#039;course templates&#039;&#039;&#039; from other people.  This will help educators share and identify examples of &#039;&#039;&#039;best practice&#039;&#039;&#039; in online pedagogy and hopefully improve the average quality of online courses.&lt;br /&gt;
&lt;br /&gt;
Finally, we want to do all this in the simplest, safest way possible, while allowing a range of scenarios such as courses that are public or private, free or paid, so that the Moodle community can build solutions for themselves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the basic idea.  The systems in this diagram are:&lt;br /&gt;
&lt;br /&gt;
;Ordinary Moodle site: A typical Moodle site with teachers who want to download course templates and/or users who want to connect (enrol) with external communities &lt;br /&gt;
;Publishing site: A Moodle site that wants to make some of its courses available for download&lt;br /&gt;
;Community site: A Moodle site that provides courses that are enrollable&lt;br /&gt;
;Moodle Hub Server: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;.  The default hub will be installed at hub.moodle.org, but there can be many others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Community.png]]&lt;br /&gt;
&lt;br /&gt;
Downloadable courses&lt;br /&gt;
* (A) Sites that want to publish certain courses and make them downloadable can register them with one or more Hub Servers.&lt;br /&gt;
* (B) The Hub will check the data and make sure the course zip is downloadable, caching a copy locally.  The Hub may also have a security process to check the download for trojan horses, bad content, etc (automatic and/or manual).&lt;br /&gt;
* (C) The download process may trigger the backup process on the original server if it hasn&#039;t been done already.&lt;br /&gt;
* (D) Later, Moodle users (who have permissions to do so) can connect to a Hub (via the Repository file picker) to search for downloadable courses and choose one (receiving a download URL).&lt;br /&gt;
* (E) The repository API downloads the file and makes it available to the Moodle user so they can now continue to restore it normally.&lt;br /&gt;
&lt;br /&gt;
Enrollable courses&lt;br /&gt;
* (1) Sites that want to publish certain courses for the public to enrol in can register them with one or more CDS (including the main one at moodle.org)&lt;br /&gt;
* (2) Later, any Moodle user can connect to a CDS (via Community block in their site) to search and find courses they want to join&lt;br /&gt;
* (3) They click on a link to be sent to the other site so that they can enrol there (with or without Mnet).&lt;br /&gt;
&lt;br /&gt;
= Use Cases =&lt;br /&gt;
&lt;br /&gt;
== New teacher creating a course ==&lt;br /&gt;
&lt;br /&gt;
# New teacher needs some help with a new course for &amp;quot;Alligator farming 101&amp;quot;&lt;br /&gt;
# Teacher sees the &amp;quot;Import/Export&amp;quot; block into the &amp;quot;Alligator farming 101&amp;quot; course page and presses &amp;quot;Import course&amp;quot;&lt;br /&gt;
# Teacher browses a list of downloadable courses in the File picker (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches for &amp;quot;Alligator&amp;quot; &lt;br /&gt;
# Teacher finds 4 courses that look good, and after reading reviews and ratings, chooses one.&lt;br /&gt;
# The course is downloaded and unpacked in Moodle.&lt;br /&gt;
# The teacher now has a good starter course they can keep developing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New teacher needs help ==&lt;br /&gt;
&lt;br /&gt;
A teacher decides they need some help and wants to talk with others teaching Alligator farming.&lt;br /&gt;
&lt;br /&gt;
# Teacher goes to their &amp;quot;Community&amp;quot; block and clicks &amp;quot;Find community&amp;quot;.&lt;br /&gt;
# Moodle displays a page to search for courses (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches courses for &amp;quot;educator&amp;quot; courses on &amp;quot;Alligators&amp;quot; in their country/language.&lt;br /&gt;
# Teacher finds two, selects one, and is returned to the page where is was before clicking on &amp;quot;Find community&amp;quot;.  The selected course is now permanently listed in the Community block.&lt;br /&gt;
# Teacher clicks on the link and is taken to the course, where they can enrol and interact/learn with peers over time, subscribe to forums etc.&lt;br /&gt;
&lt;br /&gt;
== University consortium ==&lt;br /&gt;
&lt;br /&gt;
A group of five universites wants to share courses among themselves and not to the outside world.  They also want to prevent teachers from downloading courses from outside the consortium.&lt;br /&gt;
&lt;br /&gt;
# Someone downloads Moodle and installs it as a private Moodle Hub Server&lt;br /&gt;
# Admins of all five Moodle sites in the group add the URL of the private Hub to their settings and register their sites there&lt;br /&gt;
# The default Hub at hub.moodle.org is (optionally) disabled in the site-wide settings.&lt;br /&gt;
# Admins register their courses with the Hub.&lt;br /&gt;
# Teachers can now import, export or join courses via the private Hub.&lt;br /&gt;
&lt;br /&gt;
== Course creation business ==&lt;br /&gt;
&lt;br /&gt;
CoolCourses Inc have produced a set of 50 good Moodle courses which they wish to sell.&lt;br /&gt;
&lt;br /&gt;
# They set up a Moodle site with all their courses in them.&lt;br /&gt;
# They set up a Hub with a payment system, and register it with the Hub List at moodle.org so people can find it&lt;br /&gt;
# They register all their courses with their own Hub with appropriate metadata&lt;br /&gt;
# When looking for courses, users can either &lt;br /&gt;
#* find this Hub by browsing through the Hub List, or &lt;br /&gt;
#* type the URL of the Hub directly into their Moodle site&lt;br /&gt;
# When users try to download a course, they may see a payment button to download it (credit card, paypal etc)&lt;br /&gt;
# CoolCourses could provide limited access to the courses on their Moodle site using Roles, as a preview.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Components =&lt;br /&gt;
&lt;br /&gt;
There are several components:&lt;br /&gt;
&lt;br /&gt;
;&#039;&#039;&#039;Hub List&#039;&#039;&#039;: A list of known Hub Servers, kept on moodle.org &lt;br /&gt;
;&#039;&#039;&#039;Hub Server&#039;&#039;&#039;: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;&lt;br /&gt;
;&#039;&#039;&#039;Course registration&#039;&#039;&#039;: A new mechanism in every Moodle to register particular courses with one or more Hub Servers&lt;br /&gt;
;&#039;&#039;&#039;Community membership block&#039;&#039;&#039;: to search Hub Servers to find enrollable courses to join and bookmark&lt;br /&gt;
;&#039;&#039;&#039;Import/Export block&#039;&#039;&#039;: Makes it easy to find downloadable course templates in a Hub Server, then download them from the Hub Server and restore them locally&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub List==&lt;br /&gt;
&lt;br /&gt;
The Hub List is a list of known Hub Servers (see the next section).  This makes it easy for Moodle users to find the most appropriate Hub Servers for their needs.  To get on the Hub List, Hub Servers choose to register with moodle.org via their administration interface.&lt;br /&gt;
&lt;br /&gt;
Moodle.org will store the following information, and make it available via a browseable interface at [http://moodle.org/hubs http://moodle.org/hubs] as well as a simple XML format from [http://moodle.org/hubs/list.xml http://moodle.org/hubs/list.xml] suitable for consumption by Moodle sites.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|int&lt;br /&gt;
|Standard autoincrement&lt;br /&gt;
|-&lt;br /&gt;
|hubname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the Hub&lt;br /&gt;
|-&lt;br /&gt;
|hubdescription&lt;br /&gt;
|text&lt;br /&gt;
|Description of the hub, from the admin there&lt;br /&gt;
|-&lt;br /&gt;
|huburl&lt;br /&gt;
|varchar&lt;br /&gt;
|The full URL to the hub front page&lt;br /&gt;
|-&lt;br /&gt;
|hubsecret&lt;br /&gt;
|varchar&lt;br /&gt;
|The secret code from the hub (extra authentication)&lt;br /&gt;
|-&lt;br /&gt;
|trusted&lt;br /&gt;
|int&lt;br /&gt;
|Is the hub trusted?  Does it have good quality control?&lt;br /&gt;
|-&lt;br /&gt;
|language&lt;br /&gt;
|varchar&lt;br /&gt;
|What is the primary language of this hub?  (blank for multilanguage)&lt;br /&gt;
|-&lt;br /&gt;
|sites&lt;br /&gt;
|int&lt;br /&gt;
|Number of sites  registered on this hub&lt;br /&gt;
|-&lt;br /&gt;
|courses&lt;br /&gt;
|int&lt;br /&gt;
|Number of courses registered on this hub &lt;br /&gt;
|-&lt;br /&gt;
|timefirst&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was first registered&lt;br /&gt;
|-&lt;br /&gt;
|timelast&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was last registered/updated&lt;br /&gt;
|-&lt;br /&gt;
|contactname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|contactemail&lt;br /&gt;
|varchar&lt;br /&gt;
|Email of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|varchar&lt;br /&gt;
|hub logo url&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Registerhub.png]]&lt;br /&gt;
&lt;br /&gt;
following a hub list table on Moodle.org:&lt;br /&gt;
[[Image:Hublist.png]]&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub Server==&lt;br /&gt;
&lt;br /&gt;
The Moodle Hub Server (aka Hub) is a separate system (based on Moodle technology) that allows Moodle sites to register their courses for listing there.&lt;br /&gt;
&lt;br /&gt;
A default installation of this software will be running at &#039;&#039;&#039;hub.moodle.org&#039;&#039;&#039;, but anyone else can download it and set up their own hub for private or public uses.   A default installation of Moodle can also be a Hub, or if the admin chooses, a site can be a dedicated Hub if they choose that option during install (in this case the front page of the site will be a dedicated site search for the public).&lt;br /&gt;
&lt;br /&gt;
Hubs can optionally register themselves in the Hub List so that they are easier to find and so they can become a &amp;quot;Trusted Hub&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A hub server has some config fields (saved into its database):&lt;br /&gt;
* name&lt;br /&gt;
* description&lt;br /&gt;
* language&lt;br /&gt;
* contact name&lt;br /&gt;
* contact email&lt;br /&gt;
* enable&lt;br /&gt;
* hub secret (generated the first time the hub is registered on Moodle.org, it will never change)&lt;br /&gt;
* logo url &lt;br /&gt;
* protected web search interface &#039;&#039;&#039;(TODO: the protection method needs to be defined)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data structure ===&lt;br /&gt;
&lt;br /&gt;
==== Sites ====&lt;br /&gt;
&lt;br /&gt;
Primarily this table will store information about the sites that have registered course information on that Hub.  On hub.moodle.org this information will also be used for [http://moodle.org/stats general statistics] and the listing of [http://moodle.org/sites registered sites].&lt;br /&gt;
&lt;br /&gt;
* Id&lt;br /&gt;
* Site name &lt;br /&gt;
* Site description&lt;br /&gt;
* URL&lt;br /&gt;
* Address&lt;br /&gt;
*# Country code (AU, FR etc) [http://cvs.moodle.org/moodle/lang/en_utf8/countries.php?view=markup lang/XX_utf8/countries.php]&lt;br /&gt;
*# Region/state (based on list) [http://www.commondatahub.com/live/geography/state_province_region/iso_3166_2_state_codes ISO 3166-2 (XX-XXX)]&lt;br /&gt;
*# Street address &lt;br /&gt;
*# Geolocation (for mapping)&lt;br /&gt;
* Site manager&lt;br /&gt;
*# Name&lt;br /&gt;
*# Email&lt;br /&gt;
*# Phone&lt;br /&gt;
* Contact form yes/no?&lt;br /&gt;
* Default site language&lt;br /&gt;
* Moodle version (eg 2009050502)&lt;br /&gt;
* Moodle release (eg 1.9.5+)&lt;br /&gt;
* Site ip address (updated at every update)&lt;br /&gt;
* Unique SiteID code generated by Moodle site&lt;br /&gt;
* Confirmed by admin&lt;br /&gt;
* Site is &amp;quot;trusted&amp;quot; - this means we don&#039;t manually check data in future from this site.&lt;br /&gt;
* Mnet/WS information, enough to let a teacher authenticate to the site using Mnet 2.0 (optional)&lt;br /&gt;
* Harvesting url&lt;br /&gt;
* Time updated&lt;br /&gt;
* Time created&lt;br /&gt;
* Currently unreachable&lt;br /&gt;
* Time link was last checked&lt;br /&gt;
&lt;br /&gt;
Extra information that will only be kept on hub.moodle.org (only published in aggregate form):&lt;br /&gt;
&lt;br /&gt;
* Tool usage stats &lt;br /&gt;
** number of courses&lt;br /&gt;
** number of users&lt;br /&gt;
** number of enrolments&lt;br /&gt;
** number of posts&lt;br /&gt;
** number of resources&lt;br /&gt;
** number of questions&lt;br /&gt;
** median course size&lt;br /&gt;
* Subscribed to securityalerts@lists.moodle.org&lt;br /&gt;
&lt;br /&gt;
==== Courses ====&lt;br /&gt;
&lt;br /&gt;
This table stores registered courses, one record per course.  Some courses will be &amp;quot;downloadable&amp;quot;, some will be enrollable, so different fields can be used.&lt;br /&gt;
&lt;br /&gt;
* Course ID&lt;br /&gt;
* Site ID (foreign key to sites table)&lt;br /&gt;
* Dublin Core Metadata Element Set, Version 1.1&lt;br /&gt;
*# Contributor - course manager names or whoever the publisher nominates&lt;br /&gt;
*# Coverage - User tags&lt;br /&gt;
*# Creator - main teacher name or copyright holder or whoever the publisher nominates&lt;br /&gt;
*# Date - date this was last published/updated&lt;br /&gt;
*# Description - course description&lt;br /&gt;
*# Format - zip / url&lt;br /&gt;
*# Identifier - course shortname (unique on the original site)&lt;br /&gt;
*# Language - based on lang.php&lt;br /&gt;
*# Publisher - the name of the person who caused this record to be entered here&lt;br /&gt;
*# Relation - the site id that it came from&lt;br /&gt;
*# Rights - one of a standard set of open source, creative commons and other licenses&lt;br /&gt;
*# Source - original URL of the course&lt;br /&gt;
*# Subject - The best-matching item from ([https://docs.moodle.org/en/Course_Standard_Tags  Course Standard Tags ])&lt;br /&gt;
*# Title - Course fullname&lt;br /&gt;
*# Type - &amp;quot;course&amp;quot; (later there might other types such as activities or SCORM packages etc)&lt;br /&gt;
* Audience:  Educators | Students | Admins&lt;br /&gt;
* Educational level being discussed (for educators audience only):  Tertiary | Secondary | Primary | Government | Corporate&lt;br /&gt;
* Is a course map supplied?   (Simple XML description of course structure, could be rendered graphically later [http://kn.open.ac.uk/public/workspace.cfm?wpid=8690 CompendiumLD] )&lt;br /&gt;
&lt;br /&gt;
* Availability (public/private)&lt;br /&gt;
* Download URL (usually a local cached zip but could be anything else, including empty for non-downloadable)&lt;br /&gt;
* Original Download URL (usually a download script on the original Moodle site, used by Hub to get cache)&lt;br /&gt;
* Is the course trusted?  (all downloadable courses from non-trusted sites start as &amp;quot;no&amp;quot;, then this gets changed by someone who checks it)&lt;br /&gt;
* Is the course enrollable anyone with an account?&lt;br /&gt;
* Is guest access allowed?&lt;br /&gt;
* Are screenshots supplied?   (stored on disk under id of this record)&lt;br /&gt;
* Enrol Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
* Download Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
&lt;br /&gt;
==== Course feedback ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id&lt;br /&gt;
* type (bug / comment)&lt;br /&gt;
* text &lt;br /&gt;
* rating&lt;br /&gt;
&lt;br /&gt;
==== Course content ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id &lt;br /&gt;
* module type (activity / block)&lt;br /&gt;
* module name (forum, resource etc)&lt;br /&gt;
* count&lt;br /&gt;
&lt;br /&gt;
==== Course outcomes ====&lt;br /&gt;
&lt;br /&gt;
* id&lt;br /&gt;
* course id &lt;br /&gt;
* outcome  (text)&lt;br /&gt;
&lt;br /&gt;
=== Web user interface ===&lt;br /&gt;
&lt;br /&gt;
If visiting the hub via the web, it will provide an interface for full searching and browsing.  &lt;br /&gt;
&lt;br /&gt;
The web interface can be protected from access.  The hub at moodle.org will of course be open to all.&lt;br /&gt;
&lt;br /&gt;
Here is a very rough mockup of how it could look:&lt;br /&gt;
&lt;br /&gt;
[[Image:Webinterface.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Search_hub_moodle.png]]&lt;br /&gt;
&lt;br /&gt;
The web interface allows users to:&lt;br /&gt;
&lt;br /&gt;
* search by keyword (descriptions, titles, tags, subject etc)&lt;br /&gt;
* browse a list of courses by subject&lt;br /&gt;
* go directly to a course (if marked for public use)&lt;br /&gt;
* preview a course (if screenshots have been provided, or the original URL location)&lt;br /&gt;
* download the course to desktop (only if an download url has been set)&lt;br /&gt;
* If logged in to the Hub, users can also:&lt;br /&gt;
** give a rating to the course&lt;br /&gt;
** write a comment for the course - &amp;lt;span style=color:blue&amp;gt;use comment 2.0 API&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When displaying courses, you can see and sort by:&lt;br /&gt;
&lt;br /&gt;
* Title - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Description&lt;br /&gt;
* Tags  - &#039;&#039;Sortable &amp;lt;span style=color:blue&amp;gt;(first tag retrieved by the request is considered)&amp;lt;/span&amp;gt;&#039;&#039;&lt;br /&gt;
* Screenshot(s)&lt;br /&gt;
* Cost (if any) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Rating (10-point scale displayed as 5 stars, and only if you are logged in to moodle.org) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Comments &lt;br /&gt;
* Moodle site name&lt;br /&gt;
* Date added to directory&lt;br /&gt;
* Date last updated in directory &lt;br /&gt;
* Date last checked (by a cron job)&lt;br /&gt;
* Audience (teachers, students, admins)&lt;br /&gt;
* Teacher name(s) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Web service user interface ===&lt;br /&gt;
&lt;br /&gt;
A REST-based web services interface will be provided for other systems (eg Moodle sites) to use directly.&lt;br /&gt;
&lt;br /&gt;
Web services can search on:&lt;br /&gt;
* string search&lt;br /&gt;
* array language&lt;br /&gt;
* array cost&lt;br /&gt;
* array Moodle url&lt;br /&gt;
* Others?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hub admin interface ===&lt;br /&gt;
&lt;br /&gt;
The hub will have a Hub admin interface (at http://hubsite.org/hub) where the hub is managed.  Admin processes include:&lt;br /&gt;
&lt;br /&gt;
* Listing, approving and editing the sites registered with the hub &lt;br /&gt;
* Listing, approving and editing the course descriptions, metadata etc.&lt;br /&gt;
* Registering/updating the Hub with the Hub List&lt;br /&gt;
* Configuring Hub behaviour and the appearance of the home page.&lt;br /&gt;
&lt;br /&gt;
== Site registration ==&lt;br /&gt;
&lt;br /&gt;
The existing site registration form in Moodle will be extended so that admins can:&lt;br /&gt;
&lt;br /&gt;
# choose one or more Hubs to register with (hub.moodle.org and/or others in the Hub List, or directly to a particular Hub specified by URL)&lt;br /&gt;
# choose to enable cron to re-send statistics to the hub on a periodic basis.&lt;br /&gt;
# choose to enable the hub to harvest courses on a periodic basis (TODO: not shown on image)&lt;br /&gt;
&lt;br /&gt;
Each Moodle.org Hub will perform a check every week to verify that each site is accessible and optionally to harvest the courses from that site.  Sites that fail two or three checks in a row will be disable in the Hub listing.&lt;br /&gt;
&lt;br /&gt;
[[Image:SiteRegistration.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Community membership ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Community&amp;quot; block allows people to find and subscribe to external courses that they want to be part of.&lt;br /&gt;
&lt;br /&gt;
Visibility of the block and the features within it are controlled by roles, and contains:&lt;br /&gt;
&lt;br /&gt;
# &#039;Bookmarks&#039; of previously-selected (subscribed) external courses (to make revisiting easy) grouped by site, which can be edited/deleted etc&lt;br /&gt;
# A link to a search script - &amp;quot;Add new courses...&amp;quot;&lt;br /&gt;
# A search script to browse/search one or more Hubs (via web services to get the data, with the interface rendered by the local script).  Users can select joinable courses from the list and they&#039;ll get added to the list in the block.&lt;br /&gt;
&lt;br /&gt;
Generally the links will be just be an ordinary URL and the remote site will be responsible for authentication.&lt;br /&gt;
&lt;br /&gt;
If the foreign site has an Mnet connection set up with the current site then login will be immediate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Addacourse.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Import/Export courses ==&lt;br /&gt;
&lt;br /&gt;
The Import/Export block will be available on course pages and contains buttons to:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Publish course&#039;&#039;&#039;: to publish or update the description of the current course in one or more Hubs (admins only)&lt;br /&gt;
* &#039;&#039;&#039;Export course&#039;&#039;&#039;: publish/upload entire course (as Moodle Backup minus userdata) somewhere (eg a Hub) (via Portfolio API plugins)&lt;br /&gt;
* &#039;&#039;&#039;Import course&#039;&#039;&#039;: find/download/install a course template from a Hub or from another course on same site  (Repository API plugins)&lt;br /&gt;
&lt;br /&gt;
=== Publish course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Publish&#039;&#039;&#039; button only exists if the current user has the appropriate capabilities and if the current Moodle site has been registered with a Hub.&lt;br /&gt;
&lt;br /&gt;
[[Image:Coursepublishing.png|900px]]&lt;br /&gt;
&lt;br /&gt;
Choosing &amp;quot;Publish&amp;quot; goes to a script where you can chose from the registered Hubs and whether you want to publish the course as:&lt;br /&gt;
* enrollable, so that others can come here and use the course where it is, and/or &lt;br /&gt;
* downloadable, so that a Hub can offer this course for download to others&lt;br /&gt;
&lt;br /&gt;
If the user wants to offer this course for download, then they are directed to the standard backup process to create and define the backup file (without users!).  If the backup is successful the zip is stored in a standard place and then the user is returned to the publish script to continue.  (If downloads are not required then this whole step is skipped).&lt;br /&gt;
&lt;br /&gt;
It allows the user to set up full , and especially whether you want to advertise this course as being:&lt;br /&gt;
&lt;br /&gt;
Now the script presents a form with metadata that this course will be published with on the chosen Hub(s) (this is also available in the course settings page).  Metadata includes information such as description, licensing, categories, screenshots etc (see the [[#Courses|Courses]] section above for more info).&lt;br /&gt;
&lt;br /&gt;
After checking/updating the metadata, the script will push the data to the selected Hub.  The Hub will bounce back a confirmation which gets saved locally as the &amp;quot;Last publish date&amp;quot; for that course.&lt;br /&gt;
&lt;br /&gt;
If the checkbox to allow download was selected, then the URL to a course download script in the current Moodle is included with the metadata.  This URL contains a token (eg an MD5 stored in the course table) that only the Hub knows.&lt;br /&gt;
&lt;br /&gt;
The course download script (eg /course/download.php?id=55&amp;amp;secret=XXXXX) will send the cached .zip file for the given course.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Publish course settings ====&lt;br /&gt;
&lt;br /&gt;
Some publish settings and info will also be available anytime via the course settings page under a &amp;quot;Publish&amp;quot; tab:&lt;br /&gt;
&lt;br /&gt;
* Which hubs has this course been published on, and when&lt;br /&gt;
* Full metadata&lt;br /&gt;
* Screenshots&lt;br /&gt;
&lt;br /&gt;
=== Export course ===&lt;br /&gt;
&lt;br /&gt;
A standard export will do a normal backup (taking care to remove userdata by default), and at the end will call the portfolio API to push that file to a connected portfolio.  Portfolio (export) plugins could include:&lt;br /&gt;
&lt;br /&gt;
* downloading it to the local computer&lt;br /&gt;
* uploading it as a zip to any general purpose repository&lt;br /&gt;
* copy the course to another Moodle site set up with Mnet peering.&lt;br /&gt;
&lt;br /&gt;
Pushing it to another Moodle site would trigger extra behaviours:&lt;br /&gt;
&lt;br /&gt;
* Permissions would be checked on the destination Moodle&lt;br /&gt;
* The course can be immediately restored on the external Moodle in a special &amp;quot;New&amp;quot; category as a hidden course&lt;br /&gt;
* Someone on the external Moodle can be alerted to approve/unhide the new course&lt;br /&gt;
&lt;br /&gt;
=== Import course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Import course&#039;&#039;&#039; button will pull up a normal file picker to browse repositories for files with a mimetype matching .mbkup.zip.&lt;br /&gt;
&lt;br /&gt;
One special repository plugin called &amp;quot;Courses&amp;quot; allows the user to:&lt;br /&gt;
&lt;br /&gt;
* find Hubs by downloading the Hub List&lt;br /&gt;
* search particular Hubs for downloadable courses (only)&lt;br /&gt;
* search other courses on the same server (replacing the existing import function we have)&lt;br /&gt;
&lt;br /&gt;
Once the user has selected one of these courses and passed any challenge there might be (eg the Hub could potentially require a password or payment or a license agreement form), then the zip file is downloaded to the local Moodle, and then the user is passed to the standard restore process.&lt;br /&gt;
&lt;br /&gt;
[[Image:FilePicker_all_JS.png|900px]]&lt;br /&gt;
[[Image:FilePicker_JS_course_selector.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Harvest courses ==&lt;br /&gt;
&lt;br /&gt;
Each hub will use cron to call every site that has registered a harvesting url on a periodic basis.  This will be done at the same time as the link is checked to ensure the site is reachable, so the &amp;quot;time link was last checked&amp;quot; field in the site table also indicates when the site was last harvested.&lt;br /&gt;
&lt;br /&gt;
The harvesting url will be an RSS feed which will list all the courses to be included in the hub and their metadata.  This might be the feed of all visible courses on the site, or courses in a given category.  TODO: should we allow them to enter multiple category feeds so they can say &amp;quot;arts&amp;quot;, &amp;quot;business&amp;quot; and &amp;quot;languages&amp;quot; but not &amp;quot;science&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
Course list RSS feeds are an existing tracker item for Moodle 2.0  See http://tracker.moodle.org/browse/MDL-13248  This patch allows admins to pick which categories have individual feeds created and are included in the &amp;quot;all courses&amp;quot; feed.  Each course becomes an &amp;lt;item&amp;gt; in the RSS feed as follows:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;category&amp;gt; the Moodle course category in which the course belongs&lt;br /&gt;
* &amp;lt;title&amp;gt; the course fullname&lt;br /&gt;
* &amp;lt;link&amp;gt; the course url&lt;br /&gt;
* &amp;lt;pubdate&amp;gt; the date the course (or any of its resources and activities) last updated&lt;br /&gt;
* &amp;lt;description&amp;gt; the course summary&lt;br /&gt;
&lt;br /&gt;
The current tracker item will need to be extended to include appropriate course metadata in the RSS feed.  There is a [http://purl.org/dc/elements/1.1/ Dublin Core extension to RSS 2.0] which can be implemented.  &lt;br /&gt;
&lt;br /&gt;
TODO: If we choose an alternative metadata format we will need to locate or create an alternative RSS extension.  There is a [http://www.downes.ca/xml/RSS_LOM.htm LOM extension] but not from an official IEEE namespace.  &lt;br /&gt;
&lt;br /&gt;
We will need to declare our own namespace RSS extension to identify whether a course should be listed in the hub as downloadable and/or enrollable.  This extension will add tags to the RSS feed as follows:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;moodlehub:downloadable&amp;gt; &lt;br /&gt;
* &amp;lt;moodlehub:enrollable&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both tags will take either &amp;quot;yes&amp;quot; or &amp;quot;no&amp;quot; values and will be set by course creators at the same time as they enter course metadata.&lt;br /&gt;
&lt;br /&gt;
The hub will check the published date for each item in the RSS feed to identify whether it needs to update its records.  TODO: if we use OAI-PMH for harvesting we can request courses updated since x see http://moodle.org/mod/forum/discuss.php?d=127488 &lt;br /&gt;
&lt;br /&gt;
If the course has been updated and is &amp;lt;moodlehub:downloadable&amp;gt; is yes, then the hub will request the site to create a new backup of the entire course (less user data).&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Full schedule and progress is in the tracker: MDL-19309&lt;br /&gt;
&lt;br /&gt;
# Moodle.org Hub List&lt;br /&gt;
# Hub registration form&lt;br /&gt;
# Hub Web interface&lt;br /&gt;
# Hub web service interface &lt;br /&gt;
# Improve Site registration form&lt;br /&gt;
# Community block&lt;br /&gt;
# Publish courses&lt;br /&gt;
# Import courses &lt;br /&gt;
# Export courses&lt;br /&gt;
# Harvest courses&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Community hub technotes]] - relating to MNet developments in Moodle 1.8&lt;br /&gt;
* MDL-18580 - Community Hub tracker issue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MNET]]&lt;br /&gt;
&lt;br /&gt;
[[ja:開発:コミュニティハブ]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59420</id>
		<title>Development:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59420"/>
		<updated>2009-07-06T15:46:50Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Import course */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PROJECT STATE: Proposal&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAIN TRACKER ISSUE&#039;&#039;&#039;: MDL-19309&lt;br /&gt;
* &#039;&#039;&#039;DISCUSSION AND COMMENTS&#039;&#039;&#039;: [http://moodle.org/mod/forum/view.php?id=7330 Hub servers] forum in Using Moodle&lt;br /&gt;
* &#039;&#039;&#039;MAIN AUTHORS&#039;&#039;&#039;: [[User:Martin_Dougiamas|Martin Dougiamas]] and [[User:jerome_mouneyrac|Jerome Mouneyrac]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page describes an overall functional specification for the &amp;quot;Moodle Community Hub&amp;quot; project, which consists of a new system (the Moodle Hub Server) and several new features in Moodle 2.0. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Goals and rationale =&lt;br /&gt;
&lt;br /&gt;
The main goals of the Community hub project are:&lt;br /&gt;
&lt;br /&gt;
# to allow people to easily find courses around the world that they want to enrol in:&lt;br /&gt;
#* educators want to find &#039;&#039;&#039;communities of practice&#039;&#039;&#039; that are subject or region-oriented, so that they can associate with their peers on a long-term basis.&lt;br /&gt;
#* other learners want to find and study courses on various other subjects&lt;br /&gt;
# to make it easy for educators to find and download &#039;&#039;&#039;course templates&#039;&#039;&#039; from other people.  This will help educators share and identify examples of &#039;&#039;&#039;best practice&#039;&#039;&#039; in online pedagogy and hopefully improve the average quality of online courses.&lt;br /&gt;
&lt;br /&gt;
Finally, we want to do all this in the simplest, safest way possible, while allowing a range of scenarios such as courses that are public or private, free or paid, so that the Moodle community can build solutions for themselves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the basic idea.  The systems in this diagram are:&lt;br /&gt;
&lt;br /&gt;
;Ordinary Moodle site: A typical Moodle site with teachers who want to download course templates and/or users who want to connect (enrol) with external communities &lt;br /&gt;
;Publishing site: A Moodle site that wants to make some of its courses available for download&lt;br /&gt;
;Community site: A Moodle site that provides courses that are enrollable&lt;br /&gt;
;Moodle Hub Server: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;.  The default hub will be installed at hub.moodle.org, but there can be many others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Community.png]]&lt;br /&gt;
&lt;br /&gt;
Downloadable courses&lt;br /&gt;
* (A) Sites that want to publish certain courses and make them downloadable can register them with one or more Hub Servers.&lt;br /&gt;
* (B) The Hub will check the data and make sure the course zip is downloadable, caching a copy locally.  The Hub may also have a security process to check the download for trojan horses, bad content, etc (automatic and/or manual).&lt;br /&gt;
* (C) The download process may trigger the backup process on the original server if it hasn&#039;t been done already.&lt;br /&gt;
* (D) Later, Moodle users (who have permissions to do so) can connect to a Hub (via the Repository file picker) to search for downloadable courses and choose one (receiving a download URL).&lt;br /&gt;
* (E) The repository API downloads the file and makes it available to the Moodle user so they can now continue to restore it normally.&lt;br /&gt;
&lt;br /&gt;
Enrollable courses&lt;br /&gt;
* (1) Sites that want to publish certain courses for the public to enrol in can register them with one or more CDS (including the main one at moodle.org)&lt;br /&gt;
* (2) Later, any Moodle user can connect to a CDS (via Community block in their site) to search and find courses they want to join&lt;br /&gt;
* (3) They click on a link to be sent to the other site so that they can enrol there (with or without Mnet).&lt;br /&gt;
&lt;br /&gt;
= Use Cases =&lt;br /&gt;
&lt;br /&gt;
== New teacher creating a course ==&lt;br /&gt;
&lt;br /&gt;
# New teacher needs some help with a new course for &amp;quot;Alligator farming 101&amp;quot;&lt;br /&gt;
# Teacher sees the &amp;quot;Import/Export&amp;quot; block into the &amp;quot;Alligator farming 101&amp;quot; course page and presses &amp;quot;Import course&amp;quot;&lt;br /&gt;
# Teacher browses a list of downloadable courses in the File picker (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches for &amp;quot;Alligator&amp;quot; &lt;br /&gt;
# Teacher finds 4 courses that look good, and after reading reviews and ratings, chooses one.&lt;br /&gt;
# The course is downloaded and unpacked in Moodle.&lt;br /&gt;
# The teacher now has a good starter course they can keep developing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New teacher needs help ==&lt;br /&gt;
&lt;br /&gt;
A teacher decides they need some help and wants to talk with others teaching Alligator farming.&lt;br /&gt;
&lt;br /&gt;
# Teacher goes to their &amp;quot;Community&amp;quot; block and clicks &amp;quot;Find community&amp;quot;.&lt;br /&gt;
# Moodle displays a page to search for courses (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches courses for &amp;quot;educator&amp;quot; courses on &amp;quot;Alligators&amp;quot; in their country/language.&lt;br /&gt;
# Teacher finds two, selects one, and is returned to the page where is was before clicking on &amp;quot;Find community&amp;quot;.  The selected course is now permanently listed in the Community block.&lt;br /&gt;
# Teacher clicks on the link and is taken to the course, where they can enrol and interact/learn with peers over time, subscribe to forums etc.&lt;br /&gt;
&lt;br /&gt;
== University consortium ==&lt;br /&gt;
&lt;br /&gt;
A group of five universites wants to share courses among themselves and not to the outside world.  They also want to prevent teachers from downloading courses from outside the consortium.&lt;br /&gt;
&lt;br /&gt;
# Someone downloads Moodle and installs it as a private Moodle Hub Server&lt;br /&gt;
# Admins of all five Moodle sites in the group add the URL of the private Hub to their settings and register their sites there&lt;br /&gt;
# The default Hub at hub.moodle.org is (optionally) disabled in the site-wide settings.&lt;br /&gt;
# Admins register their courses with the Hub.&lt;br /&gt;
# Teachers can now import, export or join courses via the private Hub.&lt;br /&gt;
&lt;br /&gt;
== Course creation business ==&lt;br /&gt;
&lt;br /&gt;
CoolCourses Inc have produced a set of 50 good Moodle courses which they wish to sell.&lt;br /&gt;
&lt;br /&gt;
# They set up a Moodle site with all their courses in them.&lt;br /&gt;
# They set up a Hub with a payment system, and register it with the Hub List at moodle.org so people can find it&lt;br /&gt;
# They register all their courses with their own Hub with appropriate metadata&lt;br /&gt;
# When looking for courses, users can either &lt;br /&gt;
#* find this Hub by browsing through the Hub List, or &lt;br /&gt;
#* type the URL of the Hub directly into their Moodle site&lt;br /&gt;
# When users try to download a course, they may see a payment button to download it (credit card, paypal etc)&lt;br /&gt;
# CoolCourses could provide limited access to the courses on their Moodle site using Roles, as a preview.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Components =&lt;br /&gt;
&lt;br /&gt;
There are several components:&lt;br /&gt;
&lt;br /&gt;
;&#039;&#039;&#039;Hub List&#039;&#039;&#039;: A list of known Hub Servers, kept on moodle.org &lt;br /&gt;
;&#039;&#039;&#039;Hub Server&#039;&#039;&#039;: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;&lt;br /&gt;
;&#039;&#039;&#039;Course registration&#039;&#039;&#039;: A new mechanism in every Moodle to register particular courses with one or more Hub Servers&lt;br /&gt;
;&#039;&#039;&#039;Community membership block&#039;&#039;&#039;: to search Hub Servers to find enrollable courses to join and bookmark&lt;br /&gt;
;&#039;&#039;&#039;Import/Export block&#039;&#039;&#039;: Makes it easy to find downloadable course templates in a Hub Server, then download them from the Hub Server and restore them locally&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub List==&lt;br /&gt;
&lt;br /&gt;
The Hub List is a list of known Hub Servers (see the next section).  This makes it easy for Moodle users to find the most appropriate Hub Servers for their needs.  To get on the Hub List, Hub Servers choose to register with moodle.org via their administration interface.&lt;br /&gt;
&lt;br /&gt;
Moodle.org will store the following information, and make it available via a browseable interface at [http://moodle.org/hubs http://moodle.org/hubs] as well as a simple XML format from [http://moodle.org/hubs/list.xml http://moodle.org/hubs/list.xml] suitable for consumption by Moodle sites.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|int&lt;br /&gt;
|Standard autoincrement&lt;br /&gt;
|-&lt;br /&gt;
|hubname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the Hub&lt;br /&gt;
|-&lt;br /&gt;
|hubdescription&lt;br /&gt;
|text&lt;br /&gt;
|Description of the hub, from the admin there&lt;br /&gt;
|-&lt;br /&gt;
|huburl&lt;br /&gt;
|varchar&lt;br /&gt;
|The full URL to the hub front page&lt;br /&gt;
|-&lt;br /&gt;
|hubsecret&lt;br /&gt;
|varchar&lt;br /&gt;
|The secret code from the hub (extra authentication)&lt;br /&gt;
|-&lt;br /&gt;
|trusted&lt;br /&gt;
|int&lt;br /&gt;
|Is the hub trusted?  Does it have good quality control?&lt;br /&gt;
|-&lt;br /&gt;
|language&lt;br /&gt;
|varchar&lt;br /&gt;
|What is the primary language of this hub?  (blank for multilanguage)&lt;br /&gt;
|-&lt;br /&gt;
|sites&lt;br /&gt;
|int&lt;br /&gt;
|Number of sites  registered on this hub&lt;br /&gt;
|-&lt;br /&gt;
|courses&lt;br /&gt;
|int&lt;br /&gt;
|Number of courses registered on this hub &lt;br /&gt;
|-&lt;br /&gt;
|timefirst&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was first registered&lt;br /&gt;
|-&lt;br /&gt;
|timelast&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was last registered/updated&lt;br /&gt;
|-&lt;br /&gt;
|contactname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|contactemail&lt;br /&gt;
|varchar&lt;br /&gt;
|Email of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|varchar&lt;br /&gt;
|hub logo url&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Registerhub.png]]&lt;br /&gt;
&lt;br /&gt;
following a hub list table on Moodle.org:&lt;br /&gt;
[[Image:Hublist.png]]&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub Server==&lt;br /&gt;
&lt;br /&gt;
The Moodle Hub Server (aka Hub) is a separate system (based on Moodle technology) that allows Moodle sites to register their courses for listing there.&lt;br /&gt;
&lt;br /&gt;
A default installation of this software will be running at &#039;&#039;&#039;hub.moodle.org&#039;&#039;&#039;, but anyone else can download it and set up their own hub for private or public uses.   A default installation of Moodle can also be a Hub, or if the admin chooses, a site can be a dedicated Hub if they choose that option during install (in this case the front page of the site will be a dedicated site search for the public).&lt;br /&gt;
&lt;br /&gt;
Hubs can optionally register themselves in the Hub List so that they are easier to find and so they can become a &amp;quot;Trusted Hub&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A hub server has some config fields (saved into its database):&lt;br /&gt;
* name&lt;br /&gt;
* description&lt;br /&gt;
* language&lt;br /&gt;
* contact name&lt;br /&gt;
* contact email&lt;br /&gt;
* enable&lt;br /&gt;
* hub secret (generated the first time the hub is registered on Moodle.org, it will never change)&lt;br /&gt;
* logo url &lt;br /&gt;
* protected web search interface &#039;&#039;&#039;(TODO: the protection method needs to be defined)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data structure ===&lt;br /&gt;
&lt;br /&gt;
==== Sites ====&lt;br /&gt;
&lt;br /&gt;
Primarily this table will store information about the sites that have registered course information on that Hub.  On hub.moodle.org this information will also be used for [http://moodle.org/stats general statistics] and the listing of [http://moodle.org/sites registered sites].&lt;br /&gt;
&lt;br /&gt;
* Id&lt;br /&gt;
* Site name &lt;br /&gt;
* Site description&lt;br /&gt;
* URL&lt;br /&gt;
* Address&lt;br /&gt;
*# Country code (AU, FR etc) [http://cvs.moodle.org/moodle/lang/en_utf8/countries.php?view=markup lang/XX_utf8/countries.php]&lt;br /&gt;
*# Region/state (based on list) [http://www.commondatahub.com/live/geography/state_province_region/iso_3166_2_state_codes ISO 3166-2 (XX-XXX)]&lt;br /&gt;
*# Street address &lt;br /&gt;
*# Geolocation (for mapping)&lt;br /&gt;
* Site manager&lt;br /&gt;
*# Name&lt;br /&gt;
*# Email&lt;br /&gt;
*# Phone&lt;br /&gt;
* Contact form yes/no?&lt;br /&gt;
* Default site language&lt;br /&gt;
* Moodle version (eg 2009050502)&lt;br /&gt;
* Moodle release (eg 1.9.5+)&lt;br /&gt;
* Site ip address (updated at every update)&lt;br /&gt;
* Unique SiteID code generated by Moodle site&lt;br /&gt;
* Confirmed by admin&lt;br /&gt;
* Site is &amp;quot;trusted&amp;quot; - this means we don&#039;t manually check data in future from this site.&lt;br /&gt;
* Mnet/WS information, enough to let a teacher authenticate to the site using Mnet 2.0 (optional)&lt;br /&gt;
* Harvesting url&lt;br /&gt;
* Time updated&lt;br /&gt;
* Time created&lt;br /&gt;
* Currently unreachable&lt;br /&gt;
* Time link was last checked&lt;br /&gt;
&lt;br /&gt;
Extra information that will only be kept on hub.moodle.org (only published in aggregate form):&lt;br /&gt;
&lt;br /&gt;
* Tool usage stats &lt;br /&gt;
** number of courses&lt;br /&gt;
** number of users&lt;br /&gt;
** number of enrolments&lt;br /&gt;
** number of posts&lt;br /&gt;
** number of resources&lt;br /&gt;
** number of questions&lt;br /&gt;
** median course size&lt;br /&gt;
* Subscribed to securityalerts@lists.moodle.org&lt;br /&gt;
&lt;br /&gt;
==== Courses ====&lt;br /&gt;
&lt;br /&gt;
This table stores registered courses, one record per course.  Some courses will be &amp;quot;downloadable&amp;quot;, some will be enrollable, so different fields can be used.&lt;br /&gt;
&lt;br /&gt;
* Course ID&lt;br /&gt;
* Site ID (foreign key to sites table)&lt;br /&gt;
* Dublin Core Metadata Element Set, Version 1.1&lt;br /&gt;
*# Contributor - course manager names or whoever the publisher nominates&lt;br /&gt;
*# Coverage - User tags&lt;br /&gt;
*# Creator - main teacher name or copyright holder or whoever the publisher nominates&lt;br /&gt;
*# Date - date this was last published/updated&lt;br /&gt;
*# Description - course description&lt;br /&gt;
*# Format - zip / url&lt;br /&gt;
*# Identifier - course shortname (unique on the original site)&lt;br /&gt;
*# Language - based on lang.php&lt;br /&gt;
*# Publisher - the name of the person who caused this record to be entered here&lt;br /&gt;
*# Relation - the site id that it came from&lt;br /&gt;
*# Rights - one of a standard set of open source, creative commons and other licenses&lt;br /&gt;
*# Source - original URL of the course&lt;br /&gt;
*# Subject - The best-matching item from ([https://docs.moodle.org/en/Course_Standard_Tags  Course Standard Tags ])&lt;br /&gt;
*# Title - Course fullname&lt;br /&gt;
*# Type - &amp;quot;course&amp;quot; (later there might other types such as activities or SCORM packages etc)&lt;br /&gt;
* Audience:  Educators | Students | Admins&lt;br /&gt;
* Educational level being discussed (for educators audience only):  Tertiary | Secondary | Primary | Government | Corporate&lt;br /&gt;
* Is a course map supplied?   (Simple XML description of course structure, could be rendered graphically later [http://kn.open.ac.uk/public/workspace.cfm?wpid=8690 CompendiumLD] )&lt;br /&gt;
&lt;br /&gt;
* Availability (public/private)&lt;br /&gt;
* Download URL (usually a local cached zip but could be anything else, including empty for non-downloadable)&lt;br /&gt;
* Original Download URL (usually a download script on the original Moodle site, used by Hub to get cache)&lt;br /&gt;
* Is the course trusted?  (all downloadable courses from non-trusted sites start as &amp;quot;no&amp;quot;, then this gets changed by someone who checks it)&lt;br /&gt;
* Is the course enrollable anyone with an account?&lt;br /&gt;
* Is guest access allowed?&lt;br /&gt;
* Are screenshots supplied?   (stored on disk under id of this record)&lt;br /&gt;
* Enrol Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
* Download Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
&lt;br /&gt;
==== Course feedback ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id&lt;br /&gt;
* type (bug / comment)&lt;br /&gt;
* text &lt;br /&gt;
* rating&lt;br /&gt;
&lt;br /&gt;
==== Course content ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id &lt;br /&gt;
* module type (activity / block)&lt;br /&gt;
* module name (forum, resource etc)&lt;br /&gt;
* count&lt;br /&gt;
&lt;br /&gt;
==== Course outcomes ====&lt;br /&gt;
&lt;br /&gt;
* id&lt;br /&gt;
* course id &lt;br /&gt;
* outcome  (text)&lt;br /&gt;
&lt;br /&gt;
=== Web user interface ===&lt;br /&gt;
&lt;br /&gt;
If visiting the hub via the web, it will provide an interface for full searching and browsing.  &lt;br /&gt;
&lt;br /&gt;
The web interface can be protected from access.  The hub at moodle.org will of course be open to all.&lt;br /&gt;
&lt;br /&gt;
Here is a very rough mockup of how it could look:&lt;br /&gt;
&lt;br /&gt;
[[Image:Webinterface.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Search_hub_moodle.png]]&lt;br /&gt;
&lt;br /&gt;
The web interface allows users to:&lt;br /&gt;
&lt;br /&gt;
* search by keyword (descriptions, titles, tags, subject etc)&lt;br /&gt;
* browse a list of courses by subject&lt;br /&gt;
* go directly to a course (if marked for public use)&lt;br /&gt;
* preview a course (if screenshots have been provided, or the original URL location)&lt;br /&gt;
* download the course to desktop (only if an download url has been set)&lt;br /&gt;
* If logged in to the Hub, users can also:&lt;br /&gt;
** give a rating to the course&lt;br /&gt;
** write a comment for the course - &amp;lt;span style=color:blue&amp;gt;use comment 2.0 API&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When displaying courses, you can see and sort by:&lt;br /&gt;
&lt;br /&gt;
* Title - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Description&lt;br /&gt;
* Tags  - &#039;&#039;Sortable &amp;lt;span style=color:blue&amp;gt;(first tag retrieved by the request is considered)&amp;lt;/span&amp;gt;&#039;&#039;&lt;br /&gt;
* Screenshot(s)&lt;br /&gt;
* Cost (if any) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Rating (10-point scale displayed as 5 stars, and only if you are logged in to moodle.org) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Comments &lt;br /&gt;
* Moodle site name&lt;br /&gt;
* Date added to directory&lt;br /&gt;
* Date last updated in directory &lt;br /&gt;
* Date last checked (by a cron job)&lt;br /&gt;
* Audience (teachers, students, admins)&lt;br /&gt;
* Teacher name(s) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Web service user interface ===&lt;br /&gt;
&lt;br /&gt;
A REST-based web services interface will be provided for other systems (eg Moodle sites) to use directly.&lt;br /&gt;
&lt;br /&gt;
Web services can search on:&lt;br /&gt;
* string search&lt;br /&gt;
* array language&lt;br /&gt;
* array cost&lt;br /&gt;
* array Moodle url&lt;br /&gt;
* Others?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hub admin interface ===&lt;br /&gt;
&lt;br /&gt;
The hub will have a Hub admin interface (at http://hubsite.org/hub) where the hub is managed.  Admin processes include:&lt;br /&gt;
&lt;br /&gt;
* Listing, approving and editing the sites registered with the hub &lt;br /&gt;
* Listing, approving and editing the course descriptions, metadata etc.&lt;br /&gt;
* Registering/updating the Hub with the Hub List&lt;br /&gt;
* Configuring Hub behaviour and the appearance of the home page.&lt;br /&gt;
&lt;br /&gt;
== Site registration ==&lt;br /&gt;
&lt;br /&gt;
The existing site registration form in Moodle will be extended so that admins can:&lt;br /&gt;
&lt;br /&gt;
# choose one or more Hubs to register with (hub.moodle.org and/or others in the Hub List, or directly to a particular Hub specified by URL)&lt;br /&gt;
# choose to enable cron to re-send statistics to the hub on a periodic basis.&lt;br /&gt;
# choose to enable the hub to harvest courses on a periodic basis (TODO: not shown on image)&lt;br /&gt;
&lt;br /&gt;
Each Moodle.org Hub will perform a check every week to verify that each site is accessible and optionally to harvest the courses from that site.  Sites that fail two or three checks in a row will be disable in the Hub listing.&lt;br /&gt;
&lt;br /&gt;
[[Image:SiteRegistration.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Community membership ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Community&amp;quot; block allows people to find and subscribe to external courses that they want to be part of.&lt;br /&gt;
&lt;br /&gt;
Visibility of the block and the features within it are controlled by roles, and contains:&lt;br /&gt;
&lt;br /&gt;
# &#039;Bookmarks&#039; of previously-selected (subscribed) external courses (to make revisiting easy) grouped by site, which can be edited/deleted etc&lt;br /&gt;
# A link to a search script - &amp;quot;Add new courses...&amp;quot;&lt;br /&gt;
# A search script to browse/search one or more Hubs (via web services to get the data, with the interface rendered by the local script).  Users can select joinable courses from the list and they&#039;ll get added to the list in the block.&lt;br /&gt;
&lt;br /&gt;
Generally the links will be just be an ordinary URL and the remote site will be responsible for authentication.&lt;br /&gt;
&lt;br /&gt;
If the foreign site has an Mnet connection set up with the current site then login will be immediate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Addacourse.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Import/Export courses ==&lt;br /&gt;
&lt;br /&gt;
The Import/Export block will be available on course pages and contains buttons to:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Publish course&#039;&#039;&#039;: to publish or update the description of the current course in one or more Hubs (admins only)&lt;br /&gt;
* &#039;&#039;&#039;Export course&#039;&#039;&#039;: publish/upload entire course (as Moodle Backup minus userdata) somewhere (eg a Hub) (via Portfolio API plugins)&lt;br /&gt;
* &#039;&#039;&#039;Import course&#039;&#039;&#039;: find/download/install a course template from a Hub or from another course on same site  (Repository API plugins)&lt;br /&gt;
&lt;br /&gt;
=== Publish course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Publish&#039;&#039;&#039; button only exists if the current user has the appropriate capabilities and if the current Moodle site has been registered with a Hub.&lt;br /&gt;
&lt;br /&gt;
[[Image:Coursepublishing.png|900px]]&lt;br /&gt;
&lt;br /&gt;
Choosing &amp;quot;Publish&amp;quot; goes to a script where you can chose from the registered Hubs and whether you want to publish the course as:&lt;br /&gt;
* enrollable, so that others can come here and use the course where it is, and/or &lt;br /&gt;
* downloadable, so that a Hub can offer this course for download to others&lt;br /&gt;
&lt;br /&gt;
If the user wants to offer this course for download, then they are directed to the standard backup process to create and define the backup file (without users!).  If the backup is successful the zip is stored in a standard place and then the user is returned to the publish script to continue.  (If downloads are not required then this whole step is skipped).&lt;br /&gt;
&lt;br /&gt;
It allows the user to set up full , and especially whether you want to advertise this course as being:&lt;br /&gt;
&lt;br /&gt;
Now the script presents a form with metadata that this course will be published with on the chosen Hub(s) (this is also available in the course settings page).  Metadata includes information such as description, licensing, categories, screenshots etc (see the [[#Courses|Courses]] section above for more info).&lt;br /&gt;
&lt;br /&gt;
After checking/updating the metadata, the script will push the data to the selected Hub.  The Hub will bounce back a confirmation which gets saved locally as the &amp;quot;Last publish date&amp;quot; for that course.&lt;br /&gt;
&lt;br /&gt;
If the checkbox to allow download was selected, then the URL to a course download script in the current Moodle is included with the metadata.  This URL contains a token (eg an MD5 stored in the course table) that only the Hub knows.&lt;br /&gt;
&lt;br /&gt;
The course download script (eg /course/download.php?id=55&amp;amp;secret=XXXXX) will send the cached .zip file for the given course.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Publish course settings ====&lt;br /&gt;
&lt;br /&gt;
Some publish settings and info will also be available anytime via the course settings page under a &amp;quot;Publish&amp;quot; tab:&lt;br /&gt;
&lt;br /&gt;
* Which hubs has this course been published on, and when&lt;br /&gt;
* Full metadata&lt;br /&gt;
* Screenshots&lt;br /&gt;
&lt;br /&gt;
=== Export course ===&lt;br /&gt;
&lt;br /&gt;
A standard export will do a normal backup (taking care to remove userdata by default), and at the end will call the portfolio API to push that file to a connected portfolio.  Portfolio (export) plugins could include:&lt;br /&gt;
&lt;br /&gt;
* downloading it to the local computer&lt;br /&gt;
* uploading it as a zip to any general purpose repository&lt;br /&gt;
* copy the course to another Moodle site set up with Mnet peering.&lt;br /&gt;
&lt;br /&gt;
Pushing it to another Moodle site would trigger extra behaviours:&lt;br /&gt;
&lt;br /&gt;
* Permissions would be checked on the destination Moodle&lt;br /&gt;
* The course can be immediately restored on the external Moodle in a special &amp;quot;New&amp;quot; category as a hidden course&lt;br /&gt;
* Someone on the external Moodle can be alerted to approve/unhide the new course&lt;br /&gt;
&lt;br /&gt;
=== Import course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Import course&#039;&#039;&#039; button will pull up a normal file picker to browse repositories for files with a mimetype matching .mbkup.zip.&lt;br /&gt;
&lt;br /&gt;
One special repository plugin called &amp;quot;Courses&amp;quot; allows the user to:&lt;br /&gt;
&lt;br /&gt;
* find Hubs by downloading the Hub List&lt;br /&gt;
* search particular Hubs for downloadable courses (only)&lt;br /&gt;
* search other courses on the same server (replacing the existing import function we have)&lt;br /&gt;
&lt;br /&gt;
Once the user has selected one of these courses and passed any challenge there might be (eg the Hub could potentially require a password or payment or a license agreement form), then the zip file is downloaded to the local Moodle, and then the user is passed to the standard restore process.&lt;br /&gt;
&lt;br /&gt;
[[Image:FilePicker_all_JS.png|900px]]&lt;br /&gt;
[[Image:FilePicker_JS_course_selector.png|900px]]&lt;br /&gt;
&lt;br /&gt;
=== Harvest courses ===&lt;br /&gt;
&lt;br /&gt;
Each hub will use cron to call every site that has registered a harvesting url on a periodic basis.  This will be done at the same time as the link is checked to ensure the site is reachable, so the &amp;quot;time link was last checked&amp;quot; field in the site table also indicates when the site was last harvested.&lt;br /&gt;
&lt;br /&gt;
The harvesting url will be an RSS feed which will list all the courses to be included in the hub and their metadata.  This might be the feed of all visible courses on the site, or courses in a given category.  TODO: should we allow them to enter multiple category feeds so they can say &amp;quot;arts&amp;quot;, &amp;quot;business&amp;quot; and &amp;quot;languages&amp;quot; but not &amp;quot;science&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
Course list RSS feeds are an existing tracker item for Moodle 2.0  See http://tracker.moodle.org/browse/MDL-13248  This patch allows admins to pick which categories have individual feeds created and are included in the &amp;quot;all courses&amp;quot; feed.  Each course becomes an &amp;lt;item&amp;gt; in the RSS feed as follows:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;category&amp;gt; the Moodle course category in which the course belongs&lt;br /&gt;
* &amp;lt;title&amp;gt; the course fullname&lt;br /&gt;
* &amp;lt;link&amp;gt; the course url&lt;br /&gt;
* &amp;lt;pubdate&amp;gt; the date the course (or any of its resources and activities) last updated&lt;br /&gt;
* &amp;lt;description&amp;gt; the course summary&lt;br /&gt;
&lt;br /&gt;
The current tracker item will need to be extended to include appropriate course metadata in the RSS feed.  There is a [http://purl.org/dc/elements/1.1/ Dublin Core extension to RSS 2.0] which can be implemented.  &lt;br /&gt;
&lt;br /&gt;
TODO: If we choose an alternative metadata format we will need to locate or create an alternative RSS extension.  There is a [http://www.downes.ca/xml/RSS_LOM.htm LOM extension] but not from an official IEEE namespace.  &lt;br /&gt;
&lt;br /&gt;
We will need to declare our own namespace RSS extension to identify whether a course should be listed in the hub as downloadable and/or enrollable.  This extension will add tags to the RSS feed as follows:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;moodlehub:downloadable&amp;gt; &lt;br /&gt;
* &amp;lt;moodlehub:enrollable&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both tags will take either &amp;quot;yes&amp;quot; or &amp;quot;no&amp;quot; values and will be set by course creators at the same time as they enter course metadata.&lt;br /&gt;
&lt;br /&gt;
The hub will check the published date for each item in the RSS feed to identify whether it needs to update its records.  TODO: if we use OAI-PMH for harvesting we can request courses updated since x see http://moodle.org/mod/forum/discuss.php?d=127488 &lt;br /&gt;
&lt;br /&gt;
If the course has been updated and is &amp;lt;moodlehub:downloadable&amp;gt; is yes, then the hub will request the site to create a new backup of the entire course (less user data).&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Full schedule and progress is in the tracker: MDL-19309&lt;br /&gt;
&lt;br /&gt;
# Moodle.org Hub List&lt;br /&gt;
# Hub registration form&lt;br /&gt;
# Hub Web interface&lt;br /&gt;
# Hub web service interface &lt;br /&gt;
# Improve Site registration form&lt;br /&gt;
# Community block&lt;br /&gt;
# Publish courses&lt;br /&gt;
# Import courses &lt;br /&gt;
# Export courses&lt;br /&gt;
# Harvest courses&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Community hub technotes]] - relating to MNet developments in Moodle 1.8&lt;br /&gt;
* MDL-18580 - Community Hub tracker issue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MNET]]&lt;br /&gt;
&lt;br /&gt;
[[ja:開発:コミュニティハブ]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59408</id>
		<title>Development:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59408"/>
		<updated>2009-07-06T14:48:34Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Schedule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PROJECT STATE: Proposal&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAIN TRACKER ISSUE&#039;&#039;&#039;: MDL-19309&lt;br /&gt;
* &#039;&#039;&#039;DISCUSSION AND COMMENTS&#039;&#039;&#039;: [http://moodle.org/mod/forum/view.php?id=7330 Hub servers] forum in Using Moodle&lt;br /&gt;
* &#039;&#039;&#039;MAIN AUTHORS&#039;&#039;&#039;: [[User:Martin_Dougiamas|Martin Dougiamas]] and [[User:jerome_mouneyrac|Jerome Mouneyrac]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page describes an overall functional specification for the &amp;quot;Moodle Community Hub&amp;quot; project, which consists of a new system (the Moodle Hub Server) and several new features in Moodle 2.0. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Goals and rationale =&lt;br /&gt;
&lt;br /&gt;
The main goals of the Community hub project are:&lt;br /&gt;
&lt;br /&gt;
# to allow people to easily find courses around the world that they want to enrol in:&lt;br /&gt;
#* educators want to find &#039;&#039;&#039;communities of practice&#039;&#039;&#039; that are subject or region-oriented, so that they can associate with their peers on a long-term basis.&lt;br /&gt;
#* other learners want to find and study courses on various other subjects&lt;br /&gt;
# to make it easy for educators to find and download &#039;&#039;&#039;course templates&#039;&#039;&#039; from other people.  This will help educators share and identify examples of &#039;&#039;&#039;best practice&#039;&#039;&#039; in online pedagogy and hopefully improve the average quality of online courses.&lt;br /&gt;
&lt;br /&gt;
Finally, we want to do all this in the simplest, safest way possible, while allowing a range of scenarios such as courses that are public or private, free or paid, so that the Moodle community can build solutions for themselves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the basic idea.  The systems in this diagram are:&lt;br /&gt;
&lt;br /&gt;
;Ordinary Moodle site: A typical Moodle site with teachers who want to download course templates and/or users who want to connect (enrol) with external communities &lt;br /&gt;
;Publishing site: A Moodle site that wants to make some of its courses available for download&lt;br /&gt;
;Community site: A Moodle site that provides courses that are enrollable&lt;br /&gt;
;Moodle Hub Server: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;.  The default hub will be installed at hub.moodle.org, but there can be many others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Community.png]]&lt;br /&gt;
&lt;br /&gt;
Downloadable courses&lt;br /&gt;
* (A) Sites that want to publish certain courses and make them downloadable can register them with one or more Hub Servers.&lt;br /&gt;
* (B) The Hub will check the data and make sure the course zip is downloadable, caching a copy locally.  The Hub may also have a security process to check the download for trojan horses, bad content, etc (automatic and/or manual).&lt;br /&gt;
* (C) The download process may trigger the backup process on the original server if it hasn&#039;t been done already.&lt;br /&gt;
* (D) Later, Moodle users (who have permissions to do so) can connect to a Hub (via the Repository file picker) to search for downloadable courses and choose one (receiving a download URL).&lt;br /&gt;
* (E) The repository API downloads the file and makes it available to the Moodle user so they can now continue to restore it normally.&lt;br /&gt;
&lt;br /&gt;
Enrollable courses&lt;br /&gt;
* (1) Sites that want to publish certain courses for the public to enrol in can register them with one or more CDS (including the main one at moodle.org)&lt;br /&gt;
* (2) Later, any Moodle user can connect to a CDS (via Community block in their site) to search and find courses they want to join&lt;br /&gt;
* (3) They click on a link to be sent to the other site so that they can enrol there (with or without Mnet).&lt;br /&gt;
&lt;br /&gt;
= Use Cases =&lt;br /&gt;
&lt;br /&gt;
== New teacher creating a course ==&lt;br /&gt;
&lt;br /&gt;
# New teacher needs some help with a new course for &amp;quot;Alligator farming 101&amp;quot;&lt;br /&gt;
# Teacher sees the &amp;quot;Import/Export&amp;quot; block into the &amp;quot;Alligator farming 101&amp;quot; course page and presses &amp;quot;Import course&amp;quot;&lt;br /&gt;
# Teacher browses a list of downloadable courses in the File picker (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches for &amp;quot;Alligator&amp;quot; &lt;br /&gt;
# Teacher finds 4 courses that look good, and after reading reviews and ratings, chooses one.&lt;br /&gt;
# The course is downloaded and unpacked in Moodle.&lt;br /&gt;
# The teacher now has a good starter course they can keep developing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New teacher needs help ==&lt;br /&gt;
&lt;br /&gt;
A teacher decides they need some help and wants to talk with others teaching Alligator farming.&lt;br /&gt;
&lt;br /&gt;
# Teacher goes to their &amp;quot;Community&amp;quot; block and clicks &amp;quot;Find community&amp;quot;.&lt;br /&gt;
# Moodle displays a page to search for courses (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches courses for &amp;quot;educator&amp;quot; courses on &amp;quot;Alligators&amp;quot; in their country/language.&lt;br /&gt;
# Teacher finds two, selects one, and is returned to the page where is was before clicking on &amp;quot;Find community&amp;quot;.  The selected course is now permanently listed in the Community block.&lt;br /&gt;
# Teacher clicks on the link and is taken to the course, where they can enrol and interact/learn with peers over time, subscribe to forums etc.&lt;br /&gt;
&lt;br /&gt;
== University consortium ==&lt;br /&gt;
&lt;br /&gt;
A group of five universites wants to share courses among themselves and not to the outside world.  They also want to prevent teachers from downloading courses from outside the consortium.&lt;br /&gt;
&lt;br /&gt;
# Someone downloads Moodle and installs it as a private Moodle Hub Server&lt;br /&gt;
# Admins of all five Moodle sites in the group add the URL of the private Hub to their settings and register their sites there&lt;br /&gt;
# The default Hub at hub.moodle.org is (optionally) disabled in the site-wide settings.&lt;br /&gt;
# Admins register their courses with the Hub.&lt;br /&gt;
# Teachers can now import, export or join courses via the private Hub.&lt;br /&gt;
&lt;br /&gt;
== Course creation business ==&lt;br /&gt;
&lt;br /&gt;
CoolCourses Inc have produced a set of 50 good Moodle courses which they wish to sell.&lt;br /&gt;
&lt;br /&gt;
# They set up a Moodle site with all their courses in them.&lt;br /&gt;
# They set up a Hub with a payment system, and register it with the Hub List at moodle.org so people can find it&lt;br /&gt;
# They register all their courses with their own Hub with appropriate metadata&lt;br /&gt;
# When looking for courses, users can either &lt;br /&gt;
#* find this Hub by browsing through the Hub List, or &lt;br /&gt;
#* type the URL of the Hub directly into their Moodle site&lt;br /&gt;
# When users try to download a course, they may see a payment button to download it (credit card, paypal etc)&lt;br /&gt;
# CoolCourses could provide limited access to the courses on their Moodle site using Roles, as a preview.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Components =&lt;br /&gt;
&lt;br /&gt;
There are several components:&lt;br /&gt;
&lt;br /&gt;
;&#039;&#039;&#039;Hub List&#039;&#039;&#039;: A list of known Hub Servers, kept on moodle.org &lt;br /&gt;
;&#039;&#039;&#039;Hub Server&#039;&#039;&#039;: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;&lt;br /&gt;
;&#039;&#039;&#039;Course registration&#039;&#039;&#039;: A new mechanism in every Moodle to register particular courses with one or more Hub Servers&lt;br /&gt;
;&#039;&#039;&#039;Community membership block&#039;&#039;&#039;: to search Hub Servers to find enrollable courses to join and bookmark&lt;br /&gt;
;&#039;&#039;&#039;Import/Export block&#039;&#039;&#039;: Makes it easy to find downloadable course templates in a Hub Server, then download them from the Hub Server and restore them locally&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub List==&lt;br /&gt;
&lt;br /&gt;
The Hub List is a list of known Hub Servers (see the next section).  This makes it easy for Moodle users to find the most appropriate Hub Servers for their needs.  To get on the Hub List, Hub Servers choose to register with moodle.org via their administration interface.&lt;br /&gt;
&lt;br /&gt;
Moodle.org will store the following information, and make it available via a browseable interface at [http://moodle.org/hubs http://moodle.org/hubs] as well as a simple XML format from [http://moodle.org/hubs/list.xml http://moodle.org/hubs/list.xml] suitable for consumption by Moodle sites.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|int&lt;br /&gt;
|Standard autoincrement&lt;br /&gt;
|-&lt;br /&gt;
|hubname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the Hub&lt;br /&gt;
|-&lt;br /&gt;
|hubdescription&lt;br /&gt;
|text&lt;br /&gt;
|Description of the hub, from the admin there&lt;br /&gt;
|-&lt;br /&gt;
|huburl&lt;br /&gt;
|varchar&lt;br /&gt;
|The full URL to the hub front page&lt;br /&gt;
|-&lt;br /&gt;
|hubsecret&lt;br /&gt;
|varchar&lt;br /&gt;
|The secret code from the hub (extra authentication)&lt;br /&gt;
|-&lt;br /&gt;
|trusted&lt;br /&gt;
|int&lt;br /&gt;
|Is the hub trusted?  Does it have good quality control?&lt;br /&gt;
|-&lt;br /&gt;
|language&lt;br /&gt;
|varchar&lt;br /&gt;
|What is the primary language of this hub?  (blank for multilanguage)&lt;br /&gt;
|-&lt;br /&gt;
|sites&lt;br /&gt;
|int&lt;br /&gt;
|Number of sites  registered on this hub&lt;br /&gt;
|-&lt;br /&gt;
|courses&lt;br /&gt;
|int&lt;br /&gt;
|Number of courses registered on this hub &lt;br /&gt;
|-&lt;br /&gt;
|timefirst&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was first registered&lt;br /&gt;
|-&lt;br /&gt;
|timelast&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was last registered/updated&lt;br /&gt;
|-&lt;br /&gt;
|contactname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|contactemail&lt;br /&gt;
|varchar&lt;br /&gt;
|Email of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|varchar&lt;br /&gt;
|hub logo url&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Registerhub.png]]&lt;br /&gt;
&lt;br /&gt;
following a hub list table on Moodle.org:&lt;br /&gt;
[[Image:Hublist.png]]&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub Server==&lt;br /&gt;
&lt;br /&gt;
The Moodle Hub Server (aka Hub) is a separate system (based on Moodle technology) that allows Moodle sites to register their courses for listing there.&lt;br /&gt;
&lt;br /&gt;
A default installation of this software will be running at &#039;&#039;&#039;hub.moodle.org&#039;&#039;&#039;, but anyone else can download it and set up their own hub for private or public uses.   A default installation of Moodle can also be a Hub, or if the admin chooses, a site can be a dedicated Hub if they choose that option during install (in this case the front page of the site will be a dedicated site search for the public).&lt;br /&gt;
&lt;br /&gt;
Hubs can optionally register themselves in the Hub List so that they are easier to find and so they can become a &amp;quot;Trusted Hub&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A hub server has some config fields (saved into its database):&lt;br /&gt;
* name&lt;br /&gt;
* description&lt;br /&gt;
* language&lt;br /&gt;
* contact name&lt;br /&gt;
* contact email&lt;br /&gt;
* enable&lt;br /&gt;
* hub secret (generated the first time the hub is registered on Moodle.org, it will never change)&lt;br /&gt;
* logo url &lt;br /&gt;
* protected web search interface &#039;&#039;&#039;(TODO: the protection method needs to be defined)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data structure ===&lt;br /&gt;
&lt;br /&gt;
==== Sites ====&lt;br /&gt;
&lt;br /&gt;
Primarily this table will store information about the sites that have registered course information on that Hub.  On hub.moodle.org this information will also be used for [http://moodle.org/stats general statistics] and the listing of [http://moodle.org/sites registered sites].&lt;br /&gt;
&lt;br /&gt;
* Id&lt;br /&gt;
* Site name &lt;br /&gt;
* Site description&lt;br /&gt;
* URL&lt;br /&gt;
* Address&lt;br /&gt;
*# Country code (AU, FR etc) [http://cvs.moodle.org/moodle/lang/en_utf8/countries.php?view=markup lang/XX_utf8/countries.php]&lt;br /&gt;
*# Region/state (based on list) [http://www.commondatahub.com/live/geography/state_province_region/iso_3166_2_state_codes ISO 3166-2 (XX-XXX)]&lt;br /&gt;
*# Street address &lt;br /&gt;
*# Geolocation (for mapping)&lt;br /&gt;
* Site manager&lt;br /&gt;
*# Name&lt;br /&gt;
*# Email&lt;br /&gt;
*# Phone&lt;br /&gt;
* Contact form yes/no?&lt;br /&gt;
* Default site language&lt;br /&gt;
* Moodle version (eg 2009050502)&lt;br /&gt;
* Moodle release (eg 1.9.5+)&lt;br /&gt;
* Site ip address (updated at every update)&lt;br /&gt;
* Unique SiteID code generated by Moodle site&lt;br /&gt;
* Confirmed by admin&lt;br /&gt;
* Site is &amp;quot;trusted&amp;quot; - this means we don&#039;t manually check data in future from this site.&lt;br /&gt;
* Mnet/WS information, enough to let a teacher authenticate to the site using Mnet 2.0 (optional)&lt;br /&gt;
* Harvesting url&lt;br /&gt;
* Time updated&lt;br /&gt;
* Time created&lt;br /&gt;
* Currently unreachable&lt;br /&gt;
* Time link was last checked&lt;br /&gt;
&lt;br /&gt;
Extra information that will only be kept on hub.moodle.org (only published in aggregate form):&lt;br /&gt;
&lt;br /&gt;
* Tool usage stats &lt;br /&gt;
** number of courses&lt;br /&gt;
** number of users&lt;br /&gt;
** number of enrolments&lt;br /&gt;
** number of posts&lt;br /&gt;
** number of resources&lt;br /&gt;
** number of questions&lt;br /&gt;
** median course size&lt;br /&gt;
* Subscribed to securityalerts@lists.moodle.org&lt;br /&gt;
&lt;br /&gt;
==== Courses ====&lt;br /&gt;
&lt;br /&gt;
This table stores registered courses, one record per course.  Some courses will be &amp;quot;downloadable&amp;quot;, some will be enrollable, so different fields can be used.&lt;br /&gt;
&lt;br /&gt;
* Course ID&lt;br /&gt;
* Site ID (foreign key to sites table)&lt;br /&gt;
* Dublin Core Metadata Element Set, Version 1.1&lt;br /&gt;
*# Contributor - course manager names or whoever the publisher nominates&lt;br /&gt;
*# Coverage - User tags&lt;br /&gt;
*# Creator - main teacher name or copyright holder or whoever the publisher nominates&lt;br /&gt;
*# Date - date this was last published/updated&lt;br /&gt;
*# Description - course description&lt;br /&gt;
*# Format - zip / url&lt;br /&gt;
*# Identifier - course shortname (unique on the original site)&lt;br /&gt;
*# Language - based on lang.php&lt;br /&gt;
*# Publisher - the name of the person who caused this record to be entered here&lt;br /&gt;
*# Relation - the site id that it came from&lt;br /&gt;
*# Rights - one of a standard set of open source, creative commons and other licenses&lt;br /&gt;
*# Source - original URL of the course&lt;br /&gt;
*# Subject - The best-matching item from ([https://docs.moodle.org/en/Course_Standard_Tags  Course Standard Tags ])&lt;br /&gt;
*# Title - Course fullname&lt;br /&gt;
*# Type - &amp;quot;course&amp;quot; (later there might other types such as activities or SCORM packages etc)&lt;br /&gt;
* Audience:  Educators | Students | Admins&lt;br /&gt;
* Educational level being discussed (for educators audience only):  Tertiary | Secondary | Primary | Government | Corporate&lt;br /&gt;
* Is a course map supplied?   (Simple XML description of course structure, could be rendered graphically later [http://kn.open.ac.uk/public/workspace.cfm?wpid=8690 CompendiumLD] )&lt;br /&gt;
&lt;br /&gt;
* Availability (public/private)&lt;br /&gt;
* Download URL (usually a local cached zip but could be anything else, including empty for non-downloadable)&lt;br /&gt;
* Original Download URL (usually a download script on the original Moodle site, used by Hub to get cache)&lt;br /&gt;
* Is the course trusted?  (all downloadable courses from non-trusted sites start as &amp;quot;no&amp;quot;, then this gets changed by someone who checks it)&lt;br /&gt;
* Is the course enrollable anyone with an account?&lt;br /&gt;
* Is guest access allowed?&lt;br /&gt;
* Are screenshots supplied?   (stored on disk under id of this record)&lt;br /&gt;
* Enrol Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
* Download Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
&lt;br /&gt;
==== Course feedback ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id&lt;br /&gt;
* type (bug / comment)&lt;br /&gt;
* text &lt;br /&gt;
* rating&lt;br /&gt;
&lt;br /&gt;
==== Course content ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id &lt;br /&gt;
* module type (activity / block)&lt;br /&gt;
* module name (forum, resource etc)&lt;br /&gt;
* count&lt;br /&gt;
&lt;br /&gt;
==== Course outcomes ====&lt;br /&gt;
&lt;br /&gt;
* id&lt;br /&gt;
* course id &lt;br /&gt;
* outcome  (text)&lt;br /&gt;
&lt;br /&gt;
=== Web user interface ===&lt;br /&gt;
&lt;br /&gt;
If visiting the hub via the web, it will provide an interface for full searching and browsing.  &lt;br /&gt;
&lt;br /&gt;
The web interface can be protected from access.  The hub at moodle.org will of course be open to all.&lt;br /&gt;
&lt;br /&gt;
Here is a very rough mockup of how it could look:&lt;br /&gt;
&lt;br /&gt;
[[Image:Webinterface.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Search_hub_moodle.png]]&lt;br /&gt;
&lt;br /&gt;
The web interface allows users to:&lt;br /&gt;
&lt;br /&gt;
* search by keyword (descriptions, titles, tags, subject etc)&lt;br /&gt;
* browse a list of courses by subject&lt;br /&gt;
* go directly to a course (if marked for public use)&lt;br /&gt;
* preview a course (if screenshots have been provided, or the original URL location)&lt;br /&gt;
* download the course to desktop (only if an download url has been set)&lt;br /&gt;
* If logged in to the Hub, users can also:&lt;br /&gt;
** give a rating to the course&lt;br /&gt;
** write a comment for the course - &amp;lt;span style=color:blue&amp;gt;use comment 2.0 API&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When displaying courses, you can see and sort by:&lt;br /&gt;
&lt;br /&gt;
* Title - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Description&lt;br /&gt;
* Tags  - &#039;&#039;Sortable &amp;lt;span style=color:blue&amp;gt;(first tag retrieved by the request is considered)&amp;lt;/span&amp;gt;&#039;&#039;&lt;br /&gt;
* Screenshot(s)&lt;br /&gt;
* Cost (if any) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Rating (10-point scale displayed as 5 stars, and only if you are logged in to moodle.org) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Comments &lt;br /&gt;
* Moodle site name&lt;br /&gt;
* Date added to directory&lt;br /&gt;
* Date last updated in directory &lt;br /&gt;
* Date last checked (by a cron job)&lt;br /&gt;
* Audience (teachers, students, admins)&lt;br /&gt;
* Teacher name(s) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Web service user interface ===&lt;br /&gt;
&lt;br /&gt;
A REST-based web services interface will be provided for other systems (eg Moodle sites) to use directly.&lt;br /&gt;
&lt;br /&gt;
Web services can search on:&lt;br /&gt;
* string search&lt;br /&gt;
* array language&lt;br /&gt;
* array cost&lt;br /&gt;
* array Moodle url&lt;br /&gt;
* Others?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hub admin interface ===&lt;br /&gt;
&lt;br /&gt;
The hub will have a Hub admin interface (at http://hubsite.org/hub) where the hub is managed.  Admin processes include:&lt;br /&gt;
&lt;br /&gt;
* Listing, approving and editing the sites registered with the hub &lt;br /&gt;
* Listing, approving and editing the course descriptions, metadata etc.&lt;br /&gt;
* Registering/updating the Hub with the Hub List&lt;br /&gt;
* Configuring Hub behaviour and the appearance of the home page.&lt;br /&gt;
&lt;br /&gt;
== Site registration ==&lt;br /&gt;
&lt;br /&gt;
The existing site registration form in Moodle will be extended so that admins can:&lt;br /&gt;
&lt;br /&gt;
# choose one or more Hubs to register with (hub.moodle.org and/or others in the Hub List, or directly to a particular Hub specified by URL)&lt;br /&gt;
# choose to enable cron to re-send statistics to the hub on a periodic basis.&lt;br /&gt;
# choose to enable the hub to harvest courses on a periodic basis (TODO: not shown on image)&lt;br /&gt;
&lt;br /&gt;
Each Moodle.org Hub will perform a check every week to verify that each site is accessible and optionally to harvest the courses from that site.  Sites that fail two or three checks in a row will be disable in the Hub listing.&lt;br /&gt;
&lt;br /&gt;
[[Image:SiteRegistration.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Community membership ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Community&amp;quot; block allows people to find and subscribe to external courses that they want to be part of.&lt;br /&gt;
&lt;br /&gt;
Visibility of the block and the features within it are controlled by roles, and contains:&lt;br /&gt;
&lt;br /&gt;
# &#039;Bookmarks&#039; of previously-selected (subscribed) external courses (to make revisiting easy) grouped by site, which can be edited/deleted etc&lt;br /&gt;
# A link to a search script - &amp;quot;Add new courses...&amp;quot;&lt;br /&gt;
# A search script to browse/search one or more Hubs (via web services to get the data, with the interface rendered by the local script).  Users can select joinable courses from the list and they&#039;ll get added to the list in the block.&lt;br /&gt;
&lt;br /&gt;
Generally the links will be just be an ordinary URL and the remote site will be responsible for authentication.&lt;br /&gt;
&lt;br /&gt;
If the foreign site has an Mnet connection set up with the current site then login will be immediate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Addacourse.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Import/Export courses ==&lt;br /&gt;
&lt;br /&gt;
The Import/Export block will be available on course pages and contains buttons to:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Publish course&#039;&#039;&#039;: to publish or update the description of the current course in one or more Hubs (admins only)&lt;br /&gt;
* &#039;&#039;&#039;Export course&#039;&#039;&#039;: publish/upload entire course (as Moodle Backup minus userdata) somewhere (eg a Hub) (via Portfolio API plugins)&lt;br /&gt;
* &#039;&#039;&#039;Import course&#039;&#039;&#039;: find/download/install a course template from a Hub or from another course on same site  (Repository API plugins)&lt;br /&gt;
&lt;br /&gt;
=== Publish course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Publish&#039;&#039;&#039; button only exists if the current user has the appropriate capabilities and if the current Moodle site has been registered with a Hub.&lt;br /&gt;
&lt;br /&gt;
[[Image:Coursepublishing.png|900px]]&lt;br /&gt;
&lt;br /&gt;
Choosing &amp;quot;Publish&amp;quot; goes to a script where you can chose from the registered Hubs and whether you want to publish the course as:&lt;br /&gt;
* enrollable, so that others can come here and use the course where it is, and/or &lt;br /&gt;
* downloadable, so that a Hub can offer this course for download to others&lt;br /&gt;
&lt;br /&gt;
If the user wants to offer this course for download, then they are directed to the standard backup process to create and define the backup file (without users!).  If the backup is successful the zip is stored in a standard place and then the user is returned to the publish script to continue.  (If downloads are not required then this whole step is skipped).&lt;br /&gt;
&lt;br /&gt;
It allows the user to set up full , and especially whether you want to advertise this course as being:&lt;br /&gt;
&lt;br /&gt;
Now the script presents a form with metadata that this course will be published with on the chosen Hub(s) (this is also available in the course settings page).  Metadata includes information such as description, licensing, categories, screenshots etc (see the [[#Courses|Courses]] section above for more info).&lt;br /&gt;
&lt;br /&gt;
After checking/updating the metadata, the script will push the data to the selected Hub.  The Hub will bounce back a confirmation which gets saved locally as the &amp;quot;Last publish date&amp;quot; for that course.&lt;br /&gt;
&lt;br /&gt;
If the checkbox to allow download was selected, then the URL to a course download script in the current Moodle is included with the metadata.  This URL contains a token (eg an MD5 stored in the course table) that only the Hub knows.&lt;br /&gt;
&lt;br /&gt;
The course download script (eg /course/download.php?id=55&amp;amp;secret=XXXXX) will send the cached .zip file for the given course.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Publish course settings ====&lt;br /&gt;
&lt;br /&gt;
Some publish settings and info will also be available anytime via the course settings page under a &amp;quot;Publish&amp;quot; tab:&lt;br /&gt;
&lt;br /&gt;
* Which hubs has this course been published on, and when&lt;br /&gt;
* Full metadata&lt;br /&gt;
* Screenshots&lt;br /&gt;
&lt;br /&gt;
=== Export course ===&lt;br /&gt;
&lt;br /&gt;
A standard export will do a normal backup (taking care to remove userdata by default), and at the end will call the portfolio API to push that file to a connected portfolio.  Portfolio (export) plugins could include:&lt;br /&gt;
&lt;br /&gt;
* downloading it to the local computer&lt;br /&gt;
* uploading it as a zip to any general purpose repository&lt;br /&gt;
* copy the course to another Moodle site set up with Mnet peering.&lt;br /&gt;
&lt;br /&gt;
Pushing it to another Moodle site would trigger extra behaviours:&lt;br /&gt;
&lt;br /&gt;
* Permissions would be checked on the destination Moodle&lt;br /&gt;
* The course can be immediately restored on the external Moodle in a special &amp;quot;New&amp;quot; category as a hidden course&lt;br /&gt;
* Someone on the external Moodle can be alerted to approve/unhide the new course&lt;br /&gt;
&lt;br /&gt;
=== Import course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Import course&#039;&#039;&#039; button will pull up a normal file picker to browse repositories for files with a mimetype matching .mbkup.zip.&lt;br /&gt;
&lt;br /&gt;
One special repository plugin called &amp;quot;Courses&amp;quot; allows the user to:&lt;br /&gt;
&lt;br /&gt;
* find Hubs by downloading the Hub List&lt;br /&gt;
* search particular Hubs for downloadable courses (only)&lt;br /&gt;
* search other courses on the same server (replacing the existing import function we have)&lt;br /&gt;
&lt;br /&gt;
Once the user has selected one of these courses and passed any challenge there might be (eg the Hub could potentially require a password or payment or a license agreement form), then the zip file is downloaded to the local Moodle, and then the user is passed to the standard restore process.&lt;br /&gt;
&lt;br /&gt;
[[Image:FilePicker_all_JS.png|900px]]&lt;br /&gt;
[[Image:FilePicker_JS_course_selector.png|900px]]&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Full schedule and progress is in the tracker: MDL-19309&lt;br /&gt;
&lt;br /&gt;
# Moodle.org Hub List&lt;br /&gt;
# Hub registration form&lt;br /&gt;
# Hub Web interface&lt;br /&gt;
# Hub web service interface &lt;br /&gt;
# Improve Site registration form&lt;br /&gt;
# Community block&lt;br /&gt;
# Publish courses&lt;br /&gt;
# Import courses &lt;br /&gt;
# Export courses&lt;br /&gt;
# Harvest courses&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Community hub technotes]] - relating to MNet developments in Moodle 1.8&lt;br /&gt;
* MDL-18580 - Community Hub tracker issue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MNET]]&lt;br /&gt;
&lt;br /&gt;
[[ja:開発:コミュニティハブ]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59407</id>
		<title>Development:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59407"/>
		<updated>2009-07-06T14:47:55Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Site registration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PROJECT STATE: Proposal&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAIN TRACKER ISSUE&#039;&#039;&#039;: MDL-19309&lt;br /&gt;
* &#039;&#039;&#039;DISCUSSION AND COMMENTS&#039;&#039;&#039;: [http://moodle.org/mod/forum/view.php?id=7330 Hub servers] forum in Using Moodle&lt;br /&gt;
* &#039;&#039;&#039;MAIN AUTHORS&#039;&#039;&#039;: [[User:Martin_Dougiamas|Martin Dougiamas]] and [[User:jerome_mouneyrac|Jerome Mouneyrac]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page describes an overall functional specification for the &amp;quot;Moodle Community Hub&amp;quot; project, which consists of a new system (the Moodle Hub Server) and several new features in Moodle 2.0. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Goals and rationale =&lt;br /&gt;
&lt;br /&gt;
The main goals of the Community hub project are:&lt;br /&gt;
&lt;br /&gt;
# to allow people to easily find courses around the world that they want to enrol in:&lt;br /&gt;
#* educators want to find &#039;&#039;&#039;communities of practice&#039;&#039;&#039; that are subject or region-oriented, so that they can associate with their peers on a long-term basis.&lt;br /&gt;
#* other learners want to find and study courses on various other subjects&lt;br /&gt;
# to make it easy for educators to find and download &#039;&#039;&#039;course templates&#039;&#039;&#039; from other people.  This will help educators share and identify examples of &#039;&#039;&#039;best practice&#039;&#039;&#039; in online pedagogy and hopefully improve the average quality of online courses.&lt;br /&gt;
&lt;br /&gt;
Finally, we want to do all this in the simplest, safest way possible, while allowing a range of scenarios such as courses that are public or private, free or paid, so that the Moodle community can build solutions for themselves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the basic idea.  The systems in this diagram are:&lt;br /&gt;
&lt;br /&gt;
;Ordinary Moodle site: A typical Moodle site with teachers who want to download course templates and/or users who want to connect (enrol) with external communities &lt;br /&gt;
;Publishing site: A Moodle site that wants to make some of its courses available for download&lt;br /&gt;
;Community site: A Moodle site that provides courses that are enrollable&lt;br /&gt;
;Moodle Hub Server: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;.  The default hub will be installed at hub.moodle.org, but there can be many others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Community.png]]&lt;br /&gt;
&lt;br /&gt;
Downloadable courses&lt;br /&gt;
* (A) Sites that want to publish certain courses and make them downloadable can register them with one or more Hub Servers.&lt;br /&gt;
* (B) The Hub will check the data and make sure the course zip is downloadable, caching a copy locally.  The Hub may also have a security process to check the download for trojan horses, bad content, etc (automatic and/or manual).&lt;br /&gt;
* (C) The download process may trigger the backup process on the original server if it hasn&#039;t been done already.&lt;br /&gt;
* (D) Later, Moodle users (who have permissions to do so) can connect to a Hub (via the Repository file picker) to search for downloadable courses and choose one (receiving a download URL).&lt;br /&gt;
* (E) The repository API downloads the file and makes it available to the Moodle user so they can now continue to restore it normally.&lt;br /&gt;
&lt;br /&gt;
Enrollable courses&lt;br /&gt;
* (1) Sites that want to publish certain courses for the public to enrol in can register them with one or more CDS (including the main one at moodle.org)&lt;br /&gt;
* (2) Later, any Moodle user can connect to a CDS (via Community block in their site) to search and find courses they want to join&lt;br /&gt;
* (3) They click on a link to be sent to the other site so that they can enrol there (with or without Mnet).&lt;br /&gt;
&lt;br /&gt;
= Use Cases =&lt;br /&gt;
&lt;br /&gt;
== New teacher creating a course ==&lt;br /&gt;
&lt;br /&gt;
# New teacher needs some help with a new course for &amp;quot;Alligator farming 101&amp;quot;&lt;br /&gt;
# Teacher sees the &amp;quot;Import/Export&amp;quot; block into the &amp;quot;Alligator farming 101&amp;quot; course page and presses &amp;quot;Import course&amp;quot;&lt;br /&gt;
# Teacher browses a list of downloadable courses in the File picker (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches for &amp;quot;Alligator&amp;quot; &lt;br /&gt;
# Teacher finds 4 courses that look good, and after reading reviews and ratings, chooses one.&lt;br /&gt;
# The course is downloaded and unpacked in Moodle.&lt;br /&gt;
# The teacher now has a good starter course they can keep developing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New teacher needs help ==&lt;br /&gt;
&lt;br /&gt;
A teacher decides they need some help and wants to talk with others teaching Alligator farming.&lt;br /&gt;
&lt;br /&gt;
# Teacher goes to their &amp;quot;Community&amp;quot; block and clicks &amp;quot;Find community&amp;quot;.&lt;br /&gt;
# Moodle displays a page to search for courses (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches courses for &amp;quot;educator&amp;quot; courses on &amp;quot;Alligators&amp;quot; in their country/language.&lt;br /&gt;
# Teacher finds two, selects one, and is returned to the page where is was before clicking on &amp;quot;Find community&amp;quot;.  The selected course is now permanently listed in the Community block.&lt;br /&gt;
# Teacher clicks on the link and is taken to the course, where they can enrol and interact/learn with peers over time, subscribe to forums etc.&lt;br /&gt;
&lt;br /&gt;
== University consortium ==&lt;br /&gt;
&lt;br /&gt;
A group of five universites wants to share courses among themselves and not to the outside world.  They also want to prevent teachers from downloading courses from outside the consortium.&lt;br /&gt;
&lt;br /&gt;
# Someone downloads Moodle and installs it as a private Moodle Hub Server&lt;br /&gt;
# Admins of all five Moodle sites in the group add the URL of the private Hub to their settings and register their sites there&lt;br /&gt;
# The default Hub at hub.moodle.org is (optionally) disabled in the site-wide settings.&lt;br /&gt;
# Admins register their courses with the Hub.&lt;br /&gt;
# Teachers can now import, export or join courses via the private Hub.&lt;br /&gt;
&lt;br /&gt;
== Course creation business ==&lt;br /&gt;
&lt;br /&gt;
CoolCourses Inc have produced a set of 50 good Moodle courses which they wish to sell.&lt;br /&gt;
&lt;br /&gt;
# They set up a Moodle site with all their courses in them.&lt;br /&gt;
# They set up a Hub with a payment system, and register it with the Hub List at moodle.org so people can find it&lt;br /&gt;
# They register all their courses with their own Hub with appropriate metadata&lt;br /&gt;
# When looking for courses, users can either &lt;br /&gt;
#* find this Hub by browsing through the Hub List, or &lt;br /&gt;
#* type the URL of the Hub directly into their Moodle site&lt;br /&gt;
# When users try to download a course, they may see a payment button to download it (credit card, paypal etc)&lt;br /&gt;
# CoolCourses could provide limited access to the courses on their Moodle site using Roles, as a preview.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Components =&lt;br /&gt;
&lt;br /&gt;
There are several components:&lt;br /&gt;
&lt;br /&gt;
;&#039;&#039;&#039;Hub List&#039;&#039;&#039;: A list of known Hub Servers, kept on moodle.org &lt;br /&gt;
;&#039;&#039;&#039;Hub Server&#039;&#039;&#039;: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;&lt;br /&gt;
;&#039;&#039;&#039;Course registration&#039;&#039;&#039;: A new mechanism in every Moodle to register particular courses with one or more Hub Servers&lt;br /&gt;
;&#039;&#039;&#039;Community membership block&#039;&#039;&#039;: to search Hub Servers to find enrollable courses to join and bookmark&lt;br /&gt;
;&#039;&#039;&#039;Import/Export block&#039;&#039;&#039;: Makes it easy to find downloadable course templates in a Hub Server, then download them from the Hub Server and restore them locally&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub List==&lt;br /&gt;
&lt;br /&gt;
The Hub List is a list of known Hub Servers (see the next section).  This makes it easy for Moodle users to find the most appropriate Hub Servers for their needs.  To get on the Hub List, Hub Servers choose to register with moodle.org via their administration interface.&lt;br /&gt;
&lt;br /&gt;
Moodle.org will store the following information, and make it available via a browseable interface at [http://moodle.org/hubs http://moodle.org/hubs] as well as a simple XML format from [http://moodle.org/hubs/list.xml http://moodle.org/hubs/list.xml] suitable for consumption by Moodle sites.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|int&lt;br /&gt;
|Standard autoincrement&lt;br /&gt;
|-&lt;br /&gt;
|hubname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the Hub&lt;br /&gt;
|-&lt;br /&gt;
|hubdescription&lt;br /&gt;
|text&lt;br /&gt;
|Description of the hub, from the admin there&lt;br /&gt;
|-&lt;br /&gt;
|huburl&lt;br /&gt;
|varchar&lt;br /&gt;
|The full URL to the hub front page&lt;br /&gt;
|-&lt;br /&gt;
|hubsecret&lt;br /&gt;
|varchar&lt;br /&gt;
|The secret code from the hub (extra authentication)&lt;br /&gt;
|-&lt;br /&gt;
|trusted&lt;br /&gt;
|int&lt;br /&gt;
|Is the hub trusted?  Does it have good quality control?&lt;br /&gt;
|-&lt;br /&gt;
|language&lt;br /&gt;
|varchar&lt;br /&gt;
|What is the primary language of this hub?  (blank for multilanguage)&lt;br /&gt;
|-&lt;br /&gt;
|sites&lt;br /&gt;
|int&lt;br /&gt;
|Number of sites  registered on this hub&lt;br /&gt;
|-&lt;br /&gt;
|courses&lt;br /&gt;
|int&lt;br /&gt;
|Number of courses registered on this hub &lt;br /&gt;
|-&lt;br /&gt;
|timefirst&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was first registered&lt;br /&gt;
|-&lt;br /&gt;
|timelast&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was last registered/updated&lt;br /&gt;
|-&lt;br /&gt;
|contactname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|contactemail&lt;br /&gt;
|varchar&lt;br /&gt;
|Email of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|varchar&lt;br /&gt;
|hub logo url&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Registerhub.png]]&lt;br /&gt;
&lt;br /&gt;
following a hub list table on Moodle.org:&lt;br /&gt;
[[Image:Hublist.png]]&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub Server==&lt;br /&gt;
&lt;br /&gt;
The Moodle Hub Server (aka Hub) is a separate system (based on Moodle technology) that allows Moodle sites to register their courses for listing there.&lt;br /&gt;
&lt;br /&gt;
A default installation of this software will be running at &#039;&#039;&#039;hub.moodle.org&#039;&#039;&#039;, but anyone else can download it and set up their own hub for private or public uses.   A default installation of Moodle can also be a Hub, or if the admin chooses, a site can be a dedicated Hub if they choose that option during install (in this case the front page of the site will be a dedicated site search for the public).&lt;br /&gt;
&lt;br /&gt;
Hubs can optionally register themselves in the Hub List so that they are easier to find and so they can become a &amp;quot;Trusted Hub&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A hub server has some config fields (saved into its database):&lt;br /&gt;
* name&lt;br /&gt;
* description&lt;br /&gt;
* language&lt;br /&gt;
* contact name&lt;br /&gt;
* contact email&lt;br /&gt;
* enable&lt;br /&gt;
* hub secret (generated the first time the hub is registered on Moodle.org, it will never change)&lt;br /&gt;
* logo url &lt;br /&gt;
* protected web search interface &#039;&#039;&#039;(TODO: the protection method needs to be defined)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data structure ===&lt;br /&gt;
&lt;br /&gt;
==== Sites ====&lt;br /&gt;
&lt;br /&gt;
Primarily this table will store information about the sites that have registered course information on that Hub.  On hub.moodle.org this information will also be used for [http://moodle.org/stats general statistics] and the listing of [http://moodle.org/sites registered sites].&lt;br /&gt;
&lt;br /&gt;
* Id&lt;br /&gt;
* Site name &lt;br /&gt;
* Site description&lt;br /&gt;
* URL&lt;br /&gt;
* Address&lt;br /&gt;
*# Country code (AU, FR etc) [http://cvs.moodle.org/moodle/lang/en_utf8/countries.php?view=markup lang/XX_utf8/countries.php]&lt;br /&gt;
*# Region/state (based on list) [http://www.commondatahub.com/live/geography/state_province_region/iso_3166_2_state_codes ISO 3166-2 (XX-XXX)]&lt;br /&gt;
*# Street address &lt;br /&gt;
*# Geolocation (for mapping)&lt;br /&gt;
* Site manager&lt;br /&gt;
*# Name&lt;br /&gt;
*# Email&lt;br /&gt;
*# Phone&lt;br /&gt;
* Contact form yes/no?&lt;br /&gt;
* Default site language&lt;br /&gt;
* Moodle version (eg 2009050502)&lt;br /&gt;
* Moodle release (eg 1.9.5+)&lt;br /&gt;
* Site ip address (updated at every update)&lt;br /&gt;
* Unique SiteID code generated by Moodle site&lt;br /&gt;
* Confirmed by admin&lt;br /&gt;
* Site is &amp;quot;trusted&amp;quot; - this means we don&#039;t manually check data in future from this site.&lt;br /&gt;
* Mnet/WS information, enough to let a teacher authenticate to the site using Mnet 2.0 (optional)&lt;br /&gt;
* Harvesting url&lt;br /&gt;
* Time updated&lt;br /&gt;
* Time created&lt;br /&gt;
* Currently unreachable&lt;br /&gt;
* Time link was last checked&lt;br /&gt;
&lt;br /&gt;
Extra information that will only be kept on hub.moodle.org (only published in aggregate form):&lt;br /&gt;
&lt;br /&gt;
* Tool usage stats &lt;br /&gt;
** number of courses&lt;br /&gt;
** number of users&lt;br /&gt;
** number of enrolments&lt;br /&gt;
** number of posts&lt;br /&gt;
** number of resources&lt;br /&gt;
** number of questions&lt;br /&gt;
** median course size&lt;br /&gt;
* Subscribed to securityalerts@lists.moodle.org&lt;br /&gt;
&lt;br /&gt;
==== Courses ====&lt;br /&gt;
&lt;br /&gt;
This table stores registered courses, one record per course.  Some courses will be &amp;quot;downloadable&amp;quot;, some will be enrollable, so different fields can be used.&lt;br /&gt;
&lt;br /&gt;
* Course ID&lt;br /&gt;
* Site ID (foreign key to sites table)&lt;br /&gt;
* Dublin Core Metadata Element Set, Version 1.1&lt;br /&gt;
*# Contributor - course manager names or whoever the publisher nominates&lt;br /&gt;
*# Coverage - User tags&lt;br /&gt;
*# Creator - main teacher name or copyright holder or whoever the publisher nominates&lt;br /&gt;
*# Date - date this was last published/updated&lt;br /&gt;
*# Description - course description&lt;br /&gt;
*# Format - zip / url&lt;br /&gt;
*# Identifier - course shortname (unique on the original site)&lt;br /&gt;
*# Language - based on lang.php&lt;br /&gt;
*# Publisher - the name of the person who caused this record to be entered here&lt;br /&gt;
*# Relation - the site id that it came from&lt;br /&gt;
*# Rights - one of a standard set of open source, creative commons and other licenses&lt;br /&gt;
*# Source - original URL of the course&lt;br /&gt;
*# Subject - The best-matching item from ([https://docs.moodle.org/en/Course_Standard_Tags  Course Standard Tags ])&lt;br /&gt;
*# Title - Course fullname&lt;br /&gt;
*# Type - &amp;quot;course&amp;quot; (later there might other types such as activities or SCORM packages etc)&lt;br /&gt;
* Audience:  Educators | Students | Admins&lt;br /&gt;
* Educational level being discussed (for educators audience only):  Tertiary | Secondary | Primary | Government | Corporate&lt;br /&gt;
* Is a course map supplied?   (Simple XML description of course structure, could be rendered graphically later [http://kn.open.ac.uk/public/workspace.cfm?wpid=8690 CompendiumLD] )&lt;br /&gt;
&lt;br /&gt;
* Availability (public/private)&lt;br /&gt;
* Download URL (usually a local cached zip but could be anything else, including empty for non-downloadable)&lt;br /&gt;
* Original Download URL (usually a download script on the original Moodle site, used by Hub to get cache)&lt;br /&gt;
* Is the course trusted?  (all downloadable courses from non-trusted sites start as &amp;quot;no&amp;quot;, then this gets changed by someone who checks it)&lt;br /&gt;
* Is the course enrollable anyone with an account?&lt;br /&gt;
* Is guest access allowed?&lt;br /&gt;
* Are screenshots supplied?   (stored on disk under id of this record)&lt;br /&gt;
* Enrol Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
* Download Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
&lt;br /&gt;
==== Course feedback ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id&lt;br /&gt;
* type (bug / comment)&lt;br /&gt;
* text &lt;br /&gt;
* rating&lt;br /&gt;
&lt;br /&gt;
==== Course content ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id &lt;br /&gt;
* module type (activity / block)&lt;br /&gt;
* module name (forum, resource etc)&lt;br /&gt;
* count&lt;br /&gt;
&lt;br /&gt;
==== Course outcomes ====&lt;br /&gt;
&lt;br /&gt;
* id&lt;br /&gt;
* course id &lt;br /&gt;
* outcome  (text)&lt;br /&gt;
&lt;br /&gt;
=== Web user interface ===&lt;br /&gt;
&lt;br /&gt;
If visiting the hub via the web, it will provide an interface for full searching and browsing.  &lt;br /&gt;
&lt;br /&gt;
The web interface can be protected from access.  The hub at moodle.org will of course be open to all.&lt;br /&gt;
&lt;br /&gt;
Here is a very rough mockup of how it could look:&lt;br /&gt;
&lt;br /&gt;
[[Image:Webinterface.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Search_hub_moodle.png]]&lt;br /&gt;
&lt;br /&gt;
The web interface allows users to:&lt;br /&gt;
&lt;br /&gt;
* search by keyword (descriptions, titles, tags, subject etc)&lt;br /&gt;
* browse a list of courses by subject&lt;br /&gt;
* go directly to a course (if marked for public use)&lt;br /&gt;
* preview a course (if screenshots have been provided, or the original URL location)&lt;br /&gt;
* download the course to desktop (only if an download url has been set)&lt;br /&gt;
* If logged in to the Hub, users can also:&lt;br /&gt;
** give a rating to the course&lt;br /&gt;
** write a comment for the course - &amp;lt;span style=color:blue&amp;gt;use comment 2.0 API&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When displaying courses, you can see and sort by:&lt;br /&gt;
&lt;br /&gt;
* Title - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Description&lt;br /&gt;
* Tags  - &#039;&#039;Sortable &amp;lt;span style=color:blue&amp;gt;(first tag retrieved by the request is considered)&amp;lt;/span&amp;gt;&#039;&#039;&lt;br /&gt;
* Screenshot(s)&lt;br /&gt;
* Cost (if any) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Rating (10-point scale displayed as 5 stars, and only if you are logged in to moodle.org) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Comments &lt;br /&gt;
* Moodle site name&lt;br /&gt;
* Date added to directory&lt;br /&gt;
* Date last updated in directory &lt;br /&gt;
* Date last checked (by a cron job)&lt;br /&gt;
* Audience (teachers, students, admins)&lt;br /&gt;
* Teacher name(s) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Web service user interface ===&lt;br /&gt;
&lt;br /&gt;
A REST-based web services interface will be provided for other systems (eg Moodle sites) to use directly.&lt;br /&gt;
&lt;br /&gt;
Web services can search on:&lt;br /&gt;
* string search&lt;br /&gt;
* array language&lt;br /&gt;
* array cost&lt;br /&gt;
* array Moodle url&lt;br /&gt;
* Others?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hub admin interface ===&lt;br /&gt;
&lt;br /&gt;
The hub will have a Hub admin interface (at http://hubsite.org/hub) where the hub is managed.  Admin processes include:&lt;br /&gt;
&lt;br /&gt;
* Listing, approving and editing the sites registered with the hub &lt;br /&gt;
* Listing, approving and editing the course descriptions, metadata etc.&lt;br /&gt;
* Registering/updating the Hub with the Hub List&lt;br /&gt;
* Configuring Hub behaviour and the appearance of the home page.&lt;br /&gt;
&lt;br /&gt;
== Site registration ==&lt;br /&gt;
&lt;br /&gt;
The existing site registration form in Moodle will be extended so that admins can:&lt;br /&gt;
&lt;br /&gt;
# choose one or more Hubs to register with (hub.moodle.org and/or others in the Hub List, or directly to a particular Hub specified by URL)&lt;br /&gt;
# choose to enable cron to re-send statistics to the hub on a periodic basis.&lt;br /&gt;
# choose to enable the hub to harvest courses on a periodic basis (TODO: not shown on image)&lt;br /&gt;
&lt;br /&gt;
Each Moodle.org Hub will perform a check every week to verify that each site is accessible and optionally to harvest the courses from that site.  Sites that fail two or three checks in a row will be disable in the Hub listing.&lt;br /&gt;
&lt;br /&gt;
[[Image:SiteRegistration.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Community membership ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Community&amp;quot; block allows people to find and subscribe to external courses that they want to be part of.&lt;br /&gt;
&lt;br /&gt;
Visibility of the block and the features within it are controlled by roles, and contains:&lt;br /&gt;
&lt;br /&gt;
# &#039;Bookmarks&#039; of previously-selected (subscribed) external courses (to make revisiting easy) grouped by site, which can be edited/deleted etc&lt;br /&gt;
# A link to a search script - &amp;quot;Add new courses...&amp;quot;&lt;br /&gt;
# A search script to browse/search one or more Hubs (via web services to get the data, with the interface rendered by the local script).  Users can select joinable courses from the list and they&#039;ll get added to the list in the block.&lt;br /&gt;
&lt;br /&gt;
Generally the links will be just be an ordinary URL and the remote site will be responsible for authentication.&lt;br /&gt;
&lt;br /&gt;
If the foreign site has an Mnet connection set up with the current site then login will be immediate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Addacourse.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Import/Export courses ==&lt;br /&gt;
&lt;br /&gt;
The Import/Export block will be available on course pages and contains buttons to:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Publish course&#039;&#039;&#039;: to publish or update the description of the current course in one or more Hubs (admins only)&lt;br /&gt;
* &#039;&#039;&#039;Export course&#039;&#039;&#039;: publish/upload entire course (as Moodle Backup minus userdata) somewhere (eg a Hub) (via Portfolio API plugins)&lt;br /&gt;
* &#039;&#039;&#039;Import course&#039;&#039;&#039;: find/download/install a course template from a Hub or from another course on same site  (Repository API plugins)&lt;br /&gt;
&lt;br /&gt;
=== Publish course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Publish&#039;&#039;&#039; button only exists if the current user has the appropriate capabilities and if the current Moodle site has been registered with a Hub.&lt;br /&gt;
&lt;br /&gt;
[[Image:Coursepublishing.png|900px]]&lt;br /&gt;
&lt;br /&gt;
Choosing &amp;quot;Publish&amp;quot; goes to a script where you can chose from the registered Hubs and whether you want to publish the course as:&lt;br /&gt;
* enrollable, so that others can come here and use the course where it is, and/or &lt;br /&gt;
* downloadable, so that a Hub can offer this course for download to others&lt;br /&gt;
&lt;br /&gt;
If the user wants to offer this course for download, then they are directed to the standard backup process to create and define the backup file (without users!).  If the backup is successful the zip is stored in a standard place and then the user is returned to the publish script to continue.  (If downloads are not required then this whole step is skipped).&lt;br /&gt;
&lt;br /&gt;
It allows the user to set up full , and especially whether you want to advertise this course as being:&lt;br /&gt;
&lt;br /&gt;
Now the script presents a form with metadata that this course will be published with on the chosen Hub(s) (this is also available in the course settings page).  Metadata includes information such as description, licensing, categories, screenshots etc (see the [[#Courses|Courses]] section above for more info).&lt;br /&gt;
&lt;br /&gt;
After checking/updating the metadata, the script will push the data to the selected Hub.  The Hub will bounce back a confirmation which gets saved locally as the &amp;quot;Last publish date&amp;quot; for that course.&lt;br /&gt;
&lt;br /&gt;
If the checkbox to allow download was selected, then the URL to a course download script in the current Moodle is included with the metadata.  This URL contains a token (eg an MD5 stored in the course table) that only the Hub knows.&lt;br /&gt;
&lt;br /&gt;
The course download script (eg /course/download.php?id=55&amp;amp;secret=XXXXX) will send the cached .zip file for the given course.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Publish course settings ====&lt;br /&gt;
&lt;br /&gt;
Some publish settings and info will also be available anytime via the course settings page under a &amp;quot;Publish&amp;quot; tab:&lt;br /&gt;
&lt;br /&gt;
* Which hubs has this course been published on, and when&lt;br /&gt;
* Full metadata&lt;br /&gt;
* Screenshots&lt;br /&gt;
&lt;br /&gt;
=== Export course ===&lt;br /&gt;
&lt;br /&gt;
A standard export will do a normal backup (taking care to remove userdata by default), and at the end will call the portfolio API to push that file to a connected portfolio.  Portfolio (export) plugins could include:&lt;br /&gt;
&lt;br /&gt;
* downloading it to the local computer&lt;br /&gt;
* uploading it as a zip to any general purpose repository&lt;br /&gt;
* copy the course to another Moodle site set up with Mnet peering.&lt;br /&gt;
&lt;br /&gt;
Pushing it to another Moodle site would trigger extra behaviours:&lt;br /&gt;
&lt;br /&gt;
* Permissions would be checked on the destination Moodle&lt;br /&gt;
* The course can be immediately restored on the external Moodle in a special &amp;quot;New&amp;quot; category as a hidden course&lt;br /&gt;
* Someone on the external Moodle can be alerted to approve/unhide the new course&lt;br /&gt;
&lt;br /&gt;
=== Import course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Import course&#039;&#039;&#039; button will pull up a normal file picker to browse repositories for files with a mimetype matching .mbkup.zip.&lt;br /&gt;
&lt;br /&gt;
One special repository plugin called &amp;quot;Courses&amp;quot; allows the user to:&lt;br /&gt;
&lt;br /&gt;
* find Hubs by downloading the Hub List&lt;br /&gt;
* search particular Hubs for downloadable courses (only)&lt;br /&gt;
* search other courses on the same server (replacing the existing import function we have)&lt;br /&gt;
&lt;br /&gt;
Once the user has selected one of these courses and passed any challenge there might be (eg the Hub could potentially require a password or payment or a license agreement form), then the zip file is downloaded to the local Moodle, and then the user is passed to the standard restore process.&lt;br /&gt;
&lt;br /&gt;
[[Image:FilePicker_all_JS.png|900px]]&lt;br /&gt;
[[Image:FilePicker_JS_course_selector.png|900px]]&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Full schedule and progress is in the tracker: MDL-19309&lt;br /&gt;
&lt;br /&gt;
# Moodle.org Hub List&lt;br /&gt;
# Hub registration form&lt;br /&gt;
# Hub Web interface&lt;br /&gt;
# Hub web service interface &lt;br /&gt;
# Improve Site registration form&lt;br /&gt;
# Community block&lt;br /&gt;
# Publish courses&lt;br /&gt;
# Import courses &lt;br /&gt;
# Export courses&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Community hub technotes]] - relating to MNet developments in Moodle 1.8&lt;br /&gt;
* MDL-18580 - Community Hub tracker issue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MNET]]&lt;br /&gt;
&lt;br /&gt;
[[ja:開発:コミュニティハブ]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59403</id>
		<title>Development:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Community_hub&amp;diff=59403"/>
		<updated>2009-07-06T14:46:22Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Sites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Work in progress}}{{Moodle 2.0}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PROJECT STATE: Proposal&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;MAIN TRACKER ISSUE&#039;&#039;&#039;: MDL-19309&lt;br /&gt;
* &#039;&#039;&#039;DISCUSSION AND COMMENTS&#039;&#039;&#039;: [http://moodle.org/mod/forum/view.php?id=7330 Hub servers] forum in Using Moodle&lt;br /&gt;
* &#039;&#039;&#039;MAIN AUTHORS&#039;&#039;&#039;: [[User:Martin_Dougiamas|Martin Dougiamas]] and [[User:jerome_mouneyrac|Jerome Mouneyrac]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page describes an overall functional specification for the &amp;quot;Moodle Community Hub&amp;quot; project, which consists of a new system (the Moodle Hub Server) and several new features in Moodle 2.0. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Goals and rationale =&lt;br /&gt;
&lt;br /&gt;
The main goals of the Community hub project are:&lt;br /&gt;
&lt;br /&gt;
# to allow people to easily find courses around the world that they want to enrol in:&lt;br /&gt;
#* educators want to find &#039;&#039;&#039;communities of practice&#039;&#039;&#039; that are subject or region-oriented, so that they can associate with their peers on a long-term basis.&lt;br /&gt;
#* other learners want to find and study courses on various other subjects&lt;br /&gt;
# to make it easy for educators to find and download &#039;&#039;&#039;course templates&#039;&#039;&#039; from other people.  This will help educators share and identify examples of &#039;&#039;&#039;best practice&#039;&#039;&#039; in online pedagogy and hopefully improve the average quality of online courses.&lt;br /&gt;
&lt;br /&gt;
Finally, we want to do all this in the simplest, safest way possible, while allowing a range of scenarios such as courses that are public or private, free or paid, so that the Moodle community can build solutions for themselves.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
&lt;br /&gt;
The diagram below shows the basic idea.  The systems in this diagram are:&lt;br /&gt;
&lt;br /&gt;
;Ordinary Moodle site: A typical Moodle site with teachers who want to download course templates and/or users who want to connect (enrol) with external communities &lt;br /&gt;
;Publishing site: A Moodle site that wants to make some of its courses available for download&lt;br /&gt;
;Community site: A Moodle site that provides courses that are enrollable&lt;br /&gt;
;Moodle Hub Server: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;.  The default hub will be installed at hub.moodle.org, but there can be many others.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Community.png]]&lt;br /&gt;
&lt;br /&gt;
Downloadable courses&lt;br /&gt;
* (A) Sites that want to publish certain courses and make them downloadable can register them with one or more Hub Servers.&lt;br /&gt;
* (B) The Hub will check the data and make sure the course zip is downloadable, caching a copy locally.  The Hub may also have a security process to check the download for trojan horses, bad content, etc (automatic and/or manual).&lt;br /&gt;
* (C) The download process may trigger the backup process on the original server if it hasn&#039;t been done already.&lt;br /&gt;
* (D) Later, Moodle users (who have permissions to do so) can connect to a Hub (via the Repository file picker) to search for downloadable courses and choose one (receiving a download URL).&lt;br /&gt;
* (E) The repository API downloads the file and makes it available to the Moodle user so they can now continue to restore it normally.&lt;br /&gt;
&lt;br /&gt;
Enrollable courses&lt;br /&gt;
* (1) Sites that want to publish certain courses for the public to enrol in can register them with one or more CDS (including the main one at moodle.org)&lt;br /&gt;
* (2) Later, any Moodle user can connect to a CDS (via Community block in their site) to search and find courses they want to join&lt;br /&gt;
* (3) They click on a link to be sent to the other site so that they can enrol there (with or without Mnet).&lt;br /&gt;
&lt;br /&gt;
= Use Cases =&lt;br /&gt;
&lt;br /&gt;
== New teacher creating a course ==&lt;br /&gt;
&lt;br /&gt;
# New teacher needs some help with a new course for &amp;quot;Alligator farming 101&amp;quot;&lt;br /&gt;
# Teacher sees the &amp;quot;Import/Export&amp;quot; block into the &amp;quot;Alligator farming 101&amp;quot; course page and presses &amp;quot;Import course&amp;quot;&lt;br /&gt;
# Teacher browses a list of downloadable courses in the File picker (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches for &amp;quot;Alligator&amp;quot; &lt;br /&gt;
# Teacher finds 4 courses that look good, and after reading reviews and ratings, chooses one.&lt;br /&gt;
# The course is downloaded and unpacked in Moodle.&lt;br /&gt;
# The teacher now has a good starter course they can keep developing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== New teacher needs help ==&lt;br /&gt;
&lt;br /&gt;
A teacher decides they need some help and wants to talk with others teaching Alligator farming.&lt;br /&gt;
&lt;br /&gt;
# Teacher goes to their &amp;quot;Community&amp;quot; block and clicks &amp;quot;Find community&amp;quot;.&lt;br /&gt;
# Moodle displays a page to search for courses (the data comes from one or more Hubs via web services)&lt;br /&gt;
# Teacher searches courses for &amp;quot;educator&amp;quot; courses on &amp;quot;Alligators&amp;quot; in their country/language.&lt;br /&gt;
# Teacher finds two, selects one, and is returned to the page where is was before clicking on &amp;quot;Find community&amp;quot;.  The selected course is now permanently listed in the Community block.&lt;br /&gt;
# Teacher clicks on the link and is taken to the course, where they can enrol and interact/learn with peers over time, subscribe to forums etc.&lt;br /&gt;
&lt;br /&gt;
== University consortium ==&lt;br /&gt;
&lt;br /&gt;
A group of five universites wants to share courses among themselves and not to the outside world.  They also want to prevent teachers from downloading courses from outside the consortium.&lt;br /&gt;
&lt;br /&gt;
# Someone downloads Moodle and installs it as a private Moodle Hub Server&lt;br /&gt;
# Admins of all five Moodle sites in the group add the URL of the private Hub to their settings and register their sites there&lt;br /&gt;
# The default Hub at hub.moodle.org is (optionally) disabled in the site-wide settings.&lt;br /&gt;
# Admins register their courses with the Hub.&lt;br /&gt;
# Teachers can now import, export or join courses via the private Hub.&lt;br /&gt;
&lt;br /&gt;
== Course creation business ==&lt;br /&gt;
&lt;br /&gt;
CoolCourses Inc have produced a set of 50 good Moodle courses which they wish to sell.&lt;br /&gt;
&lt;br /&gt;
# They set up a Moodle site with all their courses in them.&lt;br /&gt;
# They set up a Hub with a payment system, and register it with the Hub List at moodle.org so people can find it&lt;br /&gt;
# They register all their courses with their own Hub with appropriate metadata&lt;br /&gt;
# When looking for courses, users can either &lt;br /&gt;
#* find this Hub by browsing through the Hub List, or &lt;br /&gt;
#* type the URL of the Hub directly into their Moodle site&lt;br /&gt;
# When users try to download a course, they may see a payment button to download it (credit card, paypal etc)&lt;br /&gt;
# CoolCourses could provide limited access to the courses on their Moodle site using Roles, as a preview.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Components =&lt;br /&gt;
&lt;br /&gt;
There are several components:&lt;br /&gt;
&lt;br /&gt;
;&#039;&#039;&#039;Hub List&#039;&#039;&#039;: A list of known Hub Servers, kept on moodle.org &lt;br /&gt;
;&#039;&#039;&#039;Hub Server&#039;&#039;&#039;: A new open source web application for publishing a list of registered courses that are &#039;&#039;&#039;downloadable&#039;&#039;&#039; or &#039;&#039;&#039;enrollable&#039;&#039;&#039;&lt;br /&gt;
;&#039;&#039;&#039;Course registration&#039;&#039;&#039;: A new mechanism in every Moodle to register particular courses with one or more Hub Servers&lt;br /&gt;
;&#039;&#039;&#039;Community membership block&#039;&#039;&#039;: to search Hub Servers to find enrollable courses to join and bookmark&lt;br /&gt;
;&#039;&#039;&#039;Import/Export block&#039;&#039;&#039;: Makes it easy to find downloadable course templates in a Hub Server, then download them from the Hub Server and restore them locally&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub List==&lt;br /&gt;
&lt;br /&gt;
The Hub List is a list of known Hub Servers (see the next section).  This makes it easy for Moodle users to find the most appropriate Hub Servers for their needs.  To get on the Hub List, Hub Servers choose to register with moodle.org via their administration interface.&lt;br /&gt;
&lt;br /&gt;
Moodle.org will store the following information, and make it available via a browseable interface at [http://moodle.org/hubs http://moodle.org/hubs] as well as a simple XML format from [http://moodle.org/hubs/list.xml http://moodle.org/hubs/list.xml] suitable for consumption by Moodle sites.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;nicetable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|int&lt;br /&gt;
|Standard autoincrement&lt;br /&gt;
|-&lt;br /&gt;
|hubname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the Hub&lt;br /&gt;
|-&lt;br /&gt;
|hubdescription&lt;br /&gt;
|text&lt;br /&gt;
|Description of the hub, from the admin there&lt;br /&gt;
|-&lt;br /&gt;
|huburl&lt;br /&gt;
|varchar&lt;br /&gt;
|The full URL to the hub front page&lt;br /&gt;
|-&lt;br /&gt;
|hubsecret&lt;br /&gt;
|varchar&lt;br /&gt;
|The secret code from the hub (extra authentication)&lt;br /&gt;
|-&lt;br /&gt;
|trusted&lt;br /&gt;
|int&lt;br /&gt;
|Is the hub trusted?  Does it have good quality control?&lt;br /&gt;
|-&lt;br /&gt;
|language&lt;br /&gt;
|varchar&lt;br /&gt;
|What is the primary language of this hub?  (blank for multilanguage)&lt;br /&gt;
|-&lt;br /&gt;
|sites&lt;br /&gt;
|int&lt;br /&gt;
|Number of sites  registered on this hub&lt;br /&gt;
|-&lt;br /&gt;
|courses&lt;br /&gt;
|int&lt;br /&gt;
|Number of courses registered on this hub &lt;br /&gt;
|-&lt;br /&gt;
|timefirst&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was first registered&lt;br /&gt;
|-&lt;br /&gt;
|timelast&lt;br /&gt;
|int&lt;br /&gt;
|Time that the hub was last registered/updated&lt;br /&gt;
|-&lt;br /&gt;
|contactname&lt;br /&gt;
|varchar&lt;br /&gt;
|Name of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|contactemail&lt;br /&gt;
|varchar&lt;br /&gt;
|Email of the contact person&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|varchar&lt;br /&gt;
|hub logo url&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Registerhub.png]]&lt;br /&gt;
&lt;br /&gt;
following a hub list table on Moodle.org:&lt;br /&gt;
[[Image:Hublist.png]]&lt;br /&gt;
&lt;br /&gt;
==Moodle Hub Server==&lt;br /&gt;
&lt;br /&gt;
The Moodle Hub Server (aka Hub) is a separate system (based on Moodle technology) that allows Moodle sites to register their courses for listing there.&lt;br /&gt;
&lt;br /&gt;
A default installation of this software will be running at &#039;&#039;&#039;hub.moodle.org&#039;&#039;&#039;, but anyone else can download it and set up their own hub for private or public uses.   A default installation of Moodle can also be a Hub, or if the admin chooses, a site can be a dedicated Hub if they choose that option during install (in this case the front page of the site will be a dedicated site search for the public).&lt;br /&gt;
&lt;br /&gt;
Hubs can optionally register themselves in the Hub List so that they are easier to find and so they can become a &amp;quot;Trusted Hub&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A hub server has some config fields (saved into its database):&lt;br /&gt;
* name&lt;br /&gt;
* description&lt;br /&gt;
* language&lt;br /&gt;
* contact name&lt;br /&gt;
* contact email&lt;br /&gt;
* enable&lt;br /&gt;
* hub secret (generated the first time the hub is registered on Moodle.org, it will never change)&lt;br /&gt;
* logo url &lt;br /&gt;
* protected web search interface &#039;&#039;&#039;(TODO: the protection method needs to be defined)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data structure ===&lt;br /&gt;
&lt;br /&gt;
==== Sites ====&lt;br /&gt;
&lt;br /&gt;
Primarily this table will store information about the sites that have registered course information on that Hub.  On hub.moodle.org this information will also be used for [http://moodle.org/stats general statistics] and the listing of [http://moodle.org/sites registered sites].&lt;br /&gt;
&lt;br /&gt;
* Id&lt;br /&gt;
* Site name &lt;br /&gt;
* Site description&lt;br /&gt;
* URL&lt;br /&gt;
* Address&lt;br /&gt;
*# Country code (AU, FR etc) [http://cvs.moodle.org/moodle/lang/en_utf8/countries.php?view=markup lang/XX_utf8/countries.php]&lt;br /&gt;
*# Region/state (based on list) [http://www.commondatahub.com/live/geography/state_province_region/iso_3166_2_state_codes ISO 3166-2 (XX-XXX)]&lt;br /&gt;
*# Street address &lt;br /&gt;
*# Geolocation (for mapping)&lt;br /&gt;
* Site manager&lt;br /&gt;
*# Name&lt;br /&gt;
*# Email&lt;br /&gt;
*# Phone&lt;br /&gt;
* Contact form yes/no?&lt;br /&gt;
* Default site language&lt;br /&gt;
* Moodle version (eg 2009050502)&lt;br /&gt;
* Moodle release (eg 1.9.5+)&lt;br /&gt;
* Site ip address (updated at every update)&lt;br /&gt;
* Unique SiteID code generated by Moodle site&lt;br /&gt;
* Confirmed by admin&lt;br /&gt;
* Site is &amp;quot;trusted&amp;quot; - this means we don&#039;t manually check data in future from this site.&lt;br /&gt;
* Mnet/WS information, enough to let a teacher authenticate to the site using Mnet 2.0 (optional)&lt;br /&gt;
* Harvesting url&lt;br /&gt;
* Time updated&lt;br /&gt;
* Time created&lt;br /&gt;
* Currently unreachable&lt;br /&gt;
* Time link was last checked&lt;br /&gt;
&lt;br /&gt;
Extra information that will only be kept on hub.moodle.org (only published in aggregate form):&lt;br /&gt;
&lt;br /&gt;
* Tool usage stats &lt;br /&gt;
** number of courses&lt;br /&gt;
** number of users&lt;br /&gt;
** number of enrolments&lt;br /&gt;
** number of posts&lt;br /&gt;
** number of resources&lt;br /&gt;
** number of questions&lt;br /&gt;
** median course size&lt;br /&gt;
* Subscribed to securityalerts@lists.moodle.org&lt;br /&gt;
&lt;br /&gt;
==== Courses ====&lt;br /&gt;
&lt;br /&gt;
This table stores registered courses, one record per course.  Some courses will be &amp;quot;downloadable&amp;quot;, some will be enrollable, so different fields can be used.&lt;br /&gt;
&lt;br /&gt;
* Course ID&lt;br /&gt;
* Site ID (foreign key to sites table)&lt;br /&gt;
* Dublin Core Metadata Element Set, Version 1.1&lt;br /&gt;
*# Contributor - course manager names or whoever the publisher nominates&lt;br /&gt;
*# Coverage - User tags&lt;br /&gt;
*# Creator - main teacher name or copyright holder or whoever the publisher nominates&lt;br /&gt;
*# Date - date this was last published/updated&lt;br /&gt;
*# Description - course description&lt;br /&gt;
*# Format - zip / url&lt;br /&gt;
*# Identifier - course shortname (unique on the original site)&lt;br /&gt;
*# Language - based on lang.php&lt;br /&gt;
*# Publisher - the name of the person who caused this record to be entered here&lt;br /&gt;
*# Relation - the site id that it came from&lt;br /&gt;
*# Rights - one of a standard set of open source, creative commons and other licenses&lt;br /&gt;
*# Source - original URL of the course&lt;br /&gt;
*# Subject - The best-matching item from ([https://docs.moodle.org/en/Course_Standard_Tags  Course Standard Tags ])&lt;br /&gt;
*# Title - Course fullname&lt;br /&gt;
*# Type - &amp;quot;course&amp;quot; (later there might other types such as activities or SCORM packages etc)&lt;br /&gt;
* Audience:  Educators | Students | Admins&lt;br /&gt;
* Educational level being discussed (for educators audience only):  Tertiary | Secondary | Primary | Government | Corporate&lt;br /&gt;
* Is a course map supplied?   (Simple XML description of course structure, could be rendered graphically later [http://kn.open.ac.uk/public/workspace.cfm?wpid=8690 CompendiumLD] )&lt;br /&gt;
&lt;br /&gt;
* Availability (public/private)&lt;br /&gt;
* Download URL (usually a local cached zip but could be anything else, including empty for non-downloadable)&lt;br /&gt;
* Original Download URL (usually a download script on the original Moodle site, used by Hub to get cache)&lt;br /&gt;
* Is the course trusted?  (all downloadable courses from non-trusted sites start as &amp;quot;no&amp;quot;, then this gets changed by someone who checks it)&lt;br /&gt;
* Is the course enrollable anyone with an account?&lt;br /&gt;
* Is guest access allowed?&lt;br /&gt;
* Are screenshots supplied?   (stored on disk under id of this record)&lt;br /&gt;
* Enrol Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
* Download Cost (and currency) [http://en.wikipedia.org/wiki/ISO_4217 ISO 4217]&lt;br /&gt;
&lt;br /&gt;
==== Course feedback ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id&lt;br /&gt;
* type (bug / comment)&lt;br /&gt;
* text &lt;br /&gt;
* rating&lt;br /&gt;
&lt;br /&gt;
==== Course content ====&lt;br /&gt;
&lt;br /&gt;
* id &lt;br /&gt;
* course id &lt;br /&gt;
* module type (activity / block)&lt;br /&gt;
* module name (forum, resource etc)&lt;br /&gt;
* count&lt;br /&gt;
&lt;br /&gt;
==== Course outcomes ====&lt;br /&gt;
&lt;br /&gt;
* id&lt;br /&gt;
* course id &lt;br /&gt;
* outcome  (text)&lt;br /&gt;
&lt;br /&gt;
=== Web user interface ===&lt;br /&gt;
&lt;br /&gt;
If visiting the hub via the web, it will provide an interface for full searching and browsing.  &lt;br /&gt;
&lt;br /&gt;
The web interface can be protected from access.  The hub at moodle.org will of course be open to all.&lt;br /&gt;
&lt;br /&gt;
Here is a very rough mockup of how it could look:&lt;br /&gt;
&lt;br /&gt;
[[Image:Webinterface.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Search_hub_moodle.png]]&lt;br /&gt;
&lt;br /&gt;
The web interface allows users to:&lt;br /&gt;
&lt;br /&gt;
* search by keyword (descriptions, titles, tags, subject etc)&lt;br /&gt;
* browse a list of courses by subject&lt;br /&gt;
* go directly to a course (if marked for public use)&lt;br /&gt;
* preview a course (if screenshots have been provided, or the original URL location)&lt;br /&gt;
* download the course to desktop (only if an download url has been set)&lt;br /&gt;
* If logged in to the Hub, users can also:&lt;br /&gt;
** give a rating to the course&lt;br /&gt;
** write a comment for the course - &amp;lt;span style=color:blue&amp;gt;use comment 2.0 API&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When displaying courses, you can see and sort by:&lt;br /&gt;
&lt;br /&gt;
* Title - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Description&lt;br /&gt;
* Tags  - &#039;&#039;Sortable &amp;lt;span style=color:blue&amp;gt;(first tag retrieved by the request is considered)&amp;lt;/span&amp;gt;&#039;&#039;&lt;br /&gt;
* Screenshot(s)&lt;br /&gt;
* Cost (if any) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Rating (10-point scale displayed as 5 stars, and only if you are logged in to moodle.org) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
* Comments &lt;br /&gt;
* Moodle site name&lt;br /&gt;
* Date added to directory&lt;br /&gt;
* Date last updated in directory &lt;br /&gt;
* Date last checked (by a cron job)&lt;br /&gt;
* Audience (teachers, students, admins)&lt;br /&gt;
* Teacher name(s) - &#039;&#039;Sortable&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Web service user interface ===&lt;br /&gt;
&lt;br /&gt;
A REST-based web services interface will be provided for other systems (eg Moodle sites) to use directly.&lt;br /&gt;
&lt;br /&gt;
Web services can search on:&lt;br /&gt;
* string search&lt;br /&gt;
* array language&lt;br /&gt;
* array cost&lt;br /&gt;
* array Moodle url&lt;br /&gt;
* Others?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Hub admin interface ===&lt;br /&gt;
&lt;br /&gt;
The hub will have a Hub admin interface (at http://hubsite.org/hub) where the hub is managed.  Admin processes include:&lt;br /&gt;
&lt;br /&gt;
* Listing, approving and editing the sites registered with the hub &lt;br /&gt;
* Listing, approving and editing the course descriptions, metadata etc.&lt;br /&gt;
* Registering/updating the Hub with the Hub List&lt;br /&gt;
* Configuring Hub behaviour and the appearance of the home page.&lt;br /&gt;
&lt;br /&gt;
== Site registration ==&lt;br /&gt;
&lt;br /&gt;
The existing site registration form in Moodle will be extended so that admins can:&lt;br /&gt;
&lt;br /&gt;
# choose one or more Hubs to register with (hub.moodle.org and/or others in the Hub List, or directly to a particular Hub specified by URL)&lt;br /&gt;
# choose to enable cron to re-send statistics to the hub on a periodic basis.&lt;br /&gt;
&lt;br /&gt;
Each Moodle.org Hub will perform a check every week to verify that each site is accessible.  Sites that fail two or three checks in a row will be disable in the Hub listing.&lt;br /&gt;
&lt;br /&gt;
[[Image:SiteRegistration.png|900px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Community membership ==&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Community&amp;quot; block allows people to find and subscribe to external courses that they want to be part of.&lt;br /&gt;
&lt;br /&gt;
Visibility of the block and the features within it are controlled by roles, and contains:&lt;br /&gt;
&lt;br /&gt;
# &#039;Bookmarks&#039; of previously-selected (subscribed) external courses (to make revisiting easy) grouped by site, which can be edited/deleted etc&lt;br /&gt;
# A link to a search script - &amp;quot;Add new courses...&amp;quot;&lt;br /&gt;
# A search script to browse/search one or more Hubs (via web services to get the data, with the interface rendered by the local script).  Users can select joinable courses from the list and they&#039;ll get added to the list in the block.&lt;br /&gt;
&lt;br /&gt;
Generally the links will be just be an ordinary URL and the remote site will be responsible for authentication.&lt;br /&gt;
&lt;br /&gt;
If the foreign site has an Mnet connection set up with the current site then login will be immediate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Addacourse.png|900px]]&lt;br /&gt;
&lt;br /&gt;
== Import/Export courses ==&lt;br /&gt;
&lt;br /&gt;
The Import/Export block will be available on course pages and contains buttons to:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Publish course&#039;&#039;&#039;: to publish or update the description of the current course in one or more Hubs (admins only)&lt;br /&gt;
* &#039;&#039;&#039;Export course&#039;&#039;&#039;: publish/upload entire course (as Moodle Backup minus userdata) somewhere (eg a Hub) (via Portfolio API plugins)&lt;br /&gt;
* &#039;&#039;&#039;Import course&#039;&#039;&#039;: find/download/install a course template from a Hub or from another course on same site  (Repository API plugins)&lt;br /&gt;
&lt;br /&gt;
=== Publish course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Publish&#039;&#039;&#039; button only exists if the current user has the appropriate capabilities and if the current Moodle site has been registered with a Hub.&lt;br /&gt;
&lt;br /&gt;
[[Image:Coursepublishing.png|900px]]&lt;br /&gt;
&lt;br /&gt;
Choosing &amp;quot;Publish&amp;quot; goes to a script where you can chose from the registered Hubs and whether you want to publish the course as:&lt;br /&gt;
* enrollable, so that others can come here and use the course where it is, and/or &lt;br /&gt;
* downloadable, so that a Hub can offer this course for download to others&lt;br /&gt;
&lt;br /&gt;
If the user wants to offer this course for download, then they are directed to the standard backup process to create and define the backup file (without users!).  If the backup is successful the zip is stored in a standard place and then the user is returned to the publish script to continue.  (If downloads are not required then this whole step is skipped).&lt;br /&gt;
&lt;br /&gt;
It allows the user to set up full , and especially whether you want to advertise this course as being:&lt;br /&gt;
&lt;br /&gt;
Now the script presents a form with metadata that this course will be published with on the chosen Hub(s) (this is also available in the course settings page).  Metadata includes information such as description, licensing, categories, screenshots etc (see the [[#Courses|Courses]] section above for more info).&lt;br /&gt;
&lt;br /&gt;
After checking/updating the metadata, the script will push the data to the selected Hub.  The Hub will bounce back a confirmation which gets saved locally as the &amp;quot;Last publish date&amp;quot; for that course.&lt;br /&gt;
&lt;br /&gt;
If the checkbox to allow download was selected, then the URL to a course download script in the current Moodle is included with the metadata.  This URL contains a token (eg an MD5 stored in the course table) that only the Hub knows.&lt;br /&gt;
&lt;br /&gt;
The course download script (eg /course/download.php?id=55&amp;amp;secret=XXXXX) will send the cached .zip file for the given course.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Publish course settings ====&lt;br /&gt;
&lt;br /&gt;
Some publish settings and info will also be available anytime via the course settings page under a &amp;quot;Publish&amp;quot; tab:&lt;br /&gt;
&lt;br /&gt;
* Which hubs has this course been published on, and when&lt;br /&gt;
* Full metadata&lt;br /&gt;
* Screenshots&lt;br /&gt;
&lt;br /&gt;
=== Export course ===&lt;br /&gt;
&lt;br /&gt;
A standard export will do a normal backup (taking care to remove userdata by default), and at the end will call the portfolio API to push that file to a connected portfolio.  Portfolio (export) plugins could include:&lt;br /&gt;
&lt;br /&gt;
* downloading it to the local computer&lt;br /&gt;
* uploading it as a zip to any general purpose repository&lt;br /&gt;
* copy the course to another Moodle site set up with Mnet peering.&lt;br /&gt;
&lt;br /&gt;
Pushing it to another Moodle site would trigger extra behaviours:&lt;br /&gt;
&lt;br /&gt;
* Permissions would be checked on the destination Moodle&lt;br /&gt;
* The course can be immediately restored on the external Moodle in a special &amp;quot;New&amp;quot; category as a hidden course&lt;br /&gt;
* Someone on the external Moodle can be alerted to approve/unhide the new course&lt;br /&gt;
&lt;br /&gt;
=== Import course ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Import course&#039;&#039;&#039; button will pull up a normal file picker to browse repositories for files with a mimetype matching .mbkup.zip.&lt;br /&gt;
&lt;br /&gt;
One special repository plugin called &amp;quot;Courses&amp;quot; allows the user to:&lt;br /&gt;
&lt;br /&gt;
* find Hubs by downloading the Hub List&lt;br /&gt;
* search particular Hubs for downloadable courses (only)&lt;br /&gt;
* search other courses on the same server (replacing the existing import function we have)&lt;br /&gt;
&lt;br /&gt;
Once the user has selected one of these courses and passed any challenge there might be (eg the Hub could potentially require a password or payment or a license agreement form), then the zip file is downloaded to the local Moodle, and then the user is passed to the standard restore process.&lt;br /&gt;
&lt;br /&gt;
[[Image:FilePicker_all_JS.png|900px]]&lt;br /&gt;
[[Image:FilePicker_JS_course_selector.png|900px]]&lt;br /&gt;
&lt;br /&gt;
= Schedule =&lt;br /&gt;
&lt;br /&gt;
Full schedule and progress is in the tracker: MDL-19309&lt;br /&gt;
&lt;br /&gt;
# Moodle.org Hub List&lt;br /&gt;
# Hub registration form&lt;br /&gt;
# Hub Web interface&lt;br /&gt;
# Hub web service interface &lt;br /&gt;
# Improve Site registration form&lt;br /&gt;
# Community block&lt;br /&gt;
# Publish courses&lt;br /&gt;
# Import courses &lt;br /&gt;
# Export courses&lt;br /&gt;
&lt;br /&gt;
= See also =&lt;br /&gt;
&lt;br /&gt;
* [[Community hub technotes]] - relating to MNet developments in Moodle 1.8&lt;br /&gt;
* MDL-18580 - Community Hub tracker issue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MNET]]&lt;br /&gt;
&lt;br /&gt;
[[ja:開発:コミュニティハブ]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development_talk:Community_hub&amp;diff=59149</id>
		<title>Development talk:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development_talk:Community_hub&amp;diff=59149"/>
		<updated>2009-06-30T14:48:11Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Harvesting courses regularly and a few other  comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Regarding the course import for teachers to start from...&lt;br /&gt;
I can envisage a situation whereby the original course author finds new information/ideas and adds stuff to the master course after the teacher has downloaded it, which in the current model would not make it to the teacher as the download is a one off process which they will not repeat. I would prefer a model whereby a course can act as a master template which gets updated regularly so that new questions, resources, activities etc appear dynamically as hidden items within the teacher&#039;s downloaded course, ready to be reviewed and revealed if needed. This would be like maintaining your Moodle install using CVS - you get updates all the time as they are created. &lt;br /&gt;
&lt;br /&gt;
It would also be good to be able to track how many people are using a particular course and to have some sort of meta-forum for discussing changes and developemts. Many teachers will end up using the successful/well designed courses, so it would make a lot of sense to have a way of pooling their shared experience and getting that feedback back to the original creator. -- [[User:Matt Gibson|Matt Gibson]] 18:51, 25 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Harvesting courses regularly and a few other  comments ==&lt;br /&gt;
&lt;br /&gt;
I&#039;ve put this in the forum, but I&#039;ll say it here as well.  If a site has a lot of courses to share with a hub, perhaps because they are an OpenCourseWare provider, they might prefer to supply an RSS or OAI list rather than click &amp;quot;publish&amp;quot; on each individual course.  OCW Consortium members are already encouraged to offer an RSS feed (with DC metadata) of all their courses that is picked up by a number of OCW search tools.  I&#039;m sure Moodle users in that community would love the same approach to mean they could be included in the hubs as well.&lt;br /&gt;
&lt;br /&gt;
To aid course harvesting (but to make publishing easier anyway) I&#039;d like to see the DC metadata editing screen become part of the standard course settings screen, and the data pulled from here as part of the publish to hub functionality (and into any RSS or OAI service).&lt;br /&gt;
&lt;br /&gt;
Using LOM as well as (or instead of) DC would allow more flexible searching at the hub with relatively little extra cost of data inputting.  &lt;br /&gt;
&lt;br /&gt;
Finally, there is a great deal of discussion in the OCW community about asset-level re-use.  Anecdotal evidence from teachers suggests that the course-level is not fine-grained enough and they&#039;d prefer to pick a single resource/image/activity.  See http://opencontent.org/blog/archives/900 and related comments for example.  So I&#039;d like to see DC metadata added to resources and modules too, and the searching and import/export/enrol facility in the hub system work at this level also.&lt;br /&gt;
-- [[User:Jenny Gray|Jenny Gray]] 14:48, 30 June 2009 (GMT)&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development_talk:Community_hub&amp;diff=59148</id>
		<title>Development talk:Community hub</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development_talk:Community_hub&amp;diff=59148"/>
		<updated>2009-06-30T14:47:25Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Harvesting courses regularly and a few other  comments */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Regarding the course import for teachers to start from...&lt;br /&gt;
I can envisage a situation whereby the original course author finds new information/ideas and adds stuff to the master course after the teacher has downloaded it, which in the current model would not make it to the teacher as the download is a one off process which they will not repeat. I would prefer a model whereby a course can act as a master template which gets updated regularly so that new questions, resources, activities etc appear dynamically as hidden items within the teacher&#039;s downloaded course, ready to be reviewed and revealed if needed. This would be like maintaining your Moodle install using CVS - you get updates all the time as they are created. &lt;br /&gt;
&lt;br /&gt;
It would also be good to be able to track how many people are using a particular course and to have some sort of meta-forum for discussing changes and developemts. Many teachers will end up using the successful/well designed courses, so it would make a lot of sense to have a way of pooling their shared experience and getting that feedback back to the original creator. -- [[User:Matt Gibson|Matt Gibson]] 18:51, 25 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Harvesting courses regularly and a few other  comments ==&lt;br /&gt;
&lt;br /&gt;
I&#039;ve put this in the forum, but I&#039;ll say it here as well.  If a site has a lot of courses to share with a hub, perhaps because they are an OpenCourseWare provider, they might prefer to supply an RSS or OAI list rather than click &amp;quot;publish&amp;quot; on each individual course.  OCW Consortium members are already encouraged to offer an RSS feed (with DC metadata) of all their courses that is picked up by a number of OCW search tools.  I&#039;m sure Moodle users in that community would love the same approach to mean they could be included in the hubs as well.&lt;br /&gt;
&lt;br /&gt;
To aid course harvesting (but to make publishing easier anyway) I&#039;d like to see the DC metadata editing screen become part of the standard course settings screen, and the data pulled from here as part of the publish to hub functionality (and into any RSS or OAI service).&lt;br /&gt;
&lt;br /&gt;
Using LOM as well as (or instead of) DC would allow more flexible searching at the hub with relatively little extra cost of data inputting.  &lt;br /&gt;
&lt;br /&gt;
Finally, there is a great deal of discussion in the OCW community about asset-level re-use.  Anecdotal evidence from teachers suggests that the course-level is not fine-grained enough and they&#039;d prefer to pick a single resource/image/activity.  See http://opencontent.org/blog/archives/900 and related comments for example.  So I&#039;d like to see DC metadata added to resources and modules too, and the searching and import/export/enrol facility in the hub system work at this level also.&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=51559</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=51559"/>
		<updated>2009-02-24T15:31:04Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Advanced Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
Most users will want to download the &amp;quot;for Moodle 1.9&amp;quot; version, since the latest version (in CVS HEAD) is compatible with Moodle 2.0 which has not yet been released.&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English only.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.  To do the same, edit course/lib.php and paste the code in the print_course() function wherever you want it to appear.&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=51142</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=51142"/>
		<updated>2009-02-18T08:58:28Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
Most users will want to download the &amp;quot;for Moodle 1.9&amp;quot; version, since the latest version (in CVS HEAD) is compatible with Moodle 2.0 which has not yet been released.&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English only.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=51051</id>
		<title>Course rate block</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Course_rate_block&amp;diff=51051"/>
		<updated>2009-02-17T09:30:17Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: New page: ==Couse Rating Block==  The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have m...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Couse Rating Block==&lt;br /&gt;
&lt;br /&gt;
The block contains a link to a separate form page to give a rating, and displays the current aggregate of all user ratings including the number of people who have made ratings.&lt;br /&gt;
&lt;br /&gt;
[[Image:Rateimg.jpg]]&lt;br /&gt;
&lt;br /&gt;
Each user can rate a course only once.  If they visit the ratings form again, a message is displayed to indicate that they&#039;ve already rated the course, and the (disabled) form displays the rating they gave.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
*Copy the files into the \blocks folder. &lt;br /&gt;
*Go to the \admin page and allow the block to be installed&lt;br /&gt;
*Add the block to your course pages to display course ratings&lt;br /&gt;
&lt;br /&gt;
=== Roles and Permissions ===&lt;br /&gt;
&lt;br /&gt;
The default installation will allow all roles except for Guest and Authenticated User to rate a course.  All users, regardless of role, can see ratings.&lt;br /&gt;
&lt;br /&gt;
===Languages===&lt;br /&gt;
&lt;br /&gt;
English only.&lt;br /&gt;
&lt;br /&gt;
===Advanced Options===&lt;br /&gt;
&lt;br /&gt;
You can get the rating graphic displayed anywhere you want by adding this code at the right point:&lt;br /&gt;
&lt;br /&gt;
  $block = block_instance(&#039;rate_course&#039;);&lt;br /&gt;
  $block-&amp;gt;display_rating($course-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
We&#039;ve added this to our course listings so you can see the rating for each course as you browse through the categories.&lt;br /&gt;
&lt;br /&gt;
=== To Do ===&lt;br /&gt;
&lt;br /&gt;
It would be great if users could enter their rating by clicking directly on the star graphic in the block, using AJAX, rather than have to go to a separate page, submit a form and return to the course home page.  This would need to be an option, so that sites (or users) which do not have AJAX enabled could continue to use the form page.&lt;br /&gt;
&lt;br /&gt;
===Contributor/Maintainer===&lt;br /&gt;
&lt;br /&gt;
The Course Ratings Block was contributed and is maintained by Jenny Gray.&lt;br /&gt;
&lt;br /&gt;
[[Category:Contributed code]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=File:Rateimg.jpg&amp;diff=51050</id>
		<title>File:Rateimg.jpg</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=File:Rateimg.jpg&amp;diff=51050"/>
		<updated>2009-02-17T09:26:21Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: screenshot for the course ratings block&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;screenshot for the course ratings block&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:MoodleMoot_2007_HackFest&amp;diff=28163</id>
		<title>Development:MoodleMoot 2007 HackFest</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:MoodleMoot_2007_HackFest&amp;diff=28163"/>
		<updated>2007-10-23T13:03:35Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Social Networking tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The main part of the [http://moodlemoot.org/ 2007 UK Moodle Moot] is on Wednesday and Thursday 24th and 25th October. The day before, on the Tuesday, there will be a HackFest for developers to meet, talk and write code.&lt;br /&gt;
&lt;br /&gt;
==Practical arrangement==&lt;br /&gt;
&lt;br /&gt;
You need to get [http://maps.google.co.uk/maps?ll=52.025356,-0.710997&amp;amp;spn=0.001005,0.001904&amp;amp;t=k&amp;amp;z=19 right here]. This is the centre of the Open University&#039;s Campus:&lt;br /&gt;
&lt;br /&gt;
[http://www3.open.ac.uk/contact/ The Open University]&amp;lt;br /&amp;gt;&lt;br /&gt;
Walton Hall&amp;lt;br /&amp;gt;&lt;br /&gt;
Milton Keynes&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://maps.google.co.uk/?q=mk7+6aa&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;f=d MK7 6AA]&lt;br /&gt;
&lt;br /&gt;
The area we are meeting in is called the Christodoulou Meeting Rooms. The entry is under an archway, and if you go in and up the stairs you should find us in Meeting Room 15, or the open foyer area just outside it. We will be there from about 10:00am to about 5:30pm, and lunch will be provided. We also have rooms 1, 2 and 7 available if people want to form smaller groups at any time. (Also, in meeting room 11, there will be a separate group of people taking about online equation editors, which may interest some people.)&lt;br /&gt;
&lt;br /&gt;
If you are registered for the MoodleMoot, wireless network sign-in information should be available on arrival.&lt;br /&gt;
&lt;br /&gt;
==Programme for the day==&lt;br /&gt;
&lt;br /&gt;
In keeping with Moodle&#039;s open source philosophy, the day will be self-organising. You can turn up and talk to other developers about anything you like. However, within that general free-for-all, we will have a number of pre-announced discussions on particular topics at particular times. We have a number of other rooms available for these break-out sessions, but I don&#039;t know the room numbers right now.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add your own suggestions below.&lt;br /&gt;
&lt;br /&gt;
Naturally, not all developers will be able to come, so it might be a good idea to start discussing some of these topics in the [http://moodle.org/mod/forum/view.php?id=55 General Developer Forum] now. And if anything significant comes out of the discussions, we should try to record it on the wiki.&lt;br /&gt;
&lt;br /&gt;
==Particular discussions==&lt;br /&gt;
&lt;br /&gt;
These are significant topics, where it might be worth getting about 5-10 interested developers into a break-out room for a focussed discussion on one topic, or a demonstration of a particular idea.&lt;br /&gt;
&lt;br /&gt;
Irrespective of these sessions, there will be other developers around talking about whatever interests them all day.&lt;br /&gt;
&lt;br /&gt;
===Repository API===&lt;br /&gt;
The aim is to develop some consensus on how it can work so that a spec can be started.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 10:30 - 11:20&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR07&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Martin Dougiamas&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# Portfolio separate from repo&lt;br /&gt;
# We need to think carefully/clearly about when to copy and when not to&lt;br /&gt;
# Think users, not roles&lt;br /&gt;
# It&#039;s very complicated&lt;br /&gt;
&lt;br /&gt;
===Social Networking tools===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 11:20 - 12:00&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR07&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Jenny Gray&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The aim is to discuss recent user tagging in Moodle and how it can be used; to think about what else can be tagged (courses, resources, activities etc); and to think about how Moodle can be made more social.  Here are some suggestions made to me recently:&lt;br /&gt;
&lt;br /&gt;
* Learning twitter&lt;br /&gt;
* Learning shared to do &lt;br /&gt;
* Offering self-organising groups of learners their own activity areas (forums etc)&lt;br /&gt;
* shared activity reports&lt;br /&gt;
&lt;br /&gt;
Session feedback:&lt;br /&gt;
&lt;br /&gt;
* unit tagging from OU to be integrated into new tags block for Moodle 2.0&lt;br /&gt;
* should we push into third party social networking tools or pull from them?&lt;br /&gt;
** push into will be unpopular with students who see these networks a their private space&lt;br /&gt;
* any moodle site could add extra user profile fields like status, mood with existing core functionality&lt;br /&gt;
* ideas for extension&lt;br /&gt;
** see other people&#039;s tag clouds&lt;br /&gt;
** when it says &amp;quot;3 things tagged with this&amp;quot;, want to know who made those tags&lt;br /&gt;
** need fine grained control over who can tag what&lt;br /&gt;
** need to make sure that when things are deleted the tags go too&lt;br /&gt;
** want to be able to tag other people&lt;br /&gt;
** want to be able to choose to keep my tags private (probably with an admin setting to control whether this feature is enabled or not)&lt;br /&gt;
* facebook apps style API for moodle plug-ins&lt;br /&gt;
** scarey for sys-admins (facebook do it with the app on a separate server)&lt;br /&gt;
** maybe something simple could be done with a better database module&lt;br /&gt;
** something for a lot later!&lt;br /&gt;
&lt;br /&gt;
=== Accessibility demonstration ===&lt;br /&gt;
My colleague Chetz Colwell and I would like to give a brief demonstration of assistive technologies to developers, particularly core developers, and discuss future accessibility work on Moodle. We&#039;ll hopefully have a screen reader JAWS (Thunder?), screen magnifier, do a keyboard-only demo, and possibly speech recognition.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 12:00 to 12:40&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR15&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Nick Freear&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Quiz developments===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 1:40 to 2:20&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR07&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Tim Hunt&lt;br /&gt;
|}&lt;br /&gt;
We can discuss some things that have happened recently:&lt;br /&gt;
* The implication of [[Development:Plan_to_Improve_Flexibility_of_Question_Category_Sharing_and_Permissions|Jamie&#039;s recent changes to the question bank]],&lt;br /&gt;
* Improvements to the question type API, especially [[Development:Plans_for_enhancing_import/export_in_questiontype_plugins|Howard&#039;s recent changes]],&lt;br /&gt;
some things that will probably happen soon:&lt;br /&gt;
* The OU&#039;s quiz navigation changes, that we hope to put into Moodle 2.0,&lt;br /&gt;
* The OU&#039;s [[Development:Plans_for_adaptive_mode|changes to adaptive mode]] that we hope to put into Moodle 2.0,&lt;br /&gt;
* Tony Gardner-Medwin&#039;s plans to introduce certainty-based marking,&lt;br /&gt;
known problems with the quiz architecture that no-one is working on right now:&lt;br /&gt;
* ... suggestions welcome ...&lt;br /&gt;
and anything else you want to raise.&lt;br /&gt;
&lt;br /&gt;
Of course, you can talk to me about the quiz at any time time during the day too, if you have a more specific issue.&lt;br /&gt;
&lt;br /&gt;
===ePortfolios===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 2:20 to 3:00&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR07&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Thanh Le&lt;br /&gt;
|}&lt;br /&gt;
A quick overview of the Open University electronic portfolio tool and describing its technical underpinning to provide more background information.&lt;br /&gt;
&lt;br /&gt;
From the session, I am keen to:&lt;br /&gt;
* gauge people&#039;s interest in the tool;&lt;br /&gt;
* discuss how the tool can integrate with other Moodle tools around the concept of personal data storage;&lt;br /&gt;
* gather interest and collaboration;&lt;br /&gt;
&lt;br /&gt;
===Conditional Activities===&lt;br /&gt;
The aim is to develop some consensus on how it can work so that a spec can be started.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 3:00 - 3:40&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR07&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Martin Dougiamas&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Offline Moodle (and particularly synchronisation issues)===&lt;br /&gt;
Offline Moodle reuses the core components on Backup and mNet(Moodle Network) and adds a synchronisation component to take care of tasks that Moodle doesn&#039;t already cater for. &lt;br /&gt;
&lt;br /&gt;
The components are used because they are core components. They already offer functionality that we require and as they evolve the Offline Moodle feature will be able to take advantage of the extra features, functionality and reliability they provide. &lt;br /&gt;
&lt;br /&gt;
Because this is a new feature I&#039;ll explain a little about how we use the comments and then jot a few questions down that have come up:&lt;br /&gt;
Backup and restore is used to get information in and out of Moodle in a standardised format well understood by Moodle. It is supported by most modules and features and is likely to be fixed quickly as changes to modules effect the backup process.&lt;br /&gt;
* Will the backup tool scale effectively&lt;br /&gt;
* Will changes for Offline Moodle harm the backup code? &lt;br /&gt;
&lt;br /&gt;
Moodle Network is used to provide web service functionality. &lt;br /&gt;
* is Moodle Network the best option for this? &lt;br /&gt;
* has the web service been implemented correctly?&lt;br /&gt;
&lt;br /&gt;
Synchronisation (Synch) Component&lt;br /&gt;
This component is really the main controller of synchronisation whic is the key feature of Offline Moodle at this time. We&#039;ve spent a lot of our time developing code to get the content in and out of Moodle and transferred between Moodles in a reliable and well managed fashion. The synch component brings all this together. &lt;br /&gt;
&lt;br /&gt;
So far we&#039;ve proven that we can reliably get course content and related module content from Moodle Server to Offline Moodle. For forums we can get it back again. We&#039;ve investigated lots more but haven&#039;t code it yet. &lt;br /&gt;
&lt;br /&gt;
We would like the communities input. The plan is to improve it by adding functionality such as: &lt;br /&gt;
* merging content: this is a key feature. For example merging a forum discussion with posts from the Offline Moodle and the Moodle Server. Our original proof of concept proved this is possible for forums but the code has not been written for Offline Moodle&lt;br /&gt;
* filtering content: passwords, copyrighted material and other sensitive data all need to be removed at certain points through out the process&lt;br /&gt;
* security: checks for hacking, viruses and trojans, making sure the data doesn&#039;t get changed in transit. These are all key issues that need to be addressed.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 3:40 - 4:20&lt;br /&gt;
|-&lt;br /&gt;
| Room: || CMR07&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Colin Chambers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Other things people want to do during the day==&lt;br /&gt;
&lt;br /&gt;
=== PGP Keysiging ===&lt;br /&gt;
If any developers would like to exchange PGP Keys and expand their web of trust then this could be done during the Developer day.  &lt;br /&gt;
&lt;br /&gt;
I think it would be good to follow the  [http://www.debian.org/events/keysigning Debian guidlines] for this.--[[User:Dan Poltawski|Dan Poltawski]] 18:03, 10 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
===Enrollment &#039;Groups&#039;===&lt;br /&gt;
I would like to discuss the concept of enrollment groups and thoughts on the reasons for such a feature to be incorporated into Moodle. It would be a useful opportunity to discuss approaches with developers. This is with the intention of implementing a solution and offering it for inclusion into core when I work on this in the coming months. --[[User:Dan Poltawski|Dan Poltawski]] 16:46, 16 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
===Bug fixing prize?===&lt;br /&gt;
&lt;br /&gt;
Should we offer a prize for the person who fixes most bugs during the day?--[[User:Tim Hunt|Tim Hunt]] 03:46, 14 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
Sorry I won&#039;t be there,&lt;br /&gt;
Ok if you mean somebody submitting the larger number of proposals approved by at least one of the participants, on how to solve various bug. No real code please, if you don&#039;t want to create new ones...[[User:Pierre Pichet|Pierre Pichet]] 18:34, 19 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Developer conferences]]&lt;br /&gt;
* [http://moodle.org/mod/forum/view.php?id=55 General Developer Forum]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:MoodleMoot_2007_HackFest&amp;diff=27953</id>
		<title>Development:MoodleMoot 2007 HackFest</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:MoodleMoot_2007_HackFest&amp;diff=27953"/>
		<updated>2007-10-19T08:07:13Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Social Networking tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The main part of the [http://moodlemoot.org/ 2007 UK Moodle Moot] is on Wednesday and Thursday 24th and 25th October. The day before, on the Tuesday, there will be a HackFest for developers to meet, talk and write code.&lt;br /&gt;
&lt;br /&gt;
==Practical arrangement==&lt;br /&gt;
&lt;br /&gt;
You need to get [http://maps.google.co.uk/maps?ll=52.025356,-0.710997&amp;amp;spn=0.001005,0.001904&amp;amp;t=k&amp;amp;z=19 right here]. This is the centre of the Open University&#039;s Campus:&lt;br /&gt;
&lt;br /&gt;
[http://www3.open.ac.uk/contact/ The Open University]&amp;lt;br /&amp;gt;&lt;br /&gt;
Walton Hall&amp;lt;br /&amp;gt;&lt;br /&gt;
Milton Keynes&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://maps.google.co.uk/?q=mk7+6aa&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;f=d MK7 6AA]&lt;br /&gt;
&lt;br /&gt;
The area we are meeting in is called the Christodoulou Meeting Rooms. The entry is under an archway, and if you go in and up the stairs you should find us in Meeting Room 15, or the open foyer area just outside it. We will be there from about 10:00am to about 5:30pm, and lunch will be provided.&lt;br /&gt;
&lt;br /&gt;
If you are registered for the MoodleMoot, wireless network sign-in information should be available on arrival.&lt;br /&gt;
&lt;br /&gt;
==Programme for the day==&lt;br /&gt;
&lt;br /&gt;
In keeping with Moodle&#039;s open source philosophy, the day will be self-organising. You can turn up and talk to other developers about anything you like. However, within that general free-for-all, we will have a number of pre-announced discussions on particular topics at particular times. We have a number of other rooms available for these break-out sessions, but I don&#039;t know the room numbers right now.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add your own suggestions below.&lt;br /&gt;
&lt;br /&gt;
Naturally, not all developers will be able to come, so it might be a good idea to start discussing some of these topics in the [http://moodle.org/mod/forum/view.php?id=55 General Developer Forum] now. And if anything significant comes out of the discussions, we should try to record it on the wiki.&lt;br /&gt;
&lt;br /&gt;
==Particular discussions==&lt;br /&gt;
&lt;br /&gt;
These are significant topics, where it might be worth getting about 5-10 interested developers into a break-out room for a focussed discussion on one topic, or a demonstration of a particular idea.&lt;br /&gt;
&lt;br /&gt;
Irrespective of these sessions, there will be other developers around talking about whatever interests them all day.&lt;br /&gt;
&lt;br /&gt;
=== Accessibility demonstration ===&lt;br /&gt;
My colleague Chetz Colwell and I would like to give a brief demonstration of assistive technologies to developers, particularly core developers, and discuss future accessibility work on Moodle. We&#039;ll hopefully have a screen reader JAWS (Thunder?), screen magnifier, do a keyboard-only demo, and possibly speech recognition.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 10:00 to 10:40&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Nick Freear&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Repository API===&lt;br /&gt;
The aim is to develop some consensus on how it can work so that a spec can be started.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 10:40 - 11:20&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Martin Dougiamas&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Social Networking tools===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 11:20 - 12:00&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Jenny Gray&lt;br /&gt;
|-&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
The aim is to discuss recent user tagging in Moodle and how it can be used; to think about what else can be tagged (courses, resources, activities etc); and to think about how Moodle can be made more social.  Here are some suggestions made to me recently:&lt;br /&gt;
&lt;br /&gt;
* Learning twitter&lt;br /&gt;
* Learning shared to do &lt;br /&gt;
* Offering self-organising groups of learners their own activity areas (forums etc)&lt;br /&gt;
* shared activity reports&lt;br /&gt;
&lt;br /&gt;
===Quiz developments===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 1:40 to 2:20&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Tim Hunt&lt;br /&gt;
|}&lt;br /&gt;
We can discuss some things that have happened recently:&lt;br /&gt;
* The implication of [[Development:Plan_to_Improve_Flexibility_of_Question_Category_Sharing_and_Permissions|Jamie&#039;s recent changes to the question bank]],&lt;br /&gt;
* Improvements to the question type API, especially [[Development:Plans_for_enhancing_import/export_in_questiontype_plugins|Howard&#039;s recent changes]],&lt;br /&gt;
some things that will probably happen soon:&lt;br /&gt;
* The OU&#039;s quiz navigation changes, that we hope to put into Moodle 2.0,&lt;br /&gt;
* The OU&#039;s [[Development:Plans_for_adaptive_mode|changes to adaptive mode]] that we hope to put into Moodle 2.0,&lt;br /&gt;
* Tony Gardner-Medwin&#039;s plans to introduce certainty-based marking,&lt;br /&gt;
known problems with the quiz architecture that no-one is working on right now:&lt;br /&gt;
* ... suggestions welcome ...&lt;br /&gt;
and anything else you want to raise.&lt;br /&gt;
&lt;br /&gt;
Of course, you can talk to me about the quiz at any time time during the day too, if you have a more specific issue.&lt;br /&gt;
&lt;br /&gt;
===ePortfolios===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 2:20 to 3:00&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Thanh Le&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Conditional Activities===&lt;br /&gt;
The aim is to develop some consensus on how it can work so that a spec can be started.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 3:00 - 3:40&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Martin Dougiamas&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Offline Moodle (and particularly synchronisation issues)===&lt;br /&gt;
Offline Moodle reuses the core components on Backup and mNet(Moodle Network) and adds a synchronisation component to take care of tasks that Moodle doesn&#039;t already cater for. &lt;br /&gt;
&lt;br /&gt;
The components are used because they are core components. They already offer functionality that we require and as they evolve the Offline Moodle feature will be able to take advantage of the extra features, functionality and reliability they provide. &lt;br /&gt;
&lt;br /&gt;
Because this is a new feature I&#039;ll explain a little about how we use the comments and then jot a few questions down that have come up:&lt;br /&gt;
Backup and restore is used to get information in and out of Moodle in a standardised format well understood by Moodle. It is supported by most modules and features and is likely to be fixed quickly as changes to modules effect the backup process.&lt;br /&gt;
* Will the backup tool scale effectively&lt;br /&gt;
* Will changes for Offline Moodle harm the backup code? &lt;br /&gt;
&lt;br /&gt;
Moodle Network is used to provide web service functionality. &lt;br /&gt;
* is Moodle Network the best option for this? &lt;br /&gt;
* has the web service been implemented correctly?&lt;br /&gt;
&lt;br /&gt;
Synchronisation (Synch) Component&lt;br /&gt;
This component is really the main controller of synchronisation whic is the key feature of Offline Moodle at this time. We&#039;ve spent a lot of our time developing code to get the content in and out of Moodle and transferred between Moodles in a reliable and well managed fashion. The synch component brings all this together. &lt;br /&gt;
&lt;br /&gt;
So far we&#039;ve proven that we can reliably get course content and related module content from Moodle Server to Offline Moodle. For forums we can get it back again. We&#039;ve investigated lots more but haven&#039;t code it yet. &lt;br /&gt;
&lt;br /&gt;
We would like the communities input. The plan is to improve it by adding functionality such as: &lt;br /&gt;
* merging content: this is a key feature. For example merging a forum discussion with posts from the Offline Moodle and the Moodle Server. Our original proof of concept proved this is possible for forums but the code has not been written for Offline Moodle&lt;br /&gt;
* filtering content: passwords, copyrighted material and other sensitive data all need to be removed at certain points through out the process&lt;br /&gt;
* security: checks for hacking, viruses and trojans, making sure the data doesn&#039;t get changed in transit. These are all key issues that need to be addressed.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 3:40 - 4:20&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Colin Chambers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Other things people want to do during the day==&lt;br /&gt;
&lt;br /&gt;
=== PGP Keysiging ===&lt;br /&gt;
If any developers would like to exchange PGP Keys and expand their web of trust then this could be done during the Developer day.  &lt;br /&gt;
&lt;br /&gt;
I think it would be good to follow the  [http://www.debian.org/events/keysigning Debian guidlines] for this.--[[User:Dan Poltawski|Dan Poltawski]] 18:03, 10 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
===Enrollment &#039;Groups&#039;===&lt;br /&gt;
I would like to discuss the concept of enrollment groups and thoughts on the reasons for such a feature to be incorporated into Moodle. It would be a useful opportunity to discuss approaches with developers. This is with the intention of implementing a solution and offering it for inclusion into core when I work on this in the coming months. --[[User:Dan Poltawski|Dan Poltawski]] 16:46, 16 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
===Bug fixing prize?===&lt;br /&gt;
&lt;br /&gt;
Should we offer a prize for the person who fixes most bugs during the day?--[[User:Tim Hunt|Tim Hunt]] 03:46, 14 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Developer conferences]]&lt;br /&gt;
* [http://moodle.org/mod/forum/view.php?id=55 General Developer Forum]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:MoodleMoot_2007_HackFest&amp;diff=27791</id>
		<title>Development:MoodleMoot 2007 HackFest</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:MoodleMoot_2007_HackFest&amp;diff=27791"/>
		<updated>2007-10-11T13:42:52Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* Social Networking tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The main part of the [http://moodlemoot.org/ 2007 UK Moodle Moot] is on Wednesday and Thursday 24th and 25th October. The day before, on the Tuesday, there will be a HackFest for developers to meet, talk and write code.&lt;br /&gt;
&lt;br /&gt;
==Practical arrangement==&lt;br /&gt;
&lt;br /&gt;
You need to get [http://maps.google.co.uk/maps?ll=52.025356,-0.710997&amp;amp;spn=0.001005,0.001904&amp;amp;t=k&amp;amp;z=19 right here]. This is the centre of the Open University&#039;s Campus:&lt;br /&gt;
&lt;br /&gt;
[http://www3.open.ac.uk/contact/ The Open University]&amp;lt;br /&amp;gt;&lt;br /&gt;
Walton Hall&amp;lt;br /&amp;gt;&lt;br /&gt;
Milton Keynes&amp;lt;br /&amp;gt;&lt;br /&gt;
[http://maps.google.co.uk/?q=mk7+6aa&amp;amp;ie=UTF8&amp;amp;om=1&amp;amp;f=d MK7 6AA]&lt;br /&gt;
&lt;br /&gt;
The area we are meeting in is called the Christodoulou Meeting Rooms. The entry is under an archway, and if you go in and up the stairs you should find us in Meeting Room 15, or the open foyer area just outside it. We will be there from about 10:00am to about 5:30pm, and lunch will be provided.&lt;br /&gt;
&lt;br /&gt;
If you are registered for the MoodleMoot, wireless network sign-in information should be available on arrival.&lt;br /&gt;
&lt;br /&gt;
==Programme for the day==&lt;br /&gt;
&lt;br /&gt;
In keeping with Moodle&#039;s open source philosophy, the day will be self-organising. You can turn up and talk to other developers about anything you like. However, within that general free-for-all, we will have a number of pre-announced discussions on particular topics at particular times. We have a number of other rooms available for these break-out sessions, but I don&#039;t know the numbers right now.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add your own suggestions below.&lt;br /&gt;
&lt;br /&gt;
Naturally, not all developers will be able to come, so it might be a good idea to start discussing some of these topics in the [http://moodle.org/mod/forum/view.php?id=55 General Developer Forum] now. And if anything significant comes out of the discussions, we should try to record it on the wiki.&lt;br /&gt;
&lt;br /&gt;
===Quiz developments===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 2:00 to 3:00&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Tim Hunt&lt;br /&gt;
|}&lt;br /&gt;
We can discuss some things that have happened recently:&lt;br /&gt;
* The implication of [[Development:Plan_to_Improve_Flexibility_of_Question_Category_Sharing_and_Permissions|Jamie&#039;s recent changes to the question bank]],&lt;br /&gt;
* Improvements to the question type API, especially [[Development:Plans_for_enhancing_import/export_in_questiontype_plugins|Howard&#039;s recent changes]],&lt;br /&gt;
some things that will probably happen soon:&lt;br /&gt;
* The OU&#039;s quiz navigation changes, that we hope to put into Moodle 2.0,&lt;br /&gt;
* The OU&#039;s [[Development:Plans_for_adaptive_mode|changes to adaptive mode]] that we hope to put into Moodle 2.0,&lt;br /&gt;
* Tony Gardner-Medwin&#039;s plans to introduce certainty-based marking,&lt;br /&gt;
known problems with the quiz architecture that no-one is working on right now:&lt;br /&gt;
* ... suggestions welcome ...&lt;br /&gt;
and anything else you want to raise.&lt;br /&gt;
&lt;br /&gt;
Of course, you can talk to me about the quiz at any time time during the day too, if you have a more specific issue.&lt;br /&gt;
&lt;br /&gt;
===ePortfolios===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 2:00 to 3:00&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Thanh Le&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Social Networking tools===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || 11 - 12&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Jenny Grey&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Offline Moodle (and particularly synchronisation issues)===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Colin Chambers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Conditional Activities===&lt;br /&gt;
The aim is to develop some consensus on how it can work so that a spec can be started.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Martin Dougiamas&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Repository API===&lt;br /&gt;
The aim is to develop some consensus on how it can work so that a spec can be started.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Martin Dougiamas&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Enrolment &#039;Groups&#039;===&lt;br /&gt;
An overview of &#039;the problem&#039; how we&#039;ve solved it in the short term and discussion of hot it can be solved in core.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Time: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Room: || ??&lt;br /&gt;
|-&lt;br /&gt;
| Suggested by: || Dan Poltawski&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PGP Keysiging ==&lt;br /&gt;
&lt;br /&gt;
If any developers would like to exchange PGP Keys and expand their web of trust then this could be done during the Developer day.  &lt;br /&gt;
&lt;br /&gt;
I think it would be good to follow the  [http://www.debian.org/events/keysigning Debian guidlines] for this.--[[User:Dan Poltawski|Dan Poltawski]] 18:03, 10 October 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Developer conferences]]&lt;br /&gt;
* [http://moodle.org/mod/forum/view.php?id=55 General Developer Forum]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
	<entry>
		<id>https://docs.moodle.org/310/en/index.php?title=Development:Course_level_ratings&amp;diff=15196</id>
		<title>Development:Course level ratings</title>
		<link rel="alternate" type="text/html" href="https://docs.moodle.org/310/en/index.php?title=Development:Course_level_ratings&amp;diff=15196"/>
		<updated>2006-09-01T14:24:52Z</updated>

		<summary type="html">&lt;p&gt;Jenny-gray: /* See also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For users to be able to &amp;quot;rate&amp;quot; courses in a similar way to the way [[Forum module|forum]] ratings work.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* Using Moodle [http://moodle.org/mod/forum/discuss.php?d=53023 Course level ratings - request for comment] forum discussion&lt;br /&gt;
&lt;br /&gt;
=== Functionality ===&lt;br /&gt;
&lt;br /&gt;
For a course which has been set up to use ratings, through a block, the user can pick a value from a drop-down list and click a button &amp;quot;send my rating&amp;quot; to submit their rating.  The block also displays the average of all ratings received so far and the number of ratings e.g 3 / 5 (2).&lt;br /&gt;
&lt;br /&gt;
If a user has not yet rated the course, then the drop-down list will say &amp;quot;rate...&amp;quot;.  Otherwise it will display their current rating.  If they amend and re-submit, the average rating will be updated, but the number of ratings does not change.  No record of the first rating is retained.&lt;br /&gt;
&lt;br /&gt;
This is basically the same as the way ratings are entered for forum posts.&lt;br /&gt;
&lt;br /&gt;
Note that the rating average value and number of entries will also be displayed with other extended course metadata from the expanded display on the course categories pages.&lt;br /&gt;
&lt;br /&gt;
The admin user, and teacher(s) for the course, can click on the current rating to see the list of who has rated the course and the score they gave.  This information is not available to students.&lt;br /&gt;
&lt;br /&gt;
Note, if ratings have not been enabled for the course, the block displays a message and link &amp;quot;please enable ratings in the course settings&amp;quot; for teachers/admin and is invisible to users.&lt;br /&gt;
&lt;br /&gt;
=== Editing interface ===&lt;br /&gt;
&lt;br /&gt;
The course settings screen will have two new fields:&lt;br /&gt;
&lt;br /&gt;
* a check box whether ratings are to be used or not.&lt;br /&gt;
* a drop-down list of numbers 1-100 for the scale to be used.&lt;br /&gt;
&lt;br /&gt;
The block will also need to appear in the Add blocks list.&lt;br /&gt;
&lt;br /&gt;
====Extensions====&lt;br /&gt;
&lt;br /&gt;
Like forums, it is possible that other types of grading might be possible, but these will be considered later.  The use of this approach should mean that other forms of grading can be added.&lt;br /&gt;
&lt;br /&gt;
Course scales allow a course can have custom scales defined.  It would make sense to make 0-5 (our default) a site-wide scale, and allow the course admin screen to select any of the site-wide or custom scales for that course.&lt;br /&gt;
&lt;br /&gt;
=== Database structure ===&lt;br /&gt;
&lt;br /&gt;
New table course_ratings&lt;br /&gt;
&lt;br /&gt;
* id&lt;br /&gt;
* userid&lt;br /&gt;
* course&lt;br /&gt;
* time&lt;br /&gt;
* rating&lt;br /&gt;
&lt;br /&gt;
Additions to course&lt;br /&gt;
&lt;br /&gt;
* assessed (true/false)&lt;br /&gt;
* scale&lt;br /&gt;
&lt;br /&gt;
====Extensions====&lt;br /&gt;
&lt;br /&gt;
To offer full similarity with forums, would need extra field:&lt;br /&gt;
&lt;br /&gt;
* assesspublic which would be true/false depending on whether users can see each other&#039;s ratings.  For now, will default assume true.&lt;br /&gt;
&lt;br /&gt;
And extended field:&lt;br /&gt;
&lt;br /&gt;
* assessed (0/1 as above then 2 for teacher only ratings)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Jenny-gray</name></author>
	</entry>
</feed>