Merge branch 'wip-MDL-29188-master' of git://github.com/samhemelryk/moodle
authorAparup Banerjee <aparup@moodle.com>
Tue, 13 Sep 2011 03:58:21 +0000 (11:58 +0800)
committerAparup Banerjee <aparup@moodle.com>
Tue, 13 Sep 2011 03:58:21 +0000 (11:58 +0800)
180 files changed:
admin/langimport.php
admin/registration/forms.php
admin/settings/appearance.php
admin/settings/courses.php
admin/timezoneimport.php
admin/uploadpicture.php
auth/db/auth.php
auth/db/cli/sync_users.php
auth/mnet/auth.php
backup/backup_scheduled.php
backup/controller/backup_controller.class.php
backup/controller/restore_controller.class.php
backup/converter/convertlib.php
backup/converter/moodle1/lib.php
backup/converter/moodle1/simpletest/testlib.php
backup/import.php
backup/lib.php
backup/restorefile.php
backup/util/checks/backup_check.class.php
backup/util/checks/restore_check.class.php
backup/util/dbops/backup_controller_dbops.class.php
backup/util/dbops/backup_plan_dbops.class.php
backup/util/factories/backup_factory.class.php
backup/util/helper/backup_cron_helper.class.php
backup/util/helper/backup_file_manager.class.php
backup/util/helper/backup_general_helper.class.php
backup/util/helper/backup_helper.class.php
backup/util/helper/convert_helper.class.php
backup/util/loggers/simpletest/testlogger.php
backup/util/plan/backup_plan.class.php
backup/util/plan/restore_plan.class.php
backup/util/plan/simpletest/teststep.php
backup/util/ui/renderer.php
backup/util/ui/restore_ui_stage.class.php
backup/util/xml/output/simpletest/testoutput.php
blocks/community/communitycourse.php
blocks/community/locallib.php
blocks/course_list/block_course_list.php
blocks/navigation/block_navigation.php
blocks/rss_client/block_rss_client.php
blog/lib.php
blog/rsslib.php
calendar/export_execute.php
calendar/renderer.php
config-dist.php
course/delete.php
course/info.php
course/lib.php
course/modduplicate.php
course/publish/index.php
course/publish/metadata.php
course/recent_form.php
course/report/completion/index.php
course/report/log/graph.php
course/report/log/lib.php
course/report/progress/index.php
course/report/stats/report.php
course/rest.php
enrol/authorize/localfuncs.php
enrol/authorize/locallib.php
enrol/authorize/uploadcsv.php
enrol/database/lib.php
enrol/flatfile/lib.php
enrol/ldap/lib.php
enrol/meta/addinstance_form.php
enrol/paypal/ipn.php
enrol/paypal/lib.php
files/externallib.php
filter/tex/latex.php
filter/tex/lib.php
grade/edit/outcome/import.php
grade/export/ods/grade_export_ods.php
grade/export/txt/grade_export_txt.php
grade/export/xls/grade_export_xls.php
grade/export/xml/grade_export_xml.php
grade/import/csv/index.php
grade/report/overview/lib.php
group/index.php
group/overview.php
lang/en/admin.php
lang/en/error.php
lang/en/message.php
lang/en/moodle.php
lib/accesslib.php
lib/componentlib.class.php
lib/csvlib.class.php
lib/db/install.xml
lib/db/upgrade.php
lib/enrollib.php
lib/excellib.class.php
lib/filelib.php
lib/filestorage/zip_packer.php
lib/filterlib.php
lib/formslib.php
lib/javascript.php
lib/messagelib.php
lib/minify/config.php
lib/moodlelib.php
lib/navigationlib.php
lib/odslib.class.php
lib/outputcomponents.php
lib/outputlib.php
lib/outputrenderers.php
lib/outputrequirementslib.php
lib/pdflib.php
lib/profilerlib.php
lib/rsslib.php
lib/setup.php
lib/setuplib.php
lib/simplepie/moodle_simplepie.php
lib/simpletest/broken_testfiltermanager.php
lib/simpletest/testfilterconfig.php
lib/textlib.class.php
lib/upgradelib.php
lib/weblib.php
message/edit.php
message/lib.php
message/module.js
message/renderer.php
mod/assignment/lib.php
mod/chat/gui_ajax/index.php
mod/chat/gui_header_js/index.php
mod/chat/gui_sockets/index.php
mod/chat/view.php
mod/choice/view.php
mod/data/edit.php
mod/data/lib.php
mod/data/preset.php
mod/data/rsslib.php
mod/data/view.php
mod/feedback/analysis_course.php
mod/feedback/analysis_to_excel.php
mod/feedback/item/info/lib.php
mod/feedback/lib.php
mod/feedback/mapcourse.php
mod/forum/discuss.php
mod/forum/index.php
mod/forum/lib.php
mod/forum/view.php
mod/glossary/view.php
mod/lesson/import.php
mod/quiz/report/overview/report.php
mod/quiz/report/responses/report.php
mod/quiz/report/statistics/report.php
mod/scorm/lib.php
mod/scorm/mod_form.php
mod/scorm/player.php
mod/scorm/report/basic/report.php
mod/scorm/view.php
mod/survey/download.php
mod/upgrade.txt
mod/url/locallib.php
mod/wiki/instancecomments.php
mod/wiki/lang/en/wiki.php
mod/wiki/locallib.php
mod/wiki/pagelib.php
mod/wiki/restoreversion.php
mod/wiki/styles.css
notes/index.php
question/format/blackboard_six/format.php
question/format/qti_two/format.php
question/import.php
question/type/multianswer/edit_multianswer_form.php
repository/coursefiles/lib.php
repository/lib.php
tag/coursetags_edit.php
tag/coursetags_more.php
theme/formal_white/config.php
theme/formal_white/style/calendar.css
theme/formal_white/style/forum.css [new file with mode: 0644]
theme/formal_white/style/pagelayout.css
theme/formal_white/style/quiz.css
theme/image.php
theme/javascript.php
theme/styles.php
theme/styles_debug.php
user/index.php
user/lib.php
user/view.php
version.php

index 713f608..476dbaf 100644 (file)
@@ -58,7 +58,7 @@ $notice_error = array();
 
 if (($mode == INSTALLATION_OF_SELECTED_LANG) and confirm_sesskey() and !empty($pack)) {
     set_time_limit(0);
-    make_upload_directory('temp');
+    make_temp_directory('');
     make_upload_directory('lang');
 
     $installer = new lang_installer($pack);
@@ -149,7 +149,7 @@ if ($mode == UPDATE_ALL_LANG) {
         }
     }
 
-    make_upload_directory('temp');
+    make_temp_directory('');
     make_upload_directory('lang');
 
     // clean-up currently installed versions of the packs
index 30ec47c..4412d2e 100644 (file)
@@ -136,8 +136,8 @@ class hub_selector_form extends moodleform {
         $options = array();
         foreach ($hubs as $hub) {
             //to not display a name longer than 100 character (too big)
-            if (strlen($hub['name']) > 100) {
-                $hubname = substr($hub['name'], 0, 100);
+            if (textlib::strlen($hub['name']) > 100) {
+                $hubname = textlib::substr($hub['name'], 0, 100);
                 $hubname = $hubname . "...";
             } else {
                 $hubname = $hub['name'];
index 6b251fb..36a287b 100644 (file)
@@ -92,6 +92,7 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     $temp->add(new admin_setting_configcheckbox('navshowallcourses', get_string('navshowallcourses', 'admin'), get_string('confignavshowallcourses', 'admin'), 0));
     $temp->add(new admin_setting_configtext('navcourselimit',get_string('navcourselimit','admin'),get_string('confignavcourselimit', 'admin'),20,PARAM_INT));
     $temp->add(new admin_setting_configcheckbox('navlinkcoursesections', get_string('navlinkcoursesections', 'admin'), get_string('navlinkcoursesections_help', 'admin'), 0));
+    $temp->add(new admin_setting_configcheckbox('usesitenameforsitepages', get_string('usesitenameforsitepages', 'admin'), get_string('configusesitenameforsitepages', 'admin'), 0));
 
     $ADMIN->add('appearance', $temp);
 
index 45b1ab3..f94775c 100644 (file)
@@ -142,7 +142,7 @@ if ($hassiteconfig
 
 
     $temp->add(new admin_setting_heading('automatedsettings', get_string('automatedsettings','backup'), ''));
-    $temp->add(new admin_setting_configcheckbox('backup/backup_auto_users', get_string('users'), get_string('backupusershelp'), 1));
+    $temp->add(new admin_setting_configcheckbox('backup/backup_auto_users', get_string('generalusers', 'backup'), get_string('configgeneralusers', 'backup'), 1));
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_role_assignments', get_string('generalroleassignments','backup'), get_string('configgeneralroleassignments','backup'), 1));
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_user_files', get_string('generaluserfiles', 'backup'), get_string('configgeneraluserfiles','backup'), 1));
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_activities', get_string('generalactivities','backup'), get_string('configgeneralactivities','backup'), 1));
@@ -150,7 +150,7 @@ if ($hassiteconfig
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_filters', get_string('generalfilters','backup'), get_string('configgeneralfilters','backup'), 1));
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_comments', get_string('generalcomments','backup'), get_string('configgeneralcomments','backup'), 1));
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_userscompletion', get_string('generaluserscompletion','backup'), get_string('configgeneraluserscompletion','backup'), 1));
-    $temp->add(new admin_setting_configcheckbox('backup/backup_auto_logs', get_string('logs'), get_string('backuplogshelp'), 0));
+    $temp->add(new admin_setting_configcheckbox('backup/backup_auto_logs', get_string('generallogs', 'backup'), get_string('configgenerallogs', 'backup'), 0));
     $temp->add(new admin_setting_configcheckbox('backup/backup_auto_histories', get_string('generalhistories','backup'), get_string('configgeneralhistories','backup'), 0));
 
 
index a09f17d..9041973 100644 (file)
@@ -22,8 +22,8 @@
 
     if (!$ok or !confirm_sesskey()) {
         $message = '<br /><br />';
-        $message .= $CFG->dataroot.'/temp/olson.txt<br />';
-        $message .= $CFG->dataroot.'/temp/timezone.txt<br />';
+        $message .= $CFG->tempdir.'/olson.txt<br />';
+        $message .= $CFG->tempdir.'/timezone.txt<br />';
         $message .= '<a href="http://download.moodle.org/timezone/">http://download.moodle.org/timezone/</a><br />';
         $message .= '<a href="'.$CFG->wwwroot.'/lib/timezone.txt">'.$CFG->dirroot.'/lib/timezone.txt</a><br />';
         $message .= '<br />';
@@ -43,7 +43,7 @@
 
 /// First, look for an Olson file locally
 
-    $source = $CFG->dataroot.'/temp/olson.txt';
+    $source = $CFG->tempdir.'/olson.txt';
     if (!$importdone and is_readable($source)) {
         if ($timezones = olson_to_timezones($source)) {
             update_timezone_records($timezones);
@@ -53,7 +53,7 @@
 
 /// Next, look for a CSV file locally
 
-    $source = $CFG->dataroot.'/temp/timezone.txt';
+    $source = $CFG->tempdir.'/timezone.txt';
     if (!$importdone and is_readable($source)) {
         if ($timezones = get_records_csv($source, 'timezone')) {
             update_timezone_records($timezones);
 /// Otherwise, let's try moodle.org's copy
     $source = 'http://download.moodle.org/timezone/';
     if (!$importdone && ($content=download_file_content($source))) {
-        if ($file = fopen($CFG->dataroot.'/temp/timezone.txt', 'w')) {            // Make local copy
+        if ($file = fopen($CFG->tempdir.'/timezone.txt', 'w')) {            // Make local copy
             fwrite($file, $content);
             fclose($file);
-            if ($timezones = get_records_csv($CFG->dataroot.'/temp/timezone.txt', 'timezone')) {  // Parse it
+            if ($timezones = get_records_csv($CFG->tempdir.'/timezone.txt', 'timezone')) {  // Parse it
                 update_timezone_records($timezones);
                 $importdone = $source;
             }
-            unlink($CFG->dataroot.'/temp/timezone.txt');
+            unlink($CFG->tempdir.'/timezone.txt');
         }
     }
 
index c57e136..2a71696 100644 (file)
@@ -72,7 +72,7 @@ if ($formdata = $mform->get_data()) {
 
         // Create a unique temporary directory, to process the zip file
         // contents.
-        $zipdir = my_mktempdir($CFG->dataroot.'/temp/', 'usrpic');
+        $zipdir = my_mktempdir($CFG->tempdir.'/', 'usrpic');
         $dstfile = $zipdir.'/images.zip';
 
         if (!$mform->save_file('userpicturesfile', $dstfile, true)) {
index 931b4d2..f7773de 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Authentication Plugin: External Database Authentication
  *
@@ -44,9 +43,8 @@ class auth_plugin_db extends auth_plugin_base {
     function user_login($username, $password) {
         global $CFG, $DB;
 
-        $textlib = textlib_get_instance();
-        $extusername = $textlib->convert($username, 'utf-8', $this->config->extencoding);
-        $extpassword = $textlib->convert($password, 'utf-8', $this->config->extencoding);
+        $extusername = textlib::convert($username, 'utf-8', $this->config->extencoding);
+        $extpassword = textlib::convert($password, 'utf-8', $this->config->extencoding);
 
         $authdb = $this->db_init();
 
@@ -110,7 +108,7 @@ class auth_plugin_db extends auth_plugin_base {
 
     function db_init() {
         // Connect to the external database (forcing new connection)
-        $authdb = &ADONewConnection($this->config->type);
+        $authdb = ADONewConnection($this->config->type);
         if (!empty($this->config->debugauthdb)) {
             $authdb->debug = true;
             ob_start();//start output buffer to allow later use of the page headers
@@ -125,7 +123,7 @@ class auth_plugin_db extends auth_plugin_base {
     }
 
     /**
-     * retuns user attribute mappings between moodle and ldap
+     * Returns user attribute mappings between moodle and ldap
      *
      * @return array
      */
@@ -151,8 +149,7 @@ class auth_plugin_db extends auth_plugin_base {
     function get_userinfo($username) {
         global $CFG;
 
-        $textlib = textlib_get_instance();
-        $extusername = $textlib->convert($username, 'utf-8', $this->config->extencoding);
+        $extusername = textlib::convert($username, 'utf-8', $this->config->extencoding);
 
         $authdb = $this->db_init();
 
@@ -175,7 +172,7 @@ class auth_plugin_db extends auth_plugin_base {
                     $fields_obj = $rs->FetchObj();
                     $fields_obj = (object)array_change_key_case((array)$fields_obj , CASE_LOWER);
                     foreach ($selectfields as $localname=>$externalname) {
-                        $result[$localname] = $textlib->convert($fields_obj->{$localname}, $this->config->extencoding, 'utf-8');
+                        $result[$localname] = textlib::convert($fields_obj->{$localname}, $this->config->extencoding, 'utf-8');
                      }
                  }
                  $rs->Close();
@@ -203,27 +200,28 @@ class auth_plugin_db extends auth_plugin_base {
     }
 
     /**
-     * syncronizes user fron external db to moodle user table
+     * synchronizes user from external db to moodle user table
      *
-     * Sync shouid be done by using idnumber attribute, not username.
+     * Sync should be done by using idnumber attribute, not username.
      * You need to pass firstsync parameter to function to fill in
-     * idnumbers if they dont exists in moodle user table.
+     * idnumbers if they don't exists in moodle user table.
      *
-     * Syncing users removes (disables) users that dont exists anymore in external db.
+     * Syncing users removes (disables) users that don't exists anymore in external db.
      * Creates new users and updates coursecreator status of users.
      *
      * This implementation is simpler but less scalable than the one found in the LDAP module.
      *
      * @param bool $do_updates  Optional: set to true to force an update of existing accounts
-     * @return bool success
+     * @param bool $verbose
+     * @return int 0 means success, 1 means failure
      */
-    function sync_users($do_updates=false) {
+    function sync_users($do_updates=false, $verbose=false) {
         global $CFG, $DB;
 
-/// list external users
+        // list external users
         $userlist = $this->get_userlist();
 
-/// delete obsolete internal users
+        // delete obsolete internal users
         if (!empty($this->config->removeuser)) {
 
             // find obsolete users
@@ -243,21 +241,24 @@ class auth_plugin_db extends auth_plugin_base {
             $remove_users = $DB->get_records_sql($sql, $params);
 
             if (!empty($remove_users)) {
-                print_string('auth_dbuserstoremove','auth_db', count($remove_users)); echo "\n";
+                if ($verbose) {
+                    mtrace(print_string('auth_dbuserstoremove','auth_db', 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";
+                        delete_user($user);
+                        if ($verbose) {
+                            mtrace("\t".get_string('auth_dbdeleteuser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)));
                         }
                     } 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";
+                        if ($verbose) {
+                            mtrace("\t".get_string('auth_dbsuspenduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)));
+                        }
                     }
                 }
             }
@@ -267,7 +268,7 @@ class auth_plugin_db extends auth_plugin_base {
         if (!count($userlist)) {
             // exit right here
             // nothing else to do
-            return true;
+            return 0;
         }
 
         ///
@@ -296,14 +297,20 @@ class auth_plugin_db extends auth_plugin_base {
                           FROM {user} u
                          WHERE u.auth=:authtype AND u.deleted=0 AND u.username {$in_sql}";
                 if ($update_users = $DB->get_records_sql($sql, $params)) {
-                    print "User entries to update: ". count($update_users). "\n";
+                    if ($verbose) {
+                        mtrace("User entries to update: ".count($update_users));
+                    }
 
                     foreach ($update_users as $user) {
-                        echo "\t"; print_string('auth_dbupdatinguser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id));
-                        if (!$this->update_user_record($user->username, $updatekeys)) {
-                            echo " - ".get_string('skipped');
+                        if ($this->update_user_record($user->username, $updatekeys)) {
+                            if ($verbose) {
+                                mtrace("\t".get_string('auth_dbupdatinguser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)));
+                            }
+                        } else {
+                            if ($verbose) {
+                                mtrace("\t".get_string('auth_dbupdatinguser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id))." - ".get_string('skipped'));
+                            }
                         }
-                        echo "\n";
                     }
                     unset($update_users); // free memory
                 }
@@ -335,7 +342,9 @@ class auth_plugin_db extends auth_plugin_base {
         unset($usernames);
 
         if (!empty($add_users)) {
-            print_string('auth_dbuserstoadd','auth_db',count($add_users)); echo "\n";
+            if ($verbose) {
+                mtrace(get_string('auth_dbuserstoadd','auth_db',count($add_users)));
+            }
             $transaction = $DB->start_delegated_transaction();
             foreach($add_users as $user) {
                 $username = $user;
@@ -355,11 +364,15 @@ class auth_plugin_db extends auth_plugin_base {
                 if ($old_user = $DB->get_record('user', array('username'=>$user->username, 'deleted'=>1, 'mnethostid'=>$user->mnethostid))) {
                     $user->id = $old_user->id;
                     $DB->set_field('user', 'deleted', 0, array('username'=>$user->username));
-                    echo "\t"; print_string('auth_dbreviveduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)); echo "\n";
+                    if ($verbose) {
+                        mtrace("\t".get_string('auth_dbreviveduser', 'auth_db', array('name'=>$user->username, 'id'=>$user->id)));
+                    }
 
                 } else {
-                    $id = $DB->insert_record ('user',$user); // it is truly a new user
-                    echo "\t"; print_string('auth_dbinsertuser','auth_db',array('name'=>$user->username, 'id'=>$id)); echo "\n";
+                    $id = $DB->insert_record ('user', $user); // it is truly a new user
+                    if ($verbose) {
+                        mtrace("\t".get_string('auth_dbinsertuser', 'auth_db', array('name'=>$user->username, 'id'=>$id)));
+                    }
                     // if relevant, tag for password generation
                     if ($this->is_internal()) {
                         set_user_preference('auth_forcepasswordchange', 1, $id);
@@ -370,7 +383,7 @@ class auth_plugin_db extends auth_plugin_base {
             $transaction->allow_commit();
             unset($add_users); // free mem
         }
-        return true;
+        return 0;
     }
 
     function user_exists($username) {
@@ -378,8 +391,7 @@ class auth_plugin_db extends auth_plugin_base {
     /// Init result value
         $result = false;
 
-        $textlib = textlib_get_instance();
-        $extusername = $textlib->convert($username, 'utf-8', $this->config->extencoding);
+        $extusername = textlib::convert($username, 'utf-8', $this->config->extencoding);
 
         $authdb = $this->db_init();
 
@@ -389,7 +401,7 @@ class auth_plugin_db extends auth_plugin_base {
         if (!$rs) {
             print_error('auth_dbcantconnect','auth_db');
         } else if (!$rs->EOF) {
-            // user exists exterally
+            // user exists externally
             $result = true;
         }
 
@@ -423,7 +435,7 @@ class auth_plugin_db extends auth_plugin_base {
     }
 
     /**
-     * reads userinformation from DB and return it in an object
+     * reads user information from DB and return it in an object
      *
      * @param string $username username (with system magic quotes)
      * @return array
@@ -446,12 +458,14 @@ class auth_plugin_db extends auth_plugin_base {
      * values removed from DB won't be removed from moodle.
      *
      * @param string $username username
+     * @param bool $updatekeys
+     * @return stdClass
      */
     function update_user_record($username, $updatekeys=false) {
         global $CFG, $DB;
 
         //just in case check text case
-        $username = trim(moodle_strtolower($username));
+        $username = trim(textlib::strtolower($username));
 
         // get the current user record
         $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$CFG->mnet_localhost_id));
@@ -491,7 +505,7 @@ class auth_plugin_db extends auth_plugin_base {
     /**
      * Called when the user record is updated.
      * Modifies user in external database. It takes olduser (before changes) and newuser (after changes)
-     * conpares information saved modified information to external db.
+     * compares information saved modified information to external db.
      *
      * @param mixed $olduser     Userobject before modifications
      * @param mixed $newuser     Userobject new modified userobject
@@ -514,8 +528,7 @@ class auth_plugin_db extends auth_plugin_base {
             return false;
         }
 
-        $textlib = textlib_get_instance();
-        $extusername = $textlib->convert($olduser->username, 'utf-8', $this->config->extencoding);
+        $extusername = textlib::convert($olduser->username, 'utf-8', $this->config->extencoding);
 
         $authdb = $this->db_init();
 
@@ -532,7 +545,7 @@ class auth_plugin_db extends auth_plugin_base {
             }
             $nuvalue = $newuser->$key;
             if ($nuvalue != $value) {
-                $update[] = $this->config->{"field_map_$key"}."='".$this->ext_addslashes($textlib->convert($nuvalue, 'utf-8', $this->config->extencoding))."'";
+                $update[] = $this->config->{"field_map_$key"}."='".$this->ext_addslashes(textlib::convert($nuvalue, 'utf-8', $this->config->extencoding))."'";
             }
         }
         if (!empty($update)) {
@@ -547,8 +560,12 @@ class auth_plugin_db extends auth_plugin_base {
     /**
      * A chance to validate form data, and last chance to
      * do stuff before it is inserted in config_plugin
+     *
+     * @param stfdClass config form
+     * @param array $error errors
+     * @return void
      */
-     function validate_form(&$form, &$err) {
+     function validate_form($form, &$err) {
         if ($form->passtype === 'internal') {
             $this->config->changepasswordurl = '';
             set_config('changepasswordurl', '', 'auth/db');
@@ -625,7 +642,10 @@ class auth_plugin_db extends auth_plugin_base {
      * This function is called from admin/auth.php, and outputs a full page with
      * a form for configuring this plugin.
      *
-     * @param array $page An object containing all the data for this page.
+     * @param stdClass $config
+     * @param array $err errors
+     * @param array $user_fields
+     * @return void
      */
     function config_form($config, $err, $user_fields) {
         include 'config.html';
@@ -633,6 +653,8 @@ class auth_plugin_db extends auth_plugin_base {
 
     /**
      * Processes and stores configuration data for this authentication plugin.
+     * @param srdClass $config
+     * @return bool always true or exception
      */
     function process_config($config) {
         // set to defaults if undefined
index 5863592..a2b7a0b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
@@ -48,12 +47,46 @@ define('CLI_SCRIPT', true);
 
 require(dirname(dirname(dirname(dirname(__FILE__)))).'/config.php');
 require_once($CFG->dirroot.'/course/lib.php');
+require_once($CFG->libdir.'/clilib.php');
+
+// now get cli options
+list($options, $unrecognized) = cli_get_params(array('noupdate'=>false, 'verbose'=>false, 'help'=>false), array('n'=>'noupdate', 'v'=>'verbose', 'h'=>'help'));
+
+if ($unrecognized) {
+    $unrecognized = implode("\n  ", $unrecognized);
+    cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
+}
+
+if ($options['help']) {
+    $help =
+"Execute user account sync with external database.
+The auth_db plugin must be enabled and properly configured.
+
+Options:
+-n, --noupdate        Skip update of existing users
+-v, --verbose         Print verbose progess information
+-h, --help            Print out this help
+
+Example:
+\$sudo -u www-data /usr/bin/php auth/db/cli/sync_users.php
+
+Sample cron entry:
+# 5 minutes past 4am
+5 4 * * * $sudo -u www-data /usr/bin/php /var/www/moodle/auth/db/cli/sync_users.php
+";
+
+    echo $help;
+    die;
+}
 
 if (!is_enabled_auth('db')) {
     echo "Plugin not enabled!";
-    die;
+    exit(1);
 }
 
+$verbose = !empty($options['verbose']);
+$update = empty($options['noupdate']);
+
 $dbauth = get_auth_plugin('db');
-$dbauth->sync_users(true);
+return $dbauth->sync_users($update, $verbose);
 
index 9c463d6..b4e733c 100644 (file)
@@ -311,7 +311,7 @@ class auth_plugin_mnet extends auth_plugin_base {
                     $fetchrequest->add_param($localuser->username);
                     if ($fetchrequest->send($remotepeer) === true) {
                         if (strlen($fetchrequest->response['f1']) > 0) {
-                            $imagefilename = $CFG->dataroot . '/temp/mnet-usericon-' . $localuser->id;
+                            $imagefilename = $CFG->tempdir . '/mnet-usericon-' . $localuser->id;
                             $imagecontents = base64_decode($fetchrequest->response['f1']);
                             file_put_contents($imagefilename, $imagecontents);
                             if (process_new_icon($usercontext, 'user', 'icon', 0, $imagefilename)) {
index cf396c0..49d5dd3 100644 (file)
@@ -194,7 +194,7 @@ function schedule_backup_cron() {
 
         //Build the message subject
         $site = get_site();
-        $prefix = $site->shortname.": ";
+        $prefix = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID))).": ";
         if ($count_error != 0 || $count_unfinished != 0) {
             $prefix .= "[".strtoupper(get_string('error'))."] ";
         }
index cd05481..1bab62b 100644 (file)
@@ -339,7 +339,7 @@ class backup_controller extends backup implements loggable {
 
     protected function apply_defaults() {
         $this->log('applying plan defaults', backup::LOG_DEBUG);
-        backup_controller_dbops::apply_general_config_defaults($this);
+        backup_controller_dbops::apply_config_defaults($this);
         $this->set_status(backup::STATUS_CONFIGURED);
     }
 }
index f523df9..50ec102 100644 (file)
@@ -32,7 +32,7 @@
  */
 class restore_controller extends backup implements loggable {
 
-    protected $tempdir;   // Directory under dataroot/temp/backup awaiting restore
+    protected $tempdir;   // Directory under tempdir/backup awaiting restore
     protected $restoreid; // Unique identificator for this restore
 
     protected $courseid; // courseid where restore is going to happen
@@ -61,7 +61,7 @@ class restore_controller extends backup implements loggable {
 
     /**
      *
-     * @param string $tempdir Directory under dataroot/temp/backup awaiting restore
+     * @param string $tempdir Directory under tempdir/backup awaiting restore
      * @param int $courseid Course id where restore is going to happen
      * @param bool $interactive backup::INTERACTIVE_YES[true] or backup::INTERACTIVE_NO[false]
      * @param int $mode backup::MODE_[ GENERAL | HUB | IMPORT | SAMESITE ]
index 773055c..61b148b 100644 (file)
@@ -147,7 +147,7 @@ abstract class base_converter implements loggable {
     public function get_workdir_path() {
         global $CFG;
 
-        return "$CFG->dataroot/temp/backup/$this->workdir";
+        return "$CFG->tempdir/backup/$this->workdir";
     }
 
     /**
@@ -156,7 +156,7 @@ abstract class base_converter implements loggable {
     public function get_tempdir_path() {
         global $CFG;
 
-        return "$CFG->dataroot/temp/backup/$this->tempdir";
+        return "$CFG->tempdir/backup/$this->tempdir";
     }
 
     /// public static methods //////////////////////////////////////////////////
index aef888e..86e2026 100644 (file)
@@ -89,7 +89,7 @@ class moodle1_converter extends base_converter {
     public static function detect_format($tempdir) {
         global $CFG;
 
-        $filepath = $CFG->dataroot . '/temp/backup/' . $tempdir . '/moodle.xml';
+        $filepath = $CFG->tempdir . '/backup/' . $tempdir . '/moodle.xml';
         if (file_exists($filepath)) {
             // looks promising, lets load some information
             $handle = fopen($filepath, 'r');
index addc174..cd19870 100644 (file)
@@ -39,38 +39,38 @@ class moodle1_converter_test extends UnitTestCase {
         global $CFG;
 
         $this->tempdir = convert_helper::generate_id('simpletest');
-        check_dir_exists("$CFG->dataroot/temp/backup/$this->tempdir/course_files/sub1");
-        check_dir_exists("$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/7");
+        check_dir_exists("$CFG->tempdir/backup/$this->tempdir/course_files/sub1");
+        check_dir_exists("$CFG->tempdir/backup/$this->tempdir/moddata/unittest/4/7");
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/moodle.xml",
-            "$CFG->dataroot/temp/backup/$this->tempdir/moodle.xml"
+            "$CFG->tempdir/backup/$this->tempdir/moodle.xml"
         );
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
-            "$CFG->dataroot/temp/backup/$this->tempdir/course_files/file1.gif"
+            "$CFG->tempdir/backup/$this->tempdir/course_files/file1.gif"
         );
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
-            "$CFG->dataroot/temp/backup/$this->tempdir/course_files/sub1/file2.gif"
+            "$CFG->tempdir/backup/$this->tempdir/course_files/sub1/file2.gif"
         );
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
-            "$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/file1.gif"
+            "$CFG->tempdir/backup/$this->tempdir/moddata/unittest/4/file1.gif"
         );
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
-            "$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/icon.gif"
+            "$CFG->tempdir/backup/$this->tempdir/moddata/unittest/4/icon.gif"
         );
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
-            "$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/7/icon.gif"
+            "$CFG->tempdir/backup/$this->tempdir/moddata/unittest/4/7/icon.gif"
         );
     }
 
     public function tearDown() {
         global $CFG;
         if (empty($CFG->keeptempdirectoriesonbackup)) {
-            fulldelete("$CFG->dataroot/temp/backup/$this->tempdir");
+            fulldelete("$CFG->tempdir/backup/$this->tempdir");
         }
     }
 
@@ -440,7 +440,7 @@ as it is parsed from the backup file. <br /><br /><img border="0" width="110" vs
 
         copy(
             "$CFG->dirroot/backup/converter/moodle1/simpletest/files/questions.xml",
-            "$CFG->dataroot/temp/backup/$this->tempdir/moodle.xml"
+            "$CFG->tempdir/backup/$this->tempdir/moodle.xml"
         );
         $converter = convert_factory::get_converter('moodle1', $this->tempdir);
         $converter->convert();
index 6ba8911..7c0c0b2 100644 (file)
@@ -96,7 +96,7 @@ if ($backup->get_stage() == backup_ui::STAGE_FINAL) {
     // Check whether the backup directory still exists. If missing, something
     // went really wrong in backup, throw error. Note that backup::MODE_IMPORT
     // backups don't store resulting files ever
-    $tempdestination = $CFG->dataroot . '/temp/backup/' . $backupid;
+    $tempdestination = $CFG->tempdir . '/backup/' . $backupid;
     if (!file_exists($tempdestination) || !is_dir($tempdestination)) {
         print_error('unknownbackupexporterror'); // shouldn't happen ever
     }
index 3a4e5da..e479e90 100644 (file)
@@ -54,9 +54,9 @@
 
         $status = true;
         //Get files and directories in the temp backup dir witout descend
-        $list = get_directory_list($CFG->dataroot."/temp/backup", "", false, true, true);
+        $list = get_directory_list($CFG->tempdir."/backup", "", false, true, true);
         foreach ($list as $file) {
-            $file_path = $CFG->dataroot."/temp/backup/".$file;
+            $file_path = $CFG->tempdir."/backup/".$file;
             $moddate = filemtime($file_path);
             if ($status && $moddate < $delete_from) {
                 //If directory, recurse
     function check_and_create_backup_dir($backup_unique_code) {
         global $CFG;
 
-        $status = check_dir_exists($CFG->dataroot."/temp",true);
+        $status = check_dir_exists($CFG->tempdir."",true);
         if ($status) {
-            $status = check_dir_exists($CFG->dataroot."/temp/backup",true);
+            $status = check_dir_exists($CFG->tempdir."/backup",true);
         }
         if ($status) {
-            $status = check_dir_exists($CFG->dataroot."/temp/backup/".$backup_unique_code,true);
+            $status = check_dir_exists($CFG->tempdir."/backup/".$backup_unique_code,true);
         }
 
         return $status;
     function clear_backup_dir($backup_unique_code) {
         global $CFG;
 
-        $rootdir = $CFG->dataroot."/temp/backup/".$backup_unique_code;
+        $rootdir = $CFG->tempdir."/backup/".$backup_unique_code;
 
         //Delete recursively
         $status = delete_dir_contents($rootdir);
                    && $DB->delete_records('backup_files', array('backup_code'=>$preferences->backup_unique_code));
 
             //Now, delete temp directory (if exists)
-            $file_path = $CFG->dataroot."/temp/backup/".$preferences->backup_unique_code;
+            $file_path = $CFG->tempdir."/backup/".$preferences->backup_unique_code;
             if (is_dir($file_path)) {
                 $status = delete_dir_contents($file_path);
                 //There is nothing, delete the directory itself
 
         if (strlen($info_ser) > $max_db_storage) {
             //Calculate filename (in current_backup_dir, $backup_unique_code_$table_$old_id.info)
-            $filename = $CFG->dataroot."/temp/backup/".$backup_unique_code."/".$backup_unique_code."_".$table."_".$old_id.".info";
+            $filename = $CFG->tempdir."/backup/".$backup_unique_code."/".$backup_unique_code."_".$table."_".$old_id.".info";
             //Save data to file
             $status = backup_data2file($filename,$info_ser);
             //Set info_to save
 
         //If info field = "infile", get file contents
         if (!empty($status->info) && $status->info == "infile") {
-            $filename = $CFG->dataroot."/temp/backup/".$backup_unique_code."/".$backup_unique_code."_".$table."_".$old_id.".info";
+            $filename = $CFG->tempdir."/backup/".$backup_unique_code."/".$backup_unique_code."_".$table."_".$old_id.".info";
             //Read data from file
             $status2 = backup_file2data($filename,$info);
             if ($status2) {
index 79f5f85..d89143d 100644 (file)
@@ -64,7 +64,7 @@ require_capability('moodle/restore:restorecourse', $context);
 $browser = get_file_browser();
 
 // check if tmp dir exists
-$tmpdir = $CFG->dataroot . '/temp/backup';
+$tmpdir = $CFG->tempdir . '/backup';
 if (!check_dir_exists($tmpdir, true, true)) {
     throw new restore_controller_exception('cannot_create_backup_temp_dir');
 }
index 39d0e96..881c73c 100644 (file)
@@ -102,45 +102,31 @@ abstract class backup_check {
         // Note: all the checks along the function MUST be performed for $userid, that
         // is the user who "requested" the course backup, not current $USER at all!!
 
-        // First of all, check the main backup[course|section|activity] principal caps
-        // Lacking the corresponding one makes this to break with exception always
+        // First of all, decide which caps/contexts are we going to check
+        // for common backups (general, automated...) based exclusively
+        // in the type (course, section, activity). And store them into
+        // one capability => context array structure
+        $typecapstocheck = array();
         switch ($type) {
             case backup::TYPE_1COURSE :
                 $DB->get_record('course', array('id' => $id), '*', MUST_EXIST); // course exists
-                if (!has_capability('moodle/backup:backupcourse', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/backup:backupcourse';
-                    throw new backup_controller_exception('backup_user_missing_capability', $a);
-                }
+                $typecapstocheck['moodle/backup:backupcourse'] = $coursectx;
                 break;
             case backup::TYPE_1SECTION :
                 $DB->get_record('course_sections', array('course' => $courseid, 'id' => $id), '*', MUST_EXIST); // sec exists
-                if (!has_capability('moodle/backup:backupsection', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/backup:backupsection';
-                    throw new backup_controller_exception('backup_user_missing_capability', $a);
-                }
+                $typecapstocheck['moodle/backup:backupsection'] = $coursectx;
                 break;
             case backup::TYPE_1ACTIVITY :
                 get_coursemodule_from_id(null, $id, $courseid, false, MUST_EXIST); // cm exists
                 $modulectx = get_context_instance(CONTEXT_MODULE, $id);
-                if (!has_capability('moodle/backup:backupactivity', $modulectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->cmid = $id;
-                    $a->capability = 'moodle/backup:backupactivity';
-                    throw new backup_controller_exception('backup_user_missing_capability', $a);
-                }
+                $typecapstocheck['moodle/backup:backupactivity'] = $modulectx;
                 break;
             default :
-                print_error('unknownbackuptype');
+                throw new backup_controller_exception('backup_unknown_backup_type', $type);
         }
 
         // Now, if backup mode is hub or import, check userid has permissions for those modes
+        // other modes will perform common checks only (backupxxxx capabilities in $typecapstocheck)
         switch ($mode) {
             case backup::MODE_HUB:
                 if (!has_capability('moodle/backup:backuptargethub', $coursectx, $userid)) {
@@ -160,6 +146,18 @@ abstract class backup_check {
                     throw new backup_controller_exception('backup_user_missing_capability', $a);
                 }
                 break;
+            // Common backup (general, automated...), let's check all the $typecapstocheck
+            // capability => context pairs
+            default:
+                foreach ($typecapstocheck as $capability => $context) {
+                    if (!has_capability($capability, $context, $userid)) {
+                        $a = new stdclass();
+                        $a->userid = $userid;
+                        $a->courseid = $courseid;
+                        $a->capability = $capability;
+                        throw new backup_controller_exception('backup_user_missing_capability', $a);
+                    }
+                }
         }
 
         // Now, enforce 'moodle/backup:userinfo' to 'users' setting, applying changes if allowed,
@@ -219,15 +217,19 @@ abstract class backup_check {
         }
 
         // Check the user has the ability to configure the backup. If not then we need
-        // to lock all settings by permission so that no changes can be made.
-        $hasconfigcap = has_capability('moodle/backup:configure', $coursectx, $userid);
-        if (!$hasconfigcap) {
-            $settings = $backup_controller->get_plan()->get_settings();
-            foreach ($settings as $setting) {
-                if ($setting->get_name()=='filename') {
-                    continue;
+        // to lock all settings by permission so that no changes can be made. This does
+        // not apply to the import facility, where the activities must be always enabled
+        // to be able to pick them
+        if ($mode != backup::MODE_IMPORT) {
+            $hasconfigcap = has_capability('moodle/backup:configure', $coursectx, $userid);
+            if (!$hasconfigcap) {
+                $settings = $backup_controller->get_plan()->get_settings();
+                foreach ($settings as $setting) {
+                    if ($setting->get_name() == 'filename') {
+                        continue;
+                    }
+                    $setting->set_status(base_setting::LOCKED_BY_PERMISSION);
                 }
-                $setting->set_status(base_setting::LOCKED_BY_PERMISSION);
             }
         }
 
index 20e1f94..915112c 100644 (file)
@@ -68,41 +68,27 @@ abstract class restore_check {
         // Note: all the checks along the function MUST be performed for $userid, that
         // is the user who "requested" the course restore, not current $USER at all!!
 
-        // First of all, check the main restore[course|section|activity] principal caps
-        // Lacking the corresponding one makes this to break with exception always
+        // First of all, decide which caps/contexts are we going to check
+        // for common backups (general, automated...) based exclusively
+        // in the type (course, section, activity). And store them into
+        // one capability => context array structure
+        $typecapstocheck = array();
         switch ($type) {
             case backup::TYPE_1COURSE :
-                if (!has_capability('moodle/restore:restorecourse', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/restore:restorecourse';
-                    throw new restore_controller_exception('restore_user_missing_capability', $a);
-                }
+                $typecapstocheck['moodle/restore:restorecourse'] = $coursectx;
                 break;
             case backup::TYPE_1SECTION :
-                if (!has_capability('moodle/restore:restoresection', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/restore:restoresection';
-                    throw new restore_controller_exception('restore_user_missing_capability', $a);
-                }
+                $typecapstocheck['moodle/restore:restoresection'] = $coursectx;
                 break;
             case backup::TYPE_1ACTIVITY :
-                if (!has_capability('moodle/restore:restoreactivity', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/restore:restoreactivity';
-                    throw new restore_controller_exception('restore_user_missing_capability', $a);
-                }
+                $typecapstocheck['moodle/restore:restoreactivity'] = $coursectx;
                 break;
             default :
-                print_error('unknownrestoretype');
+                throw new restore_controller_exception('restore_unknown_restore_type', $type);
         }
 
         // Now, if restore mode is hub or import, check userid has permissions for those modes
+        // other modes will perform common checks only (restorexxxx capabilities in $typecapstocheck)
         switch ($mode) {
             case backup::MODE_HUB:
                 if (!has_capability('moodle/restore:restoretargethub', $coursectx, $userid)) {
@@ -122,6 +108,18 @@ abstract class restore_check {
                     throw new restore_controller_exception('restore_user_missing_capability', $a);
                 }
                 break;
+            // Common backup (general, automated...), let's check all the $typecapstocheck
+            // capability => context pairs
+            default:
+                foreach ($typecapstocheck as $capability => $context) {
+                    if (!has_capability($capability, $context, $userid)) {
+                        $a = new stdclass();
+                        $a->userid = $userid;
+                        $a->courseid = $courseid;
+                        $a->capability = $capability;
+                        throw new restore_controller_exception('restore_user_missing_capability', $a);
+                    }
+                }
         }
 
         // Now, enforce 'moodle/restore:userinfo' to 'users' setting, applying changes if allowed,
@@ -158,12 +156,16 @@ abstract class restore_check {
         }
 
         // Check the user has the ability to configure the restore. If not then we need
-        // to lock all settings by permission so that no changes can be made.
-        $hasconfigcap = has_capability('moodle/restore:configure', $coursectx, $userid);
-        if (!$hasconfigcap) {
-            $settings = $restore_controller->get_plan()->get_settings();
-            foreach ($settings as $setting) {
-                $setting->set_status(base_setting::LOCKED_BY_PERMISSION);
+        // to lock all settings by permission so that no changes can be made. This does
+        // not apply to the import facility, where all the activities (picked on backup)
+        // are restored automatically without restore UI
+        if ($mode != backup::MODE_IMPORT) {
+            $hasconfigcap = has_capability('moodle/restore:configure', $coursectx, $userid);
+            if (!$hasconfigcap) {
+                $settings = $restore_controller->get_plan()->get_settings();
+                foreach ($settings as $setting) {
+                    $setting->set_status(base_setting::LOCKED_BY_PERMISSION);
+                }
             }
         }
 
index d760871..cd89d82 100644 (file)
@@ -401,12 +401,40 @@ abstract class backup_controller_dbops extends backup_dbops {
         return $DB->get_record('course', array('id' => $courseid), 'fullname, shortname, startdate');
     }
 
+    /**
+     * Sets the default values for the settings in a backup operation
+     *
+     * Based on the mode of the backup it will delegate the process to
+     * other methods like {@link apply_general_config_defaults} ...
+     * to get proper defaults loaded
+     *
+     * @param backup_controller $controller
+     */
+    public static function apply_config_defaults(backup_controller $controller) {
+        // Based on the mode of the backup (general, automated, import, hub...)
+        // decide the action to perform to get defaults loaded
+        $mode = $controller->get_mode();
+
+        switch ($mode) {
+            case backup::MODE_GENERAL:
+                // Load the general defaults
+                self::apply_general_config_defaults($controller);
+                break;
+            case backup::MODE_AUTOMATED:
+                // TODO: Move the loading from automatic stuff to here
+                break;
+            default:
+                // Nothing to do for other modes (IMPORT/HUB...). Some day we
+                // can define defaults (admin UI...) for them if we want to
+        }
+    }
+
     /**
      * Sets the controller settings default values from the backup config.
      *
      * @param backup_controller $controller
      */
-    public static function apply_general_config_defaults(backup_controller $controller) {
+    private static function apply_general_config_defaults(backup_controller $controller) {
         $settings = array(
             // Config name                      => Setting name
             'backup_general_users'              => 'users',
index 3d620f5..f6e25b7 100644 (file)
@@ -214,6 +214,8 @@ abstract class backup_plan_dbops extends backup_dbops {
             switch ($type) {
                 case backup::TYPE_1COURSE:
                     $shortname = $DB->get_field('course', 'shortname', array('id' => $id));
+                    $context = get_context_instance(CONTEXT_COURSE, $id);
+                    $shortname = format_string($shortname, true, array('context' => $context));
                     break;
                 case backup::TYPE_1SECTION:
                     if (!$shortname = $DB->get_field('course_sections', 'name', array('id' => $id))) {
index 9655e87..a24905c 100644 (file)
@@ -60,9 +60,9 @@ abstract class backup_factory {
 
         // Create file_logger, observing $CFG->backup_file_logger_level
         // defaulting to $dfltloglevel
-        check_dir_exists($CFG->dataroot . '/temp/backup', true, true); // need to ensure that temp/backup already exists
+        check_dir_exists($CFG->tempdir . '/backup', true, true); // need to ensure that temp/backup already exists
         $fllevel = isset($CFG->backup_file_logger_level) ? $CFG->backup_file_logger_level : $dfltloglevel;
-        $enabledloggers[] = new file_logger($fllevel, true, true, $CFG->dataroot . '/temp/backup/' . $backupid . '.log');
+        $enabledloggers[] = new file_logger($fllevel, true, true, $CFG->tempdir . '/backup/' . $backupid . '.log');
 
         // Create database_logger, observing $CFG->backup_database_logger_level and defaulting to LOG_WARNING
         // and pointing to the backup_logs table
index be15523..6b6f285 100644 (file)
@@ -197,7 +197,7 @@ abstract class backup_cron_automated_helper {
 
             //Build the message subject
             $site = get_site();
-            $prefix = $site->shortname.": ";
+            $prefix = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID))).": ";
             if ($haserrors) {
                 $prefix .= "[".strtoupper(get_string('error'))."] ";
             }
index c5b0121..fb6477a 100644 (file)
@@ -43,7 +43,7 @@ class backup_file_manager {
     public static function get_backup_storage_base_dir($backupid) {
         global $CFG;
 
-        return $CFG->dataroot . '/temp/backup/' . $backupid . '/files';
+        return $CFG->tempdir . '/backup/' . $backupid . '/files';
     }
 
     /**
index 20238fe..73b5d3b 100644 (file)
@@ -114,7 +114,7 @@ abstract class backup_general_helper extends backup_helper {
 
         $info = new stdclass(); // Final information goes here
 
-        $moodlefile = $CFG->dataroot . '/temp/backup/' . $tempdir . '/moodle_backup.xml';
+        $moodlefile = $CFG->tempdir . '/backup/' . $tempdir . '/moodle_backup.xml';
         if (!file_exists($moodlefile)) { // Shouldn't happen ever, but...
             throw new backup_helper_exception('missing_moodle_backup_xml_file', $moodlefile);
         }
index d1fd91d..67bd78e 100644 (file)
@@ -34,7 +34,7 @@ abstract class backup_helper {
      */
     static public function check_and_create_backup_dir($backupid) {
         global $CFG;
-        if (!check_dir_exists($CFG->dataroot . '/temp/backup/' . $backupid, true, true)) {
+        if (!check_dir_exists($CFG->tempdir . '/backup/' . $backupid, true, true)) {
             throw new backup_helper_exception('cannot_create_backup_temp_dir');
         }
     }
@@ -44,7 +44,7 @@ abstract class backup_helper {
      */
     static public function clear_backup_dir($backupid) {
         global $CFG;
-        if (!self::delete_dir_contents($CFG->dataroot . '/temp/backup/' . $backupid)) {
+        if (!self::delete_dir_contents($CFG->tempdir . '/backup/' . $backupid)) {
             throw new backup_helper_exception('cannot_empty_backup_temp_dir');
         }
         return true;
@@ -56,7 +56,7 @@ abstract class backup_helper {
      static public function delete_backup_dir($backupid) {
          global $CFG;
          self::clear_backup_dir($backupid);
-         return rmdir($CFG->dataroot . '/temp/backup/' . $backupid);
+         return rmdir($CFG->tempdir . '/backup/' . $backupid);
      }
 
      /**
@@ -132,9 +132,9 @@ abstract class backup_helper {
 
         $status = true;
         // Get files and directories in the temp backup dir witout descend
-        $list = get_directory_list($CFG->dataroot . '/temp/backup', '', false, true, true);
+        $list = get_directory_list($CFG->tempdir . '/backup', '', false, true, true);
         foreach ($list as $file) {
-            $file_path = $CFG->dataroot . '/temp/backup/' . $file;
+            $file_path = $CFG->tempdir . '/backup/' . $file;
             $moddate = filemtime($file_path);
             if ($status && $moddate < $deletefrom) {
                 //If directory, recurse
index 539f4f8..1be31ae 100644 (file)
@@ -85,7 +85,7 @@ abstract class convert_helper {
     public static function detect_moodle2_format($tempdir) {
         global $CFG;
 
-        $dirpath    = $CFG->dataroot . '/temp/backup/' . $tempdir;
+        $dirpath    = $CFG->tempdir . '/backup/' . $tempdir;
         $filepath   = $dirpath . '/moodle_backup.xml';
 
         if (!is_dir($dirpath)) {
index cbd11fb..9374346 100644 (file)
@@ -230,7 +230,7 @@ class logger_test extends UnitTestCase {
     function test_file_logger() {
         global $CFG;
 
-        $file = $CFG->dataroot . '/temp/test/test_file_logger.txt';
+        $file = $CFG->tempdir . '/test/test_file_logger.txt';
         // Remove the test dir and any content
         @remove_dir(dirname($file));
         // Recreate test dir
@@ -272,7 +272,7 @@ class logger_test extends UnitTestCase {
         unlink($file); // delete file
 
         // Try one html file
-        $file = $CFG->dataroot . '/temp/test/test_file_logger.html';
+        $file = $CFG->tempdir . '/test/test_file_logger.html';
         $options = array('depth' => 1);
         $lo = new file_logger(backup::LOG_ERROR, true, true, $file);
         $this->assertTrue($lo instanceof file_logger);
@@ -289,7 +289,7 @@ class logger_test extends UnitTestCase {
         unlink($file); // delete file
 
         // Instantiate, write something, force deletion, try to write again
-        $file = $CFG->dataroot . '/temp/test/test_file_logger.html';
+        $file = $CFG->tempdir . '/test/test_file_logger.html';
         $lo = new mock_file_logger(backup::LOG_ERROR, true, true, $file);
         $this->assertTrue(file_exists($file));
         $message = 'testing file_logger';
@@ -313,7 +313,7 @@ class logger_test extends UnitTestCase {
         }
 
         // Instantiate in (near) impossible path
-        $file =  $CFG->dataroot . '/temp/test_azby/test_file_logger.txt';
+        $file =  $CFG->tempdir . '/test_azby/test_file_logger.txt';
         try {
             $lo = new file_logger(backup::LOG_WARNING, true, true, $file);
             $this->assertTrue(false, 'base_logger_exception expected');
@@ -324,7 +324,7 @@ class logger_test extends UnitTestCase {
         }
 
         // Instatiate one file logger with level = backup::LOG_NONE
-        $file =  $CFG->dataroot . '/temp/test/test_file_logger.txt';
+        $file =  $CFG->tempdir . '/test/test_file_logger.txt';
         $lo = new file_logger(backup::LOG_NONE, true, true, $file);
         $this->assertTrue($lo instanceof file_logger);
         $this->assertFalse(file_exists($file));
index 0816621..f21385c 100644 (file)
@@ -43,7 +43,7 @@ class backup_plan extends base_plan implements loggable {
             throw new backup_plan_exception('wrong_backup_controller_specified');
         }
         $this->controller = $controller;
-        $this->basepath   = $CFG->dataroot . '/temp/backup/' . $controller->get_backupid();
+        $this->basepath   = $CFG->tempdir . '/backup/' . $controller->get_backupid();
         parent::__construct('backup_plan');
     }
 
index 27b1cfc..3d0c6ca 100644 (file)
@@ -50,7 +50,7 @@ class restore_plan extends base_plan implements loggable {
             throw new restore_plan_exception('wrong_restore_controller_specified');
         }
         $this->controller = $controller;
-        $this->basepath   = $CFG->dataroot . '/temp/backup/' . $controller->get_tempdir();
+        $this->basepath   = $CFG->tempdir . '/backup/' . $controller->get_tempdir();
         $this->preloaded  = false;
         $this->decoder    = new restore_decode_processor($this->get_restoreid(), $this->get_info()->original_wwwroot, $CFG->wwwroot);
         $this->missingmodules = false;
index 0e0b567..8643c4d 100644 (file)
@@ -195,7 +195,7 @@ class backup_step_test extends UnitTestCase {
     function test_backup_structure_step() {
         global $CFG;
 
-        $file = $CFG->dataroot . '/temp/test/test_backup_structure_step.txt';
+        $file = $CFG->tempdir . '/test/test_backup_structure_step.txt';
         // Remove the test dir and any content
         @remove_dir(dirname($file));
         // Recreate test dir
@@ -295,7 +295,7 @@ class mock_backup_task_basepath extends backup_task {
 
     public function get_taskbasepath() {
         global $CFG;
-        return $CFG->dataroot . '/temp/test';
+        return $CFG->tempdir . '/test';
     }
 }
 
index b96bad2..9b891a6 100644 (file)
@@ -523,7 +523,7 @@ class core_backup_renderer extends plugin_renderer_base {
                 }
                 $row->cells = array(
                     html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'targetid', 'value'=>$course->id)),
-                    $course->shortname,
+                    format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id))),
                     $course->fullname
                 );
                 $table->data[] = $row;
@@ -587,7 +587,7 @@ class core_backup_renderer extends plugin_renderer_base {
             }
             $row->cells = array(
                 html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'importid', 'value'=>$course->id)),
-                $course->shortname,
+                format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id))),
                 $course->fullname
             );
             $table->data[] = $row;
index a50f259..cd19b7d 100644 (file)
@@ -153,7 +153,7 @@ class restore_ui_stage_confirm extends restore_ui_independent_stage {
     }
     public function process() {
         global $CFG;
-        if (!file_exists("$CFG->dataroot/temp/backup/".$this->filename)) {
+        if (!file_exists("$CFG->tempdir/backup/".$this->filename)) {
             throw new restore_ui_exception('invalidrestorefile');
         }
         $outcome = $this->extract_file_to_dir();
@@ -168,7 +168,7 @@ class restore_ui_stage_confirm extends restore_ui_independent_stage {
         $this->filepath = restore_controller::get_tempdir_name($this->contextid, $USER->id);
 
         $fb = get_file_packer();
-        return ($fb->extract_to_pathname("$CFG->dataroot/temp/backup/".$this->filename, "$CFG->dataroot/temp/backup/$this->filepath/"));
+        return ($fb->extract_to_pathname("$CFG->tempdir/backup/".$this->filename, "$CFG->tempdir/backup/$this->filepath/"));
     }
 
     /**
@@ -236,7 +236,7 @@ class restore_ui_stage_destination extends restore_ui_independent_stage {
     }
     public function process() {
         global $CFG, $DB;
-        if (!file_exists("$CFG->dataroot/temp/backup/".$this->filepath) || !is_dir("$CFG->dataroot/temp/backup/".$this->filepath)) {
+        if (!file_exists("$CFG->tempdir/backup/".$this->filepath) || !is_dir("$CFG->tempdir/backup/".$this->filepath)) {
             throw new restore_ui_exception('invalidrestorepath');
         }
         if (optional_param('searchcourses', false, PARAM_BOOL)) {
index a1d6bad..502bd9a 100644 (file)
@@ -219,7 +219,7 @@ class xml_output_test extends UnitTestCase {
     function test_file_xml_output() {
         global $CFG;
 
-        $file = $CFG->dataroot . '/temp/test/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test/test_file_xml_output.txt';
         // Remove the test dir and any content
         @remove_dir(dirname($file));
         // Recreate test dir
@@ -232,7 +232,7 @@ class xml_output_test extends UnitTestCase {
         $this->assertTrue($xo instanceof xml_output);
 
         // Try to init file in (near) impossible path
-        $file = $CFG->dataroot . '/temp/test_azby/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test_azby/test_file_xml_output.txt';
         $xo = new file_xml_output($file);
         try {
             $xo->start();
@@ -243,7 +243,7 @@ class xml_output_test extends UnitTestCase {
         }
 
         // Try to init file already existing
-        $file = $CFG->dataroot . '/temp/test/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test/test_file_xml_output.txt';
         file_put_contents($file, 'createdtobedeleted'); // create file manually
         $xo = new file_xml_output($file);
         try {
@@ -256,7 +256,7 @@ class xml_output_test extends UnitTestCase {
         unlink($file); // delete file
 
         // Send some output and check
-        $file = $CFG->dataroot . '/temp/test/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test/test_file_xml_output.txt';
         $xo = new file_xml_output($file);
         $xo->start();
         $xo->write('first text');
@@ -266,7 +266,7 @@ class xml_output_test extends UnitTestCase {
 
         // With buffer of 4 bytes, send 3 contents of 3 bytes each
         // so we force both buffering and last write on stop
-        $file = $CFG->dataroot . '/temp/test/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test/test_file_xml_output.txt';
         $xo = new file_xml_output($file);
         $xo->set_buffersize(5);
         $xo->start();
@@ -278,7 +278,7 @@ class xml_output_test extends UnitTestCase {
         unlink($file); // delete file
 
         // Write some line feeds, tabs and friends
-        $file = $CFG->dataroot . '/temp/test/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test/test_file_xml_output.txt';
         $string = "\n\r\tcrazy test\n\r\t";
         $xo = new file_xml_output($file);
         $xo->start();
@@ -288,7 +288,7 @@ class xml_output_test extends UnitTestCase {
         unlink($file); // delete file
 
         // Write some UTF-8 chars
-        $file = $CFG->dataroot . '/temp/test/test_file_xml_output.txt';
+        $file = $CFG->tempdir . '/test/test_file_xml_output.txt';
         $string = 'áéíóú';
         $xo = new file_xml_output($file);
         $xo->start();
index e996439..74e4bcd 100644 (file)
@@ -88,7 +88,7 @@ $cancelrestore = optional_param('cancelrestore', false, PARAM_INT);
 if ($usercandownload and $cancelrestore and confirm_sesskey()) {
     $filename = optional_param('filename', '', PARAM_ALPHANUMEXT);
     //delete temp file
-    unlink($CFG->dataroot . '/temp/backup/' . $filename . ".mbz");
+    unlink($CFG->tempdir . '/backup/' . $filename . ".mbz");
 }
 
 /// Download
index a2a0ce1..f76088f 100644 (file)
@@ -86,12 +86,12 @@ class block_community_manager {
         $params['courseid'] = $course->id;
         $params['filetype'] = HUB_BACKUP_FILE_TYPE;
 
-        make_upload_directory('temp/backup');
+        make_temp_directory('backup');
 
         $filename = md5(time() . '-' . $course->id . '-'. $USER->id . '-'. random_string(20));
 
         $url  = new moodle_url($course->huburl.'/local/hub/webservice/download.php', $params);
-        $path = $CFG->dataroot.'/temp/backup/'.$filename.".mbz";
+        $path = $CFG->tempdir.'/backup/'.$filename.".mbz";
         $fp = fopen($path, 'w');
         $curlurl = $course->huburl.'/local/hub/webservice/download.php?filetype='
                 .HUB_BACKUP_FILE_TYPE.'&courseid='.$course->id;
@@ -122,7 +122,7 @@ class block_community_manager {
         if (!$fs->file_exists($record->contextid, $record->component,
                 $record->filearea, 0, $record->filepath, $record->filename)) {
             $fs->create_file_from_pathname($record,
-                    $CFG->dataroot.'/temp/backup/'.$filename.".mbz");
+                    $CFG->tempdir.'/backup/'.$filename.".mbz");
         }
 
         $filenames = array();
index 52fc182..e835657 100644 (file)
@@ -36,8 +36,9 @@ class block_course_list extends block_list {
           !(has_capability('moodle/course:update', get_context_instance(CONTEXT_SYSTEM)) and $adminseesall)) {    // Just print My Courses
             if ($courses = enrol_get_my_courses(NULL, 'visible DESC, fullname ASC')) {
                 foreach ($courses as $course) {
+                    $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
                     $linkcss = $course->visible ? "" : " class=\"dimmed\" ";
-                    $this->content->items[]="<a $linkcss title=\"" . format_string($course->shortname) . "\" ".
+                    $this->content->items[]="<a $linkcss title=\"" . format_string($course->shortname, true, array('context' => $coursecontext)) . "\" ".
                                "href=\"$CFG->wwwroot/course/view.php?id=$course->id\">".$icon.format_string($course->fullname). "</a>";
                 }
                 $this->title = get_string('mycourses');
@@ -70,10 +71,11 @@ class block_course_list extends block_list {
 
                 if ($courses) {
                     foreach ($courses as $course) {
+                        $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
                         $linkcss = $course->visible ? "" : " class=\"dimmed\" ";
 
                         $this->content->items[]="<a $linkcss title=\""
-                                   . format_string($course->shortname)."\" ".
+                                   . format_string($course->shortname, true, array('context' => $coursecontext))."\" ".
                                    "href=\"$CFG->wwwroot/course/view.php?id=$course->id\">"
                                    .$icon. format_string($course->fullname) . "</a>";
                     }
@@ -117,7 +119,8 @@ class block_course_list extends block_list {
             $this->content->items[] = get_string('remotecourses','mnet');
             $this->content->icons[] = '';
             foreach ($courses as $course) {
-                $this->content->items[]="<a title=\"" . format_string($course->shortname) . "\" ".
+                $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+                $this->content->items[]="<a title=\"" . format_string($course->shortname, true, array('context' => $coursecontext)) . "\" ".
                     "href=\"{$CFG->wwwroot}/auth/mnet/jump.php?hostid={$course->hostid}&amp;wantsurl=/course/view.php?id={$course->remoteid}\">"
                     .$icon. format_string($course->fullname) . "</a>";
             }
index 77cc00a..79b8086 100644 (file)
@@ -252,7 +252,7 @@ class block_navigation extends block_base {
                     // Truncate the text to $long characters
                     $node->text = $this->trim_left($textlib, $node->text, $long);
                 }
-                if (is_string($node->shorttext) && strlen($node->shorttext)>($short+3)) {
+                if (is_string($node->shorttext) && $textlib->strlen($node->shorttext)>($short+3)) {
                     // Truncate the shorttext
                     $node->shorttext = $this->trim_left($textlib, $node->shorttext, $short);
                 }
@@ -262,7 +262,7 @@ class block_navigation extends block_base {
                     // Truncate the text to $long characters
                     $node->text = $this->trim_center($textlib, $node->text, $long);
                 }
-                if (is_string($node->shorttext) && strlen($node->shorttext)>($short+3)) {
+                if (is_string($node->shorttext) && $textlib->strlen($node->shorttext)>($short+3)) {
                     // Truncate the shorttext
                     $node->shorttext = $this->trim_center($textlib, $node->shorttext, $short);
                 }
index 11bec78..8ca1504 100644 (file)
 
         if(empty($title)){
             // no title present, use portion of description
-            $title = substr(strip_tags($description), 0, 20) . '...';
+            $title = textlib::substr(strip_tags($description), 0, 20) . '...';
         }else{
             $title = break_up_long_words($title, 30);
         }
index c37af10..55d6b73 100644 (file)
@@ -748,10 +748,11 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
     // Case 1: No entry, mod, course or user params: all site entries to be shown (filtered by search and tag/tagid)
     // Note: if action is set to 'add' or 'edit', we do this at the end
     if (empty($entryid) && empty($modid) && empty($courseid) && empty($userid) && !in_array($action, array('edit', 'add'))) {
+        $shortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
         $PAGE->navbar->add($strblogentries, $blogurl);
-        $PAGE->set_title("$site->shortname: " . get_string('blog', 'blog'));
-        $PAGE->set_heading("$site->shortname: " . get_string('blog', 'blog'));
-        $headers['heading'] = get_string('siteblog', 'blog', $site->shortname);
+        $PAGE->set_title("$shortname: " . get_string('blog', 'blog'));
+        $PAGE->set_heading("$shortname: " . get_string('blog', 'blog'));
+        $headers['heading'] = get_string('siteblog', 'blog', $shortname);
         // $headers['strview'] = get_string('viewsiteentries', 'blog');
     }
 
@@ -770,14 +771,14 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
         } else {
             $mycourseid = $site->id;
         }
+        $shortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
 
         $PAGE->navbar->add($strblogentries, $blogurl);
 
         $blogurl->remove_params('userid');
         $PAGE->navbar->add($entry->subject, $blogurl);
-
-        $PAGE->set_title("$site->shortname: " . fullname($user) . ": $entry->subject");
-        $PAGE->set_heading("$site->shortname: " . fullname($user) . ": $entry->subject");
+        $PAGE->set_title("$shortname: " . fullname($user) . ": $entry->subject");
+        $PAGE->set_heading("$shortname: " . fullname($user) . ": $entry->subject");
         $headers['heading'] = get_string('blogentrybyuser', 'blog', fullname($user));
 
         // We ignore tag and search params
@@ -789,9 +790,10 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 3: A user's blog entries
     if (!empty($userid) && empty($entryid) && ((empty($courseid) && empty($modid)) || !$CFG->useblogassociations)) {
+        $shortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
         $blogurl->param('userid', $userid);
-        $PAGE->set_title("$site->shortname: " . fullname($user) . ": " . get_string('blog', 'blog'));
-        $PAGE->set_heading("$site->shortname: " . fullname($user) . ": " . get_string('blog', 'blog'));
+        $PAGE->set_title("$shortname: " . fullname($user) . ": " . get_string('blog', 'blog'));
+        $PAGE->set_heading("$shortname: " . fullname($user) . ": " . get_string('blog', 'blog'));
         $headers['heading'] = get_string('userblog', 'blog', fullname($user));
         $headers['strview'] = get_string('viewuserentries', 'blog', fullname($user));
 
@@ -799,13 +801,15 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 4: No blog associations, no userid
     if (!$CFG->useblogassociations && empty($userid) && !in_array($action, array('edit', 'add'))) {
-        $PAGE->set_title("$site->shortname: " . get_string('blog', 'blog'));
-        $PAGE->set_heading("$site->shortname: " . get_string('blog', 'blog'));
-        $headers['heading'] = get_string('siteblog', 'blog', $site->shortname);
+        $shortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
+        $PAGE->set_title("$shortname: " . get_string('blog', 'blog'));
+        $PAGE->set_heading("$shortname: " . get_string('blog', 'blog'));
+        $headers['heading'] = get_string('siteblog', 'blog', $shortname);
     } else
 
     // Case 5: Blog entries associated with an activity by a specific user (courseid ignored)
     if (!empty($userid) && !empty($modid) && empty($entryid)) {
+        $shortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
         $blogurl->param('userid', $userid);
         $blogurl->param('modid', $modid);
 
@@ -814,8 +818,8 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
         $PAGE->navbar->add(fullname($user), "$CFG->wwwroot/user/view.php?id=$user->id");
         $PAGE->navbar->add($strblogentries, $blogurl);
 
-        $PAGE->set_title("$site->shortname: $cm->name: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
-        $PAGE->set_heading("$site->shortname: $cm->name: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
+        $PAGE->set_title("$shortname: $cm->name: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
+        $PAGE->set_heading("$shortname: $cm->name: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
 
         $a = new stdClass();
         $a->user = fullname($user);
@@ -828,13 +832,15 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 6: Blog entries associated with a course by a specific user
     if (!empty($userid) && !empty($courseid) && empty($modid) && empty($entryid)) {
+        $siteshortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
+        $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
         $blogurl->param('userid', $userid);
         $blogurl->param('courseid', $courseid);
 
         $PAGE->navbar->add($strblogentries, $blogurl);
 
-        $PAGE->set_title("$site->shortname: $course->shortname: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
-        $PAGE->set_heading("$site->shortname: $course->shortname: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
+        $PAGE->set_title("$siteshortname: $courseshortname: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
+        $PAGE->set_heading("$siteshortname: $courseshortname: " . fullname($user) . ': ' . get_string('blogentries', 'blog'));
 
         $a = new stdClass();
         $a->user = fullname($user);
@@ -850,6 +856,8 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 7: Blog entries by members of a group, associated with that group's course
     if (!empty($groupid) && empty($modid) && empty($entryid)) {
+        $siteshortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
+        $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
         $blogurl->param('courseid', $course->id);
 
         $PAGE->navbar->add($strblogentries, $blogurl);
@@ -857,8 +865,8 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
         $blogurl->param('groupid', $groupid);
         $PAGE->navbar->add($group->name, $blogurl);
 
-        $PAGE->set_title("$site->shortname: $course->shortname: " . get_string('blogentries', 'blog') . ": $group->name");
-        $PAGE->set_heading("$site->shortname: $course->shortname: " . get_string('blogentries', 'blog') . ": $group->name");
+        $PAGE->set_title("$siteshortname: $courseshortname: " . get_string('blogentries', 'blog') . ": $group->name");
+        $PAGE->set_heading("$siteshortname: $courseshortname: " . get_string('blogentries', 'blog') . ": $group->name");
 
         $a = new stdClass();
         $a->group = $group->name;
@@ -871,6 +879,8 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 8: Blog entries by members of a group, associated with an activity in that course
     if (!empty($groupid) && !empty($modid) && empty($entryid)) {
+        $siteshortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
+        $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
         $headers['cm'] = $cm;
         $blogurl->param('modid', $modid);
         $PAGE->navbar->add($strblogentries, $blogurl);
@@ -878,8 +888,8 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
         $blogurl->param('groupid', $groupid);
         $PAGE->navbar->add($group->name, $blogurl);
 
-        $PAGE->set_title("$site->shortname: $course->shortname: $cm->name: " . get_string('blogentries', 'blog') . ": $group->name");
-        $PAGE->set_heading("$site->shortname: $course->shortname: $cm->name: " . get_string('blogentries', 'blog') . ": $group->name");
+        $PAGE->set_title("$siteshortname: $courseshortname: $cm->name: " . get_string('blogentries', 'blog') . ": $group->name");
+        $PAGE->set_heading("$siteshortname: $courseshortname: $cm->name: " . get_string('blogentries', 'blog') . ": $group->name");
 
         $a = new stdClass();
         $a->group = $group->name;
@@ -893,11 +903,13 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 9: All blog entries associated with an activity
     if (!empty($modid) && empty($userid) && empty($groupid) && empty($entryid)) {
+        $siteshortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
+        $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
         $PAGE->set_cm($cm, $course);
         $blogurl->param('modid', $modid);
         $PAGE->navbar->add($strblogentries, $blogurl);
-        $PAGE->set_title("$site->shortname: $course->shortname: $cm->name: " . get_string('blogentries', 'blog'));
-        $PAGE->set_heading("$site->shortname: $course->shortname: $cm->name: " . get_string('blogentries', 'blog'));
+        $PAGE->set_title("$siteshortname: $courseshortname: $cm->name: " . get_string('blogentries', 'blog'));
+        $PAGE->set_heading("$siteshortname: $courseshortname: $cm->name: " . get_string('blogentries', 'blog'));
         $headers['heading'] = get_string('blogentriesabout', 'blog', $cm->name);
         $a = new stdClass();
         $a->type = get_string('modulename', $cm->modname);
@@ -907,10 +919,12 @@ function blog_get_headers($courseid=null, $groupid=null, $userid=null, $tagid=nu
 
     // Case 10: All blog entries associated with a course
     if (!empty($courseid) && empty($userid) && empty($groupid) && empty($modid) && empty($entryid)) {
+        $siteshortname = format_string($site->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
+        $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
         $blogurl->param('courseid', $courseid);
         $PAGE->navbar->add($strblogentries, $blogurl);
-        $PAGE->set_title("$site->shortname: $course->shortname: " . get_string('blogentries', 'blog'));
-        $PAGE->set_heading("$site->shortname: $course->shortname: " . get_string('blogentries', 'blog'));
+        $PAGE->set_title("$siteshortname: $courseshortname: " . get_string('blogentries', 'blog'));
+        $PAGE->set_heading("$siteshortname: $courseshortname: " . get_string('blogentries', 'blog'));
         $a = new stdClass();
         $a->type = get_string('course');
         $headers['heading'] = get_string('blogentriesabout', 'blog', $course->fullname);
index 3fea97f..4cc9a80 100644 (file)
@@ -223,9 +223,9 @@ function blog_rss_file_name($type, $id, $tagid=0) {
     global $CFG;
 
     if ($tagid) {
-        return "$CFG->dataroot/cache/rss/blog/$type/$id/$tagid.xml";
+        return "$CFG->cachedir/rss/blog/$type/$id/$tagid.xml";
     } else {
-        return "$CFG->dataroot/cache/rss/blog/$type/$id.xml";
+        return "$CFG->cachedir/rss/blog/$type/$id.xml";
     }
 }
 
@@ -236,8 +236,8 @@ function blog_rss_save_file($type, $id, $tagid=0, $contents='') {
     $status = true;
 
     //blog creates some additional dirs within the rss cache so make sure they all exist
-    make_upload_directory('cache/rss/blog');
-    make_upload_directory('cache/rss/blog/'.$type);
+    make_cache_directory('rss/blog');
+    make_cache_directory('rss/blog/'.$type);
 
     $filename = blog_rss_file_name($type, $id, $tagid);
     $expandfilename = false; //we're supplying a full file path
index bfda457..e50123e 100644 (file)
@@ -140,7 +140,8 @@ foreach($events as $event) {
         $ev->add_property('dtend', Bennu::timestamp_to_datetime($event->timestart + $event->timeduration));
     }
     if ($event->courseid != 0) {
-        $ev->add_property('categories', $courses[$event->courseid]->shortname);
+        $coursecontext = get_context_instance(CONTEXT_COURSE, $event->courseid);
+        $ev->add_property('categories', format_string($courses[$event->courseid]->shortname, true, array('context' => $coursecontext)));
     }
     $ical->add_component($ev);
 }
index e9ba82d..8e502a8 100644 (file)
@@ -692,7 +692,8 @@ class core_calendar_renderer extends plugin_renderer_base {
         $courseoptions = array();
         $courseoptions[SITEID] = get_string('fulllistofcourses');
         foreach ($courses as $course) {
-            $courseoptions[$course->id] = format_string($course->shortname);
+            $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+            $courseoptions[$course->id] = format_string($course->shortname, true, array('context' => $coursecontext));
         }
 
         if ($this->page->course->id !== SITEID) {
index 4ca2b72..6a5f7fc 100644 (file)
@@ -347,10 +347,16 @@ $CFG->admin = 'admin';
 //
 //     $CFG->themedir = '/location/of/extra/themes';
 //
+// It is possible to specify different cache and temp directories, use local fast filesystem.
+// The directories must not be accessible via web.
+//
+//     $CFG->tempdir = '/var/www/moodle/temp';
+//     $CFG->cachedir = '/var/www/moodle/cache';
+//
 // If $CFG->langstringcache is enabled (which should always be in production
 // environment), Moodle keeps aggregated strings in its own internal format
 // optimised for performance. By default, this on-disk cache is created in
-// $CFG->dataroot/cache/lang. In cluster environment, you may wish to specify
+// $CFG->cachedir/lang. In cluster environment, you may wish to specify
 // an alternative location of this cache so that each web server in the cluster
 // uses its own local cache and does not need to access the shared dataroot.
 // Make sure that the web server process has write permission to this location
index c0a60ca..3a4eb2f 100644 (file)
     }
 
     $category = $DB->get_record("course_categories", array("id"=>$course->category));
+    $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
 
     $PAGE->navbar->add($stradministration, new moodle_url('/admin/index.php/'));
     $PAGE->navbar->add($strcategories, new moodle_url('/course/index.php'));
     $PAGE->navbar->add($category->name, new moodle_url('/course/category.php', array('id'=>$course->category)));
     if (! $delete) {
-        $strdeletecheck = get_string("deletecheck", "", $course->shortname);
+        $strdeletecheck = get_string("deletecheck", "", $courseshortname);
         $strdeletecoursecheck = get_string("deletecoursecheck");
 
         $PAGE->navbar->add($strdeletecheck);
@@ -43,7 +44,7 @@
         $PAGE->set_heading($site->fullname);
         echo $OUTPUT->header();
 
-        $message = "$strdeletecoursecheck<br /><br />" . format_string($course->fullname) .  " (" . format_string($course->shortname) . ")";
+        $message = "$strdeletecoursecheck<br /><br />" . format_string($course->fullname) .  " (" . $courseshortname . ")";
         echo $OUTPUT->confirm($message, "delete.php?id=$course->id&delete=".md5($course->timemodified), "category.php?id=$course->category");
 
         echo $OUTPUT->footer();
@@ -62,7 +63,7 @@
 
     add_to_log(SITEID, "course", "delete", "view.php?id=$course->id", "$course->fullname (ID $course->id)");
 
-    $strdeletingcourse = get_string("deletingcourse", "", format_string($course->shortname));
+    $strdeletingcourse = get_string("deletingcourse", "", $courseshortname);
 
     $PAGE->navbar->add($strdeletingcourse);
     $PAGE->set_title("$site->shortname: $strdeletingcourse");
@@ -73,7 +74,7 @@
     delete_course($course);
     fix_course_sortorder(); //update course count in catagories
 
-    echo $OUTPUT->heading( get_string("deletedcourse", "", format_string($course->shortname)) );
+    echo $OUTPUT->heading( get_string("deletedcourse", "", $courseshortname) );
 
     echo $OUTPUT->continue_button("category.php?id=$course->category");
 
index e7ded17..aca5105 100644 (file)
@@ -42,7 +42,7 @@
     $PAGE->navbar->add(get_string('summary'));
 
     echo $OUTPUT->header();
-    echo $OUTPUT->heading('<a href="view.php?id='.$course->id.'">'.format_string($course->fullname) . '</a><br />(' . format_string($course->shortname) . ')');
+    echo $OUTPUT->heading('<a href="view.php?id='.$course->id.'">'.format_string($course->fullname) . '</a><br />(' . format_string($course->shortname, true, array('context' => $context)) . ')');
 
     // print enrol info
     if ($texts = enrol_get_course_description_texts($course)) {
index fe8630f..84a8e3e 100644 (file)
@@ -498,8 +498,9 @@ function print_mnet_log($hostid, $course, $user=0, $date=0, $order="l.time ASC",
 
         echo '<tr class="r'.$row.'">';
         if ($course->id == SITEID) {
+            $courseshortname = format_string($courses[$log->course], true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
             echo "<td class=\"r$row c0\" >\n";
-            echo "    <a href=\"{$CFG->wwwroot}/course/view.php?id={$log->course}\">".$courses[$log->course]."</a>\n";
+            echo "    <a href=\"{$CFG->wwwroot}/course/view.php?id={$log->course}\">".$courseshortname."</a>\n";
             echo "</td>\n";
         }
         echo "<td class=\"r$row c1\" align=\"right\">".userdate($log->time, '%a').
@@ -591,8 +592,9 @@ function print_log_csv($course, $user, $date, $order='l.time DESC', $modname,
         $log->info = format_string($log->info);
         $log->info = strip_tags(urldecode($log->info));    // Some XSS protection
 
-        $firstField = $courses[$log->course];
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $course->id)));
+        $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+        $firstField = format_string($courses[$log->course], true, array('context' => $coursecontext));
+        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
         $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.' '.$log->action, $log->info);
         $text = implode("\t", $row);
         echo $text." \n";
@@ -697,10 +699,12 @@ function print_log_xls($course, $user, $date, $order='l.time DESC', $modname,
             }
         }
 
-        $myxls->write($row, 0, $courses[$log->course], '');
+        $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+
+        $myxls->write($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)), '');
         $myxls->write_date($row, 1, $log->time, $formatDate); // write_date() does conversion/timezone support. MDL-14934
         $myxls->write($row, 2, $log->ip, '');
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $course->id)));
+        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
         $myxls->write($row, 3, $fullname, '');
         $myxls->write($row, 4, $log->module.' '.$log->action, '');
         $myxls->write($row, 5, $log->info, '');
@@ -808,10 +812,12 @@ function print_log_ods($course, $user, $date, $order='l.time DESC', $modname,
             }
         }
 
-        $myxls->write_string($row, 0, $courses[$log->course]);
+        $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+
+        $myxls->write_string($row, 0, format_string($courses[$log->course], true, array('context' => $context)));
         $myxls->write_date($row, 1, $log->time);
         $myxls->write_string($row, 2, $log->ip);
-        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $course->id)));
+        $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
         $myxls->write_string($row, 3, $fullname);
         $myxls->write_string($row, 4, $log->module.' '.$log->action);
         $myxls->write_string($row, 5, $log->info);
@@ -1376,22 +1382,28 @@ function set_section_visible($courseid, $sectionnumber, $visibility) {
 function get_print_section_cm_text(cm_info $cm, $course) {
     global $OUTPUT;
 
-    // Get course context
-    $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
-
     // Get content from modinfo if specified. Content displays either
     // in addition to the standard link (below), or replaces it if
     // the link is turned off by setting ->url to null.
     if (($content = $cm->get_content()) !== '') {
+        // Improve filter performance by preloading filter setttings for all
+        // activities on the course (this does nothing if called multiple
+        // times)
+        filter_preload_activities($cm->get_modinfo());
+
+        // Get module context
+        $modulecontext = get_context_instance(CONTEXT_MODULE, $cm->id);
         $labelformatoptions = new stdClass();
         $labelformatoptions->noclean = true;
         $labelformatoptions->overflowdiv = true;
-        $labelformatoptions->context = $coursecontext;
+        $labelformatoptions->context = $modulecontext;
         $content = format_text($content, FORMAT_HTML, $labelformatoptions);
     } else {
         $content = '';
     }
 
+    // Get course context
+    $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
     $stringoptions = new stdClass;
     $stringoptions->context = $coursecontext;
     $instancename = format_string($cm->name, true,  $stringoptions);
@@ -3161,13 +3173,16 @@ function make_editing_buttons(stdClass $mod, $absolute = true, $moveselect = tru
         array('class' => 'editing_update', 'title' => $str->update)
     );
 
-    // Duplicate
-    $actions[] = new action_link(
-        new moodle_url($baseurl, array('duplicate' => $mod->id)),
-        new pix_icon('t/copy', $str->duplicate, 'moodle', array('class' => 'iconsmall')),
-        null,
-        array('class' => 'editing_duplicate', 'title' => $str->duplicate)
-    );
+    // Duplicate (require both target import caps to be able to duplicate, see modduplicate.php)
+    $dupecaps = array('moodle/backup:backuptargetimport', 'moodle/restore:restoretargetimport');
+    if (has_all_capabilities($dupecaps, $coursecontext)) {
+        $actions[] = new action_link(
+            new moodle_url($baseurl, array('duplicate' => $mod->id)),
+            new pix_icon('t/copy', $str->duplicate, 'moodle', array('class' => 'iconsmall')),
+            null,
+            array('class' => 'editing_duplicate', 'title' => $str->duplicate)
+        );
+    }
 
     // Delete
     $actions[] = new action_link(
@@ -3254,12 +3269,15 @@ function make_editing_buttons(stdClass $mod, $absolute = true, $moveselect = tru
  */
 function course_format_name ($course,$max=100) {
 
-    $str = $course->shortname.': '. $course->fullname;
-    if (strlen($str) <= $max) {
+    $context = get_context_instance(CONTEXT_COURSE, $course->id);
+    $shortname = format_string($course->shortname, true, array('context' => $context));
+
+    $str = $shortname.': '. $course->fullname;
+    if (textlib::strlen($str) <= $max) {
         return $str;
     }
     else {
-        return substr($str,0,$max-3).'...';
+        return textlib::substr($str,0,$max-3).'...';
     }
 }
 
index 632f191..a9006b1 100644 (file)
@@ -44,6 +44,7 @@ $section    = $DB->get_record('course_sections', array('id' => $cm->section, 'co
 require_login($course);
 require_sesskey();
 require_capability('moodle/course:manageactivities', $context);
+// Require both target import caps to be able to duplicate, see make_editing_buttons()
 require_capability('moodle/backup:backuptargetimport', $context);
 require_capability('moodle/restore:restoretargetimport', $context);
 
index 4d048ae..9627750 100644 (file)
@@ -37,6 +37,8 @@ $huburl = optional_param('huburl', 0, PARAM_URL);
 $course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
 
 require_login($course);
+$context = get_context_instance(CONTEXT_COURSE, $course->id);
+$shortname = format_string($course->shortname, true, array('context' => $context));
 
 $PAGE->set_url('/course/publish/index.php', array('id' => $course->id));
 $PAGE->set_pagelayout('course');
@@ -48,7 +50,7 @@ if (!extension_loaded('xmlrpc')) {
     $notificationerror = $OUTPUT->doc_link('admin/environment/php_extension/xmlrpc', '');
     $notificationerror .= get_string('xmlrpcdisabledpublish', 'hub');
     echo $OUTPUT->header();
-    echo $OUTPUT->heading(get_string('publishcourse', 'hub', $course->shortname), 3, 'main');
+    echo $OUTPUT->heading(get_string('publishcourse', 'hub', $shortname), 3, 'main');
     echo $OUTPUT->notification($notificationerror);
     echo $OUTPUT->footer();
     die();
@@ -144,9 +146,9 @@ if (has_capability('moodle/course:publish', get_context_instance(CONTEXT_COURSE,
 
         } else {
             //display confirmation page for unpublishing
-           
+
             echo $OUTPUT->header();
-            echo $OUTPUT->heading(get_string('unpublishcourse', 'hub', $course->shortname), 3, 'main');
+            echo $OUTPUT->heading(get_string('unpublishcourse', 'hub', $shortname), 3, 'main');
             echo $renderer->confirmunpublishing($publication);
             echo $OUTPUT->footer();
             die();
@@ -164,7 +166,7 @@ if (has_capability('moodle/course:publish', get_context_instance(CONTEXT_COURSE,
     echo $OUTPUT->header();
     echo $confirmmessage;
 
-    echo $OUTPUT->heading(get_string('publishcourse', 'hub', $course->shortname), 3, 'main');
+    echo $OUTPUT->heading(get_string('publishcourse', 'hub', $shortname), 3, 'main');
     echo $renderer->publicationselector($course->id);
 
     $publications = $publicationmanager->get_course_publications($course->id);
index 9a952f7..b8a8caa 100644 (file)
@@ -53,8 +53,10 @@ $PAGE->set_heading($course->fullname);
 if (!extension_loaded('xmlrpc')) {
     $errornotification = $OUTPUT->doc_link('admin/environment/php_extension/xmlrpc', '');
     $errornotification .= get_string('xmlrpcdisabledpublish', 'hub');
+    $context = get_context_instance(CONTEXT_COURSE, $course->id);
+    $shortname = format_string($course->shortname, true, array('context' => $context));
     echo $OUTPUT->header();
-    echo $OUTPUT->heading(get_string('publishcourse', 'hub', $course->shortname), 3, 'main');
+    echo $OUTPUT->heading(get_string('publishcourse', 'hub', $shortname), 3, 'main');
     echo $OUTPUT->notification($errornotification);
     echo $OUTPUT->footer();
     die();
index a9f78ef..b79e443 100644 (file)
@@ -40,31 +40,63 @@ class recent_form extends moodleform {
 
         $mform->addElement('header', 'filters', get_string('managefilters')); //TODO: add better string
 
+        $groupoptions = array();
+        if (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
+            // limited group access
+            $groups = groups_get_user_groups($COURSE->id);
+            $allgroups = groups_get_all_groups($COURSE->id);
+            if (!empty($groups[$COURSE->defaultgroupingid])) {
+                foreach ($groups[$COURSE->defaultgroupingid] AS $groupid) {
+                    $groupoptions[$groupid] = format_string($allgroups[$groupid]->name, true, array('context'=>$context));
+                }
+            }
+        } else {
+            $groupoptions = array('0'=>get_string('allgroups'));
+            if (has_capability('moodle/site:accessallgroups', $context)) {
+                // user can see all groups
+                $allgroups = groups_get_all_groups($COURSE->id);
+            } else {
+                // user can see course level groups
+                $allgroups = groups_get_all_groups($COURSE->id, 0, $COURSE->defaultgroupingid);
+            }
+            foreach($allgroups as $group) {
+                $groupoptions[$group->id] = format_string($group->name, true, array('context'=>$context));
+            }
+        }
+
         if ($COURSE->id == SITEID) {
             $viewparticipants = has_capability('moodle/site:viewparticipants', get_context_instance(CONTEXT_SYSTEM));
         } else {
             $viewparticipants = has_capability('moodle/course:viewparticipants', $context);
         }
 
-        $viewfullnames = has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $COURSE->id));
-
         if ($viewparticipants) {
+            $viewfullnames = has_capability('moodle/site:viewfullnames', get_context_instance(CONTEXT_COURSE, $COURSE->id));
+
             $options = array();
             $options[0] = get_string('allparticipants');
             $options[$CFG->siteguest] = get_string('guestuser');
 
-            if (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS) {
-                $groups = groups_get_user_groups($COURSE->id);
-                $group = $groups[0];
+            if (isset($groupoptions[0])) {
+                // can see all enrolled users
+                if ($enrolled = get_enrolled_users($context, null, 0, user_picture::fields('u'))) {
+                    foreach ($enrolled as $euser) {
+                        $options[$euser->id] = fullname($euser, $viewfullnames);
+                    }
+                }
             } else {
-                $group = '';
-            }
-
-            if ($enrolled = get_enrolled_users($context, null, $group, user_picture::fields('u'))) {
-                foreach ($enrolled as $euser) {
-                    $options[$euser->id] = fullname($euser, $viewfullnames);
+                // can see users from some groups only
+                foreach ($groupoptions as $groupid=>$unused) {
+                    if ($enrolled = get_enrolled_users($context, null, $groupid, user_picture::fields('u'))) {
+                        foreach ($enrolled as $euser) {
+                            if (!array_key_exists($euser->id, $options)) {
+                                $options[$euser->id] = fullname($euser, $viewfullnames);
+                            }
+                        }
+                    }
                 }
             }
+
             $mform->addElement('select', 'user', get_string('participants'), $options);
             $mform->setAdvanced('user');
         }
@@ -110,23 +142,14 @@ class recent_form extends moodleform {
         $mform->setAdvanced('modid');
 
 
-        if (has_capability('moodle/site:accessallgroups', $context)) {
-            if ($groups = groups_get_all_groups($COURSE->id)) {
-                $options = array('0'=>get_string('allgroups'));
-                foreach($groups as $group) {
-                    $options[$group->id] = format_string($group->name);
-                }
-                $mform->addElement('select', 'group', get_string('groups'), $options);
-                $mform->setAdvanced('group');
-            } else {
-                $mform->addElement('hidden','group');
-                $mform->setType('group', PARAM_INT);
-                $mform->setConstants(array('group'=>0));
-            }
+        if ($groupoptions) {
+            $mform->addElement('select', 'group', get_string('groups'), $groupoptions);
+            $mform->setAdvanced('group');
         } else {
+            // no access to groups in separate mode
             $mform->addElement('hidden','group');
             $mform->setType('group', PARAM_INT);
-            $mform->setConstants(array('group'=>0));
+            $mform->setConstants(array('group'=>-1));
         }
 
         $options = array('default'  => get_string('bycourseorder'),
index 2c222bf..702220a 100644 (file)
@@ -143,8 +143,10 @@ if (!$csv) {
  * Setup page header
  */
 if ($csv) {
+    $shortname = format_string($course->shortname, true, array('context' => $context));
+    $textlib = textlib_get_instance();
     header('Content-Disposition: attachment; filename=progress.'.
-        preg_replace('/[^a-z0-9-]/','_',strtolower($course->shortname)).'.csv');
+        preg_replace('/[^a-z0-9-]/','_',$textlib->strtolower(strip_tags($shortname))).'.csv');
     // Unicode byte-order mark for Excel
     if($excel) {
         header('Content-Type: text/csv; charset=UTF-16LE');
@@ -486,7 +488,7 @@ if(!$csv) {
                 // Display icon
                 $iconlink = $CFG->wwwroot.'/course/view.php?id='.$criterion->courseinstance;
                 $icontitle = $crs->fullname;
-                $iconalt = $crs->shortname;
+                $iconalt = format_string($crs->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $crs->id)));
                 break;
 
             case COMPLETION_CRITERIA_TYPE_ROLE:
index a2c7ff2..cf13b2c 100644 (file)
@@ -120,7 +120,7 @@ switch ($type) {
 
    $graph = new graph(750, 400);
 
-   $a->coursename = $course->shortname;
+   $a->coursename = format_string($course->shortname, true, array('context' => $context));
    $a->username = fullname($user, true);
    $graph->parameter['title'] = get_string("hitsoncourse", "", $a);
 
@@ -183,7 +183,7 @@ switch ($type) {
 
    $graph = new graph(750, 400);
 
-   $a->coursename = $course->shortname;
+   $a->coursename = format_string($course->shortname, true, array('context' => $context));
    $a->username = fullname($user, true);
    $graph->parameter['title'] = get_string("hitsoncoursetoday", "", $a);
 
index cef00a0..eca683b 100644 (file)
@@ -181,8 +181,8 @@ function print_mnet_log_selector_form($hostid, $course, $selecteduser=0, $select
             }
             $section = $mod->section;
             $mod->name = strip_tags(format_string($mod->name, true));
-            if (strlen($mod->name) > 55) {
-                $mod->name = substr($mod->name, 0, 50)."...";
+            if (textlib::strlen($mod->name) > 55) {
+                $mod->name = textlib::substr($mod->name, 0, 50)."...";
             }
             if (!$mod->visible) {
                 $mod->name = "(".$mod->name.")";
@@ -394,8 +394,8 @@ function print_log_selector_form($course, $selecteduser=0, $selecteddate='today'
             }
             $section = $mod->section;
             $mod->name = strip_tags(format_string($mod->name, true));
-            if (strlen($mod->name) > 55) {
-                $mod->name = substr($mod->name, 0, 50)."...";
+            if (textlib::strlen($mod->name) > 55) {
+                $mod->name = textlib::substr($mod->name, 0, 50)."...";
             }
             if (!$mod->visible) {
                 $mod->name = "(".$mod->name.")";
index d246139..b205c0b 100644 (file)
@@ -108,8 +108,11 @@ if ($total) {
 }
 
 if($csv && $grandtotal && count($activities)>0) { // Only show CSV if there are some users/actvs
+
+    $shortname = format_string($course->shortname, true, array('context' => $context));
+    $textlib = textlib_get_instance();
     header('Content-Disposition: attachment; filename=progress.'.
-        preg_replace('/[^a-z0-9-]/','_',strtolower($course->shortname)).'.csv');
+        preg_replace('/[^a-z0-9-]/','_',$textlib->strtolower(strip_tags($shortname))).'.csv');
     // Unicode byte-order mark for Excel
     if($excel) {
         header('Content-Type: text/csv; charset=UTF-16LE');
index e13f064..c6a2108 100644 (file)
@@ -11,7 +11,7 @@
         $context = get_context_instance(CONTEXT_COURSE, $c->id);
 
         if (has_capability('coursereport/stats:view', $context)) {
-            $courseoptions[$c->id] = $c->shortname;
+            $courseoptions[$c->id] = format_string($c->shortname, true, array('context' => $context));
         }
     }
 
index 7c6c04f..17be668 100644 (file)
@@ -209,6 +209,14 @@ switch($requestmethod) {
                     error_log("Ajax rest.php: Could not delete the $cm->modname $cm->name from section");
                 }
 
+                // Trigger a mod_deleted event with information about this module.
+                $eventdata = new stdClass();
+                $eventdata->modulename = $cm->modname;
+                $eventdata->cmid       = $cm->id;
+                $eventdata->courseid   = $course->id;
+                $eventdata->userid     = $USER->id;
+                events_trigger('mod_deleted', $eventdata);
+
                 rebuild_course_cache($course->id);
 
                 add_to_log($courseid, "course", "delete mod",
index a05c20e..f95f370 100644 (file)
@@ -232,6 +232,7 @@ function send_welcome_messages($orderdata) {
                 $a->profileurl = "$CFG->wwwroot/user/view.php?id=$lastuserid";
                 $a->paymenturl = "$CFG->wwwroot/enrol/authorize/index.php?user=$lastuserid";
                 $emailmessage = get_string('welcometocoursesemail', 'enrol_authorize', $a);
+                $subject = get_string("enrolmentnew", '', format_string($SITE->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID))));
 
                 $eventdata = new stdClass();
                 $eventdata->modulename        = 'moodle';
@@ -239,7 +240,7 @@ function send_welcome_messages($orderdata) {
                 $eventdata->name              = 'authorize_enrolment';
                 $eventdata->userfrom          = $sender;
                 $eventdata->userto            = $user;
-                $eventdata->subject           = get_string("enrolmentnew", '', $SITE->shortname);
+                $eventdata->subject           = $subject;
                 $eventdata->fullmessage       = $emailmessage;
                 $eventdata->fullmessageformat = FORMAT_PLAIN;
                 $eventdata->fullmessagehtml   = '';
@@ -267,6 +268,7 @@ function authorize_verify_account() {
 
     $original_antest = $plugin->get_config('an_test');
     $plugin->set_config('an_test', 1); // Test mode
+    $shortname = format_string($SITE->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
 
     $order = new stdClass();
     $order->id = -1;
@@ -293,7 +295,7 @@ function authorize_verify_account() {
     $extra->x_country = $USER->country;
 
     $extra->x_invoice_num = $order->id;
-    $extra->x_description = $SITE->shortname . ' - Authorize.net Merchant Account Verification Test';
+    $extra->x_description = $shortname . ' - Authorize.net Merchant Account Verification Test';
 
     $ret = '';
     $message = '';
index 4a3a0bd..058b1b0 100644 (file)
@@ -54,6 +54,8 @@ function authorize_print_orders($courseid, $userid) {
     $searchtype = optional_param('searchtype', 'orderid', PARAM_ALPHA);
     $status = optional_param('status', AN_STATUS_NONE, PARAM_INT);
 
+    $coursecontext = get_context_instance(CONTEXT_COURSE, $courseid);
+
     $searchmenu = array('orderid' => $authstrs->orderid, 'transid' => $authstrs->transid, 'cclastfour' => $authstrs->cclastfour);
     $buttons = "<form method='post' action='index.php' autocomplete='off'><div>";
     $buttons .= html_writer::select($searchmenu, 'searchtype', $searchtype, false);
@@ -65,7 +67,7 @@ function authorize_print_orders($courseid, $userid) {
         $buttons .= "<form method='get' action='uploadcsv.php'><div><input type='submit' value='".get_string('uploadcsv', 'enrol_authorize')."' /></div></form>";
     }
 
-    $canmanagepayments = has_capability('enrol/authorize:managepayments', get_context_instance(CONTEXT_COURSE, $courseid));
+    $canmanagepayments = has_capability('enrol/authorize:managepayments', $coursecontext);
     if ($showonlymy || !$canmanagepayments) {
         $userid = $USER->id;
     }
@@ -104,7 +106,8 @@ function authorize_print_orders($courseid, $userid) {
     }
 
     if (SITEID != $courseid) {
-        $PAGE->navbar->add($course->shortname, new moodle_url('/course/view.php', array('id'=>$course->id)));
+        $shortname = format_string($course->shortname, true, array('context' => $coursecontext));
+        $PAGE->navbar->add($shortname, new moodle_url('/course/view.php', array('id'=>$course->id)));
     }
     $PAGE->navbar->add($authstrs->paymentmanagement, 'index.php');
     $PAGE->set_title("$course->shortname: $authstrs->paymentmanagement");
@@ -297,7 +300,8 @@ function authorize_print_order($orderid)
     }
 
     if (SITEID != $course->id) {
-        $PAGE->navbar->add($course->shortname, new moodle_url('/course/view.php', array('id'=>$course->id)));
+        $shortname = format_string($course->shortname, true, array('context' => $coursecontext));
+        $PAGE->navbar->add($shortname, new moodle_url('/course/view.php', array('id'=>$course->id)));
     }
     $PAGE->navbar->add($authstrs->paymentmanagement, 'index.php?course='.$course->id);
     $PAGE->navbar->add($authstrs->orderid . ': ' . $orderid, 'index.php');
@@ -343,7 +347,8 @@ function authorize_print_order($orderid)
                         redirect("$CFG->wwwroot/enrol/authorize/index.php?order=$orderid");
                     }
                     else {
-                        redirect("$CFG->wwwroot/enrol/authorize/index.php?order=$orderid", "Error while trying to enrol ".fullname($user)." in '" . format_string($course->shortname) . "'", 20);
+                        $shortname = format_string($course->shortname, true, array('context' => $coursecontext));
+                        redirect("$CFG->wwwroot/enrol/authorize/index.php?order=$orderid", "Error while trying to enrol ".fullname($user)." in '" . $shortname . "'", 20);
                     }
                 }
                 else {
index 8e0fbec..697d354 100644 (file)
@@ -54,8 +54,8 @@ echo $OUTPUT->heading($struploadcsv);
 if (!$form->get_data()) {
     $form->display();
 } else {
-    $filename = $CFG->dataroot . '/temp/enrolauthorize/importedfile_'.time().'.csv';
-    make_upload_directory('temp/enrolauthorize');
+    $filename = $CFG->tempdir . '/enrolauthorize/importedfile_'.time().'.csv';
+    make_temp_directory('enrolauthorize');
     // Fix mac/dos newlines
     $text = $form->get_file_content('csvfile');
     $text = preg_replace('!\r\n?!', "\n", $text);
index 814e723..f7606b6 100644 (file)
@@ -464,6 +464,17 @@ class enrol_database_plugin extends enrol_plugin {
                     }
                 }
 
+                // assign extra roles
+                foreach ($userroles as $roleid) {
+                    if (empty($current_roles[$userid][$roleid])) {
+                        role_assign($roleid, $userid, $context->id, 'enrol_database', $instance->id);
+                        $current_roles[$userid][$roleid] = $roleid;
+                        if ($verbose) {
+                            mtrace("  assigning roles: $userid ==> $course->shortname as ".$allroles[$roleid]->shortname);
+                        }
+                    }
+                }
+
                 // unassign removed roles
                 foreach($current_roles[$userid] as $cr) {
                     if (empty($userroles[$cr])) {
index 9831613..b37c160 100644 (file)
@@ -276,6 +276,7 @@ class enrol_flatfile_plugin extends enrol_plugin {
                 $a = new stdClass();
                 $a->coursename = "$course->fullname";
                 $a->profileurl = "$CFG->wwwroot/user/view.php?id=$user->id&amp;course=$course->id";
+                $subject = get_string("enrolmentnew", 'enrol', format_string($course->shortname, true, array('context' => $context)));
 
                 $eventdata = new stdClass();
                 $eventdata->modulename        = 'moodle';
@@ -283,7 +284,7 @@ class enrol_flatfile_plugin extends enrol_plugin {
                 $eventdata->name              = 'flatfile_enrolment';
                 $eventdata->userfrom          = $teacher;
                 $eventdata->userto            = $user;
-                $eventdata->subject           = get_string("enrolmentnew", 'enrol', $course->shortname);
+                $eventdata->subject           = $subject;
                 $eventdata->fullmessage       = get_string('welcometocoursetext', '', $a);
                 $eventdata->fullmessageformat = FORMAT_PLAIN;
                 $eventdata->fullmessagehtml   = '';
@@ -298,6 +299,7 @@ class enrol_flatfile_plugin extends enrol_plugin {
                     $a = new stdClass();
                     $a->course = "$course->fullname";
                     $a->user = fullname($user);
+                    $subject = get_string("enrolmentnew", 'enrol', format_string($course->shortname, true, array('context' => $context)));
 
                     $eventdata = new stdClass();
                     $eventdata->modulename        = 'moodle';
@@ -305,7 +307,7 @@ class enrol_flatfile_plugin extends enrol_plugin {
                     $eventdata->name              = 'flatfile_enrolment';
                     $eventdata->userfrom          = $user;
                     $eventdata->userto            = $teacher;
-                    $eventdata->subject           = get_string("enrolmentnew", 'enrol', $course->shortname);
+                    $eventdata->subject           = $subject;
                     $eventdata->fullmessage       = get_string('enrolmentnewuser', 'enrol', $a);
                     $eventdata->fullmessageformat = FORMAT_PLAIN;
                     $eventdata->fullmessagehtml   = '';
index 492aa4d..90c0830 100644 (file)
@@ -448,19 +448,20 @@ class enrol_ldap_plugin extends enrol_plugin {
                                  JOIN {enrol} e ON (e.id = ue.enrolid)
                                 WHERE u.deleted = 0 AND e.courseid = :courseid ";
                         $params = array('roleid'=>$role->id, 'courseid'=>$course_obj->id);
+                        $context = get_context_instance(CONTEXT_COURSE, $course_obj->id);
                         if (!empty($ldapmembers)) {
                             list($ldapml, $params2) = $DB->get_in_or_equal($ldapmembers, SQL_PARAMS_NAMED, 'm', false);
                             $sql .= "AND u.idnumber $ldapml";
                             $params = array_merge($params, $params2);
                             unset($params2);
                         } else {
+                            $shortname = format_string($course_obj->shortname, true, array('context' => $context));
                             print_string('emptyenrolment', 'enrol_ldap',
                                          array('role_shortname'=> $role->shortname,
-                                               'course_shortname'=>$course_obj->shortname));
+                                               'course_shortname' => $shortname));
                         }
                         $todelete = $DB->get_records_sql($sql, $params);
 
-                        $context = get_context_instance(CONTEXT_COURSE, $course_obj->id);
                         if (!empty($todelete)) {
                             $transaction = $DB->start_delegated_transaction();
                             foreach ($todelete as $row) {
index 0bba4df..eba5d15 100644 (file)
@@ -54,7 +54,7 @@ class enrol_meta_addinstance_form extends moodleform {
             if (!has_capability('enrol/meta:selectaslinked', $coursecontext)) {
                 continue;
             }
-            $courses[$c->id] = format_string($c->fullname). ' ['.$c->shortname.']';
+            $courses[$c->id] = format_string($c->fullname). ' ['.format_string($c->shortname, true, array('context' => $coursecontext)).']';
         }
         $rs->close();
 
index 3d1b608..b34570f 100644 (file)
@@ -228,6 +228,8 @@ while (!feof($fp)) {
         $mailstudents = $plugin->get_config('mailstudents');
         $mailteachers = $plugin->get_config('mailteachers');
         $mailadmins   = $plugin->get_config('mailadmins');
+        $shortname = format_string($course->shortname, true, array('context' => $context));
+
 
         if (!empty($mailstudents)) {
             $a->coursename = $course->fullname;
@@ -239,7 +241,7 @@ while (!feof($fp)) {
             $eventdata->name              = 'paypal_enrolment';
             $eventdata->userfrom          = $teacher;
             $eventdata->userto            = $user;
-            $eventdata->subject           = get_string("enrolmentnew", '', $course->shortname);
+            $eventdata->subject           = get_string("enrolmentnew", '', $shortname);
             $eventdata->fullmessage       = get_string('welcometocoursetext', '', $a);
             $eventdata->fullmessageformat = FORMAT_PLAIN;
             $eventdata->fullmessagehtml   = '';
@@ -258,7 +260,7 @@ while (!feof($fp)) {
             $eventdata->name              = 'paypal_enrolment';
             $eventdata->userfrom          = $user;
             $eventdata->userto            = $teacher;
-            $eventdata->subject           = get_string("enrolmentnew", '', $course->shortname);
+            $eventdata->subject           = get_string("enrolmentnew", '', $shortname);
             $eventdata->fullmessage       = get_string('enrolmentnewuser', '', $a);
             $eventdata->fullmessageformat = FORMAT_PLAIN;
             $eventdata->fullmessagehtml   = '';
@@ -277,7 +279,7 @@ while (!feof($fp)) {
                 $eventdata->name              = 'paypal_enrolment';
                 $eventdata->userfrom          = $user;
                 $eventdata->userto            = $admin;
-                $eventdata->subject           = get_string("enrolmentnew", '', $course->shortname);
+                $eventdata->subject           = get_string("enrolmentnew", '', $shortname);
                 $eventdata->fullmessage       = get_string('enrolmentnewuser', '', $a);
                 $eventdata->fullmessageformat = FORMAT_PLAIN;
                 $eventdata->fullmessagehtml   = '';
index 9d6f14a..d9f9d49 100644 (file)
@@ -151,11 +151,12 @@ class enrol_paypal_plugin extends enrol_plugin {
         }
 
         $course = $DB->get_record('course', array('id'=>$instance->courseid));
+        $context = get_context_instance(CONTEXT_COURSE, $course->id);
 
-        $strloginto = get_string("loginto", "", $course->shortname);
+        $shortname = format_string($course->shortname, true, array('context' => $context));
+        $strloginto = get_string("loginto", "", $shortname);
         $strcourses = get_string("courses");
 
-        $context = get_context_instance(CONTEXT_COURSE, $course->id);
         // Pass $view=true to filter hidden caps if the user cannot see them
         if ($users = get_users_by_capability($context, 'moodle/course:update', 'u.*', 'u.id ASC',
                                              '', '', '', '', false, true)) {
@@ -190,7 +191,7 @@ class enrol_paypal_plugin extends enrol_plugin {
             } else {
                 //Sanitise some fields before building the PayPal form
                 $coursefullname  = format_string($course->fullname, true, array('context'=>$context));
-                $courseshortname = $course->shortname;
+                $courseshortname = $shortname;
                 $userfullname    = fullname($USER);
                 $userfirstname   = $USER->firstname;
                 $userlastname    = $USER->lastname;
index eba388b..85b9098 100644 (file)
@@ -207,10 +207,10 @@ class moodle_file_external extends external_api {
             throw new moodle_exception('nofile');
         }
         // saving file
-        $dir = make_upload_directory('temp/wsupload');
+        $dir = make_temp_directory('wsupload');
 
         if (empty($fileinfo['filename'])) {
-            $filename = uniqid('wsupload').'_'.time().'.tmp';
+            $filename = uniqid('wsupload', true).'_'.time().'.tmp';
         } else {
             $filename = $fileinfo['filename'];
         }
index 47c7c3b..2f84bc2 100644 (file)
@@ -19,8 +19,8 @@
             global $CFG;
 
             // construct directory structure
-            $this->temp_dir = $CFG->dataroot . "/temp/latex";
-            make_upload_directory('temp/latex');
+            $this->temp_dir = $CFG->tempdir . "/latex";
+            make_temp_directory('latex');
         }
 
         /**
index 5f56922..c6b5989 100644 (file)
@@ -104,8 +104,8 @@ function filter_tex_updatedcallback($name) {
     if (file_exists("$CFG->dataroot/filter/algebra")) {
         remove_dir("$CFG->dataroot/filter/algebra");
     }
-    if (file_exists("$CFG->dataroot/temp/latex")) {
-        remove_dir("$CFG->dataroot/temp/latex");
+    if (file_exists("$CFG->tempdir/latex")) {
+        remove_dir("$CFG->tempdir/latex");
     }
 
     $DB->delete_records('cache_filters', array('filter'=>'tex'));
index f0bc646..6e62867 100644 (file)
@@ -60,8 +60,8 @@ if (!$upload_form->get_data()) {
 }
 print_grade_page_head($courseid, 'outcome', 'import', get_string('importoutcomes', 'grades'));
 
-$imported_file = $CFG->dataroot . '/temp/outcomeimport/importedfile_'.time().'.csv';
-make_upload_directory('temp/outcomeimport');
+$imported_file = $CFG->tempdir . '/outcomeimport/importedfile_'.time().'.csv';
+make_temp_directory('outcomeimport');
 
 // copying imported file
 if (!$upload_form->save_file('userfile', $imported_file, true)) {
index 8d2c4c1..e9ff095 100644 (file)
@@ -32,8 +32,10 @@ class grade_export_ods extends grade_export {
 
         $strgrades = get_string('grades');
 
+        $shortname = format_string($this->course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $this->course->id)));
+
     /// Calculate file name
-        $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.ods");
+        $downloadfilename = clean_filename("$shortname $strgrades.ods");
     /// Creating a workbook
         $workbook = new MoodleODSWorkbook("-");
     /// Sending HTTP headers
index 4fd17e5..77f804b 100644 (file)
@@ -66,7 +66,8 @@ class grade_export_txt extends grade_export {
             @header('Pragma: no-cache');
         }
         header("Content-Type: application/download\n");
-        $downloadfilename = clean_filename("{$this->course->shortname} $strgrades");
+        $shortname = format_string($this->course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $this->course->id)));
+        $downloadfilename = clean_filename("$shortname $strgrades");
         header("Content-Disposition: attachment; filename=\"$downloadfilename.txt\"");
 
 /// Print names of all the fields
index 89c3292..f1efc6e 100644 (file)
@@ -33,7 +33,8 @@ class grade_export_xls extends grade_export {
         $strgrades = get_string('grades');
 
     /// Calculate file name
-        $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.xls");
+        $shortname = format_string($this->course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $this->course->id)));
+        $downloadfilename = clean_filename("$shortname $strgrades.xls");
     /// Creating a workbook
         $workbook = new MoodleExcelWorkbook("-");
     /// Sending HTTP headers
index a978b0d..b349b89 100644 (file)
@@ -38,10 +38,11 @@ class grade_export_xml extends grade_export {
         $strgrades = get_string('grades');
 
         /// Calculate file name
-        $downloadfilename = clean_filename("{$this->course->shortname} $strgrades.xml");
+        $shortname = format_string($this->course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $this->course->id)));
+        $downloadfilename = clean_filename("$shortname $strgrades.xml");
 
-        make_upload_directory('temp/gradeexport');
-        $tempfilename = $CFG->dataroot .'/temp/gradeexport/'. md5(sesskey().microtime().$downloadfilename);
+        make_temp_directory('gradeexport');
+        $tempfilename = $CFG->tempdir .'/gradeexport/'. md5(sesskey().microtime().$downloadfilename);
         if (!$handle = fopen($tempfilename, 'w+b')) {
             print_error('cannotcreatetempdir');
         }
index 04844b0..886bf43 100644 (file)
@@ -91,7 +91,7 @@ if ($id) {
 }
 
 if ($importcode = optional_param('importcode', '', PARAM_FILE)) {
-    $filename = $CFG->dataroot.'/temp/gradeimport/cvs/'.$USER->id.'/'.$importcode;
+    $filename = $CFG->tempdir.'/gradeimport/cvs/'.$USER->id.'/'.$importcode;
     $fp = fopen($filename, "r");
     $headers = fgets($fp, GRADE_CSV_LINE_LENGTH);
     $header = explode($csv_delimiter, $headers);
@@ -111,7 +111,7 @@ if ($formdata = $mform->get_data()) {
 
     // use current (non-conflicting) time stamp
     $importcode = get_new_importcode();
-    $filename = make_upload_directory('temp/gradeimport/cvs/'.$USER->id);
+    $filename = make_temp_directory('gradeimport/cvs/'.$USER->id);
     $filename = $filename.'/'.$importcode;
 
     $text = $mform->get_file_content('userfile');
@@ -164,7 +164,7 @@ if ($formdata = $mform->get_data()) {
 } else if ($formdata = $mform2->get_data()) {
 
     $importcode = clean_param($formdata->importcode, PARAM_FILE);
-    $filename = $CFG->dataroot.'/temp/gradeimport/cvs/'.$USER->id.'/'.$importcode;
+    $filename = $CFG->tempdir.'/gradeimport/cvs/'.$USER->id.'/'.$importcode;
 
     if (!file_exists($filename)) {
         print_error('cannotuploadfile');
index 1b9a880..cf8b757 100644 (file)
@@ -119,8 +119,10 @@ class grade_report_overview extends grade_report {
                 if (!$course->showgrades) {
                     continue;
                 }
-                $courselink = '<a href="'.$CFG->wwwroot.'/grade/report/user/index.php?id='.$course->id.'&userid='.$this->user->id.'">'.$course->shortname.'</a>';
-                $canviewhidden = has_capability('moodle/grade:viewhidden', get_context_instance(CONTEXT_COURSE, $course->id));
+                $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+                $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext));
+                $courselink = html_writer::link(new moodle_url('/grade/report/user/index.php', array('id' => $course->id, 'userid' => $this->user->id)), $courseshortname);
+                $canviewhidden = has_capability('moodle/grade:viewhidden', $coursecontext);
 
                 // Get course grade_item
                 $course_item = grade_item::fetch_course_item($course->id);
index 3d8bfb0..4b75d8e 100644 (file)
@@ -155,7 +155,7 @@ if (ajaxenabled()) {
     $deletegroup_disabled = '';
 }
 
-echo $OUTPUT->heading(format_string($course->shortname) .' '.$strgroups, 3);
+echo $OUTPUT->heading(format_string($course->shortname, true, array('context' => $context)) .' '.$strgroups, 3);
 echo '<form id="groupeditform" action="index.php" method="post">'."\n";
 echo '<div>'."\n";
 echo '<input type="hidden" name="id" value="' . $courseid . '" />'."\n";
index 88d348c..75efcc7 100644 (file)
@@ -114,7 +114,7 @@ $currenttab = 'overview';
 require('tabs.php');
 
 /// Print overview
-echo $OUTPUT->heading(format_string($course->shortname) .' '.$stroverview, 3);
+echo $OUTPUT->heading(format_string($course->shortname, true, array('context' => $context)) .' '.$stroverview, 3);
 
 echo $strfiltergroups;
 
index 56e87ae..af28cb4 100644 (file)
@@ -345,6 +345,7 @@ $string['configtimezone'] = 'You can set the default timezone here.  This is the
 $string['configunzip'] = 'Indicate the location of your unzip program (Unix only, optional).  If specified, this will be used to unpack zip archives on the server.  If you leave this blank, then Moodle will use internal routines.';
 $string['configuseblogassociations'] = 'Should users be able to organize their blog by associating entries with courses and course modules?';
 $string['configuseexternalyui'] = 'Instead of using local files, use online files available on Yahoo&#145;s servers. WARNING: This requires an internet connection, or no AJAX will work on your site.';
+$string['configusesitenameforsitepages'] = 'If enabled the site\'s shortname will be used for the site pages node in the navigation rather than the string \'Site pages\'';
 $string['configusetags'] = 'Should tags functionality across the site be enabled?';
 $string['configvariables'] = 'Variables';
 $string['configverifychangedemail'] = 'Enables verification of changed email addresses using allowed and denied email domains settings. If this setting is disabled the domains are enforced only when creating new users.';
@@ -438,7 +439,7 @@ $string['denyemailaddresses'] = 'Denied email domains';
 $string['development'] = 'Development';
 $string['devicedetectregex'] = 'Device detection regular expressions';
 $string['devicedetectregex_desc'] = '<p>By default, Moodle can detect devices of the type default (desktop PCs, laptops, etc), mobile (phones and small hand held devices), tablet (iPads, Android tablets) and legacy (Internet Explorer 6 users).  The theme selector can be used to apply separate themes to all of these.  This setting allows regular expressions that allow the detection of extra device types (these take precedence over the default types).</p>
-<p>For example, you could enter the regular expression \'/(MIDP-1.0|Maemo|Windows CE)/\' to detect some commonly used feasture phones add the return value \'featurephone\'.  This adds \'featurephone\' on the theme selector that would allow you to add a theme that would be used on these devices.  Other phones would still use the theme selected for the mobile device type.</p>';
+<p>For example, you could enter the regular expression \'/(MIDP-1.0|Maemo|Windows CE)/\' to detect some commonly used feature phones add the return value \'featurephone\'.  This adds \'featurephone\' on the theme selector that would allow you to add a theme that would be used on these devices.  Other phones would still use the theme selected for the mobile device type.</p>';
 $string['devicedetectregexexpression'] = 'Regular expression';
 $string['devicedetectregexvalue'] = 'Return value';
 $string['devicetype'] = 'Device type';
@@ -1067,6 +1068,7 @@ $string['usersskipped'] = 'Users skipped';
 $string['usersupdated'] = 'Users updated';
 $string['usersweakpassword'] = 'Users having a weak password';
 $string['userquota'] = 'User quota';
+$string['usesitenameforsitepages'] = 'Use site name for site pages';
 $string['usetags'] = 'Enable tags functionality';
 $string['uubulk'] = 'Select for bulk operations';
 $string['uubulkall'] = 'All users';
index 5a1a66e..13c0033 100644 (file)
@@ -250,6 +250,7 @@ $string['headersent'] = 'Headers already sent';
 $string['idnumbertaken'] = 'ID number is already used for another course';
 $string['importformatnotimplement'] = 'Sorry, importing this format is not yet implemented!';
 $string['incorrectext'] = 'File has an incorrect extension';
+$string['installproblem'] = 'It is usually not possible to recover from errors triggered during installation, you may need to create a new database or use a different database prefix if you want to retry the installation.';
 $string['internalauthpassworderror'] = 'Missing password or invalid password policy for internal authentication';
 $string['invalidaccess'] = 'This page was not accessed correctly';
 $string['invalidaccessparameter'] = 'Invalid access parameter';
index 3d562fd..60993bc 100644 (file)
@@ -44,6 +44,8 @@ $string['couldnotfindpreference'] = 'Could not load preference {$a}. Does the co
 $string['defaultmessageoutputs'] = 'Default message outputs';
 $string['defaults'] = 'Defaults';
 $string['deletemessagesdays'] = 'Number of days before old messages are automatically deleted';
+$string['disableall'] = 'Temporarily disable notifications';
+$string['disableall_help'] = 'Temporarily disable all notifications except those marked as "forced" by the site administrator';
 $string['disabled'] = 'Messaging is disabled on this site';
 $string['disallowed'] = 'Disallowed';
 $string['discussion'] = 'Discussion';
index f71435d..ecd7141 100644 (file)
@@ -178,7 +178,6 @@ $string['backupincludemoduleuserdatahelp'] = 'Choose whether you want to include
 $string['backupkeephelp'] = 'How many recent backups for each course do you want to keep? (older ones will be deleted automatically)';
 $string['backuplogdetailed'] = 'Detailed execution log';
 $string['backuploglaststatus'] = 'Last execution log';
-$string['backuplogshelp'] = 'If enabled, then course logs will be included in automated backups';
 $string['backupmissinguserinfoperms'] = 'Note: This backup contains no user data. Exercise and Workshop activities will not be included in the backup, since these modules are not compatible with this type of backup.';
 $string['backupnext'] = 'Next backup';
 $string['backupnonisowarning'] = 'Warning: this backup is from a non-Unicode version of Moodle (pre 1.6).  If this backup contains any non-ISO-8859-1 texts then they may be CORRUPTED if you try to restore them to this Unicode version of Moodle.  See the <a href="http://docs.moodle.org/en/Backup_FAQ">Backup FAQ</a> for more information about how to recover this backup correctly.';
@@ -189,7 +188,6 @@ $string['backupsitefileshelp'] = 'If enabled then site files used in courses wil
 $string['backuptakealook'] = 'Please take a look at your backup logs in:
   {$a}';
 $string['backupuserfileshelp'] = 'Choose whether user files (eg profile images) should be included in automated backups';
-$string['backupusershelp'] = 'Select whether you want to include all the users in the server or only the needed users for each course';
 $string['backupversion'] = 'Backup version';
 $string['block'] = 'Block';
 $string['blockconfiga'] = 'Configuring a {$a} block';
index 03d6cf9..2eea1e5 100644 (file)
@@ -3597,7 +3597,7 @@ function print_context_name($context, $withprefix = true, $short = false) {
                         $name = get_string('course').': ';
                     }
                     if ($short){
-                        $name .= format_string($course->shortname);
+                        $name .= format_string($course->shortname, true, array('context' => $context));
                     } else {
                         $name .= format_string($course->fullname);
                    }
index 0042cdb..0bb7c71 100644 (file)
@@ -281,13 +281,13 @@ class component_installer {
             return COMPONENT_UPTODATE;
         }
     /// Create temp directory if necesary
-        if (!make_upload_directory('temp', false)) {
+        if (!make_temp_directory('', false)) {
              $this->errorstring='cannotcreatetempdir';
              return COMPONENT_ERROR;
         }
     /// Download zip file and save it to temp
         $source = $this->sourcebase.'/'.$this->zippath.'/'.$this->zipfilename;
-        $zipfile= $CFG->dataroot.'/temp/'.$this->zipfilename;
+        $zipfile= $CFG->tempdir.'/'.$this->zipfilename;
 
         if($contents = download_file_content($source)) {
             if ($file = fopen($zipfile, 'w')) {
index 9cf39db..2eb9df3 100644 (file)
@@ -121,7 +121,7 @@ class csv_import_reader {
         $this->_columns = $columns; // cached columns
 
         // open file for writing
-        $filename = $CFG->dataroot.'/temp/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid;
+        $filename = $CFG->tempdir.'/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid;
         $fp = fopen($filename, "w");
         fwrite($fp, serialize($columns)."\n");
 
@@ -161,7 +161,7 @@ class csv_import_reader {
 
         global $USER, $CFG;
 
-        $filename = $CFG->dataroot.'/temp/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid;
+        $filename = $CFG->tempdir.'/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid;
         if (!file_exists($filename)) {
             return false;
         }
@@ -188,7 +188,7 @@ class csv_import_reader {
         if (!empty($this->_fp)) {
             $this->close();
         }
-        $filename = $CFG->dataroot.'/temp/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid;
+        $filename = $CFG->tempdir.'/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid;
         if (!file_exists($filename)) {
             return false;
         }
@@ -247,9 +247,9 @@ class csv_import_reader {
         global $USER, $CFG;
 
         if ($full) {
-            @remove_dir($CFG->dataroot.'/temp/csvimport/'.$this->_type.'/'.$USER->id);
+            @remove_dir($CFG->tempdir.'/csvimport/'.$this->_type.'/'.$USER->id);
         } else {
-            @unlink($CFG->dataroot.'/temp/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid);
+            @unlink($CFG->tempdir.'/csvimport/'.$this->_type.'/'.$USER->id.'/'.$this->_iid);
         }
     }
 
@@ -310,7 +310,7 @@ class csv_import_reader {
     function get_new_iid($type) {
         global $USER;
 
-        $filename = make_upload_directory('temp/csvimport/'.$type.'/'.$USER->id);
+        $filename = make_temp_directory('csvimport/'.$type.'/'.$USER->id);
 
         // use current (non-conflicting) time stamp
         $iiid = time();
index d23e2db..5979d77 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="lib/db" VERSION="20110821" COMMENT="XMLDB file for core Moodle tables"
+<XMLDB PATH="lib/db" VERSION="20110907" COMMENT="XMLDB file for core Moodle tables"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
 >
@@ -73,7 +73,7 @@
         <FIELD NAME="category" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="id" NEXT="sortorder"/>
         <FIELD NAME="sortorder" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="category" NEXT="fullname"/>
         <FIELD NAME="fullname" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" PREVIOUS="sortorder" NEXT="shortname"/>
-        <FIELD NAME="shortname" TYPE="char" LENGTH="100" NOTNULL="true" SEQUENCE="false" PREVIOUS="fullname" NEXT="idnumber"/>
+        <FIELD NAME="shortname" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" PREVIOUS="fullname" NEXT="idnumber"/>
         <FIELD NAME="idnumber" TYPE="char" LENGTH="100" NOTNULL="true" SEQUENCE="false" PREVIOUS="shortname" NEXT="summary"/>
         <FIELD NAME="summary" TYPE="text" LENGTH="small" NOTNULL="false" SEQUENCE="false" PREVIOUS="idnumber" NEXT="summaryformat"/>
         <FIELD NAME="summaryformat" TYPE="int" LENGTH="2" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="summary" NEXT="format"/>
index a4f8809..2df6246 100644 (file)
@@ -124,7 +124,7 @@ function xmldb_main_upgrade($oldversion) {
     }
 
     if ($oldversion < 2008030602) {
-        @unlink($CFG->dataroot.'/cache/languages');
+        @unlink($CFG->cachedir.'/languages');
 
         if (file_exists("$CFG->dataroot/lang")) {
             // rename old lang directory so that the new and old langs do not mix
@@ -6051,11 +6051,12 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
          // Define field secret to be added to registration_hubs
         $table = new xmldb_table('registration_hubs');
         $field = new xmldb_field('secret', XMLDB_TYPE_CHAR, '255', null, null, null,
-                $CFG->siteidentifier, 'confirmed');
+                null, 'confirmed');
 
-        // Conditionally launch add field secret
+        // Conditionally launch add field secret and set its value
         if (!$dbman->field_exists($table, $field)) {
             $dbman->add_field($table, $field);
+            $DB->set_field('registration_hubs', 'secret', $CFG->siteidentifier);
         }
 
         // Main savepoint reached
@@ -6696,8 +6697,55 @@ FROM
         upgrade_main_savepoint(true, 2011083100.02);
     }
 
+    if ($oldversion < 2011090700.01) {
+        // Changing the default of field secret on table registration_hubs to NULL
+        $table = new xmldb_table('registration_hubs');
+        $field = new xmldb_field('secret', XMLDB_TYPE_CHAR, '255', null, null, null, null, 'confirmed');
+
+        // Launch change of default for field secret
+        $dbman->change_field_default($table, $field);
+
+        // Main savepoint reached
+        upgrade_main_savepoint(true, 2011090700.01);
+    }
+
+    if ($oldversion < 2011091200.00) {
+        //preference not required since 2.0
+        $DB->delete_records('user_preferences', array('name'=>'message_showmessagewindow'));
+
+        //re-introducing emailstop. check that its turned off so people dont suddenly stop getting notifications
+        $DB->set_field('user', 'emailstop', 0, array('emailstop' => 1));
+
+        upgrade_main_savepoint(true, 2011091200.00);
+    }
+
+    if ($oldversion < 2011091300.00) {
+        // Increase the length of the of the course shortname field as it is now going
+        // to be consistently filtered and 100 characters is practically useless for
+        // things like the multilang filter.
+
+        $table = new xmldb_table('course');
+        $field = new xmldb_field('shortname', XMLDB_TYPE_CHAR, '255', null, XMLDB_NOTNULL, null, null, 'fullname');
+        $index = new xmldb_index('shortname', XMLDB_INDEX_NOTUNIQUE, array('shortname'));
+
+        // First check the shortname field exists... pretty heavy mod if it doesnt!
+        if ($dbman->field_exists($table, $field)) {
+            // Conditionally launch drop index shortname, this is required to happen
+            // before we can edit the field.
+            if ($dbman->index_exists($table, $index)) {
+                $dbman->drop_index($table, $index);
+            }
+
+            // Launch change of precision for field shortname
+            $dbman->change_field_precision($table, $field);
+            // Add the index back to the table now that we're finished our mods
+            $dbman->add_index($table, $index);
+        }
+
+        // Main savepoint reached
+        upgrade_main_savepoint(true, 2011091300.00);
+    }
+
     return true;
 }
 
-
-//TODO: AFTER 2.0 remove the column user->emailstop and the user preference "message_showmessagewindow"
index 1484e4b..a2003ab 100644 (file)
@@ -434,7 +434,8 @@ function enrol_add_course_navigation(navigation_node $coursenode, $course) {
                 }
                 $plugin = $plugins[$instance->enrol];
                 if ($unenrollink = $plugin->get_unenrolself_link($instance)) {
-                    $coursenode->add(get_string('unenrolme', 'core_enrol', format_string($course->shortname)), $unenrollink, navigation_node::TYPE_SETTING, null, 'unenrolself', new pix_icon('i/user', ''));
+                    $shortname = format_string($course->shortname, true, array('context' => $coursecontext));
+                    $coursenode->add(get_string('unenrolme', 'core_enrol', $shortname), $unenrollink, navigation_node::TYPE_SETTING, null, 'unenrolself', new pix_icon('i/user', ''));
                     break;
                     //TODO. deal with multiple unenrol links - not likely case, but still...
                 }
@@ -450,7 +451,8 @@ function enrol_add_course_navigation(navigation_node $coursenode, $course) {
                     $plugin = $plugins[$instance->enrol];
                     if ($plugin->show_enrolme_link($instance)) {
                         $url = new moodle_url('/enrol/index.php', array('id'=>$course->id));
-                        $coursenode->add(get_string('enrolme', 'core_enrol', format_string($course->shortname)), $url, navigation_node::TYPE_SETTING, null, 'enrolself', new pix_icon('i/user', ''));
+                        $shortname = format_string($course->shortname, true, array('context' => $coursecontext));
+                        $coursenode->add(get_string('enrolme', 'core_enrol', $shortname), $url, navigation_node::TYPE_SETTING, null, 'enrolself', new pix_icon('i/user', ''));
                         break;
                     }
                 }
index def025c..8b1262d 100644 (file)
@@ -64,8 +64,8 @@ class MoodleExcelWorkbook {
             $this->latin_output = true;
         }
     /// Choose our temporary directory - see MDL-7176, found by paulo.matos
-        make_upload_directory('temp/excel');
-        $this->pear_excel_workbook->setTempDir($CFG->dataroot.'/temp/excel');
+        make_temp_directory('excel');
+        $this->pear_excel_workbook->setTempDir($CFG->tempdir.'/excel');
     }
 
     /**
index 4f7ec4d..02c3501 100644 (file)
@@ -2176,7 +2176,7 @@ function put_records_csv($file, $records, $table = NULL) {
 
     echo "x";
 
-    if(!($fp = @fopen($CFG->dataroot.'/temp/'.$file, 'w'))) {
+    if(!($fp = @fopen($CFG->tempdir.'/'.$file, 'w'))) {
         print_error('put_records_csv failed to open '.$file);
     }
 
@@ -2935,9 +2935,9 @@ class curl_cache {
     function __construct($module = 'repository'){
         global $CFG;
         if (!empty($module)) {
-            $this->dir = $CFG->dataroot.'/cache/'.$module.'/';
+            $this->dir = $CFG->cachedir.'/'.$module.'/';
         } else {
-            $this->dir = $CFG->dataroot.'/cache/misc/';
+            $this->dir = $CFG->cachedir.'/misc/';
         }
         if (!file_exists($this->dir)) {
             mkdir($this->dir, $CFG->directorypermissions, true);
index 4eb67c0..a593d06 100644 (file)
@@ -57,8 +57,8 @@ class zip_packer extends file_packer {
 
         $fs = get_file_storage();
 
-        check_dir_exists($CFG->dataroot.'/temp/zip');
-        $tmpfile = tempnam($CFG->dataroot.'/temp/zip', 'zipstor');
+        check_dir_exists($CFG->tempdir.'/zip');
+        $tmpfile = tempnam($CFG->tempdir.'/zip', 'zipstor');
 
         if ($result = $this->archive_to_pathname($files, $tmpfile)) {
             if ($file = $fs->get_file($contextid, $component, $filearea, $itemid, $filepath, $filename)) {
@@ -282,7 +282,7 @@ class zip_packer extends file_packer {
             return $archivefile->extract_to_pathname($this, $contextid, $component, $filearea, $itemid, $pathbase, $userid);
         }
 
-        check_dir_exists($CFG->dataroot.'/temp/zip');
+        check_dir_exists($CFG->tempdir.'/zip');
 
         $pathbase = trim($pathbase, '/');
         $pathbase = ($pathbase === '') ? '/' : '/'.$pathbase.'/';
@@ -360,7 +360,7 @@ class zip_packer extends file_packer {
 
             } else {
                 // large file, would not fit into memory :-(
-                $tmpfile = tempnam($CFG->dataroot.'/temp/zip', 'unzip');
+                $tmpfile = tempnam($CFG->tempdir.'/zip', 'unzip');
                 if (!$fp = fopen($tmpfile, 'wb')) {
                     @unlink($tmpfile);
                     $processed[$name] = 'Can not write temp file'; // TODO: localise
index 125f43a..7dd5b93 100644 (file)
@@ -816,7 +816,15 @@ function filter_get_all_local_settings($contextid) {
  *      array('filter/tex' => array(), 'mod/glossary' => array('glossaryid', 123))
  */
 function filter_get_active_in_context($context) {
-    global $DB;
+    global $DB, $FILTERLIB_PRIVATE;
+
+    // Use cache (this is a within-request cache only) if available. See
+    // function filter_preload_activities.
+    if (isset($FILTERLIB_PRIVATE->active) &&
+            array_key_exists($context->id, $FILTERLIB_PRIVATE->active)) {
+        return $FILTERLIB_PRIVATE->active[$context->id];
+    }
+
     $contextids = str_replace('/', ',', trim($context->path, '/'));
 
     // The following SQL is tricky. It is explained on
@@ -850,6 +858,129 @@ function filter_get_active_in_context($context) {
     return $filters;
 }
 
+/**
+ * Preloads the list of active filters for all activities (modules) on the course
+ * using two database queries.
+ * @param course_modinfo $modinfo Course object from get_fast_modinfo
+ */
+function filter_preload_activities(course_modinfo $modinfo) {
+    global $DB, $FILTERLIB_PRIVATE;
+
+    // Don't repeat preload
+    if (!isset($FILTERLIB_PRIVATE->preloaded)) {
+        $FILTERLIB_PRIVATE->preloaded = array();
+    }
+    if (!empty($FILTERLIB_PRIVATE->preloaded[$modinfo->get_course_id()])) {
+        return;
+    }
+    $FILTERLIB_PRIVATE->preloaded[$modinfo->get_course_id()] = true;
+
+    // Get contexts for all CMs
+    $cmcontexts = array();
+    $cmcontextids = array();
+    foreach ($modinfo->get_cms() as $cm) {
+        $modulecontext = get_context_instance(CONTEXT_MODULE, $cm->id);
+        $cmcontextids[] = $modulecontext->id;
+        $cmcontexts[] = $modulecontext;
+    }
+
+    // Get course context and all other parents...
+    $coursecontext = get_context_instance(CONTEXT_COURSE, $modinfo->get_course_id());
+    $parentcontextids = explode('/', substr($coursecontext->path, 1));
+    $allcontextids = array_merge($cmcontextids, $parentcontextids);
+
+    // Get all filter_active rows relating to all these contexts
+    list ($sql, $params) = $DB->get_in_or_equal($allcontextids);
+    $filteractives = $DB->get_records_select('filter_active', "contextid $sql", $params);
+
+    // Get all filter_config only for the cm contexts
+    list ($sql, $params) = $DB->get_in_or_equal($cmcontextids);
+    $filterconfigs = $DB->get_records_select('filter_config', "contextid $sql", $params);
+
+    // Note: I was a bit surprised that filter_config only works for the
+    // most specific context (i.e. it does not need to be checked for course
+    // context if we only care about CMs) however basede on code in
+    // filter_get_active_in_context, this does seem to be correct.
+
+    // Build course default active list. Initially this will be an array of
+    // filter name => active score (where an active score >0 means it's active)
+    $courseactive = array();
+
+    // Also build list of filter_active rows below course level, by contextid
+    $remainingactives = array();
+
+    // Array lists filters that are banned at top level
+    $banned = array();
+
+    // Add any active filters in parent contexts to the array
+    foreach ($filteractives as $row) {
+        $depth = array_search($row->contextid, $parentcontextids);
+        if ($depth !== false) {
+            // Find entry
+            if (!array_key_exists($row->filter, $courseactive)) {
+                $courseactive[$row->filter] = 0;
+            }
+            // This maths copes with reading rows in any order. Turning on/off
+            // at site level counts 1, at next level down 4, at next level 9,
+            // then 16, etc. This means the deepest level always wins, except
+            // against the -9999 at top level.
+            $courseactive[$row->filter] +=
+                ($depth + 1) * ($depth + 1) * $row->active;
+
+            if ($row->active == TEXTFILTER_DISABLED) {
+                $banned[$row->filter] = true;
+            }
+        } else {
+            // Build list of other rows indexed by contextid
+            if (!array_key_exists($row->contextid, $remainingactives)) {
+                $remainingactives[$row->contextid] = array();
+            }
+            $remainingactives[$row->contextid][] = $row;
+        }
+    }
+
+    // Chuck away the ones that aren't active
+    foreach ($courseactive as $filter=>$score) {
+        if ($score <= 0) {
+            unset($courseactive[$filter]);
+        } else {
+            $courseactive[$filter] = array();
+        }
+    }
+
+    // Loop through the contexts to reconstruct filter_active lists for each
+    // cm on the course
+    if (!isset($FILTERLIB_PRIVATE->active)) {
+        $FILTERLIB_PRIVATE->active = array();
+    }
+    foreach ($cmcontextids as $contextid) {
+        // Copy course list
+        $FILTERLIB_PRIVATE->active[$contextid] = $courseactive;
+
+        // Are there any changes to the active list?
+        if (array_key_exists($contextid, $remainingactives)) {
+            foreach ($remainingactives[$contextid] as $row) {
+                if ($row->active > 0 && empty($banned[$row->filter])) {
+                    // If it's marked active for specific context, add entry
+                    // (doesn't matter if one exists already)
+                    $FILTERLIB_PRIVATE->active[$contextid][$row->filter] = array();
+                } else {
+                    // If it's marked inactive, remove entry (doesn't matter
+                    // if it doesn't exist)
+                    unset($FILTERLIB_PRIVATE->active[$contextid][$row->filter]);
+                }
+            }
+        }
+    }
+
+    // Process all config rows to add config data to these entries
+    foreach ($filterconfigs as $row) {
+        if (isset($FILTERLIB_PRIVATE->active[$row->contextid][$row->filter])) {
+            $FILTERLIB_PRIVATE->active[$row->contextid][$row->filter][$row->name] = $row->value;
+        }
+    }
+}
+
 /**
  * List all of the filters that are available in this context, and what the
  * local and inherited states of that filter are.
@@ -977,9 +1108,11 @@ function filter_context_may_have_filter_settings($context) {
  * @param array $link_array       an array of filterobjects
  * @param array $ignoretagsopen   an array of opening tags that we should ignore while filtering
  * @param array $ignoretagsclose  an array of corresponding closing tags
+ * @param bool $overridedefaultignore True to only use tags provided by arguments
  * @return string
  **/
-function filter_phrases($text, &$link_array, $ignoretagsopen=NULL, $ignoretagsclose=NULL) {
+function filter_phrases($text, &$link_array, $ignoretagsopen=NULL, $ignoretagsclose=NULL,
+        $overridedefaultignore=false) {
 
     global $CFG;
 
@@ -988,11 +1121,30 @@ function filter_phrases($text, &$link_array, $ignoretagsopen=NULL, $ignoretagscl
     $ignoretags = array();  //To store all the enclosig tags to be completely ignored
     $tags = array();        //To store all the simple tags to be ignored
 
-/// A list of open/close tags that we should not replace within
-/// No reason why you can't put full preg expressions in here too
-/// eg '<script(.+?)>' to match any type of script tag
-    $filterignoretagsopen  = array('<head>' , '<nolink>' , '<span class="nolink">');
-    $filterignoretagsclose = array('</head>', '</nolink>', '</span>');
+    if (!$overridedefaultignore) {
+        // A list of open/close tags that we should not replace within
+        // Extended to include <script>, <textarea>, <select> and <a> tags
+        // Regular expression allows tags with or without attributes
+        $filterignoretagsopen  = array('<head>' , '<nolink>' , '<span class="nolink">',
+                '<script(\s[^>]*?)?>', '<textarea(\s[^>]*?)?>',
+                '<select(\s[^>]*?)?>', '<a(\s[^>]*?)?>');
+        $filterignoretagsclose = array('</head>', '</nolink>', '</span>',
+                 '</script>', '</textarea>', '</select>','</a>');
+    } else {
+        // Set an empty default list
+        $filterignoretagsopen = array();
+        $filterignoretagsclose = array();
+    }
+
+    // Add the user defined ignore tags to the default list
+    if ( is_array($ignoretagsopen) ) {
+        foreach ($ignoretagsopen as $open) {
+            $filterignoretagsopen[] = $open;
+        }
+        foreach ($ignoretagsclose as $close) {
+            $filterignoretagsclose[] = $close;
+        }
+    }
 
 /// Invalid prefixes and suffixes for the fullmatch searches
 /// Every "word" character, but the underscore, is a invalid suffix or prefix.
@@ -1000,19 +1152,6 @@ function filter_phrases($text, &$link_array, $ignoretagsopen=NULL, $ignoretagscl
     $filterinvalidprefixes = '([^\W_])';
     $filterinvalidsuffixes = '([^\W_])';
 
-/// Add the user defined ignore tags to the default list
-/// Unless specified otherwise, we will not replace within <a></a> tags
-    if ( $ignoretagsopen === NULL ) {
-        //$ignoretagsopen  = array('<a(.+?)>');
-        $ignoretagsopen  = array('<a\s[^>]+?>');
-        $ignoretagsclose = array('</a>');
-    }
-
-    if ( is_array($ignoretagsopen) ) {
-        foreach ($ignoretagsopen as $open) $filterignoretagsopen[] = $open;
-        foreach ($ignoretagsclose as $close) $filterignoretagsclose[] = $close;
-    }
-
     //// Double up some magic chars to avoid "accidental matches"
     $text = preg_replace('/([#*%])/','\1\1',$text);
 
index aadc8a0..d579b87 100644 (file)
@@ -652,7 +652,7 @@ abstract class moodleform {
         if (!$this->get_new_filename($elname)) {
             return false;
         }
-        if (!$dir = make_upload_directory('temp/forms')) {
+        if (!$dir = make_temp_directory('forms')) {
             return false;
         }
         if (!$tempfile = tempnam($dir, 'tempup_')) {
index 9e19def..02ab49a 100644 (file)
@@ -67,7 +67,7 @@ minify($jsfiles);
 function minify($files) {
     global $CFG;
 
-    $cachedir = $CFG->dataroot.'/cache/js';
+    $cachedir = $CFG->cachedir.'/js';
     // make sure the cache dir exist
     if (!file_exists($cachedir)) {
         @mkdir($cachedir, $CFG->directorypermissions, true);
index d6a6c97..ec2970c 100644 (file)
@@ -131,6 +131,7 @@ function message_send($eventdata) {
         }
 
         // Find out if user has configured this output
+        // Some processors cannot function without settings from the user
         $userisconfigured = $processor->object->is_user_configured($eventdata->userto);
 
         // DEBUG: notify if we are forcing unconfigured output
@@ -142,7 +143,7 @@ function message_send($eventdata) {
         if ($permitted == 'forced' && $userisconfigured) {
             // We force messages for this processor, so use this processor unconditionally if user has configured it
             $processorlist[] = $processor->name;
-        } else if ($permitted == 'permitted' && $userisconfigured) {
+        } else if ($permitted == 'permitted' && $userisconfigured && !$eventdata->userto->emailstop) {
             // User settings are permitted, see if user set any, otherwise use site default ones
             $userpreferencename = 'message_provider_'.$preferencebase.'_'.$userstate;
             if ($userpreference = get_user_preferences($userpreferencename, null, $eventdata->userto->id)) {
index 4ea33d1..7e29c0b 100644 (file)
@@ -40,7 +40,7 @@ $min_enableBuilder = false;
  * For best performance, specify your temp directory here. Otherwise Minify
  * will have to load extra code to guess. Some examples below:
  */
-$min_cachePath = $CFG->dataroot.'/temp';
+$min_cachePath = $CFG->tempdir.'';
 
 
 /**
index bfb8855..2a51255 100644 (file)
@@ -1370,14 +1370,14 @@ function purge_all_caches() {
     get_string_manager()->reset_caches();
 
     // purge all other caches: rss, simplepie, etc.
-    remove_dir($CFG->dataroot.'/cache', true);
+    remove_dir($CFG->cachedir.'', true);
 
     // make sure cache dir is writable, throws exception if not
-    make_upload_directory('cache');
+    make_cache_directory('');
 
     // hack: this script may get called after the purifier was initialised,
     // but we do not want to verify repeatedly this exists in each call
-    make_upload_directory('cache/htmlpurifier');
+    make_cache_directory('htmlpurifier');
 
     clearstatcache();
 }
@@ -5263,7 +5263,7 @@ function get_file_storage() {
         $trashdirdir = $CFG->dataroot.'/trashdir';
     }
 
-    $fs = new file_storage($filedir, $trashdirdir, "$CFG->dataroot/temp/filestorage", $CFG->directorypermissions, $CFG->filepermissions);
+    $fs = new file_storage($filedir, $trashdirdir, "$CFG->tempdir/filestorage", $CFG->directorypermissions, $CFG->filepermissions);
 
     return $fs;
 }
@@ -5685,7 +5685,7 @@ function get_string_manager($forcereload=false) {
         if (empty($CFG->early_install_lang)) {
 
             if (empty($CFG->langcacheroot)) {
-                $langcacheroot = $CFG->dataroot . '/cache/lang';
+                $langcacheroot = $CFG->cachedir . '/lang';
             } else {
                 $langcacheroot = $CFG->langcacheroot;
             }
@@ -5697,7 +5697,7 @@ function get_string_manager($forcereload=false) {
             }
 
             if (empty($CFG->langmenucachefile)) {
-                $langmenucache = $CFG->dataroot . '/cache/languages';
+                $langmenucache = $CFG->cachedir . '/languages';
             } else {
                 $langmenucache = $CFG->langmenucachefile;
             }
index b2a619a..382c003 100644 (file)
@@ -2030,7 +2030,8 @@ class global_navigation extends navigation_node {
 
             foreach ($userscourses as $usercourse) {
                 $usercoursecontext = get_context_instance(CONTEXT_COURSE, $usercourse->id);
-                $usercoursenode = $userscoursesnode->add($usercourse->shortname, new moodle_url('/user/view.php', array('id'=>$user->id, 'course'=>$usercourse->id)), self::TYPE_CONTAINER);
+                $usercourseshortname = format_string($usercourse->shortname, true, array('context' => $usercoursecontext));
+                $usercoursenode = $userscoursesnode->add($usercourseshortname, new moodle_url('/user/view.php', array('id'=>$user->id, 'course'=>$usercourse->id)), self::TYPE_CONTAINER);
 
                 $gradeavailable = has_capability('moodle/grade:viewall', $usercoursecontext);
                 if (!$gradeavailable && !empty($usercourse->showgrades) && is_array($reports) && !empty($reports)) {
@@ -2140,22 +2141,26 @@ class global_navigation extends navigation_node {
             return $this->addedcourses[$course->id];
         }
 
+        $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+
         if ($course->id != SITEID && !$course->visible) {
             if (is_role_switched($course->id)) {
                 // user has to be able to access course in order to switch, let's skip the visibility test here
-            } else if (!has_capability('moodle/course:viewhiddencourses', get_context_instance(CONTEXT_COURSE, $course->id))) {
+            } else if (!has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
                 return false;
             }
         }
 
         $issite = ($course->id == SITEID);
         $ismycourse = ($ismycourse && !$forcegeneric);
-        $shortname = $course->shortname;
+        $shortname = format_string($course->shortname, true, array('context' => $coursecontext));
 
         if ($issite) {
             $parent = $this;
             $url = null;
-            $shortname = get_string('sitepages');
+            if (empty($CFG->usesitenameforsitepages)) {
+                $shortname = get_string('sitepages');
+            }
         } else if ($ismycourse) {
             $parent = $this->rootnodes['mycourses'];
             $url = new moodle_url('/course/view.php', array('id'=>$course->id));
index db2837f..be1a5d9 100644 (file)
@@ -74,10 +74,10 @@ class MoodleODSWorkbook {
         global $CFG;
         require_once($CFG->libdir.'/filelib.php');
 
-        $dir = 'temp/ods/'.time();
-        make_upload_directory($dir);
-        make_upload_directory($dir.'/META-INF');
-        $dir = "$CFG->dataroot/$dir";
+        $dir = 'ods/'.time();
+        make_temp_directory($dir);
+        make_temp_directory($dir.'/META-INF');
+        $dir = "$CFG->tempdir/$dir";
         $files = array();
 
         $handle = fopen("$dir/mimetype", 'w');
index 9a4a123..f822ef9 100644 (file)
@@ -999,7 +999,15 @@ class html_writer {
      * @return string
      */
     public static function random_id($base='random') {
-        return uniqid($base);
+        static $counter = 0;
+        static $uniq;
+
+        if (!isset($uniq)) {
+            $uniq = uniqid();
+        }
+
+        $counter++;
+        return $base.$uniq.$counter;
     }
 
     /**
index 8712d5a..8feae4c 100644 (file)
@@ -44,7 +44,7 @@ function theme_reset_all_caches() {
     require_once("$CFG->libdir/filelib.php");
 
     set_config('themerev', empty($CFG->themerev) ? 1 : $CFG->themerev+1);
-    fulldelete("$CFG->dataroot/cache/theme");
+    fulldelete("$CFG->cachedir/theme");
 }
 
 /**
@@ -613,7 +613,7 @@ class theme_config {
             if (!defined('THEME_DESIGNER_CACHE_LIFETIME')) {
                 define('THEME_DESIGNER_CACHE_LIFETIME', 4); // this can be also set in config.php
             }
-            $candidatesheet = "$CFG->dataroot/cache/theme/$this->name/designer.ser";
+            $candidatesheet = "$CFG->cachedir/theme/$this->name/designer.ser";
             if (!file_exists($candidatesheet)) {
                 $css = $this->css_content();
                 check_dir_exists(dirname($candidatesheet));
index d685cd2..ed633f4 100644 (file)
@@ -545,7 +545,7 @@ class core_renderer extends renderer_base {
 
         } else {
             return '<div class="homelink"><a href="' . $CFG->wwwroot . '/course/view.php?id=' . $this->page->course->id . '">' .
-                    format_string($this->page->course->shortname) . '</a></div>';
+                    format_string($this->page->course->shortname, true, array('context' => $this->page->context)) . '</a></div>';
         }
     }
 
@@ -2066,6 +2066,10 @@ EOD;
         $message = '<p class="errormessage">' . $message . '</p>'.
                 '<p class="errorcode"><a href="' . $moreinfourl . '">' .
                 get_string('moreinformation') . '</a></p>';
+        if (empty($CFG->rolesactive)) {
+            $message .= '<p class="errormessage">' . get_string('installproblem', 'error') . '</p>';
+            //It is usually not possible to recover from errors triggered during installation, you may need to create a new database or use a different database prefix for new installation.
+        }
         $output .= $this->box($message, 'errorbox');
 
         if (debugging('', DEBUG_DEVELOPER)) {
@@ -2082,7 +2086,9 @@ EOD;
             }
         }
 
-        if (!empty($link)) {
+        if (empty($CFG->rolesactive)) {
+            // continue does not make much sense if moodle is not installed yet because error is most probably not recoverable
+        } else if (!empty($link)) {
             $output .= $this->continue_button($link);
         }
 
index fb8decb..5d90384 100644 (file)
@@ -1213,6 +1213,6 @@ function js_reset_all_caches() {
     require_once("$CFG->libdir/filelib.php");
 
     set_config('jsrev', empty($CFG->jsrev) ? 1 : $CFG->jsrev+1);
-    fulldelete("$CFG->dataroot/cache/js");
+    fulldelete("$CFG->cachedir/js");
 }
 
index 9c036aa..7444bc6 100644 (file)
@@ -67,7 +67,7 @@ define('K_PATH_URL', $CFG->wwwroot . '/lib/tcpdf/');
 define('K_PATH_FONTS', K_PATH_MAIN . 'fonts/');
 
 /** cache directory for temporary files (full path) */
-define('K_PATH_CACHE', $CFG->dataroot . '/cache/');
+define('K_PATH_CACHE', $CFG->cachedir . '/');
 
 /** images directory */
 define('K_PATH_IMAGES', $CFG->dirroot . '/');
index dcded90..a33cd12 100644 (file)
@@ -64,7 +64,7 @@ class Profiler
     {
         global $CFG, $USER;
         // List all files under our temporary directory
-        $tempdir = $CFG->dataroot . '/temp/profile/' . $USER->id;
+        $tempdir = $CFG->tempdir . '/profile/' . $USER->id;
         if ($files = scandir($tempdir)) {
             // Concatenate the files
             print_r($files);
index 15dd6eb..36973a5 100644 (file)
@@ -92,7 +92,7 @@ function rss_print_link($contextid, $userid, $componentname, $id, $tooltiptext='
 function rss_delete_file($componentname, $instance) {
     global $CFG;
 
-    $dirpath = "$CFG->dataroot/cache/rss/$componentname";
+    $dirpath = "$CFG->cachedir/rss/$componentname";
     if (is_dir($dirpath)) {
         $dh  = opendir($dirpath);
         while (false !== ($filename = readdir($dh))) {
@@ -145,7 +145,7 @@ function rss_save_file($componentname, $filename, $contents, $expandfilename=tru
 
     $status = true;
 
-    if (! $basedir = make_upload_directory ('cache/rss/'. $componentname)) {
+    if (! $basedir = make_cache_directory ('rss/'. $componentname)) {
         //Cannot be created, so error
         $status = false;
     }
@@ -170,7 +170,7 @@ function rss_save_file($componentname, $filename, $contents, $expandfilename=tru
 
 function rss_get_file_full_name($componentname, $filename) {
     global $CFG;
-    return "$CFG->dataroot/cache/rss/$componentname/$filename.xml";
+    return "$CFG->cachedir/rss/$componentname/$filename.xml";
 }
 
 function rss_get_file_name($instance, $sql) {
index de4ebdd..d2d3bfc 100644 (file)
@@ -36,6 +36,8 @@
  *  - $CFG->dataroot - Path to moodle data files directory on server's filesystem.
  *  - $CFG->dirroot  - Path to moodle's library folder on server's filesystem.
  *  - $CFG->libdir   - Path to moodle's library folder on server's filesystem.
+ *  - $CFG->tempdir  - Path to moodle's temp file directory on server's filesystem.
+ *  - $CFG->cachedir - Path to moodle's cache directory on server's filesystem.
  *
  * @global object $CFG
  * @name $CFG
@@ -96,6 +98,16 @@ if (!isset($CFG->admin)) {   // Just in case it isn't defined in config.php
 // Set up some paths.
 $CFG->libdir = $CFG->dirroot .'/lib';
 
+// Allow overriding of tempdir but be backwards compatible
+if (!isset($CFG->tempdir)) {
+    $CFG->tempdir = "$CFG->dataroot/temp";
+}
+
+// Allow overriding of cachedir but be backwards compatible
+if (!isset($CFG->cachedir)) {
+    $CFG->cachedir = "$CFG->dataroot/cache";
+}
+
 // The current directory in PHP version 4.3.0 and above isn't necessarily the
 // directory of the script when run from the command line. The require_once()
 // would fail, so we'll have to chdir()
index d0bce1f..f45221b 100644 (file)
@@ -860,7 +860,7 @@ function init_performance_info() {
     if (function_exists('apd_set_pprof_trace')) {
         // APD profiling
         if ($USER->id > 0 && $CFG->perfdebug >= 15) {
-            $tempdir = $CFG->dataroot . '/temp/profile/' . $USER->id;
+            $tempdir = $CFG->tempdir . '/profile/' . $USER->id;
             mkdir($tempdir);
             apd_set_pprof_trace($tempdir);
             $PERF->profiling = true;
@@ -1105,25 +1105,16 @@ function check_dir_exists($dir, $create = true, $recursive = true) {
 }
 
 /**
- * Create a directory in dataroot and make sure it is writable.
+ * Create a directory and make sure it is writable.
  *
- * @param string $directory  a string of directory names under $CFG->dataroot eg  temp/something
+ * @private
+ * @param string $dir  the full path of the directory to be created
  * @param bool $exceptiononerror throw exception if error encountered
  * @return string|false Returns full path to directory if successful, false if not; may throw exception
  */
-function make_upload_directory($directory, $exceptiononerror = true) {
+function make_writable_directory($dir, $exceptiononerror = true) {
     global $CFG;
 
-    // Make sure a .htaccess file is here, JUST IN CASE the files area is in the open and .htaccess is supported
-    if (!file_exists("$CFG->dataroot/.htaccess")) {
-        if ($handle = fopen("$CFG->dataroot/.htaccess", 'w')) {   // For safety
-            @fwrite($handle, "deny from all\r\nAllowOverride None\r\nNote: this file is broken intentionally, we do not want anybody to undo it in subdirectory!\r\n");
-            @fclose($handle);
-        }
-    }
-
-    $dir = "$CFG->dataroot/$directory";
-
     if (file_exists($dir) and !is_dir($dir)) {
         if ($exceptiononerror) {
             throw new coding_exception($dir.' directory can not be created, file with the same name already exists.');
@@ -1155,6 +1146,73 @@ function make_upload_directory($directory, $exceptiononerror = true) {
     return $dir;
 }
 
+/**
+ * Protect a directory from web access.
+ * Could be extended in the future to support other mechanisms (e.g. other webservers).
+ *
+ * @private
+ * @param string $dir  the full path of the directory to be protected
+ */
+function protect_directory($dir) {
+    // Make sure a .htaccess file is here, JUST IN CASE the files area is in the open and .htaccess is supported
+    if (!file_exists("$dir/.htaccess")) {
+        if ($handle = fopen("$dir/.htaccess", 'w')) {   // For safety
+            @fwrite($handle, "deny from all\r\nAllowOverride None\r\nNote: this file is broken intentionally, we do not want anybody to undo it in subdirectory!\r\n");
+            @fclose($handle);
+        }
+    }
+}
+
+/**
+ * Create a directory under dataroot and make sure it is writable.
+ * Do not use for temporary and cache files - see make_temp_directory() and make_cache_directory().
+ *
+ * @param string $directory  the full path of the directory to be created under $CFG->dataroot
+ * @param bool $exceptiononerror throw exception if error encountered
+ * @return string|false Returns full path to directory if successful, false if not; may throw exception
+ */
+function make_upload_directory($directory, $exceptiononerror = true) {
+    global $CFG;
+
+    if (strpos($directory, 'temp/') === 0 or $directory === 'temp') {
+        debugging('Use make_temp_directory() for creation of temporary directory and $CFG->tempdir to get the location.');
+
+    } else if (strpos($directory, 'cache/') === 0 or $directory === 'cache') {
+        debugging('Use make_cache_directory() for creation of chache directory and $CFG->cachedir to get the location.');
+    }
+
+    protect_directory($CFG->dataroot);
+    return make_writable_directory("$CFG->dataroot/$directory", $exceptiononerror);
+}
+
+/**
+ * Create a directory under tempdir and make sure it is writable.
+ * Temporary files should be used during the current request only!
+ *
+ * @param string $directory  the full path of the directory to be created under $CFG->tempdir
+ * @param bool $exceptiononerror throw exception if error encountered
+ * @return string|false Returns full path to directory if successful, false if not; may throw exception
+ */
+function make_temp_directory($directory, $exceptiononerror = true) {
+    global $CFG;
+    protect_directory($CFG->tempdir);
+    return make_writable_directory("$CFG->tempdir/$directory", $exceptiononerror);
+}
+
+/**
+ * Create a directory under cachedir and make sure it is writable.
+ *
+ * @param string $directory  the full path of the directory to be created under $CFG->cachedir
+ * @param bool $exceptiononerror throw exception if error encountered
+ * @return string|false Returns full path to directory if successful, false if not; may throw exception
+ */
+function make_cache_directory($directory, $exceptiononerror = true) {
+    global $CFG;
+    protect_directory($CFG->cachedir);
+    return make_writable_directory("$CFG->cachedir/$directory", $exceptiononerror);
+}
+
+
 function init_memcached() {
     global $CFG, $MCACHE;
 
index c6e1f6d..54e2d07 100644 (file)
@@ -88,7 +88,7 @@ class moodle_simplepie extends SimplePie
     private static function get_cache_directory() {
         global $CFG;
 
-        return $CFG->dataroot.'/cache/simplepie/';
+        return $CFG->cachedir.'/simplepie/';
     }
 
     /**
index c68129b..596512f 100644 (file)
@@ -65,7 +65,7 @@ class filter_manager_test extends UnitTestCase {
         global $CFG;
         $this->filtermanager = new testable_filter_manager();
         $this->olddirroot = $CFG->dirroot;
-        $CFG->dirroot = $CFG->dataroot . '/temp';
+        $CFG->dirroot = $CFG->tempdir . '';
     }
 
     public function tearDown() {
index ccd3592..9f1ad0a 100644 (file)
@@ -548,6 +548,180 @@ class filter_get_active_available_in_context_test extends UnitTestCaseUsingDatab
     }
 }
 
+class filter_preload_activities_test extends UnitTestCaseUsingDatabase {
+    private $syscontext, $catcontext, $coursecontext, $activity1context, $activity2context;
+
+    public function setUp() {
+        parent::setUp();
+
+        // Make sure accesslib has cached a sensible system context object
+        // before we switch to the test DB.
+        $this->syscontext = get_context_instance(CONTEXT_SYSTEM);
+
+        // Create the table we need and switch to test DB.
+        $this->create_test_tables(array('filter_active', 'filter_config', 'context',
+            'course', 'course_modules', 'modules', 'course_sections',
+            'course_modules_availability', 'grade_items'), 'lib');
+        $this->create_test_tables(array('label'), 'mod/label');
+        $this->switch_to_test_db();
+
+        // Set up systcontext in the test database.
+        $this->syscontext->id = $this->testdb->insert_record('context', $this->syscontext);
+
+        // Make the course
+        $course = (object)array(
+            'shortname' => 'TEST101');
+        $course->id = $this->testdb->insert_record('course', $course);
+
+        // Set up category and course contexts
+        $this->catcontext = (object)array(
+            'contextlevel' => CONTEXT_COURSECAT,
+            'instanceid' => 1,
+            'depth' => 2,
+            'path' => '/1/2');
+        $this->catcontext->id = $this->testdb->insert_record('context', $this->catcontext);
+        $this->coursecontext = (object)array(
+            'contextlevel' => CONTEXT_COURSE,
+            'instanceid' => $course->id,
+            'depth' => 3,
+            'path' => '/1/2/3');
+        $this->coursecontext->id = $this->testdb->insert_record('context', $this->coursecontext);
+
+        // Set up section
+        $section = (object)array(
+            'course' => $course->id);
+        $section->id = $this->testdb->insert_record('course_sections', $section);
+
+        // Make course-modules
+        $mod = (object)array(
+            'name' => 'label',
+            'visible' => 1);
+        $mod->id = $this->testdb->insert_record('modules', $mod);
+        $label1 = (object)array(
+            'course' => $course->id,
+            'intro' => 'Intro 1',
+            'name' => 'Label 1');
+        $label1->id = $this->testdb->insert_record('label', $label1);
+        $cm1 = (object)array(
+            'course' => $course->id,
+            'section' => $section->id,
+            'module' => $mod->id,
+            'instance' => $label1->id);
+        $cm1->id = $this->testdb->insert_record('course_modules', $cm1);
+        $label2 = (object)array(
+            'course' => $course->id,
+            'intro' => 'Intro 2',
+            'name' => 'Label 2');
+        $label2->id = $this->testdb->insert_record('label', $label2);
+        $cm2 = (object)array(
+            'course' => $course->id,
+            'section' => $section->id,
+            'module' => $mod->id,
+            'instance' => $label2->id);
+        $cm2->id = $this->testdb->insert_record('course_modules', $cm2);
+        $this->testdb->set_field('course_sections', 'sequence',
+            "$cm1->id,$cm2->id", array('id' => $section->id));
+
+        // Set up activity contexts
+        $this->activity1context = (object)array(
+            'contextlevel' => CONTEXT_MODULE,
+            'instanceid' => $cm1->id,
+            'depth' => 4,
+            'path' => '/1/2/3/4');
+        $this->activity1context->id =
+                $this->testdb->insert_record('context', $this->activity1context);
+        $this->activity2context = (object)array(
+                'contextlevel' => CONTEXT_MODULE,
+                'instanceid' => $cm2->id,
+                'depth' => 4,
+                'path' => '/1/2/3/5');
+        $this->activity2context->id =
+                $this->testdb->insert_record('context', $this->activity2context);
+    }
+
+    private function assert_matches($modinfo) {
+        global $FILTERLIB_PRIVATE;
+
+        // Use preload cache...
+        $FILTERLIB_PRIVATE = new stdClass;
+        filter_preload_activities($modinfo);
+
+        // Get data and check no queries are made
+        $before = $this->testdb->perf_get_reads();
+        $plfilters1 = filter_get_active_in_context($this->activity1context);
+        $plfilters2 = filter_get_active_in_context($this->activity2context);
+        $after = $this->testdb->perf_get_reads();
+        $this->assertEqual($before, $after);
+
+        // Repeat without cache and check it makes queries now
+        $FILTERLIB_PRIVATE = new stdClass;
+        $before = $this->testdb->perf_get_reads();
+        $filters1 = filter_get_active_in_context($this->activity1context);
+        $filters2 = filter_get_active_in_context($this->activity2context);
+        $after = $this->testdb->perf_get_reads();
+        $this->assertTrue($after > $before);
+
+        // Check they match
+        $this->assertEqual($plfilters1, $filters1);
+        $this->assertEqual($plfilters2, $filters2);
+    }
+
+    public function test_preload() {
+        global $FILTERLIB_PRIVATE;
+
+        // Get course and modinfo
+        $course = $this->testdb->get_record('course', array('id'=>1));
+        $modinfo = new course_modinfo($course, 1);
+
+        // Note: All the tests in this function check that the result from the
+        // preloaded cache is the same as the result from calling the standard
+        // function without preloading.
+
+        // Initially, check with no filters enabled
+        $this->assert_matches($modinfo);
+
+        // Enable filter globally, check
+        filter_set_global_state('filter/name', TEXTFILTER_ON);
+        $this->assert_matches($modinfo);
+
+        // Disable for activity 2
+        filter_set_local_state('filter/name', $this->activity2context->id, TEXTFILTER_OFF);
+        $this->assert_matches($modinfo);
+
+        // Disable at category
+        filter_set_local_state('filter/name', $this->catcontext->id, TEXTFILTER_OFF);
+        $this->assert_matches($modinfo);
+
+        // Enable for activity 1
+        filter_set_local_state('filter/name', $this->activity1context->id, TEXTFILTER_ON);
+        $this->assert_matches($modinfo);
+
+        // Disable globally
+        filter_set_global_state('filter/name', TEXTFILTER_DISABLED);
+        $this->assert_matches($modinfo);
+
+        // Add another 2 filters
+        filter_set_global_state('filter/frog', TEXTFILTER_ON);
+        filter_set_global_state('filter/zombie', TEXTFILTER_ON);
+        $this->assert_matches($modinfo);
+
+        // Disable random one of these in each context
+        filter_set_local_state('filter/zombie', $this->activity1context->id, TEXTFILTER_OFF);
+        filter_set_local_state('filter/frog', $this->activity2context->id, TEXTFILTER_OFF);
+        $this->assert_matches($modinfo);
+
+        // Now do some filter options
+        filter_set_local_config('filter/name', $this->activity1context->id, 'a', 'x');
+        filter_set_local_config('filter/zombie', $this->activity1context->id, 'a', 'y');
+        filter_set_local_config('filter/frog', $this->activity1context->id, 'a', 'z');
+        // These last two don't do anything as they are not at final level but I
+        // thought it would be good to have that verified in test
+        filter_set_local_config('filter/frog', $this->coursecontext->id, 'q', 'x');
+        filter_set_local_config('filter/frog', $this->catcontext->id, 'q', 'z');
+        $this->assert_matches($modinfo);
+    }
+}
+
 class filter_delete_config_test extends UnitTestCaseUsingDatabase {
     protected $syscontext;
 
@@ -659,4 +833,3 @@ class filter_filter_set_applies_to_strings extends UnitTestCaseUsingDatabase {
         $this->assertTrue($CFG->filterall);
     }
 }
-
index c6d9d95..558be5c 100644 (file)
@@ -83,7 +83,7 @@ class textlib {
 
         // And this directory must exist to allow Typo to cache conversion
         // tables when using internal functions
-        make_upload_directory('temp/typo3temp/cs');
+        make_temp_directory('typo3temp/cs');
 
         // Make sure typo is using our dir permissions
         $GLOBALS['TYPO3_CONF_VARS']['BE']['folderCreateMask'] = decoct($CFG->directorypermissions);
@@ -95,7 +95,7 @@ class textlib {
         // to forward slashed because Typo3 requires it.
         define ('PATH_t3lib', str_replace('\\','/',$CFG->libdir.'/typo3/'));
         define ('PATH_typo3', str_replace('\\','/',$CFG->libdir.'/typo3/'));
-        define ('PATH_site', str_replace('\\','/',$CFG->dataroot.'/temp/'));
+        define ('PATH_site', str_replace('\\','/',$CFG->tempdir.'/'));
         define ('TYPO3_OS', stristr(PHP_OS,'win')&&!stristr(PHP_OS,'darwin')?'WIN':'');
 
         $typo3cs = new t3lib_cs();
@@ -592,40 +592,46 @@ abstract class collatorlib {
                 $collator = new Collator($locale);
                 if (!empty($collator) && $collator instanceof Collator) {
                     // Check for non fatal error messages. This has to be done immediately
-                    // after instantiation as any futher calls to collation will cause
-                    // it to reset to 0 again (or another error code if one occured)
+                    // after instantiation as any further calls to collation will cause
+                    // it to reset to 0 again (or another error code if one occurred)
                     $errorcode = $collator->getErrorCode();
                     $errormessage = $collator->getErrorMessage();
-                    // Check for an error code, 0 means no error occured
+                    // Check for an error code, 0 means no error occurred
                     if ($errorcode !== 0) {
                         // Get the actual locale being used, e.g. en, he, zh
                         $localeinuse = $collator->getLocale(Locale::ACTUAL_LOCALE);
-                        // Check for the common fallback wardning error code. If this occured
-                        // there is normally little to worry about. (U_USING_FALLBACK_WARNING)
-                        if ($errorcode === -128) {
-                            // Check if the local in use is anything like the locale we asked for
-                            if (strpos($locale, $localeinuse) !== 0) {
+                        // Check for the common fallback warning error codes. If this occurred
+                        // there is normally little to worry about:
+                        // - U_USING_DEFAULT_WARNING (127)  - default fallback locale used (pt => UCA)
+                        // - U_USING_FALLBACK_WARNING (128) - fallback locale used (de_CH => de)
+                        // (UCA: Unicode Collation Algorithm http://unicode.org/reports/tr10/)
+                        if ($errorcode === -127 || $errorcode === -128) {
+                            // Check if the locale in use is UCA default one ('root') or
+                            // if it is anything like the locale we asked for
+                            if ($localeinuse !== 'root' && strpos($locale, $localeinuse) !== 0) {
                                 // The locale we asked for is completely different to the locale
-                                // we have recieved, let the user know via debugging
-                                debugging('Invalid locale, falling back to the system default locale "'.$collator->getLocale(Locale::VALID_LOCALE).'"');
+                                // we have received, let the user know via debugging
+                                debugging('Invalid locale: "' . $locale . '", with warning (not fatal) "' . $errormessage .
+                                    '", falling back to "' . $collator->getLocale(Locale::VALID_LOCALE) . '"');
                             } else {
                                 // Nothing to do here, this is expected!
                                 // The Moodle locale setting isn't what the collator expected but
                                 // it is smart enough to match the first characters of our locale
-                                // to find the correct locale
-                                // debugging('Invalid locale, falling back to closest match "'.$localeinuse.'" which may not be the exact locale');
+                                // to find the correct locale or to use UCA collation
                             }
                         } else {
                             // We've recieved some other sort of non fatal warning - let the
                             // user know about it via debugging.
-                            debugging('Locale collator generated warnings (not fatal) "'.$errormessage.'" falling back to '.$collator->getLocale(Locale::VALID_LOCALE));
+                            debugging('Problem with locale: "' . $locale . '", with message "' . $errormessage .
+                                '", falling back to "' . $collator->getLocale(Locale::VALID_LOCALE) . '"');
                         }
                     }
-                    // Store the collator object now that we can be sure it is in a workable condition.
+                    // Store the collator object now that we can be sure it is in a workable condition
                     self::$collator = $collator;
                 } else {
-                    // Fatal error while trying to instantiate the collator... who know what went wrong.
-                    debugging('Error instantiating collator: ['.collator_get_error_code($collator).']'.collator_get_error_message($collator));
+                    // Fatal error while trying to instantiate the collator... something went wrong
+                    debugging('Error instantiating collator for locale: "' . $locale . '", with error [' .
+                        intl_get_error_code() . '] ' . intl_get_error_message($collator));
                 }
             }
         }
index 6a93f6e..1d99efa 100644 (file)
@@ -1319,7 +1319,7 @@ function upgrade_language_pack($lang='') {
     upgrade_started(false);
     echo $OUTPUT->heading(get_string('langimport', 'admin').': '.$lang);
 
-    @mkdir ($CFG->dataroot.'/temp/');    //make it in case it's a fresh install, it might not be there
+    @mkdir ($CFG->tempdir.'/');    //make it in case it's a fresh install, it might not be there
     @mkdir ($CFG->dataroot.'/lang/');
 
     require_once($CFG->libdir.'/componentlib.class.php');
index d314ef2..38c57fc 100644 (file)
@@ -1187,7 +1187,7 @@ function reset_text_filters_cache() {
     global $CFG, $DB;
 
     $DB->delete_records('cache_text');
-    $purifdir = $CFG->dataroot.'/cache/htmlpurifier';
+    $purifdir = $CFG->cachedir.'/htmlpurifier';
     remove_dir($purifdir, true);
 }
 
@@ -1514,7 +1514,7 @@ function purify_html($text, $options = array()) {
     if (empty($purifiers[$type])) {
 
         // make sure the serializer dir exists, it should be fine if it disappears later during cache reset
-        $cachedir = $CFG->dataroot.'/cache/htmlpurifier';
+        $cachedir = $CFG->cachedir.'/htmlpurifier';
         check_dir_exists($cachedir);
 
         require_once $CFG->libdir.'/htmlpurifier/HTMLPurifier.safe-includes.php';
@@ -2233,10 +2233,10 @@ function navmenulist($course, $sections, $modinfo, $strsection, $strjumpto, $wid
                 if ($course->format == 'weeks' or empty($thissection->summary)) {
                     $item = $strsection ." ". $mod->sectionnum;
                 } else {
-                    if (strlen($thissection->summary) < ($width-3)) {
+                    if (textlib::strlen($thissection->summary) < ($width-3)) {
                         $item = $thissection->summary;
                     } else {
-                        $item = substr($thissection->summary, 0, $width).'...';
+                        $item = textlib::substr($thissection->summary, 0, $width).'...';
                     }
                 }
                 $menu[] = '<li class="section"><span>'.$item.'</span>';
@@ -2252,8 +2252,8 @@ function navmenulist($course, $sections, $modinfo, $strsection, $strjumpto, $wid
 
         $url = $mod->modname .'/view.php?id='. $mod->id;
         $mod->name = strip_tags(format_string($mod->name ,true));
-        if (strlen($mod->name) > ($width+5)) {
-            $mod->name = substr($mod->name, 0, $width).'...';
+        if (textlib::strlen($mod->name) > ($width+5)) {
+            $mod->name = textlib::substr($mod->name, 0, $width).'...';
         }
         if (!$mod->visible) {
             $mod->name = '('.$mod->name.')';
index 479d876..3e35825 100644 (file)
@@ -28,6 +28,7 @@ require_once($CFG->dirroot . '/message/lib.php');
 
 $userid = optional_param('id', $USER->id, PARAM_INT);    // user id
 $course = optional_param('course', SITEID, PARAM_INT);   // course id (defaults to Site)
+$disableall = optional_param('disableall', 0, PARAM_BOOL); //disable all of this user's notifications
 
 $url = new moodle_url('/message/edit.php');
 if ($userid !== $USER->id) {
@@ -68,6 +69,7 @@ $coursecontext   = get_context_instance(CONTEXT_COURSE, $course->id);
 
 $PAGE->set_context($personalcontext);
 $PAGE->set_pagelayout('course');
+$PAGE->requires->js_init_call('M.core_message.init_editsettings');
 
 // check access control
 if ($user->id == $USER->id) {
@@ -99,13 +101,20 @@ $providers = message_get_providers_for_user($user->id);
 if (($form = data_submitted()) && confirm_sesskey()) {
     $preferences = array();
 
+    //only update the user's "emailstop" if its actually changed
+    if ( $user->emailstop != $disableall ) {
+        $user->emailstop = $disableall;
+        $DB->set_field('user', 'emailstop', $user->emailstop, array("id"=>$user->id));
+    }
+
+
     foreach ($providers as $provider) {
         $componentproviderbase = $provider->component.'_'.$provider->name;
         foreach (array('loggedin', 'loggedoff') as $state) {
             $linepref = '';
             $componentproviderstate = $componentproviderbase.'_'.$state;
             if (array_key_exists($componentproviderstate, $form)) {
-                foreach (array_keys($form->{$componentproviderstate}) as $process){
+                foreach (array_keys($form->{$componentproviderstate}) as $process) {
                     if ($linepref == ''){
                         $linepref = $process;
                     } else {
@@ -185,7 +194,7 @@ $renderer = $PAGE->get_renderer('core', 'message');
 // Fetch default (site) preferences
 $defaultpreferences = get_message_output_default_preferences();
 
-$messagingoptions = $renderer->manage_messagingoptions($processors, $providers, $preferences, $defaultpreferences);
+$messagingoptions = $renderer->manage_messagingoptions($processors, $providers, $preferences, $defaultpreferences, $user->emailstop);
 
 echo $OUTPUT->header();
 echo $messagingoptions;
index 3eb5ead..eae88ae 100644 (file)
@@ -487,10 +487,11 @@ function message_print_usergroup_selector($viewing, $courses, $coursecontexts, $
         foreach($courses as $course) {
             if (has_capability('moodle/course:viewparticipants', $coursecontexts[$course->id])) {
                 //Not using short_text() as we want the end of the course name. Not the beginning.
-                if ($textlib->strlen($course->shortname) > MESSAGE_MAX_COURSE_NAME_LENGTH) {
-                    $courses_options[MESSAGE_VIEW_COURSE.$course->id] = '...'.$textlib->substr($course->shortname, -MESSAGE_MAX_COURSE_NAME_LENGTH);
+                $shortname = format_string($course->shortname, true, array('context' => $coursecontexts[$course->id]));
+                if ($textlib->strlen($shortname) > MESSAGE_MAX_COURSE_NAME_LENGTH) {
+                    $courses_options[MESSAGE_VIEW_COURSE.$course->id] = '...'.$textlib->substr($shortname, -MESSAGE_MAX_COURSE_NAME_LENGTH);
                 } else {
-                    $courses_options[MESSAGE_VIEW_COURSE.$course->id] = $course->shortname;
+                    $courses_options[MESSAGE_VIEW_COURSE.$course->id] = $shortname;
                 }
             }
         }
@@ -2021,7 +2022,7 @@ function message_post_message($userfrom, $userto, $message, $format) {
     $eventdata->smallmessage     = $message;//store the message unfiltered. Clean up on output.
 
     $s = new stdClass();
-    $s->sitename = $SITE->shortname;
+    $s->sitename = format_string($SITE->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, SITEID)));
     $s->url = $CFG->wwwroot.'/message/index.php?user='.$userto->id.'&id='.$userfrom->id;
 
     $emailtagline = get_string_manager()->get_string('emailtagline', 'message', $s, $userto->lang);
index d92f748..f0d17c1 100644 (file)
@@ -87,4 +87,28 @@ M.core_message.init_defaultoutputs = function(Y) {
     }
 
     defaultoutputs.init();
+}
+
+M.core_message.init_editsettings = function(Y) {
+    var editsettings = {
+
+        init : function() {
+            var disableall = Y.one(".disableallcheckbox");
+            disableall.on('change', editsettings.changeState);
+            disableall.simulate("change");
+        },
+
+        changeState : function(e) {
+            Y.all('.notificationpreference').each(function(node) {
+                var disabled = e.target.get('checked');
+
+                node.removeAttribute('disabled');
+                if (disabled) {
+                    node.setAttribute('disabled', 1)
+                }
+            }, this);
+        }
+    }
+
+    editsettings.init();
 }
\ No newline at end of file
index b3dfef9..d941c95 100644 (file)
@@ -210,9 +210,11 @@ class core_message_renderer extends plugin_renderer_base {
      * @param   mixed   $providers          array of objects containing message providers
      * @param   mixed   $preferences        array of objects containing current preferences
      * @param   mixed   $defaultpreferences array of objects containing site default preferences
+     * $param   boolean $notificationsdisabled indicates whether the user's "emailstop" flag is
+     *                                      set so shouldn't receive any non-forced notifications
      * @return  string                      The text to render
      */
-    public function manage_messagingoptions($processors, $providers, $preferences, $defaultpreferences) {
+    public function manage_messagingoptions($processors, $providers, $preferences, $defaultpreferences, $notificationsdisabled = false) {
         // Filter out enabled, available system_configured and user_configured processors only.
         $readyprocessors = array_filter($processors, create_function('$a', 'return $a->enabled && $a->configured && $a->object->is_user_configured();'));
 
@@ -281,7 +283,10 @@ class core_message_renderer extends plugin_renderer_base {
                             $disabled['disabled'] = 1;
                         } else {
                             $checked = false;
-                            // See if hser has touched this preference
+                            if ($notificationsdisabled) {
+                                $disabled['disabled'] = 1;
+                            }
+                            // See if user has touched this preference
                             if (isset($preferences->{$preferencebase.'_'.$state})) {
                                 // User have some preferneces for this state in the database, use them
                                 $checked = isset($preferences->{$preferencebase.'_'.$state}[$processor->name]);
@@ -304,7 +309,7 @@ class core_message_renderer extends plugin_renderer_base {
                         );
                         $label = get_string('sendingviawhen', 'message', $labelparams);
                         $cellcontent = html_writer::label($label, $elementname, true, array('class' => 'accesshide'));
-                        $cellcontent .= html_writer::checkbox($elementname, 1, $checked, '', array_merge(array('id' => $elementname), $disabled));
+                        $cellcontent .= html_writer::checkbox($elementname, 1, $checked, '', array_merge(array('id' => $elementname, 'class' => 'notificationpreference'), $disabled));
                         $optioncell = new html_table_cell($cellcontent);
                         $optioncell->attributes['class'] = 'mdl-align';
                     }
@@ -316,6 +321,10 @@ class core_message_renderer extends plugin_renderer_base {
         $output .= html_writer::start_tag('div');
         $output .= html_writer::table($table);
         $output .= html_writer::end_tag('div');
+
+        $disableallcheckbox = $this->output->help_icon('disableall', 'message') . get_string('disableall', 'message') . html_writer::checkbox('disableall', 1, $notificationsdisabled, '', array('class'=>'disableallcheckbox'));
+        $output .= html_writer::nonempty_tag('div', $disableallcheckbox, array('class'=>'disableall'));
+
         $output .= html_writer::end_tag('fieldset');
 
         foreach ($processors as $processor) {
index 2f18113..e1c3d73 100644 (file)
@@ -54,6 +54,8 @@ class assignment_base {
     var $cm;
     /** @var object */
     var $course;
+    /** @var stdClass */
+    var $coursecontext;
     /** @var object */
     var $assignment;
     /** @var string */
@@ -119,6 +121,8 @@ class assignment_base {
         } else if (! $this->course = $DB->get_record('course', array('id'=>$this->cm->course))) {
             print_error('invalidid', 'assignment');
         }
+        $this->coursecontext = get_context_instance(CONTEXT_COURSE, $this->course->id);
+        $courseshortname = format_text($this->course->shortname, true, array('context' => $this->coursecontext));
 
         if ($assignment) {
             $this->assignment = $assignment;
@@ -133,7 +137,7 @@ class assignment_base {
         $this->strassignments = get_string('modulenameplural', 'assignment');
         $this->strsubmissions = get_string('submissions', 'assignment');
         $this->strlastmodified = get_string('lastmodified');
-        $this->pagetitle = strip_tags($this->course->shortname.': '.$this->strassignment.': '.format_string($this->assignment->name,true));
+        $this->pagetitle = strip_tags($courseshortname.': '.$this->strassignment.': '.format_string($this->assignment->name, true, array('context' => $this->context)));
 
         // visibility handled by require_login() with $cm parameter
         // get current group only when really needed
@@ -1849,8 +1853,9 @@ class assignment_base {
      * @return string
      */
     function email_teachers_text($info) {
-        $posttext  = format_string($this->course->shortname).' -> '.$this->strassignments.' -> '.
-                     format_string($this->assignment->name)."\n";
+        $posttext  = format_string($this->course->shortname, true, array('context' => $this->coursecontext)).' -> '.
+                     $this->strassignments.' -> '.
+                     format_string($this->assignment->name, true, array('context' => $this->context))."\n";
         $posttext .= '---------------------------------------------------------------------'."\n";
         $posttext .= get_string("emailteachermail", "assignment", $info)."\n";
         $posttext .= "\n---------------------------------------------------------------------\n";
@@ -1866,9 +1871,9 @@ class assignment_base {
     function email_teachers_html($info) {
         global $CFG;
         $posthtml  = '<p><font face="sans-serif">'.
-                     '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$this->course->id.'">'.format_string($this->course->shortname).'</a> ->'.
+                     '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$this->course->id.'">'.format_string($this->course->shortname, true, array('context' => $this->coursecontext)).'</a> ->'.
                      '<a href="'.$CFG->wwwroot.'/mod/assignment/index.php?id='.$this->course->id.'">'.$this->strassignments.'</a> ->'.
-                     '<a href="'.$CFG->wwwroot.'/mod/assignment/view.php?id='.$this->cm->id.'">'.format_string($this->assignment->name).'</a></font></p>';
+                     '<a href="'.$CFG->wwwroot.'/mod/assignment/view.php?id='.$this->cm->id.'">'.format_string($this->assignment->name, true, array('context' => $this->context)).'</a></font></p>';
         $posthtml .= '<hr /><font face="sans-serif">';
         $posthtml .= '<p>'.get_string('emailteachermailhtml', 'assignment', $info).'</p>';
         $posthtml .= '</font><hr />';
@@ -2589,8 +2594,10 @@ function assignment_cron () {
             /// mail is customised for the receiver.
             cron_setup_user($user, $course);
 
-            if (!is_enrolled(get_context_instance(CONTEXT_COURSE, $submission->course), $user->id)) {
-                echo fullname($user)." not an active participant in " . format_string($course->shortname) . "\n";
+            $coursecontext = get_context_instance(CONTEXT_COURSE, $submission->course);
+            $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext));
+            if (!is_enrolled($coursecontext, $user->id)) {
+                echo fullname($user)." not an active participant in " . $courseshortname . "\n";
                 continue;
             }
 
@@ -2616,15 +2623,15 @@ function assignment_cron () {
             $assignmentinfo->assignment = format_string($submission->name,true);
             $assignmentinfo->url = "$CFG->wwwroot/mod/assignment/view.php?id=$mod->id";
 
-            $postsubject = "$course->shortname: $strassignments: ".format_string($submission->name,true);
-            $posttext  = "$course->shortname -> $strassignments -> ".format_string($submission->name,true)."\n";
+            $postsubject = "$courseshortname: $strassignments: ".format_string($submission->name,true);
+            $posttext  = "$courseshortname -> $strassignments -> ".format_string($submission->name,true)."\n";
             $posttext .= "---------------------------------------------------------------------\n";
             $posttext .= get_string("assignmentmail", "assignment", $assignmentinfo)."\n";
             $posttext .= "---------------------------------------------------------------------\n";
 
             if ($user->mailformat == 1) {  // HTML
                 $posthtml = "<p><font face=\"sans-serif\">".
-                "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</a> ->".
+                "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$courseshortname</a> ->".
                 "<a href=\"$CFG->wwwroot/mod/assignment/index.php?id=$course->id\">$strassignments</a> ->".
                 "<a href=\"$CFG->wwwroot/mod/assignment/view.php?id=$mod->id\">".format_string($submission->name,true)."</a></font></p>";
                 $posthtml .= "<hr /><font face=\"sans-serif\">";
@@ -3723,7 +3730,7 @@ function assignment_extend_settings_navigation(settings_navigation $settings, na
 function assignment_pack_files($filesforzipping) {
         global $CFG;
         //create path for new zip file.
-        $tempzip = tempnam($CFG->dataroot.'/temp/', 'assignment_');
+        $tempzip = tempnam($CFG->tempdir.'/', 'assignment_');
         //zip files
         $zipper = new zip_packer();
         if ($zipper->archive_to_pathname($filesforzipping, $tempzip)) {
index 7b480f7..99dc589 100644 (file)
@@ -44,7 +44,7 @@ if (!file_exists(dirname(__FILE__) . '/theme/'.$theme.'/chat.css')) {
 if (!$chat_sid = chat_login_user($chat->id, 'ajax', $groupid, $course)) {
     print_error('cantlogin', 'chat');
 }
-
+$courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
 $module = array(
     'name'      => 'mod_chat_ajax', // chat gui's are not real plugins, we have to break the naming standards for JS modules here :-(
     'fullpath'  => '/mod/chat/gui_ajax/module.js',
@@ -61,11 +61,11 @@ $modulecfg = array(
     'timer'=>3000,
     'chat_lasttime'=>0,
     'chat_lastrow'=>null,
-    'chatroom_name'=>format_string($course->shortname) . ": ".format_string($chat->name,true).$groupname
+    'chatroom_name' => $courseshortname . ": " . format_string($chat->name, true) . $groupname
 );
 $PAGE->requires->js_init_call('M.mod_chat_ajax.init', array($modulecfg), false, $module);
 
-$PAGE->set_title(get_string('modulename', 'chat').": $course->shortname: ".format_string($chat->name,true)."$groupname");
+$PAGE->set_title(get_string('modulename', 'chat').": $courseshortname: ".format_string($chat->name,true)."$groupname");
 $PAGE->add_body_class('yui-skin-sam');
 $PAGE->set_pagelayout('embedded');
 $PAGE->requires->css('/mod/chat/gui_ajax/theme/'.$theme.'/chat.css');
index 92621f9..43d0f0b 100644 (file)
@@ -59,6 +59,7 @@ if (!empty($CFG->chat_normal_updatemode)) {
     $updatemode = $CFG->chat_normal_updatemode;
 }
 
+$courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
 ?>
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
@@ -66,7 +67,7 @@ if (!empty($CFG->chat_normal_updatemode)) {
  <head>
   <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   <title>
-   <?php echo "$strchat: " . format_string($course->shortname) . ": ".format_string($chat->name,true)."$groupname" ?>
+   <?php echo "$strchat: " . $courseshortname . ": " . format_string($chat->name, true, array('context' => $context)) . "$groupname" ?>
   </title>
  </head>
  <frameset cols="*,200" border="5" framespacing="no" frameborder="yes" marginwidth="2" marginheight="1">
index 78b8339..4a5de8b 100644 (file)
@@ -25,6 +25,7 @@ if (!$cm = get_coursemodule_from_instance('chat', $chat->id, $course->id)) {
 }
 
 require_login($course, false, $cm);
+$context = get_context_instance(CONTEXT_MODULE, $cm->id);
 
 if (isguestuser()) {
     print_error('noguests', 'chat');
@@ -52,13 +53,14 @@ if (!$chat_sid = chat_login_user($chat->id, 'sockets', $groupid, $course)) {
 }
 
 $params = "chat_sid=$chat_sid";
+$courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
 
 ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
 <html>
  <head>
   <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   <title>
-   <?php echo "$strchat: " . format_string($course->shortname) . ": ".format_string($chat->name,true)."$groupname" ?>
+   <?php echo "$strchat: " . $courseshortname . ": " . format_string($chat->name, true, array('context' => $context)) . "$groupname" ?>
   </title>
  </head>
  <frameset cols="*,200" border="5" framespacing="no" frameborder="yes" marginwidth="2" marginheight="1">
index 0475e8a..0b86e50 100644 (file)
@@ -77,7 +77,8 @@ $stridle         = get_string('idle', 'chat');
 $strcurrentusers = get_string('currentusers', 'chat');
 $strnextsession  = get_string('nextsession', 'chat');
 
-$title = $course->shortname . ': ' . format_string($chat->name);
+$courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
+$title = $courseshortname . ': ' . format_string($chat->name);
 
 // Mark viewed by user (if required)
 $completion = new completion_info($course);
index b35e017..e4a49b0 100644 (file)
             $SESSION->wantsurl = $FULLME;
             $SESSION->enrolcancel = (!empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
 
+            $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+            $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext));
+
             echo $OUTPUT->box_start('generalbox', 'notice');
             echo '<p align="center">'. get_string('notenrolledchoose', 'choice') .'</p>';
             echo $OUTPUT->container_start('continuebutton');
-            echo $OUTPUT->single_button(new moodle_url('/enrol/index.php?', array('id'=>$course->id)), get_string('enrolme', 'core_enrol', format_string($course->shortname)));
+            echo $OUTPUT->single_button(new moodle_url('/enrol/index.php?', array('id'=>$course->id)), get_string('enrolme', 'core_enrol', $courseshortname));
             echo $OUTPUT->container_end();
             echo $OUTPUT->box_end();
 
index 4ad9c58..e406dc2 100644 (file)
@@ -107,8 +107,8 @@ if ($cancel) {
 /// RSS and CSS and JS meta
 if (!empty($CFG->enablerssfeeds) && !empty($CFG->data_enablerssfeeds) && $data->rssarticles > 0) {
     $rsspath = rss_get_url($context->id, $USER->id, 'mod_data', $data->id);
-    $PAGE->add_alternate_version(format_string($course->shortname) . ': %fullname%',
-            $rsspath, 'application/rss+xml');
+    $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
+    $PAGE->add_alternate_version($courseshortname . ': %fullname%', $rsspath, 'application/rss+xml');
 }
 if ($data->csstemplate) {
     $PAGE->requires->css('/mod/data/css.php?d='.$data->id);
index 3794952..2bee85b 100644 (file)
@@ -2463,7 +2463,7 @@ function data_preset_path($course, $userid, $shortname) {
     } else if ($userid == 0) {
         $path = $CFG->dirroot.'/mod/data/preset/'.$shortname;
     } else if ($userid < 0) {
-        $path = $CFG->dataroot.'/temp/data/'.-$userid.'/'.$shortname;
+        $path = $CFG->tempdir.'/data/'.-$userid.'/'.$shortname;
     }
 
     return $path;
@@ -3142,8 +3142,8 @@ function data_presets_export($course, $cm, $data, $tostorage=false) {
     global $CFG, $DB;
 
     $presetname = clean_filename($data->name) . '-preset-' . gmdate("Ymd_Hi");
-    $exportsubdir = "temp/mod_data/presetexport/$presetname";
-    make_upload_directory($exportsubdir);
+    $exportsubdir = "mod_data/presetexport/$presetname";
+    make_temp_directory($exportsubdir);
     $exportdir = "$CFG->dataroot/$exportsubdir";
 
     // Assemble "preset.xml":
index 34273cf..7f1a213 100644 (file)
@@ -190,7 +190,7 @@ if (optional_param('sesskey', false, PARAM_BOOL) && confirm_sesskey()) {
         } else if ($action == 'finishimport') {
             $overwritesettings = optional_param('overwritesettings', false, PARAM_BOOL);
             if (!$fullname) {
-                $presetdir = $CFG->dataroot.'/temp/forms/'.required_param('directory', PARAM_ALPHANUMEXT);
+                $presetdir = $CFG->tempdir.'/forms/'.required_param('directory', PARAM_ALPHANUMEXT);
                 if (!file_exists($presetdir) || !is_dir($presetdir)) {
                     print_error('cannotimport');
                 }
index aefe77d..25791df 100644 (file)
                 array_push($items, $item);
             }
             $course = $DB->get_record('course', array('id'=>$data->course));
+            $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+            $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext));
 
             // First all rss feeds common headers.
-            $header = rss_standard_header($course->shortname.': '.format_string($data->name,true),
+            $header = rss_standard_header($courseshortname . ': ' . format_string($data->name, true, array('context' => $context)),
                                           $CFG->wwwroot."/mod/data/view.php?d=".$data->id,
-                                          format_string($data->intro,true)); //TODO: fix format
+                                          format_text($data->intro, $data->introformat, array('context' => $context)));
 
             if (!empty($header)) {
                 $articles = rss_add_items($items);
index 3a68ae9..aa1e045 100644 (file)
         $USER->editing = $edit;
     }
 
+    $courseshortname = format_string($course->shortname, true, array('context' => get_context_instance(CONTEXT_COURSE, $course->id)));
+
 /// RSS and CSS and JS meta
     $meta = '';
     if (!empty($CFG->enablerssfeeds) && !empty($CFG->data_enablerssfeeds) && $data->rssarticles > 0) {
-        $rsstitle = format_string($course->shortname) . ': %fullname%';
+        $rsstitle = $courseshortname . ': %fullname%';
         rss_add_http_header($context, 'mod_data', $data, $rsstitle);
     }
     if ($data->csstemplate) {
 /// Print the page header
     // Note: MDL-19010 there will be further changes to printing header and blocks.
     // The code will be much nicer than this eventually.
-    $title = $course->shortname.': ' . format_string($data->name);
+    $title = $courseshortname.': ' . format_string($data->name);
 
     if ($PAGE->user_allowed_editing()) {
         $buttons = '<table><tr><td><form method="get" action="view.php"><div>'.
index b1743a6..548d4c8 100644 (file)
@@ -120,16 +120,17 @@ if ($courseitemfilter > 0) {
                                         GROUP BY course_id, shortname
                                         ORDER BY avgvalue desc",