Merge branch 'MDL-40441' of git://github.com/timhunt/moodle
authorMarina Glancy <marina@moodle.com>
Wed, 10 Jul 2013 00:02:04 +0000 (10:02 +1000)
committerMarina Glancy <marina@moodle.com>
Wed, 10 Jul 2013 00:02:04 +0000 (10:02 +1000)
384 files changed:
admin/cli/install.php
admin/cli/install_database.php
admin/cli/upgrade.php
admin/handlevirus.php
admin/index.php
admin/oacleanup.php
admin/plugins.php
admin/roles/classes/check_capability_table.php
admin/roles/classes/permissions_table.php
admin/roles/usersroles.php
admin/settings/security.php
admin/settings/users.php
admin/tool/behat/cli/init.php
admin/tool/capability/classes/settings_form.php [new file with mode: 0644]
admin/tool/capability/index.php
admin/tool/capability/lang/en/tool_capability.php
admin/tool/capability/locallib.php [new file with mode: 0644]
admin/tool/capability/module.js [deleted file]
admin/tool/capability/renderer.php [new file with mode: 0644]
admin/tool/capability/settings.php
admin/tool/capability/styles.css [new file with mode: 0644]
admin/tool/capability/version.php
admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-debug.js [new file with mode: 0644]
admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-min.js [new file with mode: 0644]
admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search.js [new file with mode: 0644]
admin/tool/capability/yui/src/search/build.json [new file with mode: 0644]
admin/tool/capability/yui/src/search/js/search.js [new file with mode: 0644]
admin/tool/capability/yui/src/search/meta/search.json [new file with mode: 0644]
admin/tool/customlang/edit.php
admin/tool/customlang/index.php
admin/tool/generator/index.php
admin/tool/installaddon/yui/permcheck/permcheck.js
admin/tool/phpunit/cli/init.php
admin/tool/unsuproles/index.php
admin/user/user_bulk_cohortadd.php
admin/user/user_bulk_display.php
auth/ldap/auth.php
auth/ldap/config.html
auth/ldap/lang/en/auth_ldap.php
auth/ldap/tests/plugin_test.php [moved from auth/ldap/tests/ldap_test.php with 94% similarity]
auth/mnet/auth.php
backup/moodle2/backup_stepslib.php
backup/util/dbops/restore_dbops.class.php
backup/util/ui/restore_ui_components.php
badges/renderer.php
blocks/edit_form.php
blocks/navigation/tests/behat/view_my_courses.feature [new file with mode: 0644]
cache/locallib.php
calendar/lib.php
calendar/tests/externallib_test.php [moved from calendar/tests/externallib_tests.php with 98% similarity]
comment/lib.php
course/editcategory.php
course/editcategory_form.php
course/lib.php
course/view.php
enrol/category/locallib.php
enrol/cohort/lib.php
enrol/cohort/locallib.php
enrol/externallib.php
enrol/locallib.php
enrol/meta/lib.php
enrol/users.php
enrol/users_forms.php
error/index.php
files/externallib.php
filter/manage.php
grade/grading/lib.php
grade/grading/pick.php
grade/report/grader/lib.php
grade/report/upgrade.txt
group/index.php
group/overview.php
lang/en/admin.php
lang/en/moodle.php
lib/accesslib.php
lib/adminlib.php
lib/badgeslib.php
lib/blocklib.php
lib/classes/component.php
lib/coursecatlib.php
lib/datalib.php
lib/db/install.xml
lib/db/upgrade.php
lib/deprecatedlib.php
lib/dml/mssql_native_moodle_database.php
lib/editor/tinymce/db/upgrade.php
lib/editor/tinymce/lang/en/editor_tinymce.php
lib/editor/tinymce/lib.php
lib/editor/tinymce/plugins/moodlemedia/lib.php
lib/editor/tinymce/plugins/moodlenolink/lib.php
lib/editor/tinymce/plugins/pdw/lang/en/tinymce_pdw.php [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/lib.php [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/pix/icon.gif [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/readme_moodle.txt [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/tinymce/editor_plugin.js [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/tinymce/editor_plugin_src.js [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/tinymce/img/toolbars.gif [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/tinymce/langs/en.js [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/tinymce/langs/nl.js [new file with mode: 0644]
lib/editor/tinymce/plugins/pdw/version.php [new file with mode: 0644]
lib/editor/tinymce/plugins/wrap/lang/en/tinymce_wrap.php [new file with mode: 0644]
lib/editor/tinymce/plugins/wrap/lib.php [new file with mode: 0644]
lib/editor/tinymce/plugins/wrap/tinymce/editor_plugin.js [new file with mode: 0644]
lib/editor/tinymce/plugins/wrap/version.php [new file with mode: 0644]
lib/editor/tinymce/settings.php
lib/editor/tinymce/styles.css
lib/editor/tinymce/upgrade.txt
lib/editor/tinymce/version.php
lib/enrollib.php
lib/externallib.php
lib/filebrowser/file_info_context_course.php
lib/filebrowser/file_info_context_coursecat.php
lib/filebrowser/file_info_context_module.php
lib/formslib.php
lib/gradelib.php
lib/messagelib.php
lib/modinfolib.php
lib/moodlelib.php
lib/navigationlib.php
lib/outputcomponents.php
lib/pagelib.php
lib/phpunit/bootstrap.php
lib/phpunit/classes/autoloader.php
lib/phpunit/classes/util.php
lib/phpunit/tests/advanced_test.php
lib/questionlib.php
lib/setup.php
lib/setuplib.php
lib/tablelib.php
lib/testing/generator/data_generator.php
lib/tests/accesslib_test.php
lib/tests/behat/behat_general.php
lib/tests/moodlelib_test.php
lib/thirdpartylibs.xml
lib/upgrade.txt
login/token.php
mnet/service/enrol/index.php
mnet/service/enrol/locallib.php
mod/assign/adminmanageplugins.php
mod/assign/backup/moodle2/backup_assign_stepslib.php
mod/assign/batchsetmarkingworkflowstateform.php
mod/assign/db/upgrade.php
mod/assign/feedback/comments/db/upgrade.php
mod/assign/feedback/file/db/upgrade.php
mod/assign/gradingoptionsform.php
mod/assign/gradingtable.php
mod/assign/lang/en/assign.php
mod/assign/locallib.php
mod/assign/module.js
mod/assign/renderable.php
mod/assign/renderer.php
mod/assign/settings.php
mod/assign/submission/comments/db/upgrade.php
mod/assign/submission/file/db/upgrade.php
mod/assign/submission/onlinetext/db/upgrade.php
mod/assign/tests/base_test.php
mod/assign/tests/externallib_test.php
mod/assign/tests/locallib_test.php
mod/assign/upgrade.txt
mod/assign/version.php
mod/book/edit.php
mod/data/db/upgrade.php
mod/data/lib.php
mod/data/tests/search_test.php
mod/data/view.php
mod/feedback/delete_template.php
mod/feedback/edit.php
mod/feedback/edit_form.php
mod/feedback/item/label/lib.php
mod/feedback/lib.php
mod/forum/lib.php
mod/forum/user.php
mod/glossary/lang/en/glossary.php
mod/glossary/print.php
mod/glossary/styles.css
mod/glossary/view.php
mod/quiz/renderer.php
mod/quiz/report/attemptsreport_table.php
mod/quiz/report/overview/lang/en/quiz_overview.php
mod/quiz/report/overview/overview_form.php
mod/quiz/report/overview/report.php
mod/scorm/lib.php
mod/scorm/locallib.php
mod/scorm/mod_form.php
mod/scorm/report/basic/report.php
mod/scorm/report/interactions/report.php
mod/wiki/lang/en/wiki.php
mod/wiki/pagelib.php
mod/wiki/renderer.php
mod/wiki/styles.css
mod/workshop/allocation/manual/lib.php
mod/workshop/locallib.php
pix/c/course.gif [deleted file]
pix/c/course.png [deleted file]
pix/c/course.svg [deleted file]
pix/c/group.gif [deleted file]
pix/c/group.png [deleted file]
pix/c/group.svg [deleted file]
pix/c/site.gif [deleted file]
pix/c/site.png [deleted file]
pix/c/site.svg [deleted file]
pix/c/user.gif [deleted file]
pix/c/user.png [deleted file]
pix/c/user.svg [deleted file]
pix/i/agg_mean.gif [deleted file]
pix/i/agg_sum.gif [deleted file]
pix/i/approve.gif [deleted file]
pix/i/approve.png [deleted file]
pix/i/approve.svg [deleted file]
pix/i/backup.gif [deleted file]
pix/i/calc.gif [deleted file]
pix/i/calendar.gif [deleted file]
pix/i/checkpermissions.gif [deleted file]
pix/i/cohort.gif [deleted file]
pix/i/configlock.gif [deleted file]
pix/i/course.gif [deleted file]
pix/i/cross_red_big.gif [deleted file]
pix/i/cross_red_big.png [deleted file]
pix/i/cross_red_big.svg [deleted file]
pix/i/cross_red_small.gif [deleted file]
pix/i/cross_red_small.png [deleted file]
pix/i/cross_red_small.svg [deleted file]
pix/i/db.gif [deleted file]
pix/i/edit.gif [deleted file]
pix/i/enrolmentsuspended.gif [deleted file]
pix/i/filter.gif [deleted file]
pix/i/grades.gif [deleted file]
pix/i/group.gif [deleted file]
pix/i/hide.gif [deleted file]
pix/i/hierarchylock.gif [deleted file]
pix/i/info.gif [deleted file]
pix/i/item.gif [deleted file]
pix/i/marked.gif [deleted file]
pix/i/marker.gif [deleted file]
pix/i/mnethost.gif [deleted file]
pix/i/move_2d.gif [deleted file]
pix/i/outcomes.gif [deleted file]
pix/i/permissionlock.gif [deleted file]
pix/i/permissions.gif [deleted file]
pix/i/reload.gif [deleted file]
pix/i/report.gif [deleted file]
pix/i/restore.gif [deleted file]
pix/i/return.gif [deleted file]
pix/i/risk_config.gif [deleted file]
pix/i/risk_dataloss.gif [deleted file]
pix/i/risk_managetrust.gif [deleted file]
pix/i/risk_personal.gif [deleted file]
pix/i/risk_spam.gif [deleted file]
pix/i/risk_xss.gif [deleted file]
pix/i/roles.gif [deleted file]
pix/i/roles.png [deleted file]
pix/i/roles.svg [deleted file]
pix/i/rss.gif [deleted file]
pix/i/scales.gif [deleted file]
pix/i/search.gif [deleted file]
pix/i/settings.gif [deleted file]
pix/i/show.gif [deleted file]
pix/i/tick_amber_big.gif [deleted file]
pix/i/tick_amber_big.png [deleted file]
pix/i/tick_amber_big.svg [deleted file]
pix/i/tick_amber_small.gif [deleted file]
pix/i/tick_amber_small.png [deleted file]
pix/i/tick_amber_small.svg [deleted file]
pix/i/tick_green_big.gif [deleted file]
pix/i/tick_green_big.png [deleted file]
pix/i/tick_green_big.svg [deleted file]
pix/i/tick_green_small.gif [deleted file]
pix/i/tick_green_small.png [deleted file]
pix/i/tick_green_small.svg [deleted file]
pix/i/user.gif [deleted file]
pix/i/users.gif [deleted file]
pix/t/add.gif [deleted file]
pix/t/addgreen.gif [deleted file]
pix/t/addgreen.png [deleted file]
pix/t/addgreen.svg [deleted file]
pix/t/backup.gif [deleted file]
pix/t/block.gif [deleted file]
pix/t/calc.gif [deleted file]
pix/t/calc_off.gif [deleted file]
pix/t/clear.gif [deleted file]
pix/t/clear.png [deleted file]
pix/t/clear.svg [deleted file]
pix/t/copy.gif [deleted file]
pix/t/delete.gif [deleted file]
pix/t/down.gif [deleted file]
pix/t/edit.gif [deleted file]
pix/t/email.gif [deleted file]
pix/t/emailno.gif [deleted file]
pix/t/go.gif [deleted file]
pix/t/grades.gif [deleted file]
pix/t/groupn.gif [deleted file]
pix/t/groups.gif [deleted file]
pix/t/groupv.gif [deleted file]
pix/t/hide.gif [deleted file]
pix/t/left.gif [deleted file]
pix/t/lock.gif [deleted file]
pix/t/locktime.gif [deleted file]
pix/t/manual_item.gif [deleted file]
pix/t/manual_item.png [deleted file]
pix/t/manual_item.svg [deleted file]
pix/t/message.gif [deleted file]
pix/t/move.gif [deleted file]
pix/t/portfolioadd.gif [deleted file]
pix/t/preview.gif [deleted file]
pix/t/restore.gif [deleted file]
pix/t/right.gif [deleted file]
pix/t/show.gif [deleted file]
pix/t/stop.gif [deleted file]
pix/t/switch_minus.gif [deleted file]
pix/t/switch_plus.gif [deleted file]
pix/t/switch_whole.gif [deleted file]
pix/t/unlock.gif [deleted file]
pix/t/unlock_gray.gif [deleted file]
pix/t/unlock_gray.png [deleted file]
pix/t/unlock_gray.svg [deleted file]
pix/t/up.gif [deleted file]
pix/t/user.gif [deleted file]
pix/t/userblue.gif [deleted file]
pix/t/userblue.png [deleted file]
pix/t/userblue.svg [deleted file]
portfolio/add.php
question/category_class.php
question/engine/tests/helpers.php
question/type/calculatedmulti/question.php
question/type/calculatedsimple/tests/helper.php
question/type/calculatedsimple/tests/questiontype_test.php [new file with mode: 0644]
question/type/description/tests/helper.php
question/type/description/tests/questiontype_test.php
question/type/match/tests/helper.php [new file with mode: 0644]
question/type/match/tests/questiontype_test.php
question/type/multianswer/tests/helper.php
question/type/multianswer/tests/questiontype_test.php
question/type/multichoice/styles.css
question/type/multichoice/tests/helper.php [new file with mode: 0644]
question/type/multichoice/tests/questiontype_test.php
question/type/numerical/tests/helper.php
question/type/numerical/tests/questiontype_test.php
question/type/questionbase.php
question/type/questiontypebase.php
question/type/shortanswer/tests/helper.php
question/type/shortanswer/tests/questiontype_test.php
question/type/truefalse/tests/helper.php
question/type/truefalse/tests/questiontype_test.php
report/backups/index.php
report/log/locallib.php
report/security/locallib.php
repository/draftfiles_ajax.php
repository/filepicker.php
repository/filesystem/lib.php
repository/flickr_public/lib.php
repository/lib.php
repository/repository_ajax.php
repository/tests/repository_test.php
tag/coursetags_more.php
tag/coursetagslib.php
theme/afterburner/pix_core/i/courseevent.png [moved from theme/afterburner/pix_core/c/course.png with 100% similarity]
theme/afterburner/pix_core/i/siteevent.png [moved from theme/afterburner/pix_core/c/site.png with 100% similarity]
theme/afterburner/pix_core/i/userevent.png [moved from theme/afterburner/pix_core/c/user.png with 100% similarity]
theme/afterburner/pix_core/t/add.png [moved from theme/afterburner/pix_core/t/addgreen.png with 100% similarity]
theme/afterburner/pix_core/t/check.png [moved from theme/afterburner/pix_core/t/clear.png with 100% similarity]
theme/afterburner/pix_core/t/userblue.png [deleted file]
theme/formfactor/config.php
theme/mymobile/pix_core/i/courseevent.png [moved from theme/mymobile/pix_core/c/course.png with 100% similarity]
theme/mymobile/pix_core/i/cross_red_big.png [deleted file]
theme/mymobile/pix_core/i/cross_red_small.png [deleted file]
theme/mymobile/pix_core/i/groupevent.png [moved from theme/mymobile/pix_core/c/group.png with 100% similarity]
theme/mymobile/pix_core/i/siteevent.png [moved from theme/mymobile/pix_core/c/site.png with 100% similarity]
theme/mymobile/pix_core/i/userevent.png [moved from theme/mymobile/pix_core/c/user.png with 100% similarity]
theme/mymobile/pix_core/t/approve.png [moved from theme/mymobile/pix_core/i/approve.png with 100% similarity]
theme/mymobile/pix_core/t/check.png [moved from theme/mymobile/pix_core/t/clear.png with 100% similarity]
user/edit.php
user/editlib.php
user/externallib.php
user/index.php
user/messageselect.php
user/selector/lib.php
user/tests/externallib_test.php
version.php
webservice/amf/server.php
webservice/amf/simpleserver.php
webservice/soap/server.php
webservice/soap/simpleserver.php
webservice/xmlrpc/server.php
webservice/xmlrpc/simpleserver.php

index d02d1e3..f0bee31 100644 (file)
@@ -36,6 +36,12 @@ if (isset($_SERVER['REMOTE_ADDR'])) {
     exit(1);
 }
 
+// Force OPcache reset if used, we do not want any stale caches
+// when preparing test environment.
+if (function_exists('opcache_reset')) {
+    opcache_reset();
+}
+
 $help =
 "Command line Moodle installer, creates config.php and initializes database.
 Please note you must execute this script with the same uid as apache
index dfc7a42..7a4f288 100644 (file)
@@ -36,6 +36,12 @@ if (isset($_SERVER['REMOTE_ADDR'])) {
     exit(1);
 }
 
+// Force OPcache reset if used, we do not want any stale caches
+// when preparing test environment.
+if (function_exists('opcache_reset')) {
+    opcache_reset();
+}
+
 $help =
 "Advanced command line Moodle database installer.
 Please note you must execute this script with the same uid as apache.
index ca6ef6a..98e8726 100644 (file)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+// Force OPcache reset if used, we do not want any stale caches
+// when detecting if upgrade necessary or when running upgrade.
+if (function_exists('opcache_reset') and !isset($_SERVER['REMOTE_ADDR'])) {
+    opcache_reset();
+}
+
 define('CLI_SCRIPT', true);
 define('CACHE_DISABLE_ALL', true);
 
index bfd76c1..b29392d 100644 (file)
@@ -42,7 +42,7 @@ while(!feof($fd)) {
     list($ctxselect, $ctxjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx');
     $sql = "SELECT c.id, c.fullname $ctxselect FROM {course} c $ctxjoin WHERE c.id = :courseid";
     $course = $DB->get_record_sql($sql, array('courseid' => $log->course));
-    context_instance_preload($course);
+    context_helper::preload_from_record($course);
 
     $user = $DB->get_record("user", array("id"=>$log->userid));
     $subject = get_string('virusfoundsubject','moodle',format_string($site->fullname));
index c54e838..9acf551 100644 (file)
@@ -52,6 +52,12 @@ if (empty($_GET['cache']) and empty($_POST['cache'])) {
     // we redirect to self once we known no upgrades are necessary.
     // Note: $_GET and $_POST are used here intentionally because our param cleaning is not loaded yet.
     define('CACHE_DISABLE_ALL', true);
+
+    // Force OPcache reset if used, we do not want any stale caches
+    // when detecting if upgrade necessary or when running upgrade.
+    if (function_exists('opcache_reset')) {
+        opcache_reset();
+    }
 }
 
 require('../config.php');
index a27aff9..faf55f5 100644 (file)
@@ -48,7 +48,7 @@ function online_assignment_cleanup($output=false) {
 
     /// cycle through each course
     foreach ($courses as $course) {
-        context_instance_preload($course);
+        context_helper::preload_from_record($course);
         $context = context_course::instance($course->id);
 
         if (empty($course->fullname)) {
index 280c0ae..8ceba12 100644 (file)
@@ -85,10 +85,18 @@ if ($uninstall) {
         if ($pluginman->is_plugin_folder_removable($pluginfo->component)) {
             $continueurl = new moodle_url($PAGE->url, array('delete' => $pluginfo->component, 'sesskey' => sesskey(), 'confirm' => 1));
             echo $output->plugin_uninstall_results_removable_page($pluginman, $pluginfo, $progress, $continueurl);
+            // Reset op code caches.
+            if (function_exists('opcache_reset')) {
+                opcache_reset();
+            }
             exit();
 
         } else {
             echo $output->plugin_uninstall_results_page($pluginman, $pluginfo, $progress);
+            // Reset op code caches.
+            if (function_exists('opcache_reset')) {
+                opcache_reset();
+            }
             exit();
         }
     }
@@ -131,6 +139,10 @@ if ($delete and $confirmed) {
 
     // So long, and thanks for all the bugs.
     fulldelete($pluginfo->rootdir);
+    // Reset op code caches.
+    if (function_exists('opcache_reset')) {
+        opcache_reset();
+    }
     redirect($PAGE->url);
 }
 
index de9eaae..20f9370 100644 (file)
@@ -41,7 +41,7 @@ class core_role_check_capability_table extends core_role_capability_table_base {
      * Constructor
      * @param object $context the context this table relates to.
      * @param object $user the user we are generating the results for.
-     * @param string $contextname print_context_name($context) - to save recomputing.
+     * @param string $contextname $context->get_context_name() - to save recomputing.
      */
     public function __construct($context, $user, $contextname) {
         parent::__construct($context, 'explaincaps');
index 4d317f5..aa9a2f4 100644 (file)
@@ -38,7 +38,7 @@ class core_role_permissions_table extends core_role_capability_table_base {
     /**
      * Constructor.
      * @param context $context the context this table relates to.
-     * @param string $contextname print_context_name($context) - to save recomputing.
+     * @param string $contextname $context->get_context_name() - to save recomputing.
      * @param array $allowoverrides
      * @param array $allowsafeoverrides
      * @param array $overridableroles
index 0935f6f..c62c979 100644 (file)
@@ -99,9 +99,9 @@ foreach ($contexts as $conid => $con) {
 // Put the contexts into a tree structure.
 foreach ($contexts as $conid => $con) {
     $context = context::instance_by_id($conid);
-    $parentcontextid = get_parent_contextid($context);
-    if ($parentcontextid) {
-        $contexts[$parentcontextid]->children[] = $conid;
+    $parentcontext = $context->get_parent_context();
+    if ($parentcontext) {
+        $contexts[$parentcontext->id]->children[] = $conid;
     }
 }
 
index e720160..3d63ce6 100644 (file)
@@ -46,11 +46,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
                        1800 => new lang_string('numminutes', '', 30),
                        2700 => new lang_string('numminutes', '', 45),
                        3600 => new lang_string('numminutes', '', 60))));
-    $temp->add(new admin_setting_configselect('fullnamedisplay', new lang_string('fullnamedisplay', 'admin'), new lang_string('configfullnamedisplay', 'admin'),
-                  'language', array('language' => new lang_string('language'),
-                                              'firstname lastname' => new lang_string('firstname').' + '.new lang_string('lastname'),
-                                              'lastname firstname' => new lang_string('lastname').' + '.new lang_string('firstname'),
-                                              'firstname' => new lang_string('firstname'))));
+
     $temp->add(new admin_setting_configcheckbox('extendedusernamechars', new lang_string('extendedusernamechars', 'admin'), new lang_string('configextendedusernamechars', 'admin'), 0));
     $temp->add(new admin_setting_configtext('sitepolicy', new lang_string('sitepolicy', 'admin'), new lang_string('sitepolicy_help', 'admin'), '', PARAM_RAW));
     $temp->add(new admin_setting_configtext('sitepolicyguest', new lang_string('sitepolicyguest', 'admin'), new lang_string('sitepolicyguest_help', 'admin'), (isset($CFG->sitepolicy) ? $CFG->sitepolicy : ''), PARAM_RAW));
index 0365ab5..5a50bce 100644 (file)
@@ -150,6 +150,7 @@ if ($hassiteconfig
                     'department'  => new lang_string('department'),
                     'institution' => new lang_string('institution'),
                 )));
+        $temp->add(new admin_setting_configtext('fullnamedisplay', new lang_string('fullnamedisplay', 'admin'), new lang_string('configfullnamedisplay', 'admin'), 'language', PARAM_TEXT, 50));
         $temp->add(new admin_setting_configtext('maxusersperpage', new lang_string('maxusersperpage','admin'), new lang_string('configmaxusersperpage','admin'), 100, PARAM_INT));
         $temp->add(new admin_setting_configcheckbox('enablegravatar', new lang_string('enablegravatar', 'admin'), new lang_string('enablegravatar_help', 'admin'), 0));
         $temp->add(new admin_setting_configtext('gravatardefaulturl', new lang_string('gravatardefaulturl', 'admin'), new lang_string('gravatardefaulturl_help', 'admin'), 'mm'));
index fd11b08..9ac6931 100644 (file)
@@ -26,6 +26,12 @@ if (isset($_SERVER['REMOTE_ADDR'])) {
     die(); // No access from web!
 }
 
+// Force OPcache reset if used, we do not want any stale caches
+// when preparing test environment.
+if (function_exists('opcache_reset')) {
+    opcache_reset();
+}
+
 // Is not really necessary but adding it as is a CLI_SCRIPT.
 define('CLI_SCRIPT', true);
 
diff --git a/admin/tool/capability/classes/settings_form.php b/admin/tool/capability/classes/settings_form.php
new file mode 100644 (file)
index 0000000..cf5fa3e
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Capability tool settings form.
+ *
+ * Do no include this file, it is automatically loaded by the class loader!
+ *
+ * @package    tool_capability
+ * @copyright  2013 Sam Hemelryk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+require_once($CFG->libdir.'/formslib.php');
+
+/**
+ * Class tool_capability_settings_form
+ *
+ * The settings form for the comparison of roles/capabilities.
+ *
+ * @copyright  2013 Sam Hemelryk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class tool_capability_settings_form extends moodleform {
+
+    /**
+     * The form definition.
+     */
+    public function definition() {
+        $form = $this->_form;
+        $capabilities = $this->_customdata['capabilities'];
+        $roles = $this->_customdata['roles'];
+        // Set the form ID.
+        $form->setAttributes(array('id' => 'capability-overview-form') + $form->getAttributes());
+
+        $form->addElement('header', 'reportsettings', get_string('reportsettings', 'tool_capability'));
+        $form->addElement('html', html_writer::tag('p', get_string('intro', 'tool_capability'), array('id' => 'intro')));
+
+        $form->addElement('hidden', 'search');
+        $form->setType('search', PARAM_TEXT);
+
+        $attributes = array('multiple' => 'multiple', 'size' => 10, 'data-search' => 'capability');
+        $form->addElement('select', 'capability', get_string('capabilitylabel', 'tool_capability'), $capabilities, $attributes);
+        $form->setType('capability', PARAM_CAPABILITY);
+
+        $attributes = array('multiple' => 'multiple', 'size' => 10);
+        $form->addElement('select', 'roles', get_string('roleslabel', 'tool_capability'), $roles, $attributes);
+        $form->setType('roles', PARAM_TEXT);
+
+        $form->addElement('submit', 'submitbutton', get_string('getreport', 'tool_capability'));
+    }
+
+}
\ No newline at end of file
index 3f9c58e..d1707d2 100644 (file)
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * For a given capability, show what permission it has for every role, and
- * everywhere that it is overridden.
+ * For a given capability, show what permission it has for every role, and everywhere that it is overridden.
  *
- * @package    tool
- * @subpackage capability
+ * @package    tool_capability
  * @copyright  2008 Tim Hunt
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 require_once(dirname(__FILE__) . '/../../../config.php');
+require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/capability/locallib.php');
 require_once($CFG->libdir.'/adminlib.php');
 
-// Check permissions.
-require_login();
-$systemcontext = context_system::instance();
-require_capability('moodle/role:manage', $systemcontext);
-
 // Get URL parameters.
-$capability = optional_param('capability', '', PARAM_CAPABILITY);
-$roleids = optional_param_array('roles', array('0'), PARAM_INT);
-
-// Clean the passed in list of role ids. If 'All' selected as an option, or
-// if none were selected, do all roles.
-$allroles = role_fix_names(get_all_roles());
-$cleanedroleids = array();
-foreach ($roleids as $roleid) {
-    if ($roleid == 0) {
-        $cleanedroleids = array_keys($allroles);
-        break;
-    }
-    if (array_key_exists($roleid, $allroles)) {
-        $cleanedroleids[] = $roleid;
-    }
-}
-if (empty($cleanedroleids)) {
-    $cleanedroleids = array_keys($allroles);
-}
-
-// Include the required JavaScript.
-$PAGE->requires->js_init_call('M.tool_capability.init', array(get_string('search')));
+$systemcontext = context_system::instance();
+$contextid = optional_param('context', $systemcontext->id, PARAM_INT);
 
-// Log.
-add_to_log(SITEID, "admin", "tool capability", "tool/capability/index.php?capability=$capability", $capability);
+// Check permissions.
+list($context, $course, $cm) = get_context_info_array($contextid);
+require_login($course, false, $cm);
+require_capability('moodle/role:manage', $context);
 
 // Print the header.
 admin_externalpage_setup('toolcapability');
-echo $OUTPUT->header();
 
-// Prepare the list of capabilities to choose from
-$allcapabilities = fetch_context_capabilities($systemcontext);
+// Prepare the list of capabilities to choose from.
 $capabilitychoices = array();
-foreach ($allcapabilities as $cap) {
+foreach ($context->get_capabilities() as $cap) {
     $capabilitychoices[$cap->name] = $cap->name . ': ' . get_capability_string($cap->name);
 }
 
-// Prepare the list of roles to choose from
+$allroles = role_fix_names(get_all_roles($context));
+// Prepare the list of roles to choose from.
 $rolechoices = array('0' => get_string('all'));
 foreach ($allroles as $role) {
     $rolechoices[$role->id] = $role->localname;
 }
-if (count($cleanedroleids) == count($allroles)) {
-    // Select 'All', rather than each role individually.
-    $selectedroleids = array('0');
-} else {
-    $selectedroleids = $cleanedroleids;
-}
 
-// Print the settings form.
-echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter');
-echo '<form method="get" action="" id="settingsform"><div>';
-echo $OUTPUT->heading(get_string('reportsettings', 'tool_capability'));
-echo '<p id="intro">', get_string('intro', 'tool_capability') , '</p>';
-echo '<p><label for="menucapability"> ' . get_string('capabilitylabel', 'tool_capability') . '</label></p>';
-echo  html_writer::select($capabilitychoices, 'capability', $capability, array(''=>'choose'), array('size'=>10));
-echo '<p><label for="menuroles"> ' . get_string('roleslabel', 'tool_capability') . '</label></p>';
-echo  html_writer::select($rolechoices, 'roles[]', $selectedroleids, false, array('size'=>10, 'multiple'=>'multiple'));
-echo '<p><input type="submit" id="settingssubmit" value="' . get_string('getreport', 'tool_capability') . '" /></p>';
-echo '</div></form>';
-echo $OUTPUT->box_end();
+$form = new tool_capability_settings_form(null, array(
+    'capabilities' => $capabilitychoices,
+    'roles' => $rolechoices
+));
+$PAGE->requires->yui_module(
+    'moodle-tool_capability-search',
+    'M.tool_capability.init_capability_search',
+    array(array('strsearch' => get_string('search')))
+);
 
-// If we have a capability, generate the report.
-if ($capability) {
-
-    // Work out the bits needed for the SQL WHERE clauses.
-    $params = array($capability);
-    $sqlroletest = '';
-    if (count($cleanedroleids) != count($allroles)) {
-        list($sqlroletest, $roleparams) = $DB->get_in_or_equal($cleanedroleids);
-        $params = array_merge($params, $roleparams);
-        $sqlroletest = 'AND roleid ' . $sqlroletest;
-    }
+// Log.
+$capabilities = array();
+$rolestoshow = array();
+$roleids = array('0');
+$cleanedroleids = array();
+if ($data = $form->get_data()) {
 
-    // Get all the role_capabilities rows for this capability - that is, all
-    // role definitions, and all role overrides.
-    $rolecaps = $DB->get_records_sql("
-            SELECT id, roleid, contextid, permission
-            FROM {role_capabilities}
-            WHERE capability = ? $sqlroletest", $params);
-
-    // In order to display a nice tree of contexts, we need to get all the
-    // ancestors of all the contexts in the query we just did.
-    $relevantpaths = $DB->get_records_sql_menu("
-            SELECT DISTINCT con.path, 1
-            FROM {context} con JOIN {role_capabilities} rc ON rc.contextid = con.id
-            WHERE capability = ? $sqlroletest", $params);
-    $requiredcontexts = array($systemcontext->id);
-    foreach ($relevantpaths as $path => $notused) {
-        $requiredcontexts = array_merge($requiredcontexts, explode('/', trim($path, '/')));
+    $roleids = array();
+    if (!empty($data->roles)) {
+        $roleids = $data->roles;
     }
-    $requiredcontexts = array_unique($requiredcontexts);
-
-    // Now load those contexts.
-    list($sqlcontexttest, $contextparams) = $DB->get_in_or_equal($requiredcontexts);
-    $contexts = get_sorted_contexts('ctx.id ' . $sqlcontexttest, $contextparams);
 
-    // Prepare some empty arrays to hold the data we are about to compute.
-    foreach ($contexts as $conid => $con) {
-        $contexts[$conid]->children = array();
-        $contexts[$conid]->rolecapabilities = array();
+    $capabilities = array();
+    if (!empty($data->capability)) {
+        $capabilities = $data->capability;
     }
 
-    // Put the contexts into a tree structure.
-    foreach ($contexts as $conid => $con) {
-        $context = context::instance_by_id($conid);
-        $parentcontextid = get_parent_contextid($context);
-        if ($parentcontextid) {
-            $contexts[$parentcontextid]->children[] = $conid;
+    if (in_array('0', $roleids)) {
+        $rolestoshow = $allroles;
+    } else {
+        $cleanedroleids = array_intersect(array_keys($allroles), $roleids);
+        if (count($cleanedroleids) === 0) {
+            $rolestoshow = $allroles;
+        } else {
+            foreach ($cleanedroleids as $id) {
+                $rolestoshow[$id] = $allroles[$id];
+            }
         }
     }
+}
 
-    // Put the role capabilities into the context tree.
-    foreach ($rolecaps as $rolecap) {
-        $contexts[$rolecap->contextid]->rolecapabilities[$rolecap->roleid] = $rolecap->permission;
-    }
+add_to_log(SITEID, "admin", "tool capability", "tool/capability/index.php", count($capabilities));
 
-    // Fill in any missing rolecaps for the system context.
-    foreach ($cleanedroleids as $roleid) {
-        if (!isset($contexts[$systemcontext->id]->rolecapabilities[$roleid])) {
-            $contexts[$systemcontext->id]->rolecapabilities[$roleid] = CAP_INHERIT;
-        }
-    }
+$renderer = $PAGE->get_renderer('tool_capability');
 
-    // Print the report heading.
-    echo $OUTPUT->heading(get_string('reportforcapability', 'tool_capability', get_capability_string($capability)), 2, 'main', 'report');
-    if (count($cleanedroleids) != count($allroles)) {
-        $rolenames = array();
-        foreach ($cleanedroleids as $roleid) {
-            $rolenames[] = $allroles[$roleid]->localname;
-        }
-        echo '<p>', get_string('forroles', 'tool_capability', implode(', ', $rolenames)), '</p>';
-    }
+echo $OUTPUT->header();
+
+$form->display();
 
-    // Now, recursively print the contexts, and the role information.
-    print_report_tree($systemcontext->id, $contexts, $allroles);
+// If we have a capability, generate the report.
+if (count($capabilities) && count($rolestoshow)) {
+    /* @var tool_capability_renderer $renderer */
+    echo $renderer->capability_comparison_table($capabilities, $context->id, $rolestoshow);
 }
 
 // Footer.
@@ -190,7 +125,7 @@ function print_report_tree($contextid, $contexts, $allroles) {
 
     // Start the list item, and print the context name as a link to the place to
     // make changes.
-    if ($contextid == get_system_context()->id) {
+    if ($contextid == context_system::instance()->id) {
         $url = "$CFG->wwwroot/$CFG->admin/roles/manage.php";
         $title = get_string('changeroles', 'tool_capability');
     } else {
index bae923f..3862006 100644 (file)
@@ -17,8 +17,7 @@
 /**
  * Strings for component 'tool_capability', language 'en', branch 'MOODLE_22_STABLE'
  *
- * @package    tool
- * @subpackage capability
+ * @package    tool_capability
  * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
diff --git a/admin/tool/capability/locallib.php b/admin/tool/capability/locallib.php
new file mode 100644 (file)
index 0000000..08cd8b3
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Functions used by the capability tool.
+ *
+ * @package    tool_capability
+ * @copyright  2013 Sam Hemelryk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * Calculates capability data organised by context for the given roles.
+ *
+ * @param string $capability The capability to get data for.
+ * @param array $roles An array of roles to get data for.
+ * @return context[] An array of contexts.
+ */
+function tool_capability_calculate_role_data($capability, array $roles) {
+    global $DB;
+
+    $systemcontext = context_system::instance();
+    $roleids = array_keys($roles);
+
+    // Work out the bits needed for the SQL WHERE clauses.
+    $params = array($capability);
+    list($sqlroletest, $roleparams) = $DB->get_in_or_equal($roleids);
+    $params = array_merge($params, $roleparams);
+    $sqlroletest = 'AND roleid ' . $sqlroletest;
+
+    // Get all the role_capabilities rows for this capability - that is, all
+    // role definitions, and all role overrides.
+    $sql = 'SELECT id, roleid, contextid, permission
+              FROM {role_capabilities}
+             WHERE capability = ? '.$sqlroletest;
+    $rolecaps = $DB->get_records_sql($sql, $params);
+
+    // In order to display a nice tree of contexts, we need to get all the
+    // ancestors of all the contexts in the query we just did.
+    $sql = 'SELECT DISTINCT con.path, 1
+              FROM {context} con
+              JOIN {role_capabilities} rc ON rc.contextid = con.id
+             WHERE capability = ? '.$sqlroletest;
+    $relevantpaths = $DB->get_records_sql_menu($sql, $params);
+    $requiredcontexts = array($systemcontext->id);
+    foreach ($relevantpaths as $path => $notused) {
+        $requiredcontexts = array_merge($requiredcontexts, explode('/', trim($path, '/')));
+    }
+    $requiredcontexts = array_unique($requiredcontexts);
+
+    // Now load those contexts.
+    list($sqlcontexttest, $contextparams) = $DB->get_in_or_equal($requiredcontexts);
+    $contexts = get_sorted_contexts('ctx.id ' . $sqlcontexttest, $contextparams);
+
+    // Prepare some empty arrays to hold the data we are about to compute.
+    foreach ($contexts as $conid => $con) {
+        $contexts[$conid]->children = array();
+        $contexts[$conid]->rolecapabilities = array();
+    }
+
+    // Put the contexts into a tree structure.
+    foreach ($contexts as $conid => $con) {
+        $context = context::instance_by_id($conid);
+        $parentcontext = $context->get_parent_context();
+        if ($parentcontext) {
+            $contexts[$parentcontext->id]->children[] = $conid;
+        }
+    }
+
+    // Put the role capabilities into the context tree.
+    foreach ($rolecaps as $rolecap) {
+        $contexts[$rolecap->contextid]->rolecapabilities[$rolecap->roleid] = $rolecap->permission;
+    }
+
+    // Fill in any missing rolecaps for the system context.
+    foreach ($roleids as $roleid) {
+        if (!isset($contexts[$systemcontext->id]->rolecapabilities[$roleid])) {
+            $contexts[$systemcontext->id]->rolecapabilities[$roleid] = CAP_INHERIT;
+        }
+    }
+
+    return $contexts;
+}
\ No newline at end of file
diff --git a/admin/tool/capability/module.js b/admin/tool/capability/module.js
deleted file mode 100644 (file)
index 254f194..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-
-M.tool_capability = {
-    select: null,
-    input: null,
-    button: null,
-
-    init: function(Y, strsearch) {
-        var context = M.tool_capability;
-
-        // Find the form controls.
-        context.select = document.getElementById('menucapability');
-        context.button = document.getElementById('settingssubmit');
-
-        // Create a div to hold the search UI.
-        var div = document.createElement('div');
-        div.id = 'capabilitysearchui';
-
-        // Find the capability search input.
-        var input = document.createElement('input');
-        input.type = 'text';
-        input.id = 'capabilitysearch';
-        context.input = input;
-
-        // Create a label for the search input.
-        var label = document.createElement('label');
-        label.htmlFor = input.id;
-        label.appendChild(document.createTextNode(strsearch + ' '));
-
-        // Tie it all together
-        div.appendChild(label);
-        div.appendChild(input);
-        context.select.parentNode.insertBefore(div, context.select);
-        Y.on('keyup', context.typed, input);
-        Y.on('change', context.validate, context.select);
-        context.select.options[0].style.display = 'none';
-        context.validate();
-    },
-
-    typed: function() {
-        var context = M.tool_capability;
-
-        var filtertext = context.input.value;
-        var options = context.select.options;
-        var onlycapability = -1;
-        for (var i = 1; i < options.length; i++) {
-            if (options[i].text.indexOf(filtertext) >= 0) {
-                options[i].disabled = false;
-                options[i].style.display = 'block';
-                if (onlycapability == -1) {
-                    onlycapability = i;
-                } else {
-                    onlycapability = -2;
-                }
-            } else {
-                options[i].disabled = true;
-                options[i].selected = false;
-                options[i].style.display = 'none';
-            }
-        }
-        if (onlycapability >= 0) {
-            options[onlycapability].selected = true;
-        }
-        if (onlycapability == -1) {
-            context.input.className = "error";
-        } else {
-            context.input.className = "";
-        }
-        context.validate();
-    },
-
-    validate: function() {
-        var context = M.tool_capability;
-        context.button.disabled = (context.select.value == '');
-    }
-}
\ No newline at end of file
diff --git a/admin/tool/capability/renderer.php b/admin/tool/capability/renderer.php
new file mode 100644 (file)
index 0000000..586725a
--- /dev/null
@@ -0,0 +1,136 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Capability tool renderer.
+ *
+ * @package    tool_capability
+ * @copyright  2013 Sam Hemelryk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+/**
+ * The primary renderer for the capability tool.
+ *
+ * @copyright  2013 Sam Hemelryk
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class tool_capability_renderer extends plugin_renderer_base {
+
+    /**
+     * Returns an array of permission strings.
+     *
+     * @return lang_string[]
+     */
+    protected function get_permission_strings() {
+        static $strpermissions;
+        if (!$strpermissions) {
+            $strpermissions = array(
+                CAP_INHERIT => new lang_string('inherit', 'role'),
+                CAP_ALLOW => new lang_string('allow', 'role'),
+                CAP_PREVENT => new lang_string('prevent', 'role'),
+                CAP_PROHIBIT => new lang_string('prohibit', 'role')
+            );
+        }
+        return $strpermissions;
+    }
+
+    /**
+     * Returns an array of permission CSS classes.
+     *
+     * @return string[]
+     */
+    protected function get_permission_classes() {
+        static $permissionclasses;
+        if (!$permissionclasses) {
+            $permissionclasses = array(
+                CAP_INHERIT => 'inherit',
+                CAP_ALLOW => 'allow',
+                CAP_PREVENT => 'prevent',
+                CAP_PROHIBIT => 'prohibit',
+            );
+        }
+        return $permissionclasses;
+    }
+
+    /**
+     * Produces a table to visually compare roles and capabilities.
+     *
+     * @param array $capabilities An array of capabilities to show comparison for.
+     * @param int $contextid The context we are displaying for.
+     * @param array $roles An array of roles to show comparison for.
+     * @return string
+     */
+    public function capability_comparison_table(array $capabilities, $contextid, array $roles) {
+
+        $strpermissions = $this->get_permission_strings();
+        $permissionclasses = $this->get_permission_classes();
+
+        if ($contextid === context_system::instance()->id) {
+            $strpermissions[CAP_INHERIT] = new lang_string('notset', 'role');
+        }
+
+        $table = new html_table();
+        $table->attributes['class'] = 'comparisontable';
+        $table->head = array('&nbsp;');
+        foreach ($roles as $role) {
+            $url = new moodle_url('/admin/roles/override.php', array('contextid' => $contextid, 'roleid' => $role->id));
+            $table->head[] = html_writer::div(html_writer::link($url, $role->localname));
+        }
+        $table->data = array();
+
+        foreach ($capabilities as $capability) {
+            $contexts = tool_capability_calculate_role_data($capability, $roles);
+            $captitle = new html_table_cell(get_capability_string($capability) . html_writer::span($capability));
+            $captitle->header = true;
+
+            $row = new html_table_row(array($captitle));
+
+            foreach ($roles as $role) {
+                if (isset($contexts[$contextid]->rolecapabilities[$role->id])) {
+                    $permission = $contexts[$contextid]->rolecapabilities[$role->id];
+                } else {
+                    $permission = CAP_INHERIT;
+                }
+                $cell = new html_table_cell($strpermissions[$permission]);
+                $cell->attributes['class'] = $permissionclasses[$permission];
+                $row->cells[] = $cell;
+            }
+
+            $table->data[] = $row;
+        }
+
+        // Start the list item, and print the context name as a link to the place to make changes.
+        if ($contextid == context_system::instance()->id) {
+            $url = new moodle_url('/admin/roles/manage.php');
+            $title = get_string('changeroles', 'tool_capability');
+        } else {
+            $url = new moodle_url('/admin/roles/override.php', array('contextid' => $contextid));
+            $title = get_string('changeoverrides', 'tool_capability');
+        }
+        $context = context::instance_by_id($contextid);
+        $html = $this->output->heading(html_writer::link($url, $context->get_context_name(), array('title' => $title)), 3);
+        $html .= html_writer::table($table);
+        // If there are any child contexts, print them recursively.
+        if (!empty($contexts[$contextid]->children)) {
+            foreach ($contexts[$contextid]->children as $childcontextid) {
+                $html .= $this->capability_comparison_table($capabilities, $childcontextid, $roles, true);
+            }
+        }
+        return $html;
+    }
+
+}
\ No newline at end of file
index bf4d6ad..ba8d551 100644 (file)
 /**
  * Capability overview settings
  *
- * @package    tool
- * @subpackage capability
+ * @package    tool_capability
  * @copyright  2008 Tim Hunt
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die;
 
-$ADMIN->add('roles', new admin_externalpage('toolcapability', get_string('pluginname', 'tool_capability'), "$CFG->wwwroot/$CFG->admin/tool/capability/index.php",'moodle/role:manage'));
+$ADMIN->add('roles', new admin_externalpage(
+    'toolcapability',
+    get_string('pluginname', 'tool_capability'),
+    "$CFG->wwwroot/$CFG->admin/tool/capability/index.php",
+    'moodle/role:manage'
+));
diff --git a/admin/tool/capability/styles.css b/admin/tool/capability/styles.css
new file mode 100644 (file)
index 0000000..757066e
--- /dev/null
@@ -0,0 +1,32 @@
+.path-admin-tool-capability .comparisontable {margin-top:150px;}
+.path-admin-tool-capability .comparisontable th,
+.path-admin-tool-capability .comparisontable td {vertical-align:middle;padding:0.4em 0.5em 0.3em;}
+.path-admin-tool-capability .comparisontable thead th {vertical-align:bottom;background:none;}
+.path-admin-tool-capability .comparisontable thead th div {position:relative;}
+.path-admin-tool-capability .comparisontable thead th div > a {
+    position:absolute;
+    top:-1.75em;
+    left:1em;
+    width:150px;
+    text-align:left;
+    margin-bottom:1em;
+    text-indent:-1.45em;
+
+    -webkit-transform-origin: top left;
+    -moz-transform-origin:    top left;
+    -ms-transform-origin:     top left;
+    -o-transform-origin:      top left;
+
+    -webkit-transform: rotate(315deg);
+    -moz-transform:    rotate(315deg);
+    -ms-transform:     rotate(315deg);
+    -o-transform:      rotate(315deg);
+}
+.path-admin-tool-capability .comparisontable tbody th {background-color:#EEE;text-align:right;border:1px solid #DFDFDF;}
+.path-admin-tool-capability .comparisontable tbody th span {display:block;color:#666;font-size:80%;}
+.path-admin-tool-capability .comparisontable tbody td {border:1px solid #DFDFDF;}
+
+.path-admin-tool-capability .comparisontable .inherit {color:#666;}
+.path-admin-tool-capability .comparisontable .allow {color:#006600;font-weight:bold;}
+.path-admin-tool-capability .comparisontable .prevent {color:#ad6704;font-weight:bold;}
+.path-admin-tool-capability .comparisontable .prohibit {color:#880000;font-weight:bold;}
\ No newline at end of file
index e14328a..4ada1ea 100644 (file)
 /**
  * Version details.
  *
- * @package    tool
- * @subpackage capability
+ * @package    tool_capability
  * @copyright  2011 Petr Skoda
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2013050100; // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2013050100; // Requires this Moodle version
-$plugin->component = 'tool_capability'; // Full name of the plugin (used for diagnostics)
+$plugin->version   = 2013050100; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->requires  = 2013050100; // Requires this Moodle version.
+$plugin->component = 'tool_capability'; // Full name of the plugin (used for diagnostics).
diff --git a/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-debug.js b/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-debug.js
new file mode 100644 (file)
index 0000000..f0661d5
Binary files /dev/null and b/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-debug.js differ
diff --git a/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-min.js b/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-min.js
new file mode 100644 (file)
index 0000000..0153975
Binary files /dev/null and b/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search-min.js differ
diff --git a/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search.js b/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search.js
new file mode 100644 (file)
index 0000000..f0661d5
Binary files /dev/null and b/admin/tool/capability/yui/build/moodle-tool_capability-search/moodle-tool_capability-search.js differ
diff --git a/admin/tool/capability/yui/src/search/build.json b/admin/tool/capability/yui/src/search/build.json
new file mode 100644 (file)
index 0000000..2157889
--- /dev/null
@@ -0,0 +1,10 @@
+{
+    "name": "moodle-tool_capability-search",
+    "builds": {
+        "moodle-tool_capability-search": {
+            "jsfiles": [
+                "search.js"
+            ]
+        }
+    }
+}
diff --git a/admin/tool/capability/yui/src/search/js/search.js b/admin/tool/capability/yui/src/search/js/search.js
new file mode 100644 (file)
index 0000000..5e9dc34
--- /dev/null
@@ -0,0 +1,159 @@
+/**
+ * This file contains the capability overview search functionality.
+ *
+ * @module moodle-tool_capability-search
+ */
+
+/**
+ * Constructs a new capability search manager.
+ *
+ * @namespace M.tool_capability.search
+ * @class Search
+ * @constructor
+ * @extends Y.Base
+ */
+var SEARCH = function() {
+    SEARCH.superclass.constructor.apply(this, arguments);
+};
+SEARCH.prototype = {
+    /**
+     * The search form.
+     * @property form
+     * @type Node
+     * @protected
+     */
+    form : null,
+    /**
+     * The capability select node.
+     * @property select
+     * @type Node
+     * @protected
+     */
+    select: null,
+    /**
+     * An associative array of search option. Populated from the select node above during initialisation.
+     * @property selectoptions
+     * @type Object
+     * @protected
+     */
+    selectoptions : {},
+    /**
+     * The search input field.
+     * @property input
+     * @type Node
+     * @protected
+     */
+    input: null,
+    /**
+     * The submit button for the form.
+     * @property button
+     * @type Node
+     * @protected
+     */
+    button: null,
+    /**
+     * The last search node if there is one.
+     * If there is a last search node then the last search term will be persisted between requests.
+     * @property lastsearch
+     * @type Node
+     * @protected
+     */
+    lastsearch : null,
+    /**
+     * Constructs the search manager.
+     * @method initializer
+     */
+    initializer : function() {
+        this.form = Y.one('#capability-overview-form');
+        this.select = this.form.one('select[data-search=capability]');
+        this.select.setStyle('minWidth', this.select.get('offsetWidth'));
+        this.select.get('options').each(function(option) {
+            var capability = option.get('value');
+            this.selectoptions[capability] = option;
+        }, this);
+        this.button = this.form.all('input[type=submit]');
+        this.lastsearch = this.form.one('input[name=search]');
+
+        var div = Y.Node.create('<div id="capabilitysearchui"></div>'),
+            label = Y.Node.create('<label for="capabilitysearch">'+this.get('strsearch')+'</label>');
+        this.input = Y.Node.create('<input type="text" id="capabilitysearch" />');
+
+        div.append(label).append(this.input);
+
+        this.select.insert(div, 'before');
+        this.select.one('option').setStyle('display', 'none');
+
+        this.input.on('keyup', this.typed, this);
+        this.select.on('change', this.validate, this);
+
+        if (this.lastsearch) {
+            this.input.set('value', this.lastsearch.get('value'));
+            this.typed();
+            if (this.select.one('option[selected]')) {
+                this.select.set('scrollTop', this.select.one('option[selected]').get('getX'));
+            }
+        }
+
+        this.validate();
+    },
+    /**
+     * Disables the submit button if there are no capabilities selected.
+     * @method validate
+     */
+    validate : function() {
+        this.button.set('disabled', (this.select.get('value') === ''));
+    },
+    /**
+     * Called when ever the user types into the search field.
+     * This method hides any capabilities that don't match the search term.
+     * @method typed
+     */
+    typed : function() {
+        var search = this.input.get('value'),
+            matching = 0,
+            last = null,
+            capability;
+        if (this.lastsearch) {
+            this.lastsearch.set('value', search);
+        }
+        this.select.all('option').remove();
+        for (capability in this.selectoptions) {
+            if (capability.indexOf(search) >= 0) {
+                matching++;
+                this.select.append(this.selectoptions[capability]);
+            }
+        }
+        if (matching === 0) {
+            this.input.addClass("error");
+        } else {
+            this.input.removeClass("error");
+            if (matching === 1) {
+                last.set('selected', true);
+            }
+        }
+        this.validate();
+    }
+};
+Y.extend(SEARCH, Y.Base, SEARCH.prototype, {
+    NAME : 'tool_capability-search',
+    ATTRS : {
+        strsearch : {}
+    }
+});
+
+/**
+ * Core namespace.
+ * @static
+ * @class tool_capability
+ */
+M.tool_capability = M.tool_capability || {};
+
+/**
+ * Initialises capability search functionality.
+ * @static
+ * @method init_capability_search
+ * @param {Object} options
+ */
+M.tool_capability.init_capability_search = function(options) {
+    new SEARCH(options);
+};
\ No newline at end of file
diff --git a/admin/tool/capability/yui/src/search/meta/search.json b/admin/tool/capability/yui/src/search/meta/search.json
new file mode 100644 (file)
index 0000000..720e20b
--- /dev/null
@@ -0,0 +1,8 @@
+{
+    "moodle-tool_capability-search": {
+        "requires": [
+            "base",
+            "node"
+        ]
+    }
+}
index 57d3859..6aaec2f 100644 (file)
@@ -26,7 +26,7 @@ require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php');
 require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/filter_form.php');
 
 require_login(SITEID, false);
-require_capability('tool/customlang:edit', get_system_context());
+require_capability('tool/customlang:edit', context_system::instance());
 
 $lng                    = required_param('lng', PARAM_LANG);
 $currentpage            = optional_param('p', 0, PARAM_INT);
index 28dae19..aff45ef 100644 (file)
@@ -30,7 +30,7 @@ require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php');
 require_once($CFG->libdir.'/adminlib.php');
 
 require_login(SITEID, false);
-require_capability('tool/customlang:view', get_system_context());
+require_capability('tool/customlang:view', context_system::instance());
 
 $action  = optional_param('action', '', PARAM_ALPHA);
 $confirm = optional_param('confirm', false, PARAM_BOOL);
@@ -42,7 +42,7 @@ $langs = get_string_manager()->get_list_of_translations();
 // pre-output actions
 if ($action === 'checkout') {
     require_sesskey();
-    require_capability('tool/customlang:edit', get_system_context());
+    require_capability('tool/customlang:edit', context_system::instance());
     if (empty($lng)) {
         print_error('missingparameter');
     }
@@ -66,7 +66,7 @@ if ($action === 'checkout') {
 
 if ($action === 'checkin') {
     require_sesskey();
-    require_capability('tool/customlang:edit', get_system_context());
+    require_capability('tool/customlang:edit', context_system::instance());
     if (empty($lng)) {
         print_error('missingparameter');
     }
@@ -119,7 +119,7 @@ if ($numofmodified != 0) {
 }
 
 $menu = array();
-if (has_capability('tool/customlang:edit', get_system_context())) {
+if (has_capability('tool/customlang:edit', context_system::instance())) {
     $menu['checkout'] = array(
         'title'     => get_string('checkout', 'tool_customlang'),
         'url'       => new moodle_url($PAGE->url, array('action' => 'checkout', 'lng' => $lng)),
index 577fefc..f77c8e0 100644 (file)
@@ -39,7 +39,7 @@ if (!debugging('', DEBUG_DEVELOPER)) {
 }
 
 $PAGE->set_url('/admin/tool/generator/index.php');
-$PAGE->set_context(get_system_context());
+$PAGE->set_context(context_system::instance());
 $PAGE->set_pagelayout('base');
 $generator = new generator_web();
 $generator->setup();
index ad0e4bd..97578b8 100644 (file)
@@ -48,13 +48,13 @@ YUI.add('moodle-tool_installaddon-permcheck', function(Y) {
                         var resultline = Y.one('#tool_installaddon_installfromzip_permcheck');
                         if (resultline) {
                             if (status === 'success') {
-                                resultline.setContent('<span class="success"><img src="' + M.util.image_url('i/tick_green_big') + '" /> ' +
+                                resultline.setContent('<span class="success"><img src="' + M.util.image_url('i/valid') + '" /> ' +
                                     msg + '</span>');
                             } else if (status === 'progress') {
                                 resultline.setContent('<span class="progress"><img src="' + M.cfg.loadingicon + '" /> ' +
                                     msg + '</span>');
                             } else {
-                                resultline.setContent('<span class="error"><img src="' + M.util.image_url('i/cross_red_big') + '" /> ' +
+                                resultline.setContent('<span class="error"><img src="' + M.util.image_url('i/invalid') + '" /> ' +
                                     msg + '</span>');
                             }
                         }
index bf026a4..a3d875d 100644 (file)
@@ -26,6 +26,12 @@ if (isset($_SERVER['REMOTE_ADDR'])) {
     die; // no access from web!
 }
 
+// Force OPcache reset if used, we do not want any stale caches
+// when preparing test environment.
+if (function_exists('opcache_reset')) {
+    opcache_reset();
+}
+
 require_once(__DIR__.'/../../../../lib/clilib.php');
 require_once(__DIR__.'/../../../../lib/phpunit/bootstraplib.php');
 require_once(__DIR__.'/../../../../lib/testing/lib.php');
index c6d2f36..f010f72 100644 (file)
@@ -61,7 +61,7 @@ if ($action === 'delete') {
     //show confirmation
     echo $OUTPUT->header();
     $yesurl = new moodle_url($PAGE->url, array('roleid'=>$roleid, 'contextlevel'=>$contextlevel, 'action'=>'delete', 'confirm'=>1, 'sesskey'=>sesskey()));
-    $levelname = get_contextlevel_name($contextlevel);
+    $levelname = context_helper::get_level_name($contextlevel);
     $rolename = format_string($role->name);
     $message = get_string('confirmdelete', 'tool_unsuproles', array('level'=>$levelname, 'role'=>$rolename));
     echo $OUTPUT->confirm($message, $yesurl, $PAGE->url);
@@ -96,7 +96,7 @@ if (!$problems) {
     $roles = get_all_roles();
     $data = array();
     foreach ($problems as $problem) {
-        $levelname = get_contextlevel_name($problem->contextlevel);
+        $levelname = context_helper::get_level_name($problem->contextlevel);
         $rolename = role_get_name($roles[$problem->roleid]);
         //TODO: show list of users if count low
         $count = $problem->racount;
index be72d51..deb6143 100644 (file)
@@ -68,8 +68,10 @@ if (count($cohorts) < 2) {
 }
 
 $countries = get_string_manager()->get_list_of_countries(true);
+$namefields = get_all_user_name_fields(true);
 foreach ($users as $key => $id) {
-    $user = $DB->get_record('user', array('id'=>$id, 'deleted'=>0), 'id, firstname, lastname, username, email, country, lastaccess, city');
+    $user = $DB->get_record('user', array('id'=>$id, 'deleted'=>0), 'id, ' . $namefields . ', username,
+            email, country, lastaccess, city');
     $user->fullname = fullname($user, true);
     $user->country = @$countries[$user->country];
     unset($user->firstname);
index 1e8514a..44259df 100644 (file)
@@ -24,8 +24,9 @@ echo $OUTPUT->header();
 
 $countries = get_string_manager()->get_list_of_countries(true);
 
+$namefields = get_all_user_name_fields(true);
 foreach ($users as $key => $id) {
-    $user = $DB->get_record('user', array('id'=>$id), 'id, firstname, lastname, username, email, country, lastaccess, city');
+    $user = $DB->get_record('user', array('id'=>$id), 'id, ' . $namefields . ', username, email, country, lastaccess, city');
     $user->fullname = fullname($user, true);
     $user->country = @$countries[$user->country];
     unset($user->firstname);
index 314e5be..e9d82b7 100644 (file)
@@ -61,6 +61,15 @@ if (!defined('AUTH_NTLM_VALID_DOMAINNAME')) {
 if (!defined('AUTH_NTLM_DEFAULT_FORMAT')) {
     define('AUTH_NTLM_DEFAULT_FORMAT', '%domain%\\%username%');
 }
+if (!defined('AUTH_NTLM_FASTPATH_ATTEMPT')) {
+    define('AUTH_NTLM_FASTPATH_ATTEMPT', 0);
+}
+if (!defined('AUTH_NTLM_FASTPATH_YESFORM')) {
+    define('AUTH_NTLM_FASTPATH_YESFORM', 1);
+}
+if (!defined('AUTH_NTLM_FASTPATH_YESATTEMPT')) {
+    define('AUTH_NTLM_FASTPATH_YESATTEMPT', 2);
+}
 
 // Allows us to retrieve a diagnostic message in case of LDAP operation error
 if (!defined('LDAP_OPT_DIAGNOSTIC_MESSAGE')) {
@@ -747,39 +756,57 @@ class auth_plugin_ldap extends auth_plugin_base {
 /// User removal
         // Find users in DB that aren't in ldap -- to be removed!
         // this is still not as scalable (but how often do we mass delete?)
-        if ($this->config->removeuser != AUTH_REMOVEUSER_KEEP) {
-            $sql = 'SELECT u.*
+
+        if ($this->config->removeuser == AUTH_REMOVEUSER_FULLDELETE) {
+            $sql = "SELECT u.*
                       FROM {user} u
-                      LEFT JOIN {tmp_extuser} e ON (u.username = e.username AND u.mnethostid = e.mnethostid)
-                     WHERE u.auth = ?
+                 LEFT JOIN {tmp_extuser} e ON (u.username = e.username AND u.mnethostid = e.mnethostid)
+                     WHERE u.auth = :auth
                            AND u.deleted = 0
-                           AND e.username IS NULL';
-            $remove_users = $DB->get_records_sql($sql, array($this->authtype));
+                           AND e.username IS NULL";
+            $remove_users = $DB->get_records_sql($sql, array('auth'=>$this->authtype));
 
             if (!empty($remove_users)) {
                 print_string('userentriestoremove', 'auth_ldap', count($remove_users));
-
                 foreach ($remove_users as $user) {
-                    if ($this->config->removeuser == AUTH_REMOVEUSER_FULLDELETE) {
-                        if (delete_user($user)) {
-                            echo "\t"; print_string('auth_dbdeleteuser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
-                        } else {
-                            echo "\t"; print_string('auth_dbdeleteusererror', 'auth_db', $user->username); echo "\n";
-                        }
-                    } else if ($this->config->removeuser == AUTH_REMOVEUSER_SUSPEND) {
-                        $updateuser = new stdClass();
-                        $updateuser->id = $user->id;
-                        $updateuser->auth = 'nologin';
-                        $DB->update_record('user', $updateuser);
-                        echo "\t"; print_string('auth_dbsuspenduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
-                        $euser = $DB->get_record('user', array('id' => $user->id));
-                        events_trigger('user_updated', $euser);
+                    if (delete_user($user)) {
+                        echo "\t"; print_string('auth_dbdeleteuser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
+                    } else {
+                        echo "\t"; print_string('auth_dbdeleteusererror', 'auth_db', $user->username); echo "\n";
                     }
                 }
             } else {
                 print_string('nouserentriestoremove', 'auth_ldap');
             }
-            unset($remove_users); // free mem!
+            unset($remove_users); // Free mem!
+
+        } else if ($this->config->removeuser == AUTH_REMOVEUSER_SUSPEND) {
+            $sql = "SELECT u.*
+                      FROM {user} u
+                 LEFT JOIN {tmp_extuser} e ON (u.username = e.username AND u.mnethostid = e.mnethostid)
+                     WHERE u.auth = :auth
+                           AND u.deleted = 0
+                           AND u.suspended = 0
+                           AND e.username IS NULL";
+            $remove_users = $DB->get_records_sql($sql, array('auth'=>$this->authtype));
+
+            if (!empty($remove_users)) {
+                print_string('userentriestoremove', 'auth_ldap', count($remove_users));
+
+                foreach ($remove_users as $user) {
+                    $updateuser = new stdClass();
+                    $updateuser->id = $user->id;
+                    $updateuser->suspended = 1;
+                    $DB->update_record('user', $updateuser);
+                    echo "\t"; print_string('auth_dbsuspenduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
+                    $euser = $DB->get_record('user', array('id' => $user->id));
+                    events_trigger('user_updated', $euser);
+                    session_kill_user($user->id);
+                }
+            } else {
+                print_string('nouserentriestoremove', 'auth_ldap');
+            }
+            unset($remove_users); // Free mem!
         }
 
 /// Revive suspended users
@@ -787,8 +814,9 @@ class auth_plugin_ldap extends auth_plugin_base {
             $sql = "SELECT u.id, u.username
                       FROM {user} u
                       JOIN {tmp_extuser} e ON (u.username = e.username AND u.mnethostid = e.mnethostid)
-                     WHERE u.auth = 'nologin' AND u.deleted = 0";
-            $revive_users = $DB->get_records_sql($sql);
+                     WHERE (u.auth = 'nologin' OR (u.auth = ? AND u.suspended = 1)) AND u.deleted = 0";
+            // Note: 'nologin' is there for backwards compatibility.
+            $revive_users = $DB->get_records_sql($sql, array($this->authtype));
 
             if (!empty($revive_users)) {
                 print_string('userentriestorevive', 'auth_ldap', count($revive_users));
@@ -797,6 +825,7 @@ class auth_plugin_ldap extends auth_plugin_base {
                     $updateuser = new stdClass();
                     $updateuser->id = $user->id;
                     $updateuser->auth = $this->authtype;
+                    $updateuser->suspended = 0;
                     $DB->update_record('user', $updateuser);
                     echo "\t"; print_string('auth_dbreviveduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
                     $euser = $DB->get_record('user', array('id' => $user->id));
@@ -914,7 +943,7 @@ class auth_plugin_ldap extends auth_plugin_base {
 
                 $id = $DB->insert_record('user', $user);
                 echo "\t"; print_string('auth_dbinsertuser', 'auth_db', array('name'=>$user->username, 'id'=>$id)); echo "\n";
-                $euser = $DB->get_record('user', array('id' => $user->id));
+                $euser = $DB->get_record('user', array('id' => $id));
                 events_trigger('user_created', $euser);
                 if (!empty($this->config->forcechangepassword)) {
                     set_user_preference('auth_forcepasswordchange', 1, $id);
@@ -1606,17 +1635,17 @@ class auth_plugin_ldap extends auth_plugin_base {
             }
 
             // Now start the whole NTLM machinery.
-            if(!empty($this->config->ntlmsso_ie_fastpath)) {
-                // Shortcut for IE browsers: skip the attempt page
+            if($this->config->ntlmsso_ie_fastpath == AUTH_NTLM_FASTPATH_YESATTEMPT ||
+                $this->config->ntlmsso_ie_fastpath == AUTH_NTLM_FASTPATH_YESFORM) {
+
                 if(check_browser_version('MSIE')) {
                     $sesskey = sesskey();
                     redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_magic.php?sesskey='.$sesskey);
-                } else {
+                } else if ($this->config->ntlmsso_ie_fastpath == AUTH_NTLM_FASTPATH_YESFORM) {
                     redirect($CFG->httpswwwroot.'/login/index.php?authldap_skipntlmsso=1');
                 }
-            } else {
-                redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_attempt.php');
             }
+            redirect($CFG->wwwroot.'/auth/ldap/ntlmsso_attempt.php');
         }
 
         // No NTLM SSO, Use the normal login page instead.
index f23886a..0b5de31 100644 (file)
@@ -106,6 +106,10 @@ if (!isset($config->ntlmsso_remoteuserformat)) {
 
 $yesno = array(get_string('no'), get_string('yes'));
 
+$fastpathoptions = array(AUTH_NTLM_FASTPATH_YESFORM => get_string('auth_ntlmsso_ie_fastpath_yesform', 'auth_ldap'),
+                         AUTH_NTLM_FASTPATH_YESATTEMPT => get_string('auth_ntlmsso_ie_fastpath_yesattempt', 'auth_ldap'),
+                         AUTH_NTLM_FASTPATH_ATTEMPT => get_string('auth_ntlmsso_ie_fastpath_attempt', 'auth_ldap'));
+
 $disabled = '';
 if (!ldap_paged_results_supported($config->ldap_version)) {
     $disabled = ' disabled="disabled"';
@@ -562,7 +566,7 @@ if (!ldap_paged_results_supported($config->ldap_version)) {
         <label for="menuntlmsso_ie_fastpath"><?php print_string('auth_ntlmsso_ie_fastpath_key', 'auth_ldap') ?></label>
     </td>
     <td>
-        <?php echo html_writer::select($yesno, 'ntlmsso_ie_fastpath', $config->ntlmsso_ie_fastpath, false); ?>
+        <?php echo html_writer::select($fastpathoptions, 'ntlmsso_ie_fastpath', $config->ntlmsso_ie_fastpath, false); ?>
     </td>
     <td>
     <?php print_string('auth_ntlmsso_ie_fastpath', 'auth_ldap') ?>
index 54c174b..34df891 100644 (file)
@@ -98,8 +98,11 @@ $string['auth_ldap_version_key'] = 'Version';
 $string['auth_ntlmsso'] = 'NTLM SSO';
 $string['auth_ntlmsso_enabled'] = 'Set to yes to attempt Single Sign On with the NTLM domain. <strong>Note:</strong> this requires additional setup on the webserver to work, see <a href="http://docs.moodle.org/en/NTLM_authentication">http://docs.moodle.org/en/NTLM_authentication</a>';
 $string['auth_ntlmsso_enabled_key'] = 'Enable';
-$string['auth_ntlmsso_ie_fastpath'] = 'Set to yes to enable the NTLM SSO fast path (bypasses certain steps and only works if the client\'s browser is MS Internet Explorer).';
+$string['auth_ntlmsso_ie_fastpath'] = 'Set to enable the NTLM SSO fast path (bypasses certain steps if the client\'s browser is MS Internet Explorer).';
 $string['auth_ntlmsso_ie_fastpath_key'] = 'MS IE fast path?';
+$string['auth_ntlmsso_ie_fastpath_yesform'] = 'Yes, all other browsers use standard login form';
+$string['auth_ntlmsso_ie_fastpath_yesattempt'] = 'Yes, attempt NTLM other browsers';
+$string['auth_ntlmsso_ie_fastpath_attempt'] = 'Attempt NTLM with all browsers';
 $string['auth_ntlmsso_maybeinvalidformat'] = 'Unable to extract the username from the REMOTE_USER header. Is the configured format right?';
 $string['auth_ntlmsso_missing_username'] = 'You need to specify at least %username% in the remote username format';
 $string['auth_ntlmsso_remoteuserformat_key'] = 'Remote username format';
similarity index 94%
rename from auth/ldap/tests/ldap_test.php
rename to auth/ldap/tests/plugin_test.php
index fdf3384..b468fde 100644 (file)
@@ -34,7 +34,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-class auth_ldap_testcase extends advanced_testcase {
+class auth_ldap_plugin_testcase extends advanced_testcase {
 
     public function test_auth_ldap() {
         global $CFG, $DB;
@@ -169,9 +169,9 @@ class auth_ldap_testcase extends advanced_testcase {
         $auth->sync_users(true);
         ob_end_clean();
 
-        $this->assertEquals(4, $DB->count_records('user', array('auth'=>'ldap')));
-        $this->assertEquals(1, $DB->count_records('user', array('auth'=>'nologin', 'username'=>'username1')));
-        $this->assertEquals(0, $DB->count_records('user', array('suspended'=>1)));
+        $this->assertEquals(5, $DB->count_records('user', array('auth'=>'ldap')));
+        $this->assertEquals(0, $DB->count_records('user', array('auth'=>'nologin', 'username'=>'username1')));
+        $this->assertEquals(1, $DB->count_records('user', array('auth'=>'ldap', 'suspended'=>'1', 'username'=>'username1')));
         $this->assertEquals(0, $DB->count_records('user', array('deleted'=>1)));
         $this->assertEquals(2, $DB->count_records('role_assignments'));
         $this->assertEquals(2, $DB->count_records('role_assignments', array('roleid'=>$creatorrole->id)));
@@ -188,6 +188,17 @@ class auth_ldap_testcase extends advanced_testcase {
         $this->assertEquals(2, $DB->count_records('role_assignments'));
         $this->assertEquals(2, $DB->count_records('role_assignments', array('roleid'=>$creatorrole->id)));
 
+        $DB->set_field('user', 'auth', 'nologin', array('username'=>'username1'));
+
+        ob_start();
+        $auth->sync_users(true);
+        ob_end_clean();
+
+        $this->assertEquals(5, $DB->count_records('user', array('auth'=>'ldap')));
+        $this->assertEquals(0, $DB->count_records('user', array('suspended'=>1)));
+        $this->assertEquals(0, $DB->count_records('user', array('deleted'=>1)));
+        $this->assertEquals(2, $DB->count_records('role_assignments'));
+        $this->assertEquals(2, $DB->count_records('role_assignments', array('roleid'=>$creatorrole->id)));
 
         set_config('removeuser', AUTH_REMOVEUSER_FULLDELETE, 'auth/ldap');
 
index db7328b..c1861fa 100644 (file)
@@ -146,7 +146,7 @@ class auth_plugin_mnet extends auth_plugin_base {
         }
 
         // check remote login permissions
-        if (! has_capability('moodle/site:mnetlogintoremote', get_system_context())
+        if (! has_capability('moodle/site:mnetlogintoremote', context_system::instance())
                 or is_mnet_remote_user($USER)
                 or isguestuser()
                 or !isloggedin()) {
index a926756..952cc26 100644 (file)
@@ -1194,12 +1194,12 @@ class backup_users_structure_step extends backup_structure_step {
 
         // Then, the fields potentially needing anonymization
         $anonfields = array(
-            'username', 'idnumber', 'firstname', 'lastname',
-            'email', 'icq', 'skype',
+            'username', 'idnumber', 'email', 'icq', 'skype',
             'yahoo', 'aim', 'msn', 'phone1',
             'phone2', 'institution', 'department', 'address',
             'city', 'country', 'lastip', 'picture',
             'url', 'description', 'descriptionformat', 'imagealt', 'auth');
+        $anonfields = array_merge($anonfields, get_all_user_name_fields());
 
         // Add anonymized fields to $userfields with custom final element
         foreach ($anonfields as $field) {
index 5146cfe..7feafe8 100644 (file)
@@ -741,7 +741,7 @@ abstract class restore_dbops {
                  // Build the array of contexts we are going to look
                  $systemctx = context_system::instance();
                  $coursectx = context_course::instance($courseid);
-                 $parentctxs= get_parent_contexts($coursectx);
+                 $parentctxs = $coursectx->get_parent_context_ids();
                  foreach ($parentctxs as $parentctx) {
                      // Exclude system context
                      if ($parentctx == $systemctx->id) {
index e1aca51..832717f 100644 (file)
@@ -191,7 +191,7 @@ abstract class restore_search_base implements renderable {
         while ($totalcourses > $offs and $this->totalcount < $this->maxresults) {
             $resultset = $DB->get_records_sql($sql, $params, $offs, $blocksz);
             foreach ($resultset as $result) {
-                context_instance_preload($result);
+                context_helper::preload_from_record($result);
                 $classname = context_helper::get_class_for_level($contextlevel);
                 $context = $classname::instance($result->id);
                 if (count($requiredcaps) > 0) {
index 171bdb3..e6e9d2d 100644 (file)
@@ -527,7 +527,7 @@ class core_badges_renderer extends plugin_renderer_base {
             $description = $badge->description;
             $criteria = self::print_badge_criteria($badge);
             if ($badge->dateissued) {
-                $icon = new pix_icon('i/tick_green_big',
+                $icon = new pix_icon('i/valid',
                             get_string('dateearned', 'badges',
                                 userdate($badge->dateissued, get_string('strftimedatefullshort', 'core_langconfig'))));
                 $badgeurl = new moodle_url('/badges/badge.php', array('hash' => $badge->uniquehash));
index 31eadf6..44e514a 100644 (file)
@@ -91,7 +91,7 @@ class block_edit_form extends moodleform {
         $mform->addElement('hidden', 'bui_parentcontextid', $parentcontext->id);
         $mform->setType('bui_parentcontextid', PARAM_INT);
 
-        $mform->addElement('static', 'bui_homecontext', get_string('createdat', 'block'), print_context_name($parentcontext));
+        $mform->addElement('static', 'bui_homecontext', get_string('createdat', 'block'), $parentcontext->get_context_name());
         $mform->addHelpButton('bui_homecontext', 'createdat', 'block');
 
         // For pre-calculated (fixed) pagetype lists
@@ -142,7 +142,7 @@ class block_edit_form extends moodleform {
             // module context doesn't have child contexts, so display in current context only
             $mform->addElement('hidden', 'bui_contexts', BUI_CONTEXTS_CURRENT);
         } else {
-            $parentcontextname = print_context_name($parentcontext);
+            $parentcontextname = $parentcontext->get_context_name();
             $contextoptions[BUI_CONTEXTS_CURRENT]      = get_string('showoncontextonly', 'block', $parentcontextname);
             $contextoptions[BUI_CONTEXTS_CURRENT_SUBS] = get_string('showoncontextandsubs', 'block', $parentcontextname);
             $mform->addElement('select', 'bui_contexts', get_string('contexts', 'block'), $contextoptions);
diff --git a/blocks/navigation/tests/behat/view_my_courses.feature b/blocks/navigation/tests/behat/view_my_courses.feature
new file mode 100644 (file)
index 0000000..102a03c
--- /dev/null
@@ -0,0 +1,68 @@
+@block @block_navigation
+Feature: View my courses in navigation block
+  In order to navigate to my courses
+  As a student
+  I need my courses displayed in the navigation block
+
+  Background:
+    Given the following "users" exists:
+      | username | firstname | lastname | email |
+      | student1 | Student | 1 | student1@asd.com |
+    And the following "categories" exists:
+      | name  | category | idnumber |
+      | cat1  | 0        | cat1     |
+      | cat2  | 0        | cat2     |
+      | cat3  | 0        | cat3     |
+      | cat31 | cat3     | cat31    |
+      | cat32 | cat3     | cat32    |
+      | cat33 | cat3     | cat33    |
+    And the following "courses" exists:
+      | fullname | shortname | category |
+      | Course1  | c1        | cat1     |
+      | Course2  | c2        | cat2     |
+      | Course31 | c31       | cat31    |
+      | Course32 | c32       | cat32    |
+      | Course331| c331      | cat33    |
+      | Course332| c332      | cat33    |
+    And the following "course enrolments" exists:
+      | user     | course | role    |
+      | student1 | c1     | student |
+      | student1 | c31    | student |
+      | student1 | c331   | student |
+    And I log in as "admin"
+
+  @javascript
+  Scenario: The plain list of enrolled courses is shown
+    Given I set the following administration settings values:
+      | Show my course categories | 0 |
+    And I log out
+    And I log in as "student1"
+    When I follow "My home"
+    Then I should not see "cat1" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "cat2" in the "div.block_navigation .type_system" "css_element"
+    And I should see "c1" in the "div.block_navigation .type_system" "css_element"
+    And I should see "c31" in the "div.block_navigation .type_system" "css_element"
+    And I should see "c331" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "c2" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "c32" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "c332" in the "div.block_navigation .type_system" "css_element"
+
+  @javascript
+  Scenario: The nested list of enrolled courses is shown
+    Given I set the following administration settings values:
+      | Show my course categories | 1 |
+    And I log out
+    And I log in as "student1"
+    When I follow "My home"
+    Then I should see "cat1" in the "div.block_navigation .type_system" "css_element"
+    And I should see "cat3" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "cat2" in the "div.block_navigation .type_system" "css_element"
+    When I expand "cat3" node
+    Then I should see "cat31" in the "div.block_navigation .type_system" "css_element"
+    And I should see "cat33" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "cat32" in the "div.block_navigation .type_system" "css_element"
+    When I expand "cat31" node
+    Then I should see "c31" in the "div.block_navigation .type_system" "css_element"
+    When I expand "cat33" node
+    And I should see "c331" in the "div.block_navigation .type_system" "css_element"
+    And I should not see "c332" in the "div.block_navigation .type_system" "css_element"
index 8124fdc..2e6c018 100644 (file)
@@ -108,6 +108,8 @@ class cache_config_writer extends cache_config {
             fflush($handle);
             fclose($handle);
             $locking->unlock('configwrite', 'config');
+            // Tell PHP to recompile the script.
+            core_component::invalidate_opcode_php_cache($cachefile);
         } else {
             throw new cache_exception('ex_configcannotsave', 'cache', '', null, 'Unable to open the cache config file.');
         }
@@ -901,7 +903,7 @@ abstract class cache_administration_helper extends cache_helper {
      */
     public static function get_store_instance_actions($name, array $storedetails) {
         $actions = array();
-        if (has_capability('moodle/site:config', get_system_context())) {
+        if (has_capability('moodle/site:config', context_system::instance())) {
             $baseurl = new moodle_url('/cache/admin.php', array('store' => $name, 'sesskey' => sesskey()));
             if (empty($storedetails['default'])) {
                 $actions[] = array(
index 371b7ec..bbcd41a 100644 (file)
@@ -1469,7 +1469,7 @@ function calendar_set_filters(array $courseeventsfrom, $ignorefilters = false) {
             }
         }
         if ($group === false) {
-            if (!empty($CFG->calendar_adminseesall) && has_any_capability($allgroupscaps, get_system_context())) {
+            if (!empty($CFG->calendar_adminseesall) && has_any_capability($allgroupscaps, context_system::instance())) {
                 $group = true;
             } else if ($isloggedin) {
                 $groupids = array();
@@ -1790,7 +1790,7 @@ function calendar_set_event_type_display($type, $display = null, $user = null) {
 function calendar_get_allowed_types(&$allowed, $course = null) {
     global $USER, $CFG, $DB;
     $allowed = new stdClass();
-    $allowed->user = has_capability('moodle/calendar:manageownentries', get_system_context());
+    $allowed->user = has_capability('moodle/calendar:manageownentries', context_system::instance());
     $allowed->groups = false; // This may change just below
     $allowed->courses = false; // This may change just below
     $allowed->site = has_capability('moodle/calendar:manageentries', context_course::instance(SITEID));
similarity index 98%
rename from calendar/tests/externallib_tests.php
rename to calendar/tests/externallib_test.php
index 866b268..e38538e 100644 (file)
@@ -113,13 +113,16 @@ class core_calendar_external_testcase extends externallib_advanced_testcase {
 
         // Create a few events and do asserts.
         $this->create_calendar_event('test', $USER->id);
-        $count = count($DB->get_records("event", array('name' => 'test')));
+        $where = $DB->sql_compare_text('name') ." = ?";
+        $count = count($DB->get_records_select("event", $where, array('test')));
         $this->assertEquals(1, $count);
         $aftercount = count($DB->get_records("event"));
         $this->assertEquals($prevcount + 1, $aftercount);
 
         $this->create_calendar_event('user', $USER->id, 'user', 3);
-        $count = count($DB->get_records("event", array('name' => 'user')));
+        $where = $DB->sql_compare_text('name') ." = ?";
+        $count = count($DB->get_records_select("event", $where, array('user')));
+
         $this->assertEquals(3, $count);
         $aftercount = count($DB->get_records("event"));
         $this->assertEquals($prevcount + 4, $aftercount);
index c158c97..ef1e619 100644 (file)
@@ -685,7 +685,7 @@ class comment {
         global $DB;
         $contexts = array();
         $contexts[] = $context->id;
-        $children = get_child_contexts($context);
+        $children = $context->get_child_contexts();
         foreach ($children as $c) {
             $contexts[] = $c->id;
         }
index f2dfd03..a2de1f1 100644 (file)
@@ -57,7 +57,7 @@ if ($id) {
         }
         $context = context_coursecat::instance($parent);
     } else {
-        $context = get_system_context();
+        $context = context_system::instance();
     }
     $PAGE->set_context($context);
     $category = new stdClass();
index 316c48b..4e0db04 100644 (file)
@@ -16,7 +16,7 @@ class editcategory_form extends moodleform {
 
         // get list of categories to use as parents, with site as the first one
         $options = array();
-        if (has_capability('moodle/category:manage', get_system_context()) || $category->parent == 0) {
+        if (has_capability('moodle/category:manage', context_system::instance()) || $category->parent == 0) {
             $options[0] = get_string('top');
         }
         if ($category->id) {
index 9f2bb26..eab20cf 100644 (file)
@@ -2036,7 +2036,7 @@ function move_courses($courseids, $categoryid) {
             add_to_log($course->id, "course", "move", "edit.php?id=$course->id", $course->id);
 
             $context   = context_course::instance($course->id);
-            context_moved($context, $newparent);
+            $context->update_moved($newparent);
         }
     }
     fix_course_sortorder();
@@ -2353,7 +2353,7 @@ function update_course($data, $editoroptions = NULL) {
 
     if ($movecat) {
         $newparent = context_coursecat::instance($course->category);
-        context_moved($context, $newparent);
+        $context->update_moved($newparent);
     }
 
     fix_course_sortorder();
index f7f925d..cf3748a 100644 (file)
@@ -49,7 +49,7 @@
     // Prevent caching of this page to stop confusion when changing page after making AJAX changes
     $PAGE->set_cacheable(false);
 
-    preload_course_contexts($course->id);
+    context_helper::preload_course($course->id);
     $context = context_course::instance($course->id, MUST_EXIST);
 
     // Remove any switched roles before checking login
index 4ca66c8..4240276 100644 (file)
@@ -129,7 +129,7 @@ class enrol_category_handler {
 
         foreach ($rs as $instance) {
             $coursecontext = context_course::instance($instance->courseid);
-            $contextids = get_parent_contexts($coursecontext);
+            $contextids = $coursecontext->get_parent_context_ids();
             array_pop($contextids); // Remove system context, we are interested in categories only.
 
             list($contextids, $contextparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'c');
@@ -178,7 +178,7 @@ function enrol_category_sync_course($course) {
 
     // First find out if any parent category context contains interesting role assignments.
     $coursecontext = context_course::instance($course->id);
-    $contextids = get_parent_contexts($coursecontext);
+    $contextids = $coursecontext->get_parent_context_ids();
     array_pop($contextids); // Remove system context, we are interested in categories only.
 
     list($roleids, $params) = $DB->get_in_or_equal(array_keys($roles), SQL_PARAMS_NAMED, 'r');
index eeed03a..6ab0402 100644 (file)
@@ -86,7 +86,7 @@ class enrol_cohort_plugin extends enrol_plugin {
         if (!has_capability('moodle/course:enrolconfig', $coursecontext) or !has_capability('enrol/cohort:config', $coursecontext)) {
             return false;
         }
-        list($sqlparents, $params) = $DB->get_in_or_equal(get_parent_contexts($coursecontext));
+        list($sqlparents, $params) = $DB->get_in_or_equal($coursecontext->get_parent_context_ids());
         $sql = "SELECT id, contextid
                   FROM {cohort}
                  WHERE contextid $sqlparents
index 606b829..377584e 100644 (file)
@@ -394,7 +394,7 @@ function enrol_cohort_get_cohorts(course_enrolment_manager $manager) {
             $enrolled[] = $instance->customint1;
         }
     }
-    list($sqlparents, $params) = $DB->get_in_or_equal(get_parent_contexts($context));
+    list($sqlparents, $params) = $DB->get_in_or_equal($context->get_parent_context_ids());
     $sql = "SELECT id, name, idnumber, contextid
               FROM {cohort}
              WHERE contextid $sqlparents
index 8f4ef7f..f7f0804 100644 (file)
@@ -426,7 +426,7 @@ class core_enrol_external extends external_api {
         $course = $DB->get_record('course', array('id'=>$courseid), '*', MUST_EXIST);
         $coursecontext = context_course::instance($courseid, IGNORE_MISSING);
         if ($courseid == SITEID) {
-            $context = get_system_context();
+            $context = context_system::instance();
         } else {
             $context = $coursecontext;
         }
@@ -467,7 +467,7 @@ class core_enrol_external extends external_api {
         $enrolledusers = $DB->get_recordset_sql($sql, $enrolledparams, $limitfrom, $limitnumber);
         $users = array();
         foreach ($enrolledusers as $user) {
-            context_instance_preload($user);
+            context_helper::preload_from_record($user);
             if ($userdetails = user_get_user_details($user, $course, $userfields)) {
                 $users[] = $userdetails;
             }
index a2039da..6cca938 100644 (file)
@@ -61,6 +61,16 @@ class course_enrolment_manager {
      * @var string
      */
     protected $searchfilter = '';
+    /**
+     * Limits the focus of the manager to users in specified group
+     * @var int
+     */
+    protected $groupfilter = 0;
+    /**
+     * Limits the focus of the manager to users who match status active/inactive
+     * @var int
+     */
+    protected $statusfilter = -1;
 
     /**
      * The total number of users enrolled in the course
@@ -120,15 +130,19 @@ class course_enrolment_manager {
      * @param string $instancefilter
      * @param int $rolefilter If non-zero, filters to users with specified role
      * @param string $searchfilter If non-blank, filters to users with search text
+     * @param int $groupfilter if non-zero, filter users with specified group
+     * @param int $statusfilter if not -1, filter users with active/inactive enrollment.
      */
     public function __construct(moodle_page $moodlepage, $course, $instancefilter = null,
-            $rolefilter = 0, $searchfilter = '') {
+            $rolefilter = 0, $searchfilter = '', $groupfilter = 0, $statusfilter = -1) {
         $this->moodlepage = $moodlepage;
         $this->context = context_course::instance($course->id);
         $this->course = $course;
         $this->instancefilter = $instancefilter;
         $this->rolefilter = $rolefilter;
         $this->searchfilter = $searchfilter;
+        $this->groupfilter = $groupfilter;
+        $this->statusfilter = $statusfilter;
     }
 
     /**
@@ -158,6 +172,7 @@ class course_enrolment_manager {
                            FROM {user} u
                            JOIN {user_enrolments} ue ON (ue.userid = u.id  AND ue.enrolid $instancessql)
                            JOIN {enrol} e ON (e.id = ue.enrolid)
+                      LEFT JOIN {groups_members} gm ON u.id = gm.userid
                           WHERE $filtersql";
             $this->totalusers = (int)$DB->count_records_sql($sqltotal, $params);
         }
@@ -176,7 +191,7 @@ class course_enrolment_manager {
     public function get_total_other_users() {
         global $DB;
         if ($this->totalotherusers === null) {
-            list($ctxcondition, $params) = $DB->get_in_or_equal(get_parent_contexts($this->context, true), SQL_PARAMS_NAMED, 'ctx');
+            list($ctxcondition, $params) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'ctx');
             $params['courseid'] = $this->course->id;
             $sql = "SELECT COUNT(DISTINCT u.id)
                       FROM {role_assignments} ra
@@ -227,6 +242,7 @@ class course_enrolment_manager {
                       JOIN {user_enrolments} ue ON (ue.userid = u.id  AND ue.enrolid $instancessql)
                       JOIN {enrol} e ON (e.id = ue.enrolid)
                  LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id)
+                 LEFT JOIN {groups_members} gm ON u.id = gm.userid
                      WHERE $filtersql";
             if ($sort === 'firstname') {
                 $sql .= " ORDER BY u.firstname $direction, u.lastname $direction";
@@ -270,6 +286,31 @@ class course_enrolment_manager {
             $params['roleid'] = $this->rolefilter;
         }
 
+        // Group condition.
+        if ($this->groupfilter) {
+            $sql .= " AND gm.groupid = :groupid";
+            $params['groupid'] = $this->groupfilter;
+        }
+
+        // Status condition.
+        if ($this->statusfilter === ENROL_USER_ACTIVE) {
+            $sql .= " AND ue.status = :active AND e.status = :enabled AND ue.timestart < :now1
+                    AND (ue.timeend = 0 OR ue.timeend > :now2)";
+            $now = round(time(), -2); // rounding helps caching in DB
+            $params += array('enabled' => ENROL_INSTANCE_ENABLED,
+                             'active' => ENROL_USER_ACTIVE,
+                             'now1' => $now,
+                             'now2' => $now);
+        } else if ($this->statusfilter === ENROL_USER_SUSPENDED) {
+            $sql .= " AND ue.status = :inactive OR e.status = :disabled OR ue.timestart > :now1
+                    OR (ue.timeend <> 0 AND ue.timeend < :now2)";
+            $now = round(time(), -2); // rounding helps caching in DB
+            $params += array('disabled' => ENROL_INSTANCE_DISABLED,
+                             'inactive' => ENROL_USER_SUSPENDED,
+                             'now1' => $now,
+                             'now2' => $now);
+        }
+
         return array($sql, $params);
     }
 
@@ -293,7 +334,7 @@ class course_enrolment_manager {
         }
         $key = md5("$sort-$direction-$page-$perpage");
         if (!array_key_exists($key, $this->otherusers)) {
-            list($ctxcondition, $params) = $DB->get_in_or_equal(get_parent_contexts($this->context, true), SQL_PARAMS_NAMED, 'ctx');
+            list($ctxcondition, $params) = $DB->get_in_or_equal($this->context->get_parent_context_ids(true), SQL_PARAMS_NAMED, 'ctx');
             $params['courseid'] = $this->course->id;
             $params['cid'] = $this->course->id;
             $sql = "SELECT ra.id as raid, ra.contextid, ra.component, ctx.contextlevel, ra.roleid, u.*, ue.lastseen
@@ -852,6 +893,12 @@ class course_enrolment_manager {
         if ($this->searchfilter !== '') {
             $args['search'] = $this->searchfilter;
         }
+        if (!empty($this->groupfilter)) {
+            $args['group'] = $this->groupfilter;
+        }
+        if ($this->statusfilter !== -1) {
+            $args['status'] = $this->statusfilter;
+        }
         return $args;
     }
 
index 2babc8a..60dbb96 100644 (file)
@@ -45,7 +45,9 @@ class enrol_meta_plugin extends enrol_plugin {
             return get_string('pluginname', 'enrol_'.$enrol);
         } else if (empty($instance->name)) {
             $enrol = $this->get_name();
-            return get_string('pluginname', 'enrol_'.$enrol) . ' (' . format_string($DB->get_field('course', 'fullname', array('id'=>$instance->customint1))) . ')';
+            $course = $DB->get_record('course', array('id'=>$instance->customint1));
+            $coursename = format_string(get_course_display_name_for_list($course));
+            return get_string('pluginname', 'enrol_' . $enrol) . ' (' . $coursename . ')';
         } else {
             return format_string($instance->name);
         }
index d8453fb..c01e361 100644 (file)
@@ -33,6 +33,8 @@ $action  = optional_param('action', '', PARAM_ALPHANUMEXT);
 $filter  = optional_param('ifilter', 0, PARAM_INT);
 $search  = optional_param('search', '', PARAM_RAW);
 $role    = optional_param('role', 0, PARAM_INT);
+$fgroup  = optional_param('filtergroup', 0, PARAM_INT);
+$status  = optional_param('status', -1, PARAM_INT);
 
 // When users reset the form, redirect back to first page without other params.
 if (optional_param('resetbutton', '', PARAM_RAW) !== '') {
@@ -50,7 +52,7 @@ require_login($course);
 require_capability('moodle/course:enrolreview', $context);
 $PAGE->set_pagelayout('admin');
 
-$manager = new course_enrolment_manager($PAGE, $course, $filter, $role, $search);
+$manager = new course_enrolment_manager($PAGE, $course, $filter, $role, $search, $fgroup, $status);
 $table = new course_enrolment_users_table($manager, $PAGE);
 $PAGE->set_url('/enrol/users.php', $manager->get_url_params()+$table->get_url_params());
 navigation_node::override_active_url(new moodle_url('/enrol/users.php', array('id' => $id)));
index 6bdb550..a854d80 100644 (file)
@@ -163,6 +163,22 @@ class enrol_users_filter_form extends moodleform {
         $mform->addElement('select', 'role', get_string('role'),
                 array(0 => get_string('all')) + $rolenames);
 
+        // Filter by group.
+        $allgroups = $manager->get_all_groups();
+        $groupsmenu[0] = get_string('allparticipants');
+        foreach($allgroups as $gid => $unused) {
+            $groupsmenu[$gid] = $allgroups[$gid]->name;
+        }
+        if (count($groupsmenu) > 1) {
+            $mform->addElement('select', 'filtergroup', get_string('group'), $groupsmenu);
+        }
+
+        // Status active/inactive.
+        $mform->addElement('select', 'status', get_string('status'),
+                array(-1 => get_string('all'),
+                    ENROL_USER_ACTIVE => get_string('active'),
+                    ENROL_USER_SUSPENDED => get_string('inactive')));
+
         // Submit button does not use add_action_buttons because that adds
         // another fieldset which causes the CSS style to break in an unfixable
         // way due to fieldset quirks.
index 6798a48..84b2428 100644 (file)
@@ -51,7 +51,7 @@
     $PAGE->set_url('/error/');
     $PAGE->set_title($site->fullname .':Error');
     $PAGE->set_heading($site->fullname .': Error 404');
-    $PAGE->set_context(get_system_context());
+    $PAGE->set_context(context_system::instance());
     $PAGE->navbar->add('Error 404 - File not Found');
     echo $OUTPUT->header();
     echo $OUTPUT->box(get_string('pagenotexist', 'error'). '<br />'.s($requesturi), 'generalbox boxaligncenter');
index 0b1d9e6..54cb292 100644 (file)
@@ -80,7 +80,7 @@ class core_files_external extends external_api {
         $browser = get_file_browser();
 
         if (empty($fileinfo['contextid'])) {
-            $context  = get_system_context();
+            $context  = context_system::instance();
         } else {
             $context  = context::instance_by_id($fileinfo['contextid']);
         }
index 0bea014..c4b2f56 100644 (file)
@@ -53,7 +53,7 @@ if (!in_array($context->contextlevel, array(CONTEXT_COURSECAT, CONTEXT_COURSE, C
 
 $isfrontpage = ($context->contextlevel == CONTEXT_COURSE && $context->instanceid == SITEID);
 
-$contextname = print_context_name($context);
+$contextname = $context->get_context_name();
 
 if ($context->contextlevel == CONTEXT_COURSECAT) {
     $heading = "$SITE->fullname: ".get_string("categories");
index 637a583..70451da 100644 (file)
@@ -35,7 +35,7 @@ defined('MOODLE_INTERNAL') || die();
  *
  * @category grading
  * @example $manager = get_grading_manager($areaid);
- * @example $manager = get_grading_manager(get_system_context());
+ * @example $manager = get_grading_manager(context_system::instance());
  * @example $manager = get_grading_manager($context, 'mod_assignment', 'submission');
  * @param stdClass|int|null $context_or_areaid if $areaid is passed, no other parameter is needed
  * @param string|null $component the frankenstyle name of the component
index 075ca27..8de5bca 100644 (file)
@@ -223,7 +223,7 @@ foreach ($rs as $template) {
     $actions = array();
     if ($controller->is_shared_template()) {
         $actions[] = $output->pick_action_icon(new moodle_url($PAGE->url, array('pick' => $template->id)),
-            get_string('templatepick', 'core_grading'), 'i/tick_green_big', 'pick template');
+            get_string('templatepick', 'core_grading'), 'i/valid', 'pick template');
         if ($canmanage or ($canshare and ($template->usercreated == $USER->id))) {
             //$actions[] = $output->pick_action_icon(new moodle_url($PAGE->url, array('edit' => $template->id)),
             //    get_string('templateedit', 'core_grading'), 'i/edit', 'edit');
@@ -232,7 +232,7 @@ foreach ($rs as $template) {
         }
     } else if ($controller->is_own_form()) {
         $actions[] = $output->pick_action_icon(new moodle_url($PAGE->url, array('pick' => $template->id)),
-            get_string('templatepickownform', 'core_grading'), 'i/tick_green_big', 'pick ownform');
+            get_string('templatepickownform', 'core_grading'), 'i/valid', 'pick ownform');
     }
     $out .= $output->box(join(' ', $actions), 'template-actions');
     $out .= $output->box($controller->get_formatted_description(), 'template-description');
index c99f672..3c21585 100644 (file)
@@ -532,93 +532,17 @@ class grade_report_grader extends grade_report {
     }
 
     /**
-     * Builds and returns a div with on/off toggles.
-     * @return string HTML code
-     * @deprecated since 2.4 as it appears not to be used any more.
+     * @deprecated since Moodle 2.4 as it appears not to be used any more.
      */
     public function get_toggles_html() {
-        global $CFG, $USER, $COURSE, $OUTPUT;
-        debugging('Call to deprecated function grade_report_grader::get_toggles_html().', DEBUG_DEVELOPER);
-        $html = '';
-        if ($USER->gradeediting[$this->courseid]) {
-            if (has_capability('moodle/grade:manage', $this->context) or has_capability('moodle/grade:hide', $this->context)) {
-                $html .= $this->print_toggle('eyecons');
-            }
-            if (has_capability('moodle/grade:manage', $this->context)
-             or has_capability('moodle/grade:lock', $this->context)
-             or has_capability('moodle/grade:unlock', $this->context)) {
-                $html .= $this->print_toggle('locks');
-            }
-            if (has_capability('moodle/grade:manage', $this->context)) {
-                $html .= $this->print_toggle('quickfeedback');
-            }
-
-            if (has_capability('moodle/grade:manage', $this->context)) {
-                $html .= $this->print_toggle('calculations');
-            }
-        }
-
-        if ($this->canviewhidden) {
-            $html .= $this->print_toggle('averages');
-        }
-
-        $html .= $this->print_toggle('ranges');
-        if (!empty($CFG->enableoutcomes)) {
-            $html .= $this->print_toggle('nooutcomes');
-        }
-
-        return $OUTPUT->container($html, 'grade-report-toggles');
+        throw new coding_exception('get_toggles_html() can not be used any more');
     }
 
     /**
-    * Shortcut function for printing the grader report toggles.
-    * @param string $type The type of toggle
-    * @param bool $return Whether to return the HTML string rather than printing it
-    * @return void
-    * @deprecated since 2.4 as it appears not to be used any more.
-    */
+     * @deprecated since 2.4 as it appears not to be used any more.
+     */
     public function print_toggle($type) {
-        global $CFG, $OUTPUT;
-        debugging('Call to deprecated function grade_report_grader::print_toggle().', DEBUG_DEVELOPER);
-        $icons = array('eyecons' => 't/hide',
-                       'calculations' => 't/calc',
-                       'locks' => 't/lock',
-                       'averages' => 't/mean',
-                       'quickfeedback' => 't/feedback',
-                       'nooutcomes' => 't/outcomes');
-
-        $prefname = 'grade_report_show' . $type;
-
-        if (array_key_exists($prefname, $CFG)) {
-            $showpref = get_user_preferences($prefname, $CFG->$prefname);
-        } else {
-            $showpref = get_user_preferences($prefname);
-        }
-
-        $strshow = $this->get_lang_string('show' . $type, 'grades');
-        $strhide = $this->get_lang_string('hide' . $type, 'grades');
-
-        $showhide = 'show';
-        $toggleaction = 1;
-
-        if ($showpref) {
-            $showhide = 'hide';
-            $toggleaction = 0;
-        }
-
-        if (array_key_exists($type, $icons)) {
-            $imagename = $icons[$type];
-        } else {
-            $imagename = "t/$type";
-        }
-
-        $string = ${'str' . $showhide};
-
-        $url = new moodle_url($this->baseurl, array('toggle' => $toggleaction, 'toggle_type' => $type));
-
-        $retval = $OUTPUT->container($OUTPUT->action_icon($url, new pix_icon($imagename, $string))); // TODO: this container looks wrong here
-
-        return $retval;
+        throw new coding_exception('print_toggle() can not be used any more');
     }
 
     /**
index 4a8d086..9ff8f36 100644 (file)
@@ -1,6 +1,9 @@
 This files describes API changes in /grade/report/*,
 information provided here is intended especially for developers.
 
+=== 2.6 ===
+* grade_report_grader::get_toggles_html() and grade_report_grader::print_toggle()
+  can not be used any more
 
 === 2.3.5, 2.4.2 ===
 * class_grade_report::showtotalsifcontainhidden has been switched from a single integer value to an array.
index 9a0df5f..ffd8f74 100644 (file)
@@ -78,7 +78,7 @@ switch ($action) {
 
     case 'ajax_getmembersingroup':
         $roles = array();
-        if ($groupmemberroles = groups_get_members_by_role($groupids[0], $courseid, 'u.id, u.firstname, u.lastname')) {
+        if ($groupmemberroles = groups_get_members_by_role($groupids[0], $courseid, 'u.id, ' . get_all_user_name_fields(true, 'u'))) {
             foreach($groupmemberroles as $roleid=>$roledata) {
                 $shortroledata = new stdClass();
                 $shortroledata->name = $roledata->name;
@@ -246,7 +246,7 @@ $member_names = array();
 
 $atleastonemember = false;
 if ($singlegroup) {
-    if ($groupmemberroles = groups_get_members_by_role($groupids[0], $courseid, 'u.id, u.firstname, u.lastname')) {
+    if ($groupmemberroles = groups_get_members_by_role($groupids[0], $courseid, 'u.id, ' . get_all_user_name_fields(true, 'u'))) {
         foreach($groupmemberroles as $roleid=>$roledata) {
             echo '<optgroup label="'.s($roledata->name).'">';
             foreach($roledata->users as $member) {
index 7e6fa2c..134261e 100644 (file)
@@ -90,7 +90,8 @@ if ($groupingid) {
 
 list($sort, $sortparams) = users_order_by_sql('u');
 
-$sql = "SELECT g.id AS groupid, gg.groupingid, u.id AS userid, u.firstname, u.lastname, u.idnumber, u.username
+$allnames = get_all_user_name_fields(true, 'u');
+$sql = "SELECT g.id AS groupid, gg.groupingid, u.id AS userid, $allnames, u.idnumber, u.username
           FROM {groups} g
                LEFT JOIN {groupings_groups} gg ON g.id = gg.groupid
                LEFT JOIN {groups_members} gm ON g.id = gm.groupid
@@ -106,6 +107,9 @@ foreach ($rs as $row) {
     $user->lastname  = $row->lastname;
     $user->username  = $row->username;
     $user->idnumber  = $row->idnumber;
+    foreach (get_all_user_name_fields() as $addname) {
+        $user->$addname = $row->$addname;
+    }
     if (!$row->groupingid) {
         $row->groupingid = -1;
     }
index b6e872a..d6a3c2a 100644 (file)
@@ -227,7 +227,7 @@ $string['configfrontpage'] = 'The items selected above will be displayed on the
 $string['configfrontpagecourselimit'] = 'Maximum number of courses';
 $string['configfrontpagecourselimithelp'] = 'Maximum number of courses to be displayed on the site\'s front page in course listings.';
 $string['configfrontpageloggedin'] = 'The items selected above will be displayed on the site\'s front page when a user is logged in.';
-$string['configfullnamedisplay'] = 'This defines how names are shown when they are displayed in full. For most mono-lingual sites the most efficient setting is "First name + Surname", but you may choose to hide surnames altogether, or to leave it up to the current language pack to decide (some languages have different conventions).';
+$string['configfullnamedisplay'] = 'This defines how names are shown when they are displayed in full. For most mono-lingual sites the most efficient setting is "firstname lastname", but you may choose to hide surnames altogether, or to leave it up to the current language pack to decide (some languages have different conventions). Placeholders that can be used are: firstname, lastname, firstnamephonetic, lastnamephonetic, middlename, and alternatename.';
 $string['configgeoipfile'] = 'Location of GeoIP City binary data file. This file is not part of Moodle distribution and must be obtained separately from <a href="http://www.maxmind.com/">MaxMind</a>. You can either buy a commercial version or use the free version.<br />Simply download <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz" >http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a> and extract it into "{$a}" directory on your server.';
 $string['configgetremoteaddrconf'] = 'If your server is behind a reverse proxy, you can use this setting to specify which HTTP headers can be trusted to contain the remote IP address. The headers are read in order, using the first one that is available.';
 $string['configgradebookroles'] = 'This setting allows you to control who appears on the gradebook.  Users need to have at least one of these roles in a course to be shown in the gradebook for that course.';
@@ -548,6 +548,7 @@ $string['frontpagerestore'] = 'Front page restore';
 $string['frontpageroles'] = 'Front page roles';
 $string['frontpagesettings'] = 'Front page settings';
 $string['fullnamedisplay'] = 'Full name format';
+$string['fullnamedisplayprivate'] = 'Full name format - private';
 $string['gdrecommended'] = 'GD extension is used for conversion of images, some features such as user profile images will not be available if missing.';
 $string['gdrequired'] = 'The GD extension is now required by Moodle for image conversion.';
 $string['generalsettings'] = 'General settings';
index 3ec27d6..e92ab1f 100644 (file)
@@ -60,6 +60,7 @@ $string['addfilehere'] = 'Add file(s) here';
 $string['addinganew'] = 'Adding a new {$a}';
 $string['addinganewto'] = 'Adding a new {$a->what} to {$a->to}';
 $string['addingdatatoexisting'] = 'Adding data to existing';
+$string['additionalnames'] = 'Additional names';
 $string['addlinkhere'] = 'Add link here';
 $string['addnewcategory'] = 'Add new category';
 $string['addnewcourse'] = 'Add a new course';
@@ -135,6 +136,7 @@ $string['allparticipants'] = 'All participants';
 $string['allteachers'] = 'All teachers';
 $string['alphanumerical'] = 'Can only contain alphanumeric characters, hyphen (-) or period (.)';
 $string['alreadyconfirmed'] = 'Registration has already been confirmed';
+$string['alternatename'] = 'Alternate name';
 $string['always'] = 'Always';
 $string['and'] = '{$a->one} and {$a->two}';
 $string['answer'] = 'Answer';
@@ -680,6 +682,7 @@ $string['filter'] = 'Filter';
 $string['findmorecourses'] = 'Find more courses...';
 $string['firstaccess'] = 'First access';
 $string['firstname'] = 'First name';
+$string['firstnamephonetic'] = 'First name - phonetic';
 $string['firsttime'] = 'Is this your first time here?';
 $string['folder'] = 'Folder';
 $string['folderclosed'] = 'Closed folder';
@@ -910,6 +913,7 @@ $string['lastedited'] = 'Last edited';
 $string['lastlogin'] = 'Last login';
 $string['lastmodified'] = 'Last modified';
 $string['lastname'] = 'Surname';
+$string['lastnamephonetic'] = 'Surname - phonetic';
 $string['lastyear'] = 'Last year';
 $string['latestlanguagepack'] = 'Check for latest language pack on moodle.org';
 $string['layouttable'] = 'Layout table';
@@ -1019,6 +1023,7 @@ $string['messageprovider:instantmessage'] = 'Personal messages between users';
 $string['messageprovider:instantmessage_help'] = 'This section configures what happens to messages that are sent to you directly from other users on this site.';
 $string['messageselect'] = 'Select this user as a message recipient';
 $string['messageselectadd'] = 'Send a message';
+$string['middlename'] = 'Middle name';
 $string['migratinggrades'] = 'Migrating grades';
 $string['min'] = 'min';
 $string['mins'] = 'mins';
index 10d0c80..a31aedd 100644 (file)
@@ -3964,7 +3964,8 @@ function get_role_users($roleid, context $context, $parent = false, $fields = ''
     global $DB;
 
     if (empty($fields)) {
-        $fields = 'u.id, u.confirmed, u.username, u.firstname, u.lastname, '.
+        $allnames = get_all_user_name_fields(true, 'u');
+        $fields = 'u.id, u.confirmed, u.username, '. $allnames . ', ' .
                   'u.maildisplay, u.mailformat, u.maildigest, u.email, u.emailstop, u.city, '.
                   'u.country, u.picture, u.idnumber, u.department, u.institution, '.
                   'u.lang, u.timezone, u.lastaccess, u.mnethostid, r.name AS rolename, r.sortorder, '.
@@ -5357,6 +5358,10 @@ abstract class context extends stdClass implements IteratorAggregate {
         $fs = get_file_storage();
         $fs->delete_area_files($this->_id);
 
+        // Delete all repository instances attached to this context.
+        require_once($CFG->dirroot . '/repository/lib.php');
+        repository::delete_all_for_context($this->_id);
+
         // delete all advanced grading data attached to this context
         require_once($CFG->dirroot.'/grade/grading/lib.php');
         grading_manager::delete_all_for_context($this->_id);
@@ -6001,7 +6006,7 @@ class context_system extends context {
 
 
         try {
-            // we ignore the strictness completely because system context must except except during install
+            // We ignore the strictness completely because system context must exist except during install.
             $record = $DB->get_record('context', array('contextlevel'=>CONTEXT_SYSTEM), '*', MUST_EXIST);
         } catch (dml_exception $e) {
             //table or record does not exist
@@ -7225,161 +7230,9 @@ class context_block extends context {
 // before removing devs will be warned with a debugging message first,
 // then we will add error message and only after that we can remove the functions
 // completely.
-
-
-/**
- * Not available any more, use load_temp_course_role() instead.
- *
- * @deprecated since 2.2
- * @param stdClass $context
- * @param int $roleid
- * @param array $accessdata
- * @return array
- */
-function load_temp_role($context, $roleid, array $accessdata) {
-    debugging('load_temp_role() is deprecated, please use load_temp_course_role() instead, temp role not loaded.');
-    return $accessdata;
-}
-
-/**
- * Not available any more, use remove_temp_course_roles() instead.
- *
- * @deprecated since 2.2
- * @param stdClass $context
- * @param array $accessdata
- * @return array access data
- */
-function remove_temp_roles($context, array $accessdata) {
-    debugging('remove_temp_role() is deprecated, please use remove_temp_course_roles() instead.');
-    return $accessdata;
-}
-
-/**
- * Returns system context or null if can not be created yet.
- *
- * @deprecated since 2.2, use context_system::instance()
- * @param bool $cache use caching
- * @return context system context (null if context table not created yet)
- */
-function get_system_context($cache = true) {
-    return context_system::instance(0, IGNORE_MISSING, $cache);
-}
-
-/**
- * Recursive function which, given a context, find all parent context ids,
- * and return the array in reverse order, i.e. parent first, then grand
- * parent, etc.
- *
- * @deprecated since 2.2, use $context->get_parent_context_ids() instead
- * @param context $context
- * @param bool $includeself optional, defaults to false
- * @return array
- */
-function get_parent_contexts(context $context, $includeself = false) {
-    return $context->get_parent_context_ids($includeself);
-}
-
-/**
- * Return the id of the parent of this context, or false if there is no parent (only happens if this
- * is the site context.)
- *
- * @deprecated since 2.2, use $context->get_parent_context() instead
- * @param context $context
- * @return integer the id of the parent context.
- */
-function get_parent_contextid(context $context) {
-    if ($parent = $context->get_parent_context()) {
-        return $parent->id;
-    } else {
-        return false;
-    }
-}
-
-/**
- * Recursive function which, given a context, find all its children context ids.
- *
- * For course category contexts it will return immediate children only categories and courses.
- * It will NOT recurse into courses or child categories.
- * If you want to do that, call it on the returned courses/categories.
- *
- * When called for a course context, it will return the modules and blocks
- * displayed in the course page.
- *
- * If called on a user/course/module context it _will_ populate the cache with the appropriate
- * contexts ;-)
- *
- * @deprecated since 2.2, use $context->get_child_contexts() instead
- * @param context $context
- * @return array Array of child records
- */
-function get_child_contexts(context $context) {
-    return $context->get_child_contexts();
-}
-
-/**
- * Precreates all contexts including all parents
- *
- * @deprecated since 2.2
- * @param int $contextlevel empty means all
- * @param bool $buildpaths update paths and depths
- * @return void
- */
-function create_contexts($contextlevel = null, $buildpaths = true) {
-    context_helper::create_instances($contextlevel, $buildpaths);
-}
-
-/**
- * Remove stale context records
- *
- * @deprecated since 2.2, use context_helper::cleanup_instances() instead
- * @return bool
- */
-function cleanup_contexts() {
-    context_helper::cleanup_instances();
-    return true;
-}
-
-/**
- * Populate context.path and context.depth where missing.
- *
- * @deprecated since 2.2, use context_helper::build_all_paths() instead
- * @param bool $force force a complete rebuild of the path and depth fields, defaults to false
- * @return void
- */
-function build_context_path($force = false) {
-    context_helper::build_all_paths($force);
-}
-
-/**
- * Rebuild all related context depth and path caches
- *
- * @deprecated since 2.2
- * @param array $fixcontexts array of contexts, strongtyped
- * @return void
- */
-function rebuild_contexts(array $fixcontexts) {
-    foreach ($fixcontexts as $fixcontext) {
-        $fixcontext->reset_paths(false);
-    }
-    context_helper::build_all_paths(false);
-}
-
-/**
- * Preloads all contexts relating to a course: course, modules. Block contexts
- * are no longer loaded here. The contexts for all the blocks on the current
- * page are now efficiently loaded by {@link block_manager::load_blocks()}.
- *
- * @deprecated since 2.2
- * @param int $courseid Course ID
- * @return void
- */
-function preload_course_contexts($courseid) {
-    context_helper::preload_course($courseid);
-}
-
 /**
  * Preloads context information together with instances.
- * Use context_instance_preload() to strip the context info from the record and cache the context instance.
+ * Use context_helper::preload_from_record() to strip the context info from the record and cache the context instance.
  *
  * @deprecated since 2.2
  * @param string $joinon for example 'u.id'
@@ -7393,18 +7246,6 @@ function context_instance_preload_sql($joinon, $contextlevel, $tablealias) {
     return array($select, $join);
 }
 
-/**
- * Preloads context information from db record and strips the cached info.
- * The db request has to contain both the $join and $select from context_instance_preload_sql()
- *
- * @deprecated since 2.2
- * @param stdClass $rec
- * @return void (modifies $rec)
- */
-function context_instance_preload(stdClass $rec) {
-    context_helper::preload_from_record($rec);
-}
-
 /**
  * Mark a context as dirty (with timestamp) so as to force reloading of the context.
  *
@@ -7438,26 +7279,6 @@ function mark_context_dirty($path) {
     }
 }
 
-/**
- * Update the path field of the context and all dep. subcontexts that follow
- *
- * Update the path field of the context and
- * all the dependent subcontexts that follow
- * the move.
- *
- * The most important thing here is to be as
- * DB efficient as possible. This op can have a
- * massive impact in the DB.
- *
- * @deprecated since 2.2
- * @param context $context context obj
- * @param context $newparent new parent obj
- * @return void
- */
-function context_moved(context $context, context $newparent) {
-    $context->update_moved($newparent);
-}
-
 /**
  * Remove a context record and any dependent entries,
  * removes context from static context cache too
@@ -7481,32 +7302,6 @@ function delete_context($contextlevel, $instanceid, $deleterecord = true) {
     return true;
 }
 
-/**
- * Returns context level name
- *
- * @deprecated since 2.2
- * @param integer $contextlevel $context->context level. One of the CONTEXT_... constants.
- * @return string the name for this type of context.
- */
-function get_contextlevel_name($contextlevel) {
-    return context_helper::get_level_name($contextlevel);
-}
-
-/**
- * Prints human readable context identifier.
- *
- * @deprecated since 2.2
- * @param context $context the context.
- * @param boolean $withprefix whether to prefix the name of the context with the
- *      type of context, e.g. User, Course, Forum, etc.
- * @param boolean $short whether to user the short name of the thing. Only applies
- *      to course contexts
- * @return string the human readable context name.
- */
-function print_context_name(context $context, $withprefix = true, $short = false) {
-    return $context->get_context_name($withprefix, $short);
-}
-
 /**
  * Get a URL for a context, if there is a natural one. For example, for
  * CONTEXT_COURSE, this is the course page. For CONTEXT_USER it is the
@@ -7601,7 +7396,6 @@ function fetch_context_capabilities(context $context) {
  * for the purpose of $select, you need to know that the context table has been
  * aliased to ctx, so for example, you can call get_sorted_contexts('ctx.depth = 3');
  *
- * @deprecated since 2.2
  * @param string $select the contents of the WHERE clause. Remember to do ctx.fieldname.
  * @param array $params any parameters required by $select.
  * @return array the requested context records.
index 1276b41..4a76f82 100644 (file)
@@ -6959,7 +6959,7 @@ class admin_setting_managerepository extends admin_setting {
                     // Calculate number of instances in order to display them for the Moodle administrator
                     if (!empty($instanceoptionnames)) {
                         $params = array();
-                        $params['context'] = array(get_system_context());
+                        $params['context'] = array(context_system::instance());
                         $params['onlyvisible'] = false;
                         $params['type'] = $typename;
                         $admininstancenumber = count(repository::static_function($typename, 'get_instances', $params));
@@ -7117,7 +7117,7 @@ class admin_setting_enablemobileservice extends admin_setting_configcheckbox {
             $assign = true;
         }
         if (!empty($assign)) {
-            $systemcontext = get_system_context();
+            $systemcontext = context_system::instance();
             assign_capability('webservice/xmlrpc:use', $permission, $CFG->defaultuserroleid, $systemcontext->id, true);
             assign_capability('webservice/rest:use', $permission, $CFG->defaultuserroleid, $systemcontext->id, true);
         }
index daf2d44..cf51764 100644 (file)
@@ -620,8 +620,10 @@ function badges_notify_badge_award(badge $badge, $userid, $issued, $filepathhash
     $userfrom = new stdClass();
     $userfrom->id = $admin->id;
     $userfrom->email = !empty($CFG->badges_defaultissuercontact) ? $CFG->badges_defaultissuercontact : $admin->email;
+    foreach (get_all_user_name_fields() as $addname) {
+        $userfrom->$addname = !empty($CFG->badges_defaultissuername) ? '' : $admin->$addname;
+    }
     $userfrom->firstname = !empty($CFG->badges_defaultissuername) ? $CFG->badges_defaultissuername : $admin->firstname;
-    $userfrom->lastname = !empty($CFG->badges_defaultissuername) ? '' : $admin->lastname;
     $userfrom->maildisplay = true;
 
     $issuedlink = html_writer::link(new moodle_url('/badges/badge.php', array('hash' => $issued)), $badge->name);
index 02e3c8d..ae413cf 100644 (file)
@@ -566,7 +566,7 @@ class block_manager {
         $context = $this->page->context;
         $contexttest = 'bi.parentcontextid = :contextid2';
         $parentcontextparams = array();
-        $parentcontextids = get_parent_contexts($context);
+        $parentcontextids = $context->get_parent_context_ids();
         if ($parentcontextids) {
             list($parentcontexttest, $parentcontextparams) =
                     $DB->get_in_or_equal($parentcontextids, SQL_PARAMS_NAMED, 'parentcontext');
@@ -630,7 +630,7 @@ class block_manager {
         $this->birecordsbyregion = $this->prepare_per_region_arrays();
         $unknown = array();
         foreach ($blockinstances as $bi) {
-            context_instance_preload($bi);
+            context_helper::preload_from_record($bi);
             if ($this->is_known_region($bi->region)) {
                 $this->birecordsbyregion[$bi->region][] = $bi;
             } else {
index fefe8e6..0c7a8fa 100644 (file)
@@ -142,6 +142,7 @@ class core_component {
                 @chmod($cachefile, $CFG->filepermissions);
             }
             @unlink($cachefile.'.tmp'); // Just in case anything fails (race condition).
+            self::invalidate_opcode_php_cache($cachefile);
         }
     }
 
@@ -735,4 +736,21 @@ $cache = '.var_export($cache, true).';
         }
         return $return;
     }
+
+    /**
+     * Invalidate opcode cache for given file, this is intended for
+     * php files that are stored in dataroot.
+     *
+     * Note: we need it here because this class must be self-contained.
+     *
+     * @param string $file
+     */
+    public static function invalidate_opcode_php_cache($file) {
+        if (function_exists('opcache_invalidate')) {
+            if (!file_exists($file)) {
+                return;
+            }
+            opcache_invalidate($file, true);
+        }
+    }
 }
index ba549e1..c5fd1e6 100644 (file)
@@ -712,9 +712,10 @@ class coursecat implements renderable, cacheable_object, IteratorAggregate {
         list($sql2, $params2) = $DB->get_in_or_equal($managerroles, SQL_PARAMS_NAMED, 'rid');
         list($sort, $sortparams) = users_order_by_sql('u');
         $notdeleted = array('notdeleted'=>0);
+        $allnames = get_all_user_name_fields(true, 'u');
         $sql = "SELECT ra.contextid, ra.id AS raid,
                        r.id AS roleid, r.name AS rolename, r.shortname AS roleshortname,
-                       rn.name AS rolecoursealias, u.id, u.username, u.firstname, u.lastname
+                       rn.name AS rolecoursealias, u.id, u.username, $allnames
                   FROM {role_assignments} ra
                   JOIN {user} u ON ra.userid = u.id
                   JOIN {role} r ON ra.roleid = r.id
@@ -2033,7 +2034,7 @@ class course_in_list implements IteratorAggregate {
      *     context preloading
      */
     public function __construct(stdClass $record) {
-        context_instance_preload($record);
+        context_helper::preload_from_record($record);
         $this->record = new stdClass();
         foreach ($record as $key => $value) {
             $this->record->$key = $value;
@@ -2109,8 +2110,9 @@ class course_in_list implements IteratorAggregate {
                 $user = new stdClass();
                 $user->id = $ruser->id;
                 $user->username = $ruser->username;
-                $user->firstname = $ruser->firstname;
-                $user->lastname = $ruser->lastname;
+                foreach (get_all_user_name_fields() as $addname) {
+                    $user->$addname = $ruser->$addname;
+                }
                 $role = new stdClass();
                 $role->id = $ruser->roleid;
                 $role->name = $ruser->rolename;
index 49d8cb5..36ad297 100644 (file)
@@ -507,10 +507,11 @@ function get_users_listing($sort='lastaccess', $dir='ASC', $page=0, $recordsperp
                 array('id', 'username', 'email', 'firstname', 'lastname', 'city', 'country',
                 'lastaccess', 'confirmed', 'mnethostid'));
     }
+    $namefields = get_all_user_name_fields(true);
+    $extrafields = "$extrafields, $namefields";
 
     // warning: will return UNCONFIRMED USERS
-    return $DB->get_records_sql("SELECT id, username, email, firstname, lastname, city, country,
-                                        lastaccess, confirmed, mnethostid, suspended $extrafields
+    return $DB->get_records_sql("SELECT id, username, email, city, country, lastaccess, confirmed, mnethostid, suspended $extrafields
                                    FROM {user}
                                   WHERE $select
                                   $sort", $params, $page, $recordsperpage);
@@ -631,7 +632,7 @@ function get_courses($categoryid="all", $sort="c.sortorder ASC", $fields="c.*")
 
         // loop throught them
         foreach ($courses as $course) {
-            context_instance_preload($course);
+            context_helper::preload_from_record($course);
             if (isset($course->visible) && $course->visible <= 0) {
                 // for hidden courses, require visibility check
                 if (has_capability('moodle/course:viewhiddencourses', context_course::instance($course->id))) {
@@ -698,7 +699,7 @@ function get_courses_page($categoryid="all", $sort="c.sortorder ASC", $fields="c
     $rs = $DB->get_recordset_sql($sql, $params);
     // iteration will have to be done inside loop to keep track of the limitfrom and limitnum
     foreach($rs as $course) {
-        context_instance_preload($course);
+        context_helper::preload_from_record($course);
         if ($course->visible <= 0) {
             // for hidden courses, require visibility check
             if (has_capability('moodle/course:viewhiddencourses', context_course::instance($course->id))) {
@@ -810,7 +811,7 @@ function get_courses_search($searchterms, $sort, $page, $recordsperpage, &$total
     foreach($rs as $course) {
         if (!$course->visible) {
             // preload contexts only for hidden courses or courses we need to return
-            context_instance_preload($course);
+            context_helper::preload_from_record($course);
             $coursecontext = context_course::instance($course->id);
             if (!has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
                 continue;
@@ -1781,8 +1782,8 @@ function get_logs($select, array $params=null, $order='l.time DESC', $limitfrom=
            $select";
 
     $totalcount = $DB->count_records_sql($sql, $params);
-
-    $sql = "SELECT l.*, u.firstname, u.lastname, u.picture
+    $allnames = get_all_user_name_fields(true, 'u');
+    $sql = "SELECT l.*, $allnames, u.picture
               FROM {log} l
               LEFT JOIN {user} u ON l.userid = u.id
            $select
index 67660b3..dba2025 100644 (file)
         <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
         <FIELD NAME="trustbitmask" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
         <FIELD NAME="imagealt" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="alt tag for user uploaded image"/>
+        <FIELD NAME="lastnamephonetic" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Last name phonetic"/>
+        <FIELD NAME="firstnamephonetic" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="First name phonetic"/>
+        <FIELD NAME="middlename" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Middle name"/>
+        <FIELD NAME="alternatename" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Alternate name - Useful for three-name countries."/>
       </FIELDS>
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
         <INDEX NAME="email" UNIQUE="false" FIELDS="email"/>
         <INDEX NAME="auth" UNIQUE="false" FIELDS="auth"/>
         <INDEX NAME="idnumber" UNIQUE="false" FIELDS="idnumber"/>
+        <INDEX NAME="firstnamephonetic" UNIQUE="false" FIELDS="firstnamephonetic"/>
+        <INDEX NAME="lastnamephonetic" UNIQUE="false" FIELDS="lastnamephonetic"/>
+        <INDEX NAME="middlename" UNIQUE="false" FIELDS="middlename"/>
+        <INDEX NAME="alternatename" UNIQUE="false" FIELDS="alternatename"/>
       </INDEXES>
     </TABLE>
     <TABLE NAME="user_preferences" COMMENT="Allows modules to store arbitrary user preferences">
index c6bafe0..b593aef 100644 (file)
@@ -2190,5 +2190,74 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2013061700.00);
     }
 
+    if ($oldversion < 2013070800.00) {
+
+        // Remove orphan repository instances.
+        if ($DB->get_dbfamily() === 'mysql') {
+            $sql = "DELETE {repository_instances} FROM {repository_instances}
+                    LEFT JOIN {context} ON {context}.id = {repository_instances}.contextid
+                    WHERE {context}.id IS NULL";
+        } else {
+            $sql = "DELETE FROM {repository_instances}
+                    WHERE NOT EXISTS (
+                        SELECT 'x' FROM {context}
+                        WHERE {context}.id = {repository_instances}.contextid)";
+        }
+        $DB->execute($sql);
+
+        // Main savepoint reached.
+        upgrade_main_savepoint(true, 2013070800.00);
+    }
+
+    if ($oldversion < 2013070800.01) {
+
+        // Define field lastnamephonetic to be added to user.
+        $table = new xmldb_table('user');
+        $field = new xmldb_field('lastnamephonetic', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'imagealt');
+        $index = new xmldb_index('lastnamephonetic', XMLDB_INDEX_NOTUNIQUE, array('lastnamephonetic'));
+
+        // Conditionally launch add field lastnamephonetic.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+            $dbman->add_index($table, $index);
+        }
+
+        // Define field firstnamephonetic to be added to user.
+        $table = new xmldb_table('user');
+        $field = new xmldb_field('firstnamephonetic', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'lastnamephonetic');
+        $index = new xmldb_index('firstnamephonetic', XMLDB_INDEX_NOTUNIQUE, array('firstnamephonetic'));
+
+        // Conditionally launch add field firstnamephonetic.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+            $dbman->add_index($table, $index);
+        }
+
+        // Define field alternatename to be added to user.
+        $table = new xmldb_table('user');
+        $field = new xmldb_field('middlename', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'firstnamephonetic');
+        $index = new xmldb_index('middlename', XMLDB_INDEX_NOTUNIQUE, array('middlename'));
+
+        // Conditionally launch add field firstnamephonetic.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+            $dbman->add_index($table, $index);
+        }
+
+        // Define field alternatename to be added to user.
+        $table = new xmldb_table('user');
+        $field = new xmldb_field('alternatename', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'middlename');
+        $index = new xmldb_index('alternatename', XMLDB_INDEX_NOTUNIQUE, array('alternatename'));
+
+        // Conditionally launch add field alternatename.
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+            $dbman->add_index($table, $index);
+        }
+
+        // Main savepoint reached.
+        upgrade_main_savepoint(true, 2013070800.01);
+    }
+
     return true;
 }
index ecb064b..90f48bf 100644 (file)
@@ -264,15 +264,6 @@ function reset_login_count() {
     debugging('reset_login_count() is deprecated, all calls need to be removed');
 }
 
-/**
- * Unsupported session id rewriting.
- * @deprecated
- * @param string $buffer
- */
-function sid_ob_rewrite($buffer) {
-    throw new coding_exception('$CFG->usesid support was removed completely and can not be used.');
-}
-
 /**
  * Insert or update log display entry. Entry may already exist.
  * $module, $action must be unique
@@ -389,153 +380,43 @@ function get_file_url($path, $options=null, $type='coursefile') {
 }
 
 /**
- * If there has been an error uploading a file, print the appropriate error message
- * Numerical constants used as constant definitions not added until PHP version 4.2.0
- * @deprecated removed - use new file api
- */
-function print_file_upload_error($filearray = '', $returnerror = false) {
-    throw new coding_exception('print_file_upload_error() can not be used any more, please use new file API');
-}
-
-/**
- * Handy function for resolving file conflicts
- * @deprecated removed - use new file api
- */
-
-function resolve_filename_collisions($destination,$files,$format='%s_%d.%s') {
-    throw new coding_exception('resolve_filename_collisions() can not be used any more, please use new file API');
-}
-
-/**
- * Checks a file name for any conflicts
- * @deprecated removed - use new file api
- */
-function check_potential_filename($destination,$filename,$files) {
-    throw new coding_exception('check_potential_filename() can not be used any more, please use new file API');
-}
-
-/**
- * This function prints out a number of upload form elements.
- * @deprecated removed - use new file api
- */
-function upload_print_form_fragment($numfiles=1, $names=null, $descriptions=null, $uselabels=false, $labelnames=null, $coursebytes=0, $modbytes=0, $return=false) {
-    throw new coding_exception('upload_print_form_fragment() can not be used any more, please use new file API');
-}
-
-/**
- * Return the authentication plugin title
- *
- * @param string $authtype plugin type
- * @return string
+ * @deprecated use get_string("pluginname", "auth_[PLUINNAME]") instead.
+ * @todo remove completely in MDL-40517
  */
 function auth_get_plugin_title($authtype) {
-    debugging('Function auth_get_plugin_title() is deprecated, please use standard get_string("pluginname", "auth_'.$authtype.'")!');
-    return get_string('pluginname', "auth_{$authtype}");
+    throw new coding_exception('Function auth_get_plugin_title() is deprecated, please use standard get_string("pluginname", "auth_'.$authtype.'")!');
 }
 
-
-
 /**
- * Enrol someone without using the default role in a course
- * @deprecated
- */
-function enrol_into_course($course, $user, $enrol) {
-    error('Function enrol_into_course() was removed, please use new enrol plugins instead!');
-}
-
-/**
- * Returns a role object that is the default role for new enrolments in a given course
- *
- * @deprecated
- * @param object $course
- * @return object returns a role or NULL if none set
+ * @deprecated use indivividual enrol plugin settings instead
+ * @todo remove completely in MDL-40517
  */
 function get_default_course_role($course) {
-    debugging('Function get_default_course_role() is deprecated, please use individual enrol plugin settings instead!');
-
-    $student = get_archetype_roles('student');
-    $student = reset($student);
-
-    return $student;
+    throw new coding_exception('get_default_course_role() can not be used any more, please use enrol plugin settings instead!');
 }
 
 /**
- * Extremely slow enrolled courses query.
- * @deprecated
- */
-function get_my_courses($userid, $sort='visible DESC,sortorder ASC', $fields=NULL, $doanything=false,$limit=0) {
-    error('Function get_my_courses() was removed, please use new enrol_get_my_courses() or enrol_get_users_courses()!');
-}
-
-/**
- * Was returning list of translations, use new string_manager instead
- *
- * @deprecated
- * @param bool $refreshcache force refreshing of lang cache
- * @param bool $returnall ignore langlist, return all languages available
- * @return array An associative array with contents in the form of LanguageCode => LanguageName
+ * @deprecated use get_string_manager()->get_list_of_translations() instead.
+ * @todo remove completely in MDL-40517
  */
 function get_list_of_languages($refreshcache=false, $returnall=false) {
-    debugging('get_list_of_languages() is deprecated, please use get_string_manager()->get_list_of_translations() instead.');
-    if ($refreshcache) {
-        get_string_manager()->reset_caches();
-    }
-    return get_string_manager()->get_list_of_translations($returnall);
+    throw new coding_exception('get_list_of_languages() can not be used any more, please use get_string_manager()->get_list_of_translations() instead.');
 }
 
 /**
- * Returns a list of currencies in the current language
- * @deprecated
- * @return array
+ * @deprecated use get_string_manager()->get_list_of_currencies() instead.
+ * @todo remove completely in MDL-40517
  */
 function get_list_of_currencies() {
-    debugging('get_list_of_currencies() is deprecated, please use get_string_manager()->get_list_of_currencies() instead.');
-    return get_string_manager()->get_list_of_currencies();
+    throw new coding_exception('get_list_of_currencies() can not be used any more, please use get_string_manager()->get_list_of_currencies() instead.');
 }
 
 /**
- * Returns a list of all enabled country names in the current translation
- * @deprecated
- * @return array two-letter country code => translated name.
+ * @deprecated use get_string_manager()->get_list_of_countries() instead.
+ * @todo remove completely in MDL-40517
  */
 function get_list_of_countries() {
-    debugging('get_list_of_countries() is deprecated, please use get_string_manager()->get_list_of_countries() instead.');
-    return get_string_manager()->get_list_of_countries(false);
-}
-
-/**
- * @deprecated
- */
-function isteacher() {
-    error('Function isteacher() was removed, please use capabilities instead!');
-}
-
-/**
- * @deprecated
- */
-function isteacherinanycourse() {
-    throw new coding_Exception('Function isteacherinanycourse() was removed, please use capabilities instead!');
-}
-
-/**
- * @deprecated
- */
-function get_guest() {
-    throw new coding_Exception('Function get_guest() was removed, please use capabilities instead!');
-}
-
-/**
- * @deprecated
- */
-function isguest() {
-    throw new coding_Exception('Function isguest() was removed, please use capabilities instead!');
-}
-
-/**
- * @deprecated
- */
-function get_teacher() {
-    throw new coding_Exception('Function get_teacher() was removed, please use capabilities instead!');
+    throw new coding_exception('get_list_of_countries() can not be used any more, please use get_string_manager()->get_list_of_countries() instead.');
 }
 
 /**
@@ -593,195 +474,54 @@ function get_recent_enrolments($courseid, $timestart) {
     return $DB->get_records_sql($sql, $params);
 }
 
-
-/**
- * Turn the ctx* fields in an objectlike record into a context subobject
- * This allows us to SELECT from major tables JOINing with
- * context at no cost, saving a ton of context lookups...
- *
- * Use context_instance_preload() instead.
- *
- * @deprecated since 2.0
- * @param object $rec
- * @return object
- */
-function make_context_subobj($rec) {
-    throw new coding_Exception('make_context_subobj() was removed, use new context preloading');
-}
-
-/**
- * Do some basic, quick checks to see whether $rec->context looks like a valid context object.
- *
- * Use context_instance_preload() instead.
- *
- * @deprecated since 2.0
- * @param object $rec a think that has a context, for example a course,
- *      course category, course modules, etc.
- * @param int $contextlevel the type of thing $rec is, one of the CONTEXT_... constants.
- * @return bool whether $rec->context looks like the correct context object
- *      for this thing.
- */
-function is_context_subobj_valid($rec, $contextlevel) {
-    throw new coding_Exception('is_context_subobj_valid() was removed, use new context preloading');
-}
-
-/**
- * Ensure that $rec->context is present and correct before you continue
- *
- * When you have a record (for example a $category, $course, $user or $cm that may,
- * or may not, have come from a place that does make_context_subobj, you can use
- * this method to ensure that $rec->context is present and correct before you continue.
- *
- * Use context_instance_preload() instead.
- *
- * @deprecated since 2.0
- * @param object $rec a thing that has an associated context.
- * @param integer $contextlevel the type of thing $rec is, one of the CONTEXT_... constants.
- */
-function ensure_context_subobj_present(&$rec, $contextlevel) {
-    throw new coding_Exception('ensure_context_subobj_present() was removed, use new context preloading');
-}
-
 ########### FROM weblib.php ##########################################################################
 
-
 /**
- * Print a message in a standard themed box.
- * This old function used to implement boxes using tables.  Now it uses a DIV, but the old
- * parameters remain.  If possible, $align, $width and $color should not be defined at all.
- * Preferably just use print_box() in weblib.php
- *
- * @deprecated
- * @param string $message The message to display
- * @param string $align alignment of the box, not the text (default center, left, right).
- * @param string $width width of the box, including units %, for example '100%'.
- * @param string $color background colour of the box, for example '#eee'.
- * @param int $padding padding in pixels, specified without units.
- * @param string $class space-separated class names.
- * @param string $id space-separated id names.
- * @param boolean $return return as string or just print it
- * @return string|void Depending on $return
+ * @deprecated use $OUTPUT->box() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_simple_box($message, $align='', $width='', $color='', $padding=5, $class='generalbox', $id='', $return=false) {
-    $output = '';
-    $output .= print_simple_box_start($align, $width, $color, $padding, $class, $id, true);
-    $output .= $message;
-    $output .= print_simple_box_end(true);
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_simple_box can not be used any more. Please use $OUTPUT->box() instead');
 }
 
-
-
 /**
- * This old function used to implement boxes using tables.  Now it uses a DIV, but the old
- * parameters remain.  If possible, $align, $width and $color should not be defined at all.
- * Even better, please use print_box_start() in weblib.php
- *
- * @param string $align alignment of the box, not the text (default center, left, right).   DEPRECATED
- * @param string $width width of the box, including % units, for example '100%'.            DEPRECATED
- * @param string $color background colour of the box, for example '#eee'.                   DEPRECATED
- * @param int $padding padding in pixels, specified without units.                          OBSOLETE
- * @param string $class space-separated class names.
- * @param string $id space-separated id names.
- * @param boolean $return return as string or just print it
- * @return string|void Depending on $return
+ * @deprecated use $OUTPUT->box_start instead.
+ * @todo remove completely in MDL-40517
  */
 function print_simple_box_start($align='', $width='', $color='', $padding=5, $class='generalbox', $id='', $return=false) {
-    debugging('print_simple_box(_start/_end) is deprecated. Please use $OUTPUT->box(_start/_end) instead', DEBUG_DEVELOPER);
-
-    $output = '';
-
-    $divclasses = 'box '.$class.' '.$class.'content';
-    $divstyles  = '';
-
-    if ($align) {
-        $divclasses .= ' boxalign'.$align;    // Implement alignment using a class
-    }
-    if ($width) {    // Hopefully we can eliminate these in calls to this function (inline styles are bad)
-        if (substr($width, -1, 1) == '%') {    // Width is a % value
-            $width = (int) substr($width, 0, -1);    // Extract just the number
-            if ($width < 40) {
-                $divclasses .= ' boxwidthnarrow';    // Approx 30% depending on theme
-            } else if ($width > 60) {
-                $divclasses .= ' boxwidthwide';      // Approx 80% depending on theme
-            } else {
-                $divclasses .= ' boxwidthnormal';    // Approx 50% depending on theme
-            }
-        } else {
-            $divstyles  .= ' width:'.$width.';';     // Last resort
-        }
-    }
-    if ($color) {    // Hopefully we can eliminate these in calls to this function (inline styles are bad)
-        $divstyles  .= ' background:'.$color.';';
-    }
-    if ($divstyles) {
-        $divstyles = ' style="'.$divstyles.'"';
-    }
-
-    if ($id) {
-        $id = ' id="'.$id.'"';
-    }
-
-    $output .= '<div'.$id.$divstyles.' class="'.$divclasses.'">';
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_simple_box_start can not be used any more. Please use $OUTPUT->box_start instead');
 }
 
-
 /**
- * Print the end portion of a standard themed box.
- * Preferably just use print_box_end() in weblib.php
- *
- * @param boolean $return return as string or just print it
- * @return string|void Depending on $return
+ * @deprecated use $OUTPUT->box_end instead.
+ * @todo remove completely in MDL-40517
  */
 function print_simple_box_end($return=false) {
-    $output = '</div>';
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_simple_box_end can not be used any more. Please use $OUTPUT->box_end instead');
 }
 
 /**
- * Given some text this function converted any URLs it found into HTML links
- *
- * This core function has been replaced with filter_urltolink since Moodle 2.0
- *
- * @param string $text Passed in by reference. The string to be searched for urls.
+ * @deprecated the urltolink filter now does this job.
+ * @todo remove completely in MDL-40517
  */
 function convert_urls_into_links($text) {
-    debugging('convert_urls_into_links() has been deprecated and replaced by a new filter');
+    throw new coding_exception('convert_urls_into_links() can not be used any more and replaced by the urltolink filter');
 }
 
 /**
- * Used to be called from help.php to inject a list of smilies into the
- * emoticons help file.
- *
- * @return string HTML
+ * @deprecated use the emoticon_manager class instead.
+ * @todo remove completely in MDL-40517
  */
 function get_emoticons_list_for_help_file() {
-    debugging('get_emoticons_list_for_help_file() has been deprecated, see the new emoticon_manager API');
-    return '';
+    throw new coding_exception('get_emoticons_list_for_help_file() can not be used any more, use the new emoticon_manager API instead');
 }
 
 /**
- * Was used to replace all known smileys in the text with image equivalents
- *
- * This core function has been replaced with filter_emoticon since Moodle 2.0
+ * @deprecated use emoticon filter now does this job.
+ * @todo remove completely in MDL-40517
  */
 function replace_smilies(&$text) {
-    debugging('replace_smilies() has been deprecated and replaced with the new filter_emoticon');
+    throw new coding_exception('replace_smilies() can not be used any more and replaced with the emoticon filter.');
 }
 
 /**
@@ -1071,17 +811,6 @@ function error($message, $link='') {
 /// removed functions ////
 //////////////////////////
 
-/**
- * @deprecated
- * @param mixed $name
- * @param mixed $editorhidebuttons
- * @param mixed $id
- * @return void Throws an error and does nothing
- */
-function use_html_editor($name='', $editorhidebuttons='', $id='') {
-    error('use_html_editor() not available anymore');
-}
-
 /**
  * The old method that was used to include JavaScript libraries.
  * Please use $PAGE->requires->js_module() instead.
@@ -1097,38 +826,6 @@ function require_js($lib) {
     throw new coding_exception('require_js() was removed, use new JS api');
 }
 
-/**
- * Makes an upload directory for a particular module.
- *
- * This function has been deprecated by the file API changes in Moodle 2.0.
- *
- * @deprecated
- * @param int $courseid The id of the course in question - maps to id field of 'course' table.
- * @return string|false Returns full path to directory if successful, false if not
- */
-function make_mod_upload_directory($courseid) {
-    throw new coding_exception('make_mod_upload_directory has been deprecated by the file API changes in Moodle 2.0.');
-}
-
-/**
- * Used to be used for setting up the theme. No longer used by core code, and
- * should not have been used elsewhere.
- *
- * The theme is now automatically initialised before it is first used. If you really need
- * to force this to happen, just reference $PAGE->theme.
- *
- * To force a particular theme on a particular page, you can use $PAGE->force_theme(...).
- * However, I can't think of any valid reason to do that outside the theme selector UI.
- *
- * @deprecated
- * @param string $theme The theme to use defaults to current theme
- * @param array $params An array of parameters to use
- */
-function theme_setup($theme = '', $params=NULL) {
-    throw new coding_exception('The function theme_setup is no longer required, and should no longer be used. ' .
-            'The current theme gets initialised automatically before it is first used.');
-}
-
 /**
  * @deprecated use $PAGE->theme->name instead.
  * @return string the name of the current theme.
@@ -1167,132 +864,51 @@ function skip_main_destination() {
 }
 
 /**
- * Prints a string in a specified size  (retained for backward compatibility)
- *
- * @deprecated
- * @param string $text The text to be displayed
- * @param int $size The size to set the font for text display.
- * @param bool $return If set to true output is returned rather than echoed Default false
- * @return string|void String if return is true
+ * @deprecated use $OUTPUT->heading() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_headline($text, $size=2, $return=false) {
-    global $OUTPUT;
-    debugging('print_headline() has been deprecated. Please change your code to use $OUTPUT->heading().');
-    $output = $OUTPUT->heading($text, $size);
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_headline() can not be used any more. Please use $OUTPUT->heading() instead.');
 }
 
 /**
- * Prints text in a format for use in headings.
- *
- * @deprecated
- * @param string $text The text to be displayed
- * @param string $deprecated No longer used. (Use to do alignment.)
- * @param int $size The size to set the font for text display.
- * @param string $class
- * @param bool $return If set to true output is returned rather than echoed, default false
- * @param string $id The id to use in the element
- * @return string|void String if return=true nothing otherwise
+ * @deprecated use $OUTPUT->heading() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_heading($text, $deprecated = '', $size = 2, $class = 'main', $return = false, $id = '') {
-    global $OUTPUT;
-    debugging('print_heading() has been deprecated. Please change your code to use $OUTPUT->heading().');
-    if (!empty($deprecated)) {
-        debugging('Use of deprecated align attribute of print_heading. ' .
-                'Please do not specify styling in PHP code like that.', DEBUG_DEVELOPER);
-    }
-    $output = $OUTPUT->heading($text, $size, $class, $id);
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_heading() can not be used any more. Please use $OUTPUT->heading() instead.');
 }
 
 /**
- * Output a standard heading block
- *
- * @deprecated
- * @param string $heading The text to write into the heading
- * @param string $class An additional Class Attr to use for the heading
- * @param bool $return If set to true output is returned rather than echoed, default false
- * @return string|void HTML String if return=true nothing otherwise
+ * @deprecated use $OUTPUT->heading() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_heading_block($heading, $class='', $return=false) {
-    global $OUTPUT;
-    debugging('print_heading_with_block() has been deprecated. Please change your code to use $OUTPUT->heading().');
-    $output = $OUTPUT->heading($heading, 2, 'headingblock header ' . renderer_base::prepare_classes($class));
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_heading_with_block() can not be used any more. Please use $OUTPUT->heading() instead.');
 }
 
 /**
- * Print a message in a standard themed box.
- * Replaces print_simple_box (see deprecatedlib.php)
- *
- * @deprecated
- * @param string $message, the content of the box
- * @param string $classes, space-separated class names.
- * @param string $ids
- * @param boolean $return, return as string or just print it
- * @return string|void mixed string or void
+ * @deprecated use $OUTPUT->box() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_box($message, $classes='generalbox', $ids='', $return=false) {
-    global $OUTPUT;
-    debugging('print_box() has been deprecated. Please change your code to use $OUTPUT->box().');
-    $output = $OUTPUT->box($message, $classes, $ids);
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_box() can not be used any more. Please use $OUTPUT->box() instead.');
 }
 
 /**
- * Starts a box using divs
- * Replaces print_simple_box_start (see deprecatedlib.php)
- *
- * @deprecated
- * @param string $classes, space-separated class names.
- * @param string $ids
- * @param boolean $return, return as string or just print it
- * @return string|void  string or void
+ * @deprecated use $OUTPUT->box_start() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_box_start($classes='generalbox', $ids='', $return=false) {
-    global $OUTPUT;
-    debugging('print_box_start() has been deprecated. Please change your code to use $OUTPUT->box_start().');
-    $output = $OUTPUT->box_start($classes, $ids);
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_box_start() can not be used any more. Please use $OUTPUT->box_start() instead.');
 }
 
 /**
- * Simple function to end a box (see above)
- * Replaces print_simple_box_end (see deprecatedlib.php)
- *
- * @deprecated
- * @param boolean $return, return as string or just print it
- * @return string|void Depending on value of return
+ * @deprecated use $OUTPUT->box_end() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_box_end($return=false) {
-    global $OUTPUT;
-    debugging('print_box_end() has been deprecated. Please change your code to use $OUTPUT->box_end().');
-    $output = $OUTPUT->box_end();
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_box_end() can not be used any more. Please use $OUTPUT->box_end() instead.');
 }
 
 /**
@@ -1343,10 +959,11 @@ function print_container_start($clearfix=false, $classes='', $idbase='', $return
 }
 
 /**
- * Deprecated, now handled automatically in themes
+ * @deprecated do not use any more, is not automatic
+ * @todo remove completely in MDL-40517
  */
 function check_theme_arrows() {
-    debugging('check_theme_arrows() has been deprecated, do not use it anymore, it is now automatic.');
+    throw new coding_exception('check_theme_arrows() has been deprecated, do not use it anymore, it is now automatic.');
 }
 
 /**
@@ -1522,43 +1139,20 @@ function print_header_simple($title='', $heading='', $navigation='', $focus='',
     }
 }
 
+/**
+ * @deprecated use $OUTPUT->footer() instead.
+ * @todo remove completely in MDL-40517
+ */
 function print_footer($course = NULL, $usercourse = NULL, $return = false) {
-    global $PAGE, $OUTPUT;
-    debugging('print_footer() has been deprecated. Please change your code to use $OUTPUT->footer().');
-    // TODO check arguments.
-    if (is_string($course)) {
-        debugging("Magic values like 'home', 'empty' passed to print_footer no longer have any effect. " .
-                'To achieve a similar effect, call $PAGE->set_pagelayout before you call print_header.', DEBUG_DEVELOPER);
-    } else if (!empty($course->id) && $course->id != $PAGE->course->id) {
-        throw new coding_exception('The $course object you passed to print_footer does not match $PAGE->course.');
-    }
-    if (!is_null($usercourse)) {
-        debugging('The second parameter ($usercourse) to print_footer is no longer supported. ' .
-                '(I did not think it was being used anywhere.)', DEBUG_DEVELOPER);
-    }
-    $output = $OUTPUT->footer();
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_footer() cant be used anymore. Please use $OUTPUT->footer() instead.');
 }
 
 /**
- * Returns text to be displayed to the user which reflects their login status
- *
- * @global object
- * @global object
- * @global object
- * @global object
- * @uses CONTEXT_COURSE
- * @param course $course {@link $COURSE} object containing course information
- * @param user $user {@link $USER} object containing user information
- * @return string HTML
+ * @deprecated use theme layouts instead.
+ * @todo remove completely in MDL-40517
  */
 function user_login_string($course='ignored', $user='ignored') {
-    debugging('user_login_info() has been deprecated. User login info is now handled via themes layouts.');
-    return '';
+    throw new coding_exception('user_login_info() cant be used anymore. User login info is now handled via themes layouts.');
 }
 
 /**
@@ -1610,421 +1204,89 @@ function print_side_block($heading='', $content='', $list=NULL, $icons=NULL, $fo
 }
 
 /**
- * Starts a nice side block with an optional header.
- *
- * @todo Finish documenting this function
- *
- * @global object
- * @global object
- * @param string $heading HTML for the heading. Can include full HTML or just
- *   plain text - plain text will automatically be enclosed in the appropriate
- *   heading tags.
- * @param array $attributes HTML attributes to apply if possible
- * @deprecated
- */
-function print_side_block_start($heading='', $attributes = array()) {
-    throw new coding_exception('print_side_block_start has been deprecated. Please change your code to use $OUTPUT->block().');
-}
-
-/**
- * Print table ending tags for a side block box.
- *
- * @global object
- * @global object
- * @param array $attributes HTML attributes to apply if possible [id]
- * @param string $title
- * @deprecated
- */
-function print_side_block_end($attributes = array(), $title='') {
-    throw new coding_exception('print_side_block_end has been deprecated. Please change your code to use $OUTPUT->block().');
-}
-
-/**
- * This was used by old code to see whether a block region had anything in it,
- * and hence wether that region should be printed.
- *
- * We don't ever want old code to print blocks, so we now always return false.
- * The function only exists to avoid fatal errors in old code.
- *
- * @deprecated since Moodle 2.0. always returns false.
- *
- * @param object $blockmanager
- * @param string $region
- * @return bool
+ * @deprecated blocks are now printed by theme.
+ * @todo remove completely in MDL-40517
  */
 function blocks_have_content(&$blockmanager, $region) {
-    debugging('The function blocks_have_content should no longer be used. Blocks are now printed by the theme.');
-    return false;
+    throw new coding_exception('blocks_have_content() can no longer be used. Blocks are now printed by the theme.');
 }
 
 /**
- * This was used by old code to print the blocks in a region.
- *
- * We don't ever want old code to print blocks, so this is now a no-op.
- * The function only exists to avoid fatal errors in old code.
- *
- * @deprecated since Moodle 2.0. does nothing.
- *
- * @param object $page
- * @param object $blockmanager
- * @param string $region
+ * @deprecated blocks are now printed by the theme.
+ * @todo remove completely in MDL-40517
  */
 function blocks_print_group($page, $blockmanager, $region) {
-    debugging('The function blocks_print_group should no longer be used. Blocks are now printed by the theme.');
+    throw new coding_exception('function blocks_print_group() can no longer be used. Blocks are now printed by the theme.');
 }
 
 /**
- * This used to be the old entry point for anyone that wants to use blocks.
- * Since we don't want people people dealing with blocks this way any more,
- * just return a suitable empty array.
- *
- * @deprecated since Moodle 2.0.
- *
- * @param object $page
- * @return array
+ * @deprecated blocks are now printed by the theme.
+ * @todo remove completely in MDL-40517
  */
 function blocks_setup(&$page, $pinned = BLOCKS_PINNED_FALSE) {
-    debugging('The function blocks_print_group should no longer be used. Blocks are now printed by the theme.');
-    return array(BLOCK_POS_LEFT => array(), BLOCK_POS_RIGHT => array());
+    throw new coding_exception('blocks_print_group() can no longer be used. Blocks are now printed by the theme.');
 }
 
 /**
- * This iterates over an array of blocks and calculates the preferred width
- * Parameter passed by reference for speed; it's not modified.
- *
- * @deprecated since Moodle 2.0. Layout is now controlled by the theme.
- *
- * @param mixed $instances
+ * @deprecated Layout is now controlled by the theme.
+ * @todo remove completely in MDL-40517
  */
 function blocks_preferred_width($instances) {
-    debugging('The function blocks_print_group should no longer be used. Blocks are now printed by the theme.');
-    $width = 210;
-}
-
-/**
- * @deprecated since Moodle 2.0. See the replacements in blocklib.php.
- *
- * @param object $page The page object
- * @param object $blockmanager The block manager object
- * @param string $blockaction One of [config, add, delete]
- * @param int|object $instanceorid The instance id or a block_instance object
- * @param bool $pinned
- * @param bool $redirect To redirect or not to that is the question but you should stick with true
- */
-function blocks_execute_action($page, &$blockmanager, $blockaction, $instanceorid, $pinned=false, $redirect=true) {
-    throw new coding_exception('blocks_execute_action is no longer used. The way blocks work has been changed. See the new code in blocklib.php.');
-}
-
-/**
- * You can use this to get the blocks to respond to URL actions without much hassle
- *
- * @deprecated since Moodle 2.0. Blocks have been changed. {@link block_manager::process_url_actions} is the closest replacement.
- *
- * @param object $PAGE
- * @param object $blockmanager
- * @param bool $pinned
- */
-function blocks_execute_url_action(&$PAGE, &$blockmanager,$pinned=false) {
-    throw new coding_exception('blocks_execute_url_action is no longer used. It has been replaced by methods of block_manager.');
-}
-
-/**
- * This shouldn't be used externally at all, it's here for use by blocks_execute_action()
- * in order to reduce code repetition.
- *
- * @deprecated since Moodle 2.0. See the replacements in blocklib.php.
- *
- * @param $instance
- * @param $newpos
- * @param string|int $newweight
- * @param bool $pinned
- */
-function blocks_execute_repositioning(&$instance, $newpos, $newweight, $pinned=false) {
-    throw new coding_exception('blocks_execute_repositioning is no longer used. The way blocks work has been changed. See the new code in blocklib.php.');
-}
-
-
-/**
- * Moves a block to the new position (column) and weight (sort order).
- *
- * @deprecated since Moodle 2.0. See the replacements in blocklib.php.
- *
- * @param object $instance The block instance to be moved.
- * @param string $destpos BLOCK_POS_LEFT or BLOCK_POS_RIGHT. The destination column.
- * @param string $destweight The destination sort order. If NULL, we add to the end
- *                    of the destination column.
- * @param bool $pinned Are we moving pinned blocks? We can only move pinned blocks
- *                to a new position withing the pinned list. Likewise, we
- *                can only moved non-pinned blocks to a new position within
- *                the non-pinned list.
- * @return boolean success or failure
- */
-function blocks_move_block($page, &$instance, $destpos, $destweight=NULL, $pinned=false) {
-    throw new coding_exception('blocks_move_block is no longer used. The way blocks work has been changed. See the new code in blocklib.php.');
+    throw new coding_exception('blocks_print_group() can no longer be used. Blocks are now printed by the theme.');
 }
 
 /**
- * Print a nicely formatted table.
- *
- * @deprecated since Moodle 2.0
- *
- * @param array $table is an object with several properties.
+ * @deprecated use html_writer::table() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_table($table, $return=false) {
-    global $OUTPUT;
-    // TODO MDL-19755 turn debugging on once we migrate the current core code to use the new API
-    debugging('print_table() has been deprecated. Please change your code to use html_writer::table().');
-    $newtable = new html_table();
-    foreach ($table as $property => $value) {
-        if (property_exists($newtable, $property)) {
-            $newtable->{$property} = $value;
-        }
-    }
-    if (isset($table->class)) {
-        $newtable->attributes['class'] = $table->class;
-    }
-    if (isset($table->rowclass) && is_array($table->rowclass)) {
-        debugging('rowclass[] has been deprecated for html_table and should be replaced by rowclasses[]. please fix the code.');
-        $newtable->rowclasses = $table->rowclass;
-    }
-    $output = html_writer::table($newtable);
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-        return true;
-    }
+    throw new coding_exception('print_table() can no longer be used. Use html_writer::table() instead.');
 }
 
 /**
- * Creates and displays (or returns) a link to a popup window
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $url Web link. Either relative to $CFG->wwwroot, or a full URL.
- * @param string $name Name to be assigned to the popup window (this is used by
- *   client-side scripts to "talk" to the popup window)
- * @param string $linkname Text to be displayed as web link
- * @param int $height Height to assign to popup window
- * @param int $width Height to assign to popup window
- * @param string $title Text to be displayed as popup page title
- * @param string $options List of additional options for popup window
- * @param bool $return If true, return as a string, otherwise print
- * @param string $id id added to the element
- * @param string $class class added to the element
- * @return string html code to display a link to a popup window.
+ * @deprecated use $OUTPUT->action_link() instead (note: popups are discouraged for accesibility reasons)
+ * @todo remove completely in MDL-40517
  */
 function link_to_popup_window ($url, $name=null, $linkname=null, $height=400, $width=500, $title=null, $options=null, $return=false) {
-    debugging('link_to_popup_window() has been removed. Please change your code to use $OUTPUT->action_link(). Please note popups are discouraged for accessibility reasons');
-
-    return html_writer::link($url, $name);
+    throw new coding_exception('link_to_popup_window() can no longer be used. Please to use $OUTPUT->action_link() instead.');
 }
 
 /**
- * Creates and displays (or returns) a buttons to a popup window.
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $url Web link. Either relative to $CFG->wwwroot, or a full URL.
- * @param string $name Name to be assigned to the popup window (this is used by
- *   client-side scripts to "talk" to the popup window)
- * @param string $linkname Text to be displayed as web link
- * @param int $height Height to assign to popup window
- * @param int $width Height to assign to popup window
- * @param string $title Text to be displayed as popup page title
- * @param string $options List of additional options for popup window
- * @param bool $return If true, return as a string, otherwise print
- * @param string $id id added to the element
- * @param string $class class added to the element
- * @return string html code to display a link to a popup window.
+ * @deprecated use $OUTPUT->single_button() instead.
+ * @todo remove completely in MDL-40517
  */
 function button_to_popup_window ($url, $name=null, $linkname=null,
                                  $height=400, $width=500, $title=null, $options=null, $return=false,
                                  $id=null, $class=null) {
-    global $OUTPUT;
-
-    debugging('button_to_popup_window() has been deprecated. Please change your code to use $OUTPUT->single_button().');
-
-    if ($options == 'none') {
-        $options = null;
-    }
-
-    if (empty($linkname)) {
-        throw new coding_exception('A link must have a descriptive text value! See $OUTPUT->action_link() for usage.');
-    }
-
-    // Create a single_button object
-    $form = new single_button($url, $linkname, 'post');
-    $form->button->title = $title;
-    $form->button->id = $id;
-
-    // Parse the $options string
-    $popupparams = array();
-    if (!empty($options)) {
-        $optionsarray = explode(',', $options);
-        foreach ($optionsarray as $option) {
-            if (strstr($option, '=')) {
-                $parts = explode('=', $option);
-                if ($parts[1] == '0') {
-                    $popupparams[$parts[0]] = false;
-                } else {
-                    $popupparams[$parts[0]] = $parts[1];
-                }
-            } else {
-                $popupparams[$option] = true;
-            }
-        }
-    }
-
-    if (!empty($height)) {
-        $popupparams['height'] = $height;
-    }
-    if (!empty($width)) {
-        $popupparams['width'] = $width;
-    }
-
-    $form->button->add_action(new popup_action('click', $url, $name, $popupparams));
-    $output = $OUTPUT->render($form);
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('button_to_popup_window() can no longer be used. Please use $OUTPUT->single_button() instead.');
 }
 
 /**
- * Print a self contained form with a single submit button.
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $link used as the action attribute on the form, so the URL that will be hit if the button is clicked.
- * @param array $options these become hidden form fields, so these options get passed to the script at $link.
- * @param string $label the caption that appears on the button.
- * @param string $method HTTP method used on the request of the button is clicked. 'get' or 'post'.
- * @param string $notusedanymore no longer used.
- * @param boolean $return if false, output the form directly, otherwise return the HTML as a string.
- * @param string $tooltip a tooltip to add to the button as a title attribute.
- * @param boolean $disabled if true, the button will be disabled.
- * @param string $jsconfirmmessage if not empty then display a confirm dialogue with this string as the question.
- * @param string $formid The id attribute to use for the form
- * @return string|void Depending on the $return paramter.
+ * @deprecated use $OUTPUT->single_button() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_single_button($link, $options, $label='OK', $method='get', $notusedanymore='',
         $return=false, $tooltip='', $disabled = false, $jsconfirmmessage='', $formid = '') {
-    global $OUTPUT;
-
-    debugging('print_single_button() has been deprecated. Please change your code to use $OUTPUT->single_button().');
-
-    // Cast $options to array
-    $options = (array) $options;
-
-    $button = new single_button(new moodle_url($link, $options), $label, $method, array('disabled'=>$disabled, 'title'=>$tooltip, 'id'=>$formid));
-
-    if ($jsconfirmmessage) {
-        $button->button->add_confirm_action($jsconfirmmessage);
-    }
-
-    $output = $OUTPUT->render($button);
 
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_single_button() can no longer be used. Please use $OUTPUT->single_button() instead.');
 }
 
 /**
- * Print a spacer image with the option of including a line break.
- *
- * @deprecated since Moodle 2.0
- *
- * @global object
- * @param int $height The height in pixels to make the spacer
- * @param int $width The width in pixels to make the spacer
- * @param boolean $br If set to true a BR is written after the spacer
+ * @deprecated use $OUTPUT->spacer() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_spacer($height=1, $width=1, $br=true, $return=false) {
-    global $CFG, $OUTPUT;
-
-    debugging('print_spacer() has been deprecated. Please change your code to use $OUTPUT->spacer().');
-
-    $output = $OUTPUT->spacer(array('height'=>$height, 'width'=>$width, 'br'=>$br));
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_spacer() can no longer be used. Please use $OUTPUT->spacer() instead.');
 }
 
 /**
- * Given the path to a picture file in a course, or a URL,
- * this function includes the picture in the page.
- *
- * @deprecated since Moodle 2.0
- */
-function print_file_picture($path, $courseid=0, $height='', $width='', $link='', $return=false) {
-    throw new coding_exception('print_file_picture() has been deprecated since Moodle 2.0. Please use $OUTPUT->action_icon() instead.');
-}
-
-/**
- * Print the specified user's avatar.
- *
- * @deprecated since Moodle 2.0
- *
- * @global object
- * @global object
- * @param mixed $user Should be a $user object with at least fields id, picture, imagealt, firstname, lastname, email
- *      If any of these are missing, or if a userid is passed, the the database is queried. Avoid this
- *      if at all possible, particularly for reports. It is very bad for performance.
- * @param int $courseid The course id. Used when constructing the link to the user's profile.
- * @param boolean $picture The picture to print. By default (or if NULL is passed) $user->picture is used.
- * @param int $size Size in pixels. Special values are (true/1 = 100px) and (false/0 = 35px) for backward compatibility
- * @param boolean $return If false print picture to current page, otherwise return the output as string
- * @param boolean $link enclose printed image in a link the user's profile (default true).
- * @param string $target link target attribute. Makes the profile open in a popup window.
- * @param boolean $alttext add non-blank alt-text to the image. (Default true, set to false for purely
- *      decorative images, or where the username will be printed anyway.)
- * @return string|void String or nothing, depending on $return.
+ * @deprecated use $OUTPUT->user_picture() instead.
+ * @todo remove completely in MDL-40517
  */
 function print_user_picture($user, $courseid, $picture=NULL, $size=0, $return=false, $link=true, $target='', $alttext=true) {
-    global $OUTPUT;
-
-    debugging('print_user_picture() has been deprecated. Please change your code to use $OUTPUT->user_picture($user, array(\'courseid\'=>$courseid).');
-
-    if (!is_object($user)) {
-        $userid = $user;
-        $user = new stdClass();
-        $user->id = $userid;
-    }
-
-    if (empty($user->picture) and $picture) {
-        $user->picture = $picture;
-    }
-
-    $options = array('size'=>$size, 'link'=>$link, 'alttext'=>$alttext, 'courseid'=>$courseid, 'popup'=>!empty($target));
-
-    $output = $OUTPUT->user_picture($user, $options);
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
-}
-
-/**
- * Print a png image.
- *
- * @deprecated since Moodle 2.0: no replacement
- *
- */
-function print_png() {
-    throw new coding_exception('print_png() has been deprecated since Moodle 2.0. Please use $OUTPUT->pix_icon() instead.');
+    throw new coding_exception('print_user_picture() can no longer be used. Please use $OUTPUT->user_picture($user, array(\'courseid\'=>$courseid) instead.');
 }
 
-
 /**
  * Prints a basic textarea field.
  *
@@ -2104,23 +1366,11 @@ function helpbutton($page, $title, $module='moodle', $image=true, $linktext=fals
 }
 
 /**
- * Print a help button.
- *
- * Prints a special help button that is a link to the "live" emoticon popup
- *
- * @todo Finish documenting this function
- *
- * @global object
- * @global object
- * @param string $form ?
- * @param string $field ?
- * @param boolean $return If true then the output is returned as a string, if false it is printed to the current page.
- * @return string|void Depending on value of $return
+ * @deprecated this is now handled by text editors
+ * @todo remove completely in MDL-40517
  */
 function emoticonhelpbutton($form, $field, $return = false) {
-    /// TODO: MDL-21215
-
-    debugging('emoticonhelpbutton() was removed, new text editors will implement this feature');
+    throw new coding_exception('emoticonhelpbutton() was removed, new text editors will implement this feature');
 }
 
 /**
@@ -2219,80 +1469,25 @@ function print_arrow($direction='up', $strsort=null, $return=false) {
  * Also contains an icon by default. Shown to teachers and admin only.
  *
  * @deprecated since Moodle 2.0
- */
-function doc_link($path='', $text='', $iconpath='ignored') {
-    throw new coding_exception('doc_link() can not be used any more, please see $OUTPUT->doc_link().');
-}
-
-/**
- * Prints a single paging bar to provide access to other pages  (usually in a search)
- *
- * @deprecated since Moodle 2.0
- *
- * @param int $totalcount Thetotal number of entries available to be paged through
- * @param int $page The page you are currently viewing
- * @param int $perpage The number of entries that should be shown per page
- * @param mixed $baseurl If this  is a string then it is the url which will be appended with $pagevar, an equals sign and the page number.
- *                          If this is a moodle_url object then the pagevar param will be replaced by the page no, for each page.
- * @param string $pagevar This is the variable name that you use for the page number in your code (ie. 'tablepage', 'blogpage', etc)
- * @param bool $nocurr do not display the current page as a link (dropped, link is never displayed for the current page)
- * @param bool $return whether to return an output string or echo now
- * @return bool|string depending on $result
- */
-function print_paging_bar($totalcount, $page, $perpage, $baseurl, $pagevar='page',$nocurr=false, $return=false) {
-    global $OUTPUT;
-
-    debugging('print_paging_bar() has been deprecated. Please change your code to use $OUTPUT->render($pagingbar).');
-
-    if (empty($nocurr)) {
-        debugging('the feature of parameter $nocurr has been removed from the paging_bar');
-    }
-
-    $pagingbar = new paging_bar($totalcount, $page, $perpage, $baseurl);
-    $pagingbar->pagevar = $pagevar;
-    $output = $OUTPUT->render($pagingbar);
-
-    if ($return) {
-        return $output;
-    }
-
-    echo $output;
-    return true;
-}
-
-/**
- * Print a message along with "Yes" and "No" links for the user to continue.
- *
- * @deprecated since Moodle 2.0
- *
- * @global object
- * @param string $message The text to display
- * @param string $linkyes The link to take the user to if they choose "Yes"
- * @param string $linkno The link to take the user to if they choose "No"
- * @param string $optionyes The yes option to show on the notice
- * @param string $optionsno The no option to show
- * @param string $methodyes Form action method to use if yes [post, get]
- * @param string $methodno Form action method to use if no [post, get]
- * @return void Output is echo'd
- */
-function notice_yesno($message, $linkyes, $linkno, $optionsyes=NULL, $optionsno=NULL, $methodyes='post', $methodno='post') {
-
-    debugging('notice_yesno() has been deprecated. Please change your code to use $OUTPUT->confirm($message, $buttoncontinue, $buttoncancel).');
-
-    global $OUTPUT;
-
-    $buttoncontinue = new single_button(new moodle_url($linkyes, $optionsyes), get_string('yes'), $methodyes);
-    $buttoncancel   = new single_button(new moodle_url($linkno, $optionsno), get_string('no'), $methodno);
+ */
+function doc_link($path='', $text='', $iconpath='ignored') {
+    throw new coding_exception('doc_link() can not be used any more, please see $OUTPUT->doc_link().');
+}
 
-    echo $OUTPUT->confirm($message, $buttoncontinue, $buttoncancel);
+/**
+ * @deprecated use $OUTPUT->render($pagingbar) instead.
+ * @todo remove completely in MDL-40517
+ */
+function print_paging_bar($totalcount, $page, $perpage, $baseurl, $pagevar='page',$nocurr=false, $return=false) {
+    throw new coding_exception('print_paging_bar() can not be used any more. Please use $OUTPUT->render($pagingbar) instead.');
 }
 
 /**
- * Prints a scale menu (as part of an existing form) including help button
- * @deprecated since Moodle 2.0
+ * @deprecated use $OUTPUT->confirm($message, $buttoncontinue, $buttoncancel) instead.
+ * @todo remove completely in MDL-40517
  */
-function print_scale_menu() {
-    throw new coding_exception('print_scale_menu() has been deprecated since the Jurassic period. Get with the times!.');
+function notice_yesno($message, $linkyes, $linkno, $optionsyes=NULL, $optionsno=NULL, $methodyes='post', $methodno='post') {
+    throw new coding_exception('notice_yesno() can not be used any more. Please use $OUTPUT->confirm($message, $buttoncontinue, $buttoncancel) instead.');
 }
 
 /**
@@ -2352,69 +1547,21 @@ function choose_from_menu ($options, $name, $selected='', $nothing='choose', $sc
 }
 
 /**
- * Choose value 0 or 1 from a menu with options 'No' and 'Yes'.
- * Other options like choose_from_menu.
- *
- * @deprecated since Moodle 2.0
- *
- * Calls {@link choose_from_menu()} with preset arguments
- * @see choose_from_menu()
- *
- * @param string $name the name of this form control, as in &lt;select name="..." ...
- * @param string $selected the option to select initially, default none.
- * @param string $script if not '', then this is added to the &lt;select> element as an onchange handler.
- * @param boolean $return Whether this function should return a string or output it (defaults to false)
- * @param boolean $disabled (defaults to false)
- * @param int $tabindex
- * @return string|void If $return=true returns string, else echo's and returns void
+ * @deprecated use html_writer::select_yes_no() instead.
+ * @todo remove completely in MDL-40517
  */
 function choose_from_menu_yesno($name, $selected, $script = '', $return = false, $disabled = false, $tabindex = 0) {
-    debugging('choose_from_menu_yesno() has been deprecated. Please change your code to use html_writer.');
-    global $OUTPUT;
-
-    if ($script) {
-        debugging('The $script parameter has been deprecated. You must use component_actions instead', DEBUG_DEVELOPER);
-    }
-
-    $output = html_writer::select_yes_no($name, $selected, array('disabled'=>($disabled ? 'disabled' : null), 'tabindex'=>$tabindex));
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('choose_from_menu_yesno() can not be used anymore. Please use html_writerselect_yes_no() instead.');
 }
 
 /**
- * Just like choose_from_menu, but takes a nested array (2 levels) and makes a dropdown menu
- * including option headings with the first level.
- *
- * @deprecated since Moodle 2.0
- *
- * This function is very similar to {@link choose_from_menu_yesno()}
- * and {@link choose_from_menu()}
- *
- * @todo Add datatype handling to make sure $options is an array
- *
- * @param array $options An array of objects to choose from
- * @param string $name The XHTML field name
- * @param string $selected The value to select by default
- * @param string $nothing The label for the 'nothing is selected' option.
- *                        Defaults to get_string('choose').
- * @param string $script If not '', then this is added to the &lt;select> element
- *                       as an onchange handler.
- * @param string $nothingvalue The value for the first `nothing` option if $nothing is set
- * @param bool $return Whether this function should return a string or output
- *                     it (defaults to false)
- * @param bool $disabled Is the field disabled by default
- * @param int|string $tabindex Override the tabindex attribute [numeric]
- * @return string|void If $return=true returns string, else echo's and returns void
+ * @deprecated use html_writer::select() instead.
+ * @todo remove completely in MDL-40517
  */
 function choose_from_menu_nested($options,$name,$selected='',$nothing='choose',$script = '',
                                  $nothingvalue=0,$return=false,$disabled=false,$tabindex=0) {
 
-    debugging('choose_from_menu_nested() has been removed. Please change your code to use html_writer::select().');
-    global $OUTPUT;
+    throw new coding_exception('choose_from_menu_nested() can not be used any more. Please use html_writer::select() instead.');
 }
 
 /**
@@ -2441,79 +1588,20 @@ function print_scale_menu_helpbutton($courseid, $scale, $return=false) {
     }
 }
 
-
-/**
- * Prints time limit value selector
- *
- * @deprecated since Moodle 2.0
- *
- * Uses {@link choose_from_menu()} to generate HTML
- * @see choose_from_menu()
- *
- * @global object
- * @param int $timelimit default
- * @param string $unit
- * @param string $name
- * @param boolean $return If set to true returns rather than echo's
- * @return string|bool Depending on value of $return
- */
-function print_timer_selector($timelimit = 0, $unit = '', $name = 'timelimit', $return=false) {
-    throw new coding_exception('print_timer_selector is completely removed. Please use html_writer instead');
-}
-
 /**
- * Prints form items with the names $hour and $minute
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $hour  fieldname
- * @param string $minute  fieldname
- * @param int $currenttime A default timestamp in GMT
- * @param int $step minute spacing
- * @param boolean $return If set to true returns rather than echo's
- * @return string|bool Depending on value of $return
+ * @deprecated use html_writer::select_time() instead
+ * @todo remove completely in MDL-40517
  */
 function print_time_selector($hour, $minute, $currenttime=0, $step=5, $return=false) {
-    debugging('print_time_selector() has been deprecated. Please change your code to use html_writer.');
-
-    $hourselector = html_writer::select_time('hours', $hour, $currenttime);
-    $minuteselector = html_writer::select_time('minutes', $minute, $currenttime, $step);
-
-    $output = $hourselector . $$minuteselector;
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new moodle_exception('print_time_selector() can not be used any more . Please use html_writer::select_time() instead.');
 }
 
 /**
- * Prints form items with the names $day, $month and $year
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $day   fieldname
- * @param string $month  fieldname
- * @param string $year  fieldname
- * @param int $currenttime A default timestamp in GMT
- * @param boolean $return If set to true returns rather than echo's
- * @return string|bool Depending on value of $return
+ * @deprecated please use html_writer::select_time instead
+ * @todo remove completely in MDL-40517
  */
 function print_date_selector($day, $month, $year, $currenttime=0, $return=false) {
-    debugging('print_date_selector() has been deprecated. Please change your code to use html_writer.');
-
-    $dayselector = html_writer::select_time('days', $day, $currenttime);
-    $monthselector = html_writer::select_time('months', $month, $currenttime);
-    $yearselector = html_writer::select_time('years', $year, $currenttime);
-
-    $output = $dayselector . $monthselector . $yearselector;
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('print_date_selector() can not be used any more. Please use html_writer::select_time() instead.');
 }
 
 /**
@@ -2527,45 +1615,19 @@ function popup_form($baseurl, $options, $formid, $selected='', $nothing='choose'
 }
 
 /**
- * Prints a simple button to close a window
- *
- * @deprecated since Moodle 2.0
- *
- * @global object
- * @param string $name Name of the window to close
- * @param boolean $return whether this function should return a string or output it.
- * @param boolean $reloadopener if true, clicking the button will also reload
- *      the page that opend this popup window.
- * @return string|void if $return is true, void otherwise
+ * @deprecated use $OUTPUT->close_window_button() instead.
+ * @todo remove completely in MDL-40517
  */
 function close_window_button($name='closewindow', $return=false, $reloadopener = false) {
-    global $OUTPUT;
-
-    debugging('close_window_button() has been deprecated. Please change your code to use $OUTPUT->close_window_button().');
-    $output = $OUTPUT->close_window_button(get_string($name));
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
+    throw new coding_exception('close_window_button() can not be used any more. Use $OUTPUT->close_window_button() instead.');
 }
 
 /**
- * Given an array of values, creates a group of radio buttons to be part of a form
- *
- * @deprecated since Moodle 2.0
- *
- * @staticvar int $idcounter
- * @param array  $options  An array of value-label pairs for the radio group (values as keys)
- * @param string $name     Name of the radiogroup (unique in the form)
- * @param string $checked  The value that is already checked
- * @param bool $return Whether this function should return a string or output
- *                     it (defaults to false)
- * @return string|void If $return=true returns string, else echo's and returns void
+ * @deprecated use html_writer instead.
+ * @todo remove completely in MDL-40517
  */
 function choose_from_radio ($options, $name, $checked='', $return=false) {
-    debugging('choose_from_radio() has been removed. Please change your code to use html_writer.');
+    throw new coding_exception('choose_from_radio() can not be used any more. Please use html_writer instead.');
 }
 
 /**
@@ -2604,99 +1666,29 @@ function print_checkbox($name, $value, $checked = true, $label = '', $alt = '',
 
 }
 
-
 /**
- * Display an standard html text field with an optional label
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $name    The name of the text field
- * @param string $value   The value of the text field
- * @param string $alt     The info to be inserted in the alt tag
- * @param int $size Sets the size attribute of the field. Defaults to 50
- * @param int $maxlength Sets the maxlength attribute of the field. Not set by default
- * @param bool $return Whether this function should return a string or output
- *                     it (defaults to false)
- * @return string|void If $return=true returns string, else echo's and returns void
+ * @deprecated use mforms or html_writer instead.
+ * @todo remove completely in MDL-40517
  */
 function print_textfield($name, $value, $alt = '', $size=50, $maxlength=0, $return=false) {
-    debugging('print_textfield() has been deprecated. Please use mforms or html_writer.');
-
-    if ($alt === '') {
-        $alt = null;
-    }
-
-    $style = "width: {$size}px;";
-    $attributes = array('type'=>'text', 'name'=>$name, 'alt'=>$alt, 'style'=>$style, 'value'=>$value);
-    if ($maxlength) {
-        $attributes['maxlength'] = $maxlength;
-    }
-
-    $output = html_writer::empty_tag('input', $attributes);
-
-    if (empty($return)) {
-        echo $output;
-    } else {
-        return $output;
-    }
+    throw new coding_exception('print_textfield() can not be used anymore. Please use mforms or html_writer instead.');
 }
 
 
 /**
- * Centered heading with attached help button (same title text)
- * and optional icon attached
- *
- * @deprecated since Moodle 2.0
- *
- * @param string $text The text to be displayed
- * @param string $helppage The help page to link to
- * @param string $module The module whose help should be linked to
- * @param string $icon Image to display if needed
- * @param bool $return If set to true output is returned rather than echoed, default false
- * @return string|void String if return=true nothing otherwise
+ * @deprecated use $OUTPUT->heading_with_help() instead
+ * @todo remove completely in MDL-40517
  */
 function print_heading_with_help($text, $helppage, $module='moodle', $icon=false, $return=false) {
-
-    debugging('print_heading_with_help() has been deprecated. Please change your code to use $OUTPUT->heading().');
-
-    global $OUTPUT;
-
-    // Extract the src from $icon if it exists
-    if (preg_match('/src="([^"]*)"/', $icon, $matches)) {
-        $icon = $matches[1];
-        $icon = new moodle_url($icon);
-    } else {
-        $icon = '';
-    }
-
-    $output = $OUTPUT->heading_with_help($text, $helppage, $module, $icon);
-
-    if ($return) {
-        return $output;
-    } else {
-        echo $output;
-    }
-}
-
-/**
- * Returns a turn edit on/off button for course in a self contained form.
- * Used to be an icon, but it's now a simple form button
- * @deprecated since Moodle 2.0
- */
-function update_mymoodle_icon() {
-    throw new coding_exception('update_mymoodle_icon() has been completely deprecated.');
+    throw new coding_exception('print_heading_with_help() can not be used anymore. Please use $OUTPUT->heading_with_help() instead.');
 }
 
 /**
- * Returns a turn edit on/off button for tag in a self contained form.
- * @deprecated since Moodle 2.0
- * @param string $tagid The ID attribute
- * @return string
+ * @deprecated use $OUTPUT->edit_button() instead.
+ * @todo remove completely in MDL-40517
  */
 function update_tag_button($tagid) {
-    global $OUTPUT;
-    debugging('update_tag_button() has been deprecated. Please change your code to use $OUTPUT->edit_button(moodle_url).');
-    return $OUTPUT->edit_button(new moodle_url('/tag/index.php', array('id' => $tagid)));
+    throw new coding_exception('update_tag_button() can not be used any more. Please $OUTPUT->edit_button(moodle_url) instead.');
 }
 
 
@@ -2728,39 +1720,11 @@ function update_module_button($cmid, $ignored, $string) {
 }
 
 /**
- * Prints the editing button on search results listing
- * For bulk move courses to another category
- * @deprecated since Moodle 2.0
- */
-function update_categories_search_button($search,$page,$perpage) {
-    throw new coding_exception('update_categories_search_button() has been completely deprecated.');
-}
-
-/**
- * Prints a summary of a user in a nice little box.
- * @deprecated since Moodle 2.0
- */
-function print_user($user, $course, $messageselect=false, $return=false) {
-    throw new coding_exception('print_user() has been completely deprecated. See user/index.php for new usage.');
-}
-
-/**
- * Returns a turn edit on/off button for course in a self contained form.
- * Used to be an icon, but it's now a simple form button
- *
- * Note that the caller is responsible for capchecks.
- *
- * @global object
- * @global object
- * @param int $courseid The course  to update by id as found in 'course' table
- * @return string
+ * @deprecated use $OUTPUT->edit_button() instead.
+ * @todo remove completely in MDL-40517
  */
 function update_course_icon($courseid) {
-    global $CFG, $OUTPUT;
-
-    debugging('update_course_button() has been deprecated. Please change your code to use $OUTPUT->edit_button(moodle_url).');
-
-    return $OUTPUT->edit_button(new moodle_url('/course/view.php', array('id' => $courseid)));
+    throw new coding_exception('update_course_button() can not be used anymore. Please use $OUTPUT->edit_button(moodle_url) instead.');
 }
 
 /**
@@ -2882,38 +1846,27 @@ function navmenu($course, $cm=NULL, $targetwindow='self') {
 }
 
 /**
- * Returns a little popup menu for switching roles
- *
- * @deprecated in Moodle 2.0
- * @param int $courseid The course  to update by id as found in 'course' table
- * @return string
+ * @deprecated use the settings block instead.
+ * @todo remove completely in MDL-40517
  */
 function switchroles_form($courseid) {
-    debugging('switchroles_form() has been deprecated and replaced by an item in the global settings block');
-    return '';
+    throw new coding_exception('switchroles_form() can not be used any more. The global settings block does this job.');
 }
 
 /**
- * Print header for admin page
- * @deprecated since Moodle 20. Please use normal $OUTPUT->header() instead
- * @param string $focus focus element
+ * @deprecated Please use normal $OUTPUT->header() instead
+ * @todo remove completely in MDL-40517
  */
 function admin_externalpage_print_header($focus='') {
-    global $OUTPUT;
-
-    debugging('admin_externalpage_print_header is deprecated. Please $OUTPUT->header() instead.', DEBUG_DEVELOPER);
-
-    echo $OUTPUT->header();
+    throw new coding_exception('admin_externalpage_print_header can not be used any more. Please $OUTPUT->header() instead.');
 }
 
 /**
- * @deprecated since Moodle 1.9. Please use normal $OUTPUT->footer() instead
+ * @deprecated Please use normal $OUTPUT->footer() instead
+ * @todo remove completely in MDL-40517
  */
 function admin_externalpage_print_footer() {
-// TODO Still 103 referernces in core code. Don't do debugging output yet.
-    debugging('admin_externalpage_print_footer is deprecated. Please $OUTPUT->footer() instead.', DEBUG_DEVELOPER);
-    global $OUTPUT;
-    echo $OUTPUT->footer();
+    throw new coding_exception('admin_externalpage_print_footer can not be used anymore Please $OUTPUT->footer() instead.');
 }
 
 /// CALENDAR MANAGEMENT  ////////////////////////////////////////////////////////////////
@@ -4069,7 +3022,7 @@ function get_categories($parent='none', $sort=NULL, $shallow=true) {
 
     $rs = $DB->get_recordset_sql($sql, $params);
     foreach($rs as $cat) {
-        context_instance_preload($cat);
+        context_helper::preload_from_record($cat);
         $catcontext = context_coursecat::instance($cat->id);
         if ($cat->visible || has_capability('moodle/category:viewhiddencategories', $catcontext)) {
             $categories[$cat->id] = $cat;
@@ -4301,7 +3254,7 @@ function get_course_category_tree($id = 0, $depth = 0) {
             if ($course->id == SITEID) {
                 continue;
             }
-            context_instance_preload($course);
+            context_helper::preload_from_record($course);
             if (!empty($course->visible) || has_capability('moodle/course:viewhiddencourses', context_course::instance($course->id))) {
                 $categoryids[$course->category]->courses[$course->id] = $course;
             }
@@ -4474,7 +3427,7 @@ function blog_get_context_url($context=null) {
             break;
         case CONTEXT_MODULE:
             $filterparam = 'modid';
-            $strlevel = print_context_name($context);
+            $strlevel = $context->get_context_name();
             break;
         case CONTEXT_USER:
             $filterparam = 'userid';
@@ -4605,7 +3558,7 @@ function get_courses_wmanagers($categoryid=0, $sort="c.sortorder ASC", $fields=a
         // the context, and prepping data to fetch the
         // managers efficiently later...
         foreach ($courses as $k => $course) {
-            context_instance_preload($course);
+            context_helper::preload_from_record($course);
             $coursecontext = context_course::instance($course->id);
             $courses[$k] = $course;
             $courses[$k]->managers = array();
@@ -4899,3 +3852,227 @@ function get_context_instance_by_id($id, $strictness = IGNORE_MISSING) {
     debugging('get_context_instance_by_id() is deprecated, please use context::instance_by_id($id) instead.', DEBUG_DEVELOPER);
     return context::instance_by_id($id, $strictness);
 }
+
+/**
+ * @deprecated since Moodle 2.2
+ * @see load_temp_course_role()
+ */
+function load_temp_role($context, $roleid, array $accessdata) {
+    throw new coding_exception('load_temp_role() can not be used any more, please use load_temp_course_role()');
+}
+
+/**
+ * @deprecated since Moodle 2.2
+ * @see remove_temp_course_roles()
+ */
+function remove_temp_roles($context, array $accessdata) {
+    throw new coding_exception('remove_temp_roles() can not be used any more, please use remove_temp_course_roles()');
+}
+
+/**
+ * Returns system context or null if can not be created yet.
+ *
+ * @see context_system::instance()
+ * @deprecated since 2.2
+ * @param bool $cache use caching
+ * @return context system context (null if context table not created yet)
+ */
+function get_system_context($cache = true) {
+    debugging('get_system_context() is deprecated, please use context_system::instance() instead.', DEBUG_DEVELOPER);
+    return context_system::instance(0, IGNORE_MISSING, $cache);
+}
+
+/**
+ * Recursive function which, given a context, find all parent context ids,
+ * and return the array in reverse order, i.e. parent first, then grand
+ * parent, etc.
+ *
+ * @see context::get_parent_context_ids()
+ * @deprecated since 2.2, use $context->get_parent_context_ids() instead
+ * @param context $context
+ * @param bool $includeself optional, defaults to false
+ * @return array
+ */
+function get_parent_contexts(context $context, $includeself = false) {
+    debugging('get_parent_contexts() is deprecated, please use $context->get_parent_context_ids() instead.', DEBUG_DEVELOPER);
+    return $context->get_parent_context_ids($includeself);
+}
+
+/**
+ * Return the id of the parent of this context, or false if there is no parent (only happens if this
+ * is the site context.)
+ *
+ * @deprecated since Moodle 2.2
+ * @see context::get_parent_context()
+ * @param context $context
+ * @return integer the id of the parent context.
+ */
+function get_parent_contextid(context $context) {
+    debugging('get_parent_contextid() is deprecated, please use $context->get_parent_context() instead.', DEBUG_DEVELOPER);
+
+    if ($parent = $context->get_parent_context()) {
+        return $parent->id;
+    } else {
+        return false;
+    }
+}
+
+/**
+ * Recursive function which, given a context, find all its children contexts.
+ *
+ * For course category contexts it will return immediate children only categories and courses.
+ * It will NOT recurse into courses or child categories.
+ * If you want to do that, call it on the returned courses/categories.
+ *
+ * When called for a course context, it will return the modules and blocks
+ * displayed in the course page.
+ *
+ * If called on a user/course/module context it _will_ populate the cache with the appropriate
+ * contexts ;-)
+ *
+ * @see context::get_child_contexts()
+ * @deprecated since 2.2
+ * @param context $context
+ * @return array Array of child records
+ */
+function get_child_contexts(context $context) {
+    debugging('get_child_contexts() is deprecated, please use $context->get_child_contexts() instead.', DEBUG_DEVELOPER);
+    return $context->get_child_contexts();
+}
+
+/**
+ * Precreates all contexts including all parents.
+ *
+ * @see context_helper::create_instances()
+ * @deprecated since 2.2
+ * @param int $contextlevel empty means all
+ * @param bool $buildpaths update paths and depths
+ * @return void
+ */
+function create_contexts($contextlevel = null, $buildpaths = true) {
+    debugging('create_contexts() is deprecated, please use context_helper::create_instances() instead.', DEBUG_DEVELOPER);
+    context_helper::create_instances($contextlevel, $buildpaths);
+}
+
+/**
+ * Remove stale context records.
+ *
+ * @see context_helper::cleanup_instances()
+ * @deprecated since 2.2
+ * @return bool
+ */
+function cleanup_contexts() {
+    debugging('cleanup_contexts() is deprecated, please use context_helper::cleanup_instances() instead.', DEBUG_DEVELOPER);
+    context_helper::cleanup_instances();
+    return true;
+}
+
+/**
+ * Populate context.path and context.depth where missing.
+ *
+ * @see context_helper::build_all_paths()
+ * @deprecated since 2.2
+ * @param bool $force force a complete rebuild of the path and depth fields, defaults to false
+ * @return void
+ */
+function build_context_path($force = false) {
+    debugging('build_context_path() is deprecated, please use context_helper::build_all_paths() instead.', DEBUG_DEVELOPER);
+    context_helper::build_all_paths($force);
+}
+
+/**
+ * Rebuild all related context depth and path caches.
+ *
+ * @see context::reset_paths()
+ * @deprecated since 2.2
+ * @param array $fixcontexts array of contexts, strongtyped
+ * @return void
+ */
+function rebuild_contexts(array $fixcontexts) {
+    debugging('rebuild_contexts() is deprecated, please use $context->reset_paths(true) instead.', DEBUG_DEVELOPER);
+    foreach ($fixcontexts as $fixcontext) {
+        $fixcontext->reset_paths(false);
+    }
+    context_helper::build_all_paths(false);
+}
+
+/**
+ * Preloads all contexts relating to a course: course, modules. Block contexts
+ * are no longer loaded here. The contexts for all the blocks on the current
+ * page are now efficiently loaded by {@link block_manager::load_blocks()}.
+ *
+ * @deprecated since Moodle 2.2
+ * @see context_helper::preload_course()
+ * @param int $courseid Course ID
+ * @return void
+ */
+function preload_course_contexts($courseid) {
+    debugging('preload_course_contexts() is deprecated, please use context_helper::preload_course() instead.', DEBUG_DEVELOPER);
+    context_helper::preload_course($courseid);
+}
+
+/**
+ * Update the path field of the context and all dep. subcontexts that follow
+ *
+ * Update the path field of the context and
+ * all the dependent subcontexts that follow
+ * the move.
+ *
+ * The most important thing here is to be as
+ * DB efficient as possible. This op can have a
+ * massive impact in the DB.
+ *
+ * @deprecated since Moodle 2.2
+ * @see context::update_moved()
+ * @param context $context context obj
+ * @param context $newparent new parent obj
+ * @return void
+ */
+function context_moved(context $context, context $newparent) {
+    debugging('context_moved() is deprecated, please use context::update_moved() instead.', DEBUG_DEVELOPER);
+    $context->update_moved($newparent);
+}
+
+/**
+ * Preloads context information from db record and strips the cached info.
+ * The db request has to contain both the $join and $select from context_instance_preload_sql()
+ *
+ * @deprecated since 2.2
+ * @see context_helper::preload_from_record()
+ * @param stdClass $rec
+ * @return void (modifies $rec)
+ */
+function context_instance_preload(stdClass $rec) {
+    debugging('context_instance_preload() is deprecated, please use context_helper::preload_from_record() instead.', DEBUG_DEVELOPER);
+    context_helper::preload_from_record($rec);
+}
+
+/**
+ * Returns context level name
+ *
+ * @deprecated since 2.2
+ * @see context_helper::get_level_name()
+ * @param integer $contextlevel $context->context level. One of the CONTEXT_... constants.
+ * @return string the name for this type of context.
+ */
+function get_contextlevel_name($contextlevel) {
+    debugging('get_contextlevel_name() is deprecated, please use context_helper::get_level_name() instead.', DEBUG_DEVELOPER);
+    return context_helper::get_level_name($contextlevel);
+}
+
+/**
+ * Prints human readable context identifier.
+ *
+ * @deprecated since 2.2
+ * @see context::get_context_name()
+ * @param context $context the context.
+ * @param boolean $withprefix whether to prefix the name of the context with the
+ *      type of context, e.g. User, Course, Forum, etc.
+ * @param boolean $short whether to user the short name of the thing. Only applies
+ *      to course contexts
+ * @return string the human readable context name.
+ */
+function print_context_name(context $context, $withprefix = true, $short = false) {
+    debugging('print_context_name() is deprecated, please use $context->get_context_name() instead.', DEBUG_DEVELOPER);
+    return $context->get_context_name($withprefix, $short);
+}
index 63f2470..4ac7472 100644 (file)
@@ -140,7 +140,8 @@ class mssql_native_moodle_database extends moodle_database {
         $this->store_settings($dbhost, $dbuser, $dbpass, $dbname, $prefix, $dboptions);
 
         $dbhost = $this->dbhost;
-        if (isset($dboptions['dbport'])) {
+        // Zero shouldn't be used as a port number so doing a check with empty() should be fine.
+        if (!empty($dboptions['dbport'])) {
             if (stristr(PHP_OS, 'win') && !stristr(PHP_OS, 'darwin')) {
                 $dbhost .= ','.$dboptions['dbport'];
             } else {
index 9616cd9..8487e9c 100644 (file)
@@ -45,5 +45,82 @@ function xmldb_editor_tinymce_upgrade($oldversion) {
     // Put any upgrade step following this.
 
 
+    // Moodle v2.6.0 release upgrade line.
+    // Put any upgrade step following this.
+
+    if ($oldversion < 2013061400) {
+        // Reset redesigned editor toolbar setting.
+        $oldorder = "fontselect,fontsizeselect,formatselect,|,undo,redo,|,search,replace,|,fullscreen
+
+bold,italic,underline,strikethrough,sub,sup,|,justifyleft,justifycenter,justifyright,|,cleanup,removeformat,pastetext,pasteword,|,forecolor,backcolor,|,ltr,rtl
+
+bullist,numlist,outdent,indent,|,link,unlink,|,image,nonbreaking,charmap,table,|,code";
+
+        $neworder = "formatselect,bold,italic,|,bullist,numlist,|,link,unlink,|,image
+
+undo,redo,|,underline,strikethrough,sub,sup,|,justifyleft,justifycenter,justifyright,|,outdent,indent,|,forecolor,backcolor,|,ltr,rtl,|,nonbreaking,charmap,table
+
+fontselect,fontsizeselect,code,search,replace,|,cleanup,removeformat,pastetext,pasteword,|,fullscreen";
+        $currentorder = get_config('editor_tinymce', 'customtoolbar');
+        if ($currentorder == $oldorder) {
+            unset_config('customtoolbar', 'editor_tinymce');
+            set_config('customtoolbar', $neworder, 'editor_tinymce');
+        }
+        upgrade_plugin_savepoint(true, 2013061400, 'editor', 'tinymce');
+    }
+
+    if ($oldversion < 2013070500) {
+        // Insert wrap plugin to nicely wrap the toolbars on small screens.
+        $oldorder = "formatselect,bold,italic,|,bullist,numlist,|,link,unlink,|,image
+
+undo,redo,|,underline,strikethrough,sub,sup,|,justifyleft,justifycenter,justifyright,|,outdent,indent,|,forecolor,backcolor,|,ltr,rtl,|,nonbreaking,charmap,table
+
+fontselect,fontsizeselect,code,search,replace,|,cleanup,removeformat,pastetext,pasteword,|,fullscreen";
+
+        $neworder = "formatselect,bold,italic,wrap,bullist,numlist,|,link,unlink,|,image
+
+undo,redo,|,underline,strikethrough,sub,sup,|,justifyleft,justifycenter,justifyright,wrap,outdent,indent,|,forecolor,backcolor,|,ltr,rtl,|,nonbreaking,charmap,table
+
+fontselect,fontsizeselect,wrap,code,search,replace,|,cleanup,removeformat,pastetext,pasteword,|,fullscreen";
+        $currentorder = get_config('editor_tinymce', 'customtoolbar');
+        if ($currentorder == $oldorder) {
+            unset_config('customtoolbar', 'editor_tinymce');
+            set_config('customtoolbar', $neworder, 'editor_tinymce');
+        } else {
+            // Simple auto conversion algorithm.
+            $toolbars = explode("\n", $oldorder);
+            $newtoolbars = array();
+            foreach ($toolbars as $toolbar) {
+                $sepcount = substr_count($toolbar, '|');
+
+                if ($sepcount > 0) {
+                    // We assume the middle separator (rounding down).
+                    $divisionindex = round($sepcount / 2, 0, PHP_ROUND_HALF_DOWN);
+
+                    $buttons = explode(',', $toolbar);
+                    $index = 0;
+                    foreach ($buttons as $key => $button) {
+                        if ($button === "|") {
+                            if ($index == $divisionindex) {
+                                $buttons[$key] = 'wrap';
+                                break;
+                            } else {
+                                $index += 1;
+                            }
+                        }
+                    }
+                    $toolbar = implode(',', $buttons);
+                }
+                array_push($newtoolbars, $toolbar);
+            }
+            $neworder = implode("\n", $newtoolbars);
+
+            // Set the new config.
+            unset_config('customtoolbar', 'editor_tinymce');
+            set_config('customtoolbar', $neworder, 'editor_tinymce');
+        }
+        upgrade_plugin_savepoint(true, 2013070500, 'editor', 'tinymce');
+    }
+
     return true;
 }