Merge branch 'w12_MDL-32050_m23_minify' of git://github.com/skodak/moodle
authorSam Hemelryk <sam@moodle.com>
Mon, 19 Mar 2012 23:50:21 +0000 (12:50 +1300)
committerSam Hemelryk <sam@moodle.com>
Mon, 19 Mar 2012 23:50:21 +0000 (12:50 +1300)
128 files changed:
admin/roles/override.php
admin/settings/security.php
auth/cas/config.html
auth/db/config.html
auth/email/auth.php
auth/email/config.html
auth/fc/config.html
auth/imap/config.html
auth/ldap/config.html
auth/manual/config.html
auth/mnet/config.html
auth/nntp/config.html
auth/none/config.html
auth/pam/config.html
auth/pop3/config.html
auth/shibboleth/config.html
backup/moodle2/backup_stepslib.php
backup/moodle2/restore_stepslib.php
calendar/renderer.php
course/edit.php
course/edit_form.php
course/index.php
course/lib.php
course/modedit.php
course/reset_form.php
enrol/database/lib.php
group/group.php
group/members.php
lang/en/admin.php
lang/en/blog.php
lang/en/message.php
lang/en/moodle.php
lib/db/install.xml
lib/db/upgrade.php
lib/javascript.php
lib/moodlelib.php
lib/navigationlib.php
lib/outputlib.php
lib/searchlib.php
lib/setuplib.php
message/edit.php
message/lib.php
mod/assignment/db/access.php
mod/assignment/lang/en/assignment.php
mod/assignment/version.php
mod/chat/db/access.php
mod/chat/lang/en/chat.php
mod/chat/version.php
mod/choice/db/access.php
mod/choice/lang/en/choice.php
mod/choice/version.php
mod/data/db/access.php
mod/data/lang/en/data.php
mod/data/version.php
mod/feedback/db/access.php
mod/feedback/lang/en/feedback.php
mod/feedback/version.php
mod/folder/db/access.php
mod/folder/edit.php
mod/folder/lang/en/folder.php
mod/folder/version.php
mod/forum/db/access.php
mod/forum/lang/en/forum.php
mod/forum/version.php
mod/glossary/db/access.php
mod/glossary/lang/en/glossary.php
mod/glossary/version.php
mod/imscp/db/access.php
mod/imscp/lang/en/imscp.php
mod/imscp/version.php
mod/label/db/access.php [new file with mode: 0644]
mod/label/lang/en/label.php
mod/label/version.php
mod/lesson/db/access.php
mod/lesson/lang/en/lesson.php
mod/lesson/version.php
mod/lti/db/access.php
mod/lti/lang/en/lti.php
mod/lti/version.php
mod/page/db/access.php
mod/page/lang/en/page.php
mod/page/version.php
mod/quiz/db/access.php
mod/quiz/lang/en/quiz.php
mod/quiz/module.js
mod/quiz/version.php
mod/resource/db/access.php
mod/resource/lang/en/resource.php
mod/resource/version.php
mod/scorm/db/access.php
mod/scorm/lang/en/scorm.php
mod/scorm/version.php
mod/survey/db/access.php
mod/survey/lang/en/survey.php
mod/survey/version.php
mod/upgrade.txt
mod/url/db/access.php
mod/url/lang/en/url.php
mod/url/version.php
mod/wiki/admin.php
mod/wiki/comments.php
mod/wiki/create.php
mod/wiki/db/access.php
mod/wiki/diff.php
mod/wiki/edit.php
mod/wiki/history.php
mod/wiki/index.php
mod/wiki/instancecomments.php
mod/wiki/lang/en/wiki.php
mod/wiki/lock.php
mod/wiki/map.php
mod/wiki/overridelocks.php
mod/wiki/pagelib.php
mod/wiki/prettyview.php
mod/wiki/restoreversion.php
mod/wiki/version.php
mod/wiki/view.php
mod/wiki/viewversion.php
mod/workshop/db/access.php
mod/workshop/lang/en/workshop.php
mod/workshop/version.php
question/editlib.php
question/engine/questionattempt.php
question/engine/simpletest/testquestionattempt.php
question/qbank.js
theme/fusion/layout/frontpage.php
theme/fusion/settings.php
version.php

index 9cd3ce5..ff6848d 100644 (file)
@@ -50,8 +50,10 @@ if ($course) {
 
 // security first
 require_login($course, false, $cm);
+$safeoverridesonly = false;
 if (!has_capability('moodle/role:override', $context)) {
     require_capability('moodle/role:safeoverride', $context);
+    $safeoverridesonly = true;
 }
 $PAGE->set_url($url);
 $PAGE->set_context($context);
@@ -119,7 +121,7 @@ if (empty($overridableroles[$roleid])) {
 }
 
 // If we are actually overriding a role, create the table object, and save changes if appropriate.
-$overridestable = new override_permissions_table_advanced($context, $roleid, false);
+$overridestable = new override_permissions_table_advanced($context, $roleid, $safeoverridesonly);
 $overridestable->read_submitted_permissions();
 
 if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) {
index 6e499ac..189bf87 100644 (file)
@@ -86,19 +86,6 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
     $ADMIN->add('security', $temp);
 
 
-    // "modulesecurity" settingpage
-    $temp = new admin_settingpage('modulesecurity', new lang_string('modulesecurity', 'admin'));
-    $temp->add(new admin_setting_configselect('restrictmodulesfor', new lang_string('restrictmodulesfor', 'admin'), new lang_string('configrestrictmodulesfor', 'admin'), 'none', array('none' => new lang_string('nocourses'),
-                                                                                                                                                                              'all' => new lang_string('fulllistofcourses'),
-                                                                                                                                                                              'requested' => new lang_string('requestedcourses'))));
-    $temp->add(new admin_setting_configcheckbox('restrictbydefault', new lang_string('restrictbydefault', 'admin'), new lang_string('configrestrictbydefault', 'admin'), 0));
-    $temp->add(new admin_setting_configmultiselect_modules('defaultallowedmodules',
-            new lang_string('defaultallowedmodules', 'admin'),
-            new lang_string('configdefaultallowedmodules', 'admin')));
-    $ADMIN->add('security', $temp);
-
-
-
     // "notifications" settingpage
     $temp = new admin_settingpage('notifications', new lang_string('notifications', 'admin'));
     $temp->add(new admin_setting_configselect('displayloginfailures', new lang_string('displayloginfailures', 'admin'), new lang_string('configdisplayloginfailures', 'admin'), '', array('' => new lang_string('nobody'),
index 81894ea..4781cb9 100644 (file)
@@ -437,6 +437,6 @@ $help .= get_string('auth_updateremote_expl', 'auth');
 $help .= '<hr />';
 $help .= get_string('auth_updateremote_ldap', 'auth');
 
-print_auth_lock_options('cas', $user_fields, $help, true, true);
+print_auth_lock_options($this->authtype, $user_fields, $help, true, true);
 ?>
 </table>
index 63d014c..94d981b 100644 (file)
 
 <?php
 
-print_auth_lock_options('db', $user_fields, get_string('auth_dbextrafields', 'auth_db'), true, true);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_dbextrafields', 'auth_db'), true, true);
 
 ?>
 </table>
index 4436097..0051aaf 100644 (file)
@@ -127,7 +127,7 @@ class auth_plugin_email extends auth_plugin_base {
             if ($user->confirmed) {
                 return AUTH_CONFIRM_ALREADY;
 
-            } else if ($user->auth != 'email') {
+            } else if ($user->auth != $this->authtype) {
                 return AUTH_CONFIRM_ERROR;
 
             } else if ($user->secret == $confirmsecret) {   // They have provided the secret key to get in
index 095171e..1b26e3f 100644 (file)
@@ -25,7 +25,7 @@
 </tr>
 <?php
 
-print_auth_lock_options('email', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index 9f44af1..91dd8c8 100644 (file)
@@ -97,7 +97,7 @@
 
 <?php
 
-print_auth_lock_options('fc', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index d604b47..d88ad3a 100644 (file)
@@ -87,7 +87,7 @@ if (!isset($config->changepasswordurl)) {
 
 <?php
 
-print_auth_lock_options('imap', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index 25c6786..72519c7 100644 (file)
@@ -547,6 +547,6 @@ $help .= get_string('auth_updateremote_expl', 'auth');
 $help .= '<hr />';
 $help .= get_string('auth_updateremote_ldap', 'auth');
 
-print_auth_lock_options('ldap', $user_fields, $help, true, true);
+print_auth_lock_options($this->authtype, $user_fields, $help, true, true);
 ?>
 </table>
index 9caa591..8c03ce0 100644 (file)
@@ -1,5 +1,5 @@
 <table cellspacing="0" cellpadding="5" border="0">
 <?php
-print_auth_lock_options('manual', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 ?>
 </table>
index 5fc988b..2dbba3f 100644 (file)
@@ -88,7 +88,7 @@ foreach($service_providers as $host) {
 <?php
 }
 
-// print_auth_lock_options('mnet', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+// print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index 5d50324..179efdd 100644 (file)
@@ -68,7 +68,7 @@ if (!isset($config->changepasswordurl)) {
 
 <?php
 
-print_auth_lock_options('nntp', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index abeada0..0068836 100644 (file)
@@ -4,7 +4,7 @@
 <table cellspacing="0" cellpadding="5" border="0">
 <?php
 
-print_auth_lock_options('none', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index f2f6f1a..0068836 100644 (file)
@@ -4,7 +4,7 @@
 <table cellspacing="0" cellpadding="5" border="0">
 <?php
 
-print_auth_lock_options('pam', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index 8726b28..e2d7e7a 100644 (file)
@@ -105,7 +105,7 @@ if (!isset($config->changepasswordurl)) {
 
 <?php
 
-print_auth_lock_options('pop3', $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
+print_auth_lock_options($this->authtype, $user_fields, get_string('auth_fieldlocks_help', 'auth'), false, false);
 
 ?>
 </table>
index b15b17a..8eff5f2 100644 (file)
@@ -138,7 +138,7 @@ urn:mace:organization2:providerID, Example Organization 2, /Shibboleth.sso/WAYF/
 
 <?php
 
-print_auth_lock_options('shibboleth', $user_fields, '<!-- empty help -->', true, false);
+print_auth_lock_options($this->authtype, $user_fields, '<!-- empty help -->', true, false);
 
 ?>
 </table>
index 78d2721..e22ff35 100644 (file)
@@ -403,7 +403,7 @@ class backup_course_structure_step extends backup_structure_step {
             'visible', 'hiddensections', 'groupmode', 'groupmodeforce',
             'defaultgroupingid', 'lang', 'theme',
             'timecreated', 'timemodified',
-            'requested', 'restrictmodules',
+            'requested',
             'enablecompletion', 'completionstartonenrol', 'completionnotify'));
 
         $category = new backup_nested_element('category', array('id'), array(
@@ -414,10 +414,6 @@ class backup_course_structure_step extends backup_structure_step {
         $tag = new backup_nested_element('tag', array('id'), array(
             'name', 'rawname'));
 
-        $allowedmodules = new backup_nested_element('allowed_modules');
-
-        $module = new backup_nested_element('module', array(), array('modulename'));
-
         // attach format plugin structure to $course element, only one allowed
         $this->add_plugin_structure('format', $course, false);
 
@@ -444,9 +440,6 @@ class backup_course_structure_step extends backup_structure_step {
         $course->add_child($tags);
         $tags->add_child($tag);
 
-        $course->add_child($allowedmodules);
-        $allowedmodules->add_child($module);
-
         // Set the sources
 
         $courserec = $DB->get_record('course', array('id' => $this->task->get_courseid()));
@@ -466,11 +459,6 @@ class backup_course_structure_step extends backup_structure_step {
                                      backup_helper::is_sqlparam('course'),
                                      backup::VAR_PARENTID));
 
-        $module->set_source_sql('SELECT m.name AS modulename
-                                   FROM {modules} m
-                                   JOIN {course_allowed_modules} cam ON m.id = cam.module
-                                  WHERE course = ?', array(backup::VAR_COURSEID));
-
         // Some annotations
 
         $course->annotate_ids('grouping', 'defaultgroupingid');
index 58048ec..6dd757e 100644 (file)
@@ -1069,6 +1069,21 @@ class restore_section_structure_step extends restore_structure_step {
  * the course record (never inserting)
  */
 class restore_course_structure_step extends restore_structure_step {
+    /**
+     * @var bool this gets set to true by {@link process_course()} if we are
+     * restoring an old coures that used the legacy 'module security' feature.
+     * If so, we have to do more work in {@link after_execute()}.
+     */
+    protected $legacyrestrictmodules = false;
+
+    /**
+     * @var array Used when {@link $legacyrestrictmodules} is true. This is an
+     * array with array keys the module names ('forum', 'quiz', etc.). These are
+     * the modules that are allowed according to the data in the backup file.
+     * In {@link after_execute()} we then have to prevent adding of all the other
+     * types of activity.
+     */
+    protected $legacyallowedmodules = array();
 
     protected function define_structure() {
 
@@ -1131,8 +1146,9 @@ class restore_course_structure_step extends restore_structure_step {
             $data->hiddensections = 0;
         }
 
-        // Only restrict modules if original course was and target site too for new courses
-        $data->restrictmodules = $data->restrictmodules && !empty($CFG->restrictmodulesfor) && $CFG->restrictmodulesfor == 'all';
+        // Set legacyrestrictmodules to true if the course was resticting modules. If so
+        // then we will need to process restricted modules after execution.
+        $this->legacyrestrictmodules = !empty($data->restrictmodules);
 
         $data->startdate= $this->apply_date_offset($data->startdate);
         if ($data->defaultgroupingid) {
@@ -1187,31 +1203,44 @@ class restore_course_structure_step extends restore_structure_step {
     }
 
     public function process_allowed_module($data) {
-        global $CFG, $DB;
-
         $data = (object)$data;
 
-        // only if enabled by admin setting
-        if (!empty($CFG->restrictmodulesfor) && $CFG->restrictmodulesfor == 'all') {
-            $available = get_plugin_list('mod');
-            $mname = $data->modulename;
-            if (array_key_exists($mname, $available)) {
-                if ($module = $DB->get_record('modules', array('name' => $mname, 'visible' => 1))) {
-                    $rec = new stdclass();
-                    $rec->course = $this->get_courseid();
-                    $rec->module = $module->id;
-                    if (!$DB->record_exists('course_allowed_modules', (array)$rec)) {
-                        $DB->insert_record('course_allowed_modules', $rec);
-                    }
-                }
-            }
+        // Backwards compatiblity support for the data that used to be in the
+        // course_allowed_modules table.
+        if ($this->legacyrestrictmodules) {
+            $this->legacyallowedmodules[$data->modulename] = 1;
         }
     }
 
     protected function after_execute() {
+        global $DB;
+
         // Add course related files, without itemid to match
         $this->add_related_files('course', 'summary', null);
         $this->add_related_files('course', 'legacy', null);
+
+        // Deal with legacy allowed modules.
+        if ($this->legacyrestrictmodules) {
+            $context = context_course::instance($this->get_courseid());
+
+            list($roleids) = get_roles_with_cap_in_context($context, 'moodle/course:manageactivities');
+            list($managerroleids) = get_roles_with_cap_in_context($context, 'moodle/site:config');
+            foreach ($managerroleids as $roleid) {
+                unset($roleids[$roleid]);
+            }
+
+            foreach (get_plugin_list('mod') as $modname => $notused) {
+                if (isset($this->legacyallowedmodules[$modname])) {
+                    // Module is allowed, no worries.
+                    continue;
+                }
+
+                $capability = 'mod/' . $modname . ':addinstance';
+                foreach ($roleids as $roleid) {
+                    assign_capability($capability, CAP_PREVENT, $roleid, $context);
+                }
+            }
+        }
     }
 }
 
index 312c572..ade2f63 100644 (file)
@@ -413,6 +413,8 @@ class core_calendar_renderer extends plugin_renderer_base {
 
         $table = new html_table();
         $table->attributes = array('class'=>'calendarmonth calendartable');
+        $time = make_timestamp($calendar->year, $calendar->month);
+        $table->summary = get_string('calendarheading', 'calendar', userdate($time, get_string('strftimemonthyear')));
         $table->data = array();
 
         $header = new html_table_row();
index 053d8bb..174872c 100644 (file)
@@ -65,18 +65,6 @@ if ($id) { // editing course
 // Prepare course and the editor
 $editoroptions = array('maxfiles' => EDITOR_UNLIMITED_FILES, 'maxbytes'=>$CFG->maxbytes, 'trusttext'=>false, 'noclean'=>true);
 if (!empty($course)) {
-    $allowedmods = array();
-    if ($am = $DB->get_records('course_allowed_modules', array('course'=>$course->id))) {
-        foreach ($am as $m) {
-            $allowedmods[] = $m->module;
-        }
-    } else {
-        // this happens in case we edit course created before enabling module restrictions or somebody disabled everything :-(
-        if (empty($course->restrictmodules) and !empty($CFG->defaultallowedmodules)) {
-            $allowedmods = explode(',', $CFG->defaultallowedmodules);
-        }
-    }
-    $course->allowedmods = $allowedmods;
     //add context for editor
     $editoroptions['context'] = $coursecontext;
     $course = file_prepare_standard_editor($course, 'summary', $editoroptions, $coursecontext, 'course', 'summary', 0);
index d87c9d1..44ed742 100644 (file)
@@ -256,48 +256,6 @@ class course_edit_form extends moodleform {
             $mform->setDefault('completionstartonenrol',0);
         }
 
-//--------------------------------------------------------------------------------
-        if (has_capability('moodle/site:config', $systemcontext)) {
-            if (((!empty($course->requested) && $CFG->restrictmodulesfor == 'requested') || $CFG->restrictmodulesfor == 'all')) {
-                $mform->addElement('header', '', get_string('restrictmodules'));
-
-                $options = array();
-                $options['0'] = get_string('no');
-                $options['1'] = get_string('yes');
-                $mform->addElement('select', 'restrictmodules', get_string('restrictmodules'), $options);
-                if (!empty($CFG->restrictbydefault)) {
-                    $mform->setDefault('restrictmodules', 1);
-                }
-
-                $mods = array(0=>get_string('allownone'));
-                $allmods = $DB->get_records_menu('modules', array('visible' => 1),
-                        'name', 'id, name');
-                foreach ($allmods as $key => $value) {
-                    // Add module to list unless it cannot be added by users anyway
-                    if (plugin_supports('mod', $value, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER) !==
-                            MOD_ARCHETYPE_SYSTEM) {
-                        $mods[$key] = get_string('pluginname', $value);
-                    }
-                }
-                $mform->addElement('select', 'allowedmods', get_string('to'), $mods, array('multiple'=>'multiple', 'size'=>'10'));
-                $mform->disabledIf('allowedmods', 'restrictmodules', 'eq', 0);
-                // defaults are already in $course
-            } else {
-                // remove any mod restriction
-                $mform->addElement('hidden', 'restrictmodules', 0);
-                $mform->setType('restrictmodules', PARAM_INT);
-            }
-        } else {
-            $mform->addElement('hidden', 'restrictmodules');
-            $mform->setType('restrictmodules', PARAM_INT);
-            if (empty($course->id)) {
-                $mform->setConstant('restrictmodules', (int)($CFG->restrictmodulesfor == 'all'));
-            } else {
-                // keep previous
-                $mform->setConstant('restrictmodules', $course->restrictmodules);
-            }
-        }
-
 /// customizable role names in this course
 //--------------------------------------------------------------------------------
         $mform->addElement('header','rolerenaming', get_string('rolerenaming'));
index e873128..ce1466a 100644 (file)
@@ -177,6 +177,7 @@ if (!$categories = get_categories()) {    /// No category yet!
     $tempcat->context = get_context_instance(CONTEXT_COURSECAT, $tempcat->id);
     mark_context_dirty('/'.SYSCONTEXTID);
     fix_course_sortorder(); // Required to build course_categories.depth and .path.
+    set_config('defaultrequestcategory', $tempcat->id);
 }
 
 /// Move a category to a new parent if required
@@ -394,4 +395,4 @@ function print_category_edit($category, $displaylist, $parentslist, $depth=-1, $
             print_category_edit($cat, $displaylist, $parentslist, $depth+1, $up, $down);
         }
     }
-}
\ No newline at end of file
+}
index 6282112..fd8a1e1 100644 (file)
@@ -3391,58 +3391,37 @@ function course_format_name ($course,$max=100) {
     }
 }
 
-function update_restricted_mods($course, $mods) {
-    global $DB;
-
-/// Delete all the current restricted list
-    $DB->delete_records('course_allowed_modules', array('course'=>$course->id));
-
-    if (empty($course->restrictmodules)) {
-        return;   // We're done
-    }
-
-/// Insert the new list of restricted mods
-    foreach ($mods as $mod) {
-        if ($mod == 0) {
-            continue; // this is the 'allow none' option
-        }
-        $am = new stdClass();
-        $am->course = $course->id;
-        $am->module = $mod;
-        $DB->insert_record('course_allowed_modules',$am);
-    }
-}
-
 /**
- * This function will take an int (module id) or a string (module name)
- * and return true or false, whether it's allowed in the given course (object)
- * $mod is not allowed to be an object, as the field for the module id is inconsistent
- * depending on where in the code it's called from (sometimes $mod->id, sometimes $mod->module)
+ * Is the user allowed to add this type of module to this course?
+ * @param object $course the course settings. Only $course->id is used.
+ * @param string $modname the module name. E.g. 'forum' or 'quiz'.
+ * @return bool whether the current user is allowed to add this type of module to this course.
  */
-
-function course_allowed_module($course,$mod) {
+function course_allowed_module($course, $modname) {
     global $DB;
 
-    if (empty($course->restrictmodules)) {
-        return true;
+    if (is_numeric($modname)) {
+        throw new coding_exception('Function course_allowed_module no longer
+                supports numeric module ids. Please update your code to pass the module name.');
     }
 
-    // Admins and admin-like people who can edit everything can also add anything.
-    // Originally there was a course:update test only, but it did not match the test in course edit form
-    if (has_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM))) {
-        return true;
-    }
+    $capability = 'mod/' . $modname . ':addinstance';
+    if (!get_capability_info($capability)) {
+        // Debug warning that the capability does not exist, but no more than once per page.
+        static $warned = array();
+        $archetype = plugin_supports('mod', $modname, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER);
+        if (!isset($warned[$modname]) && $archetype !== MOD_ARCHETYPE_SYSTEM) {
+            debugging('The module ' . $modname . ' does not define the standard capability ' .
+                    $capability , DEBUG_DEVELOPER);
+            $warned[$modname] = 1;
+        }
 
-    if (is_numeric($mod)) {
-        $modid = $mod;
-    } else if (is_string($mod)) {
-        $modid = $DB->get_field('modules', 'id', array('name'=>$mod));
-    }
-    if (empty($modid)) {
-        return false;
+        // If the capability does not exist, the module can always be added.
+        return true;
     }
 
-    return $DB->record_exists('course_allowed_modules', array('course'=>$course->id, 'module'=>$modid));
+    $coursecontext = context_course::instance($course->id);
+    return has_capability($capability, $coursecontext);
 }
 
 /**
@@ -3910,17 +3889,6 @@ function create_course($data, $editoroptions = NULL) {
 
     fix_course_sortorder();
 
-    // update module restrictions
-    if ($course->restrictmodules) {
-        if (isset($data->allowedmods)) {
-            update_restricted_mods($course, $data->allowedmods);
-        } else {
-            if (!empty($CFG->defaultallowedmodules)) {
-                update_restricted_mods($course, explode(',', $CFG->defaultallowedmodules));
-            }
-        }
-    }
-
     // new context created - better mark it as dirty
     mark_context_dirty($context->path);
 
@@ -3999,11 +3967,6 @@ function update_course($data, $editoroptions = NULL) {
     // Test for and remove blocks which aren't appropriate anymore
     blocks_remove_inappropriate($course);
 
-    // update module restrictions
-    if (isset($data->allowedmods)) {
-        update_restricted_mods($course, $data->allowedmods);
-    }
-
     // Save any custom role names.
     save_local_role_names($course->id, $data);
 
@@ -4316,9 +4279,6 @@ class course_request {
 
         // Set misc settings
         $data->requested = 1;
-        if (!empty($CFG->restrictmodulesfor) && $CFG->restrictmodulesfor != 'none' && !empty($CFG->restrictbydefault)) {
-            $data->restrictmodules = 1;
-        }
 
         // Apply course default settings
         $data->format             = $courseconfig->format;
index 9ed3f5d..63ea832 100644 (file)
@@ -59,7 +59,7 @@ if (!empty($add)) {
 
     $cw = get_course_section($section, $course->id);
 
-    if (!course_allowed_module($course, $module->id)) {
+    if (!course_allowed_module($course, $module->name)) {
         print_error('moduledisable');
     }
 
index ce8b0f7..cb899f0 100644 (file)
@@ -27,6 +27,9 @@ class course_reset_form extends moodleform {
         $mform->addElement('header', 'rolesheader', get_string('roles'));
 
         $roles = get_assignable_roles(get_context_instance(CONTEXT_COURSE, $COURSE->id));
+        $roles[0] = get_string('noroles', 'role');
+        $roles = array_reverse($roles, true);
+
         $mform->addElement('select', 'unenrol_users', get_string('unenrolroleusers', 'enrol'), $roles, array('multiple' => 'multiple'));
         $mform->addElement('checkbox', 'reset_roles_overrides', get_string('deletecourseoverrides', 'role'));
         $mform->setAdvanced('reset_roles_overrides');
index ce8d6d2..62b44f9 100644 (file)
@@ -354,9 +354,7 @@ class enrol_database_plugin extends enrol_plugin {
         }
         $preventfullunenrol = empty($externalcourses);
         if ($preventfullunenrol and $unenrolaction == ENROL_EXT_REMOVED_UNENROL) {
-            if ($verbose) {
-                mtrace('  Preventing unenrolment of all current users, because it might result in major data loss, there has to be at least one record in external enrol table, sorry.');
-            }
+            mtrace('  Preventing unenrolment of all current users, because it might result in major data loss, there has to be at least one record in external enrol table, sorry.');
         }
 
         // first find all existing courses with enrol instance
index cf12016..3b23ad9 100644 (file)
@@ -35,10 +35,12 @@ $confirm  = optional_param('confirm', 0, PARAM_BOOL);
 
 // This script used to support group delete, but that has been moved. In case
 // anyone still links to it, let's redirect to the new script.
-if($delete) {
-    redirect('delete.php?courseid='.$courseid.'&groups='.$id);
+if ($delete) {
+    debugging('Deleting a group through group/group.php is deprecated and will be removed soon. Please use group/delete.php instead');
+    redirect(new moodle_url('delete.php', array('courseid' => $courseid, 'groups' => $id)));
 }
 
+
 if ($id) {
     if (!$group = $DB->get_record('groups', array('id'=>$id))) {
         print_error('invalidgroupid');
@@ -74,28 +76,6 @@ require_capability('moodle/course:managegroups', $context);
 
 $returnurl = $CFG->wwwroot.'/group/index.php?id='.$course->id.'&group='.$id;
 
-if ($id and $delete) {
-    if (!$confirm) {
-        $PAGE->set_title(get_string('deleteselectedgroup', 'group'));
-        $PAGE->set_heading($course->fullname . ': '. get_string('deleteselectedgroup', 'group'));
-        echo $OUTPUT->header();
-        $optionsyes = array('id'=>$id, 'delete'=>1, 'courseid'=>$courseid, 'sesskey'=>sesskey(), 'confirm'=>1);
-        $optionsno  = array('id'=>$courseid);
-        $formcontinue = new single_button(new moodle_url('group.php', $optionsyes), get_string('yes'), 'get');
-        $formcancel = new single_button(new moodle_url($baseurl, $optionsno), get_string('no'), 'get');
-        echo $OUTPUT->confirm(get_string('deletegroupconfirm', 'group', $group->name), $formcontinue, $formcancel);
-        echo $OUTPUT->footer();
-        die;
-
-    } else if (confirm_sesskey()){
-        if (groups_delete_group($id)) {
-            redirect('index.php?id='.$course->id);
-        } else {
-            print_error('erroreditgroup', 'group', $returnurl);
-        }
-    }
-}
-
 // Prepare the description editor: We do support files for group descriptions
 $editoroptions = array('maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$course->maxbytes, 'trust'=>false, 'context'=>$context, 'noclean'=>true);
 if (!empty($group->id)) {
index d302bf7..df0a266 100644 (file)
@@ -34,7 +34,7 @@ $cancel  = optional_param('cancel', false, PARAM_BOOL);
 $group = $DB->get_record('groups', array('id'=>$groupid), '*', MUST_EXIST);
 $course = $DB->get_record('course', array('id'=>$group->courseid), '*', MUST_EXIST);
 
-$PAGE->set_url('/groups/members.php', array('id'=>$groupid));
+$PAGE->set_url('/group/members.php', array('group'=>$groupid));
 $PAGE->set_pagelayout('standard');
 
 require_login($course);
index 6b6c8df..921dc7d 100644 (file)
@@ -171,7 +171,6 @@ $string['configdebugdisplay'] = 'Set to on, the error reporting will go to the H
 $string['configdebugpageinfo'] = 'Enable if you want page information printed in page footer.';
 $string['configdebugsmtp'] = 'Enable verbose debug information during sending of email messages to SMTP server.';
 $string['configdebugvalidators'] = 'Enable if you want to have links to external validator servers in page footer. You may need to create new user with username <em>w3cvalidator</em>, and enable guest access. These changes may allow unauthorized access to server, do not enable on production sites!';
-$string['configdefaultallowedmodules'] = 'For the courses which fall into the above category, which modules do you want to allow by default <b>when the course is created</b>?';
 $string['configdefaulthomepage'] = 'This determines the home page for logged in users';
 $string['configdefaultrequestcategory'] = 'Courses requested by users will be automatically placed in this category.';
 $string['configdefaultrequestedcategory'] = 'Default category to put courses that were requested into, if they\'re approved.';
@@ -285,8 +284,6 @@ $string['configrequestedstudentsname'] = 'Word for students used in requested co
 $string['configrequestedteachername'] = 'Word for teacher used in requested courses';
 $string['configrequestedteachersname'] = 'Word for teachers used in requested courses';
 $string['configrequiremodintro'] = 'Disable this option if you do not want to force users to enter description of each activity.';
-$string['configrestrictbydefault'] = 'Should new courses that are created that fall into the above category have their modules restricted by default?';
-$string['configrestrictmodulesfor'] = 'Which courses should have <b>the setting</b> for disabling some activity modules?  Note that this setting only applies to teachers, administrators will still be able to add any activity to a course.';
 $string['configrunclamavonupload'] = 'When enabled, clam AV will be used to scan all uploaded files.';
 $string['configrunclamonupload'] = 'Run clam AV on file upload? You will need a correct path in pathtoclam for this to work.  (Clam AV is a free virus scanner that you can get from http://www.clamav.net/)';
 $string['configuserquota'] = 'The maximum number of bytes that a user can store in their own private file area. {$a->bytes} bytes == {$a->displaysize}';
@@ -407,7 +404,6 @@ $string['debugsmtp'] = 'Debug email sending';
 $string['debugstringids'] = 'Show origin of languages strings';
 $string['debugstringids_desc'] = 'This option is designed to help translators. When this option is enabled, if you add the parameter strings=1 to a request URL, it will show the language file and string id beside each string that is output.';
 $string['debugvalidators'] = 'Show validator links';
-$string['defaultallowedmodules'] = 'Default allowed modules';
 $string['defaultcity'] = 'Default city';
 $string['defaultcity_help'] = 'A city entered here will be the default city when creating new user accounts.';
 $string['defaulthomepage'] = 'Default home page for users';
@@ -861,8 +857,6 @@ $string['purgecachesconfirm']= 'Moodle can cache themes, javascript, language st
 $string['purgecachesfinished']= 'All caches were purged.';
 $string['restorernewroleid'] = 'Restorers\' role in courses';
 $string['restorernewroleid_help'] = 'If the user does not already have the permission to manage the newly restored course, the user is automatically assigned this role and enrolled if necessary. Select "None" if you do not want restorers to be able to manage every restored course.';
-$string['restrictbydefault'] = 'Restrict modules by default';
-$string['restrictmodulesfor'] = 'Restrict modules for';
 $string['reverseproxy'] = 'Reverse proxy';
 $string['riskconfig'] = 'Users could change site configuration and behaviour';
 $string['riskconfigshort'] = 'Configuration risk';
index 1d54561..202ad87 100644 (file)
@@ -54,6 +54,8 @@ $string['blogentriesbyuseraboutmodule'] = 'Blog entries about this {$a->mod} by
 $string['blogentrybyuser'] = 'Blog entry by {$a}';
 $string['blogpreferences'] = 'Blog preferences';
 $string['blogs'] = 'Blogs';
+$string['blogscourse'] = 'Course blogs';
+$string['blogssite'] = 'Site blogs';
 $string['blogtags'] = 'Blog tags';
 $string['cannotviewcourseblog'] = 'You do not have the required permissions to view blogs in this course';
 $string['cannotviewcourseorgroupblog'] = 'You do not have the required permissions to view blogs in this course/group';
index 60993bc..5aa5f4e 100644 (file)
@@ -128,6 +128,7 @@ $string['settings'] = 'Settings';
 $string['settingssaved'] = 'Your settings have been saved';
 $string['showmessagewindow'] = 'Popup window on new message';
 $string['strftimedaydatetime'] = '%A, %d %B %Y, %I:%M %p';
+$string['thisconversation'] = 'this conversation';
 $string['timenosee'] = 'Minutes since I was last seen online';
 $string['timesent'] = 'Time sent';
 $string['touserdoesntexist'] = 'You can not send a message to a user id ({$a}) that doesn\'t exist';
index fd18d93..764d5db 100644 (file)
@@ -1385,7 +1385,6 @@ $string['restoreuserinfofailed'] = 'The restore process has stopped because you
 $string['restoreusersprecheck'] = 'Checking user data';
 $string['restoreusersprecheckerror'] = 'Some problems were detected when checking user data';
 $string['restricted'] = 'Restricted';
-$string['restrictmodules'] = 'Restrict activity modules?';
 $string['returningtosite'] = 'Returning to this web site?';
 $string['returntooriginaluser'] = 'Return to {$a}';
 $string['revert'] = 'Revert';
index eeac75d..7f53bb4 100644 (file)
@@ -97,9 +97,8 @@
         <FIELD NAME="theme" TYPE="char" LENGTH="50" NOTNULL="true" SEQUENCE="false" PREVIOUS="lang" NEXT="timecreated"/>
         <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="theme" NEXT="timemodified"/>
         <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timecreated" NEXT="requested"/>
-        <FIELD NAME="requested" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timemodified" NEXT="restrictmodules"/>
-        <FIELD NAME="restrictmodules" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="requested" NEXT="enablecompletion"/>
-        <FIELD NAME="enablecompletion" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="1 = allow use of 'completion' progress-tracking on this course. 0 = disable completion tracking on this course." PREVIOUS="restrictmodules" NEXT="completionstartonenrol"/>
+        <FIELD NAME="requested" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timemodified" NEXT="enablecompletion"/>
+        <FIELD NAME="enablecompletion" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="1 = allow use of 'completion' progress-tracking on this course. 0 = disable completion tracking on this course." PREVIOUS="requested" NEXT="completionstartonenrol"/>
         <FIELD NAME="completionstartonenrol" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="1 = allow use of 'activty completion' progress-tracking on this course. 0 = disable activity completion tracking on this course." PREVIOUS="enablecompletion" NEXT="completionnotify"/>
         <FIELD NAME="completionnotify" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Notify users when they complete this course" PREVIOUS="completionstartonenrol"/>
       </FIELDS>
         <INDEX NAME="course_section" UNIQUE="false" FIELDS="course, section"/>
       </INDEXES>
     </TABLE>
-    <TABLE NAME="course_request" COMMENT="course requests" PREVIOUS="course_sections" NEXT="course_allowed_modules">
+    <TABLE NAME="course_request" COMMENT="course requests" PREVIOUS="course_sections" NEXT="filter_active">
       <FIELDS>
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="fullname"/>
         <FIELD NAME="fullname" TYPE="char" LENGTH="254" NOTNULL="true" SEQUENCE="false" PREVIOUS="id" NEXT="shortname"/>
         <INDEX NAME="shortname" UNIQUE="false" FIELDS="shortname"/>
       </INDEXES>
     </TABLE>
-    <TABLE NAME="course_allowed_modules" COMMENT="allowed modules foreach course" PREVIOUS="course_request" NEXT="filter_active">
-      <FIELDS>
-        <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="course"/>
-        <FIELD NAME="course" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="id" NEXT="module"/>
-        <FIELD NAME="module" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="course"/>
-      </FIELDS>
-      <KEYS>
-        <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
-      </KEYS>
-      <INDEXES>
-        <INDEX NAME="course" UNIQUE="false" FIELDS="course" NEXT="module"/>
-        <INDEX NAME="module" UNIQUE="false" FIELDS="module" PREVIOUS="course"/>
-      </INDEXES>
-    </TABLE>
-    <TABLE NAME="filter_active" COMMENT="Stores information about which filters are active in which contexts. Also the filter sort order. See get_active_filters in lib/filterlib.php for how this data is used." PREVIOUS="course_allowed_modules" NEXT="filter_config">
+    <TABLE NAME="filter_active" COMMENT="Stores information about which filters are active in which contexts. Also the filter sort order. See get_active_filters in lib/filterlib.php for how this data is used." PREVIOUS="course_request" NEXT="filter_config">
       <FIELDS>
         <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" NEXT="filter"/>
         <FIELD NAME="filter" TYPE="char" LENGTH="32" NOTNULL="true" SEQUENCE="false" COMMENT="The filter internal name, like 'filter/tex' or 'mod/glossary'." PREVIOUS="id" NEXT="contextid"/>
index c42d27c..a77878f 100644 (file)
@@ -212,7 +212,110 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2012030900.01);
     }
 
+    if ($oldversion < 2012031500.01) {
+        // Upgrade old course_allowed_modules data to be permission overrides.
+        if ($CFG->restrictmodulesfor === 'all') {
+            $courses = $DB->get_records_menu('course', array(), 'id', 'id, 1');
+        } else if ($CFG->restrictmodulesfor === 'requested') {
+            $courses = $DB->get_records_menu('course', array('retrictmodules' => 1), 'id', 'id, 1');
+        } else {
+            $courses = array();
+        }
+
+        if (!$dbman->table_exists('course_allowed_modules')) {
+            // Upgrade must already have been run on this server. This might happen,
+            // for example, during development of these changes.
+            $courses = array();
+        }
+
+        $modidtoname = $DB->get_records_menu('modules', array(), 'id', 'id, name');
+
+        $coursecount = count($courses);
+        if ($coursecount) {
+            $pbar = new progress_bar('allowedmods', 500, true);
+            $transaction = $DB->start_delegated_transaction();
+        }
+
+        $i = 0;
+        foreach ($courses as $courseid => $notused) {
+            $i += 1;
+            upgrade_set_timeout(60); // 1 minute per course should be fine.
+
+            $allowedmoduleids = $DB->get_records_menu('course_allowed_modules',
+            array('course' => $courseid), 'module', 'module, 1');
+            if (empty($allowedmoduleids)) {
+                // This seems to be the best match for backwards compatibility,
+                // not necessarily with the old code in course_allowed_module function,
+                // but with the code that used to be in the coures settings form.
+                $allowedmoduleids = explode(',', $CFG->defaultallowedmodules);
+                $allowedmoduleids = array_combine($allowedmoduleids, $allowedmoduleids);
+            }
+
+            $context = context_course::instance($courseid);
+
+            list($roleids) = get_roles_with_cap_in_context($context, 'moodle/course:manageactivities');
+            list($managerroleids) = get_roles_with_cap_in_context($context, 'moodle/site:config');
+            foreach ($managerroleids as $roleid) {
+                unset($roleids[$roleid]);
+            }
+
+            foreach ($modidtoname as $modid => $modname) {
+                if (isset($allowedmoduleids[$modid])) {
+                    // Module is allowed, no worries.
+                    continue;
+                }
+
+                $capability = 'mod/' . $modname . ':addinstance';
+                foreach ($roleids as $roleid) {
+                    assign_capability($capability, CAP_PREVENT, $roleid, $context);
+                }
+            }
+
+            $pbar->update($i, $coursecount, "Upgrading legacy course_allowed_modules data - $i/$coursecount.");
+        }
+
+        if ($coursecount) {
+            $transaction->allow_commit();
+        }
+
+        upgrade_main_savepoint(true, 2012031500.01);
+    }
+
+    if ($oldversion < 2012031500.02) {
+
+        // Define field retrictmodules to be dropped from course
+        $table = new xmldb_table('course');
+        $field = new xmldb_field('restrictmodules');
+
+        // Conditionally launch drop field requested
+        if ($dbman->field_exists($table, $field)) {
+            $dbman->drop_field($table, $field);
+        }
+
+        upgrade_main_savepoint(true, 2012031500.02);
+    }
+
+    if ($oldversion < 2012031500.03) {
+
+        // Define table course_allowed_modules to be dropped
+        $table = new xmldb_table('course_allowed_modules');
+
+        // Conditionally launch drop table for course_allowed_modules
+        if ($dbman->table_exists($table)) {
+            $dbman->drop_table($table);
+        }
+
+        upgrade_main_savepoint(true, 2012031500.03);
+    }
+
+    if ($oldversion < 2012031500.04) {
+        // Clean up the old admin settings.
+        unset_config('restrictmodulesfor');
+        unset_config('restrictbydefault');
+        unset_config('defaultallowedmodules');
+
+        upgrade_main_savepoint(true, 2012031500.04);
+    }
 
     return true;
 }
-
index 8bf0367..baae4c0 100644 (file)
@@ -46,7 +46,11 @@ foreach ($files as $fsfile) {
         // does not exist
         continue;
     }
-    if (strpos($jsfile, $CFG->dirroot . DIRECTORY_SEPARATOR) !== 0) {
+    if ($CFG->dirroot === '/') {
+        // Some shared hosting sites serve files directly from '/',
+        // this is NOT supported, but at least allow JS when showing
+        // errors and warnings.
+    } else if (strpos($jsfile, $CFG->dirroot . DIRECTORY_SEPARATOR) !== 0) {
         // hackers - not in dirroot
         continue;
     }
index 0099f60..942ab0b 100644 (file)
@@ -4775,12 +4775,24 @@ function reset_course_userdata($data) {
         }
 
         foreach($data->unenrol_users as $withroleid) {
-            $sql = "SELECT ue.*
-                      FROM {user_enrolments} ue
-                      JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid)
-                      JOIN {context} c ON (c.contextlevel = :courselevel AND c.instanceid = e.courseid)
-                      JOIN {role_assignments} ra ON (ra.contextid = c.id AND ra.roleid = :roleid AND ra.userid = ue.userid)";
-            $params = array('courseid'=>$data->courseid, 'roleid'=>$withroleid, 'courselevel'=>CONTEXT_COURSE);
+            if ($withroleid) {
+                $sql = "SELECT ue.*
+                          FROM {user_enrolments} ue
+                          JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid)
+                          JOIN {context} c ON (c.contextlevel = :courselevel AND c.instanceid = e.courseid)
+                          JOIN {role_assignments} ra ON (ra.contextid = c.id AND ra.roleid = :roleid AND ra.userid = ue.userid)";
+                $params = array('courseid'=>$data->courseid, 'roleid'=>$withroleid, 'courselevel'=>CONTEXT_COURSE);
+
+            } else {
+                // without any role assigned at course context
+                $sql = "SELECT ue.*
+                          FROM {user_enrolments} ue
+                          JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid)
+                          JOIN {context} c ON (c.contextlevel = :courselevel AND c.instanceid = e.courseid)
+                     LEFT JOIN {role_assignments} ra ON (ra.contextid = c.id AND ra.userid = ue.userid)
+                         WHERE ra.id IS NULL";
+                $params = array('courseid'=>$data->courseid, 'courselevel'=>CONTEXT_COURSE);
+            }
 
             $rs = $DB->get_recordset_sql($sql, $params);
             foreach ($rs as $ue) {
index f807b7d..963f431 100644 (file)
@@ -2352,7 +2352,7 @@ class global_navigation extends navigation_node {
             if (($CFG->bloglevel == BLOG_GLOBAL_LEVEL or ($CFG->bloglevel == BLOG_SITE_LEVEL and (isloggedin() and !isguestuser())))
                and has_capability('moodle/blog:view', get_context_instance(CONTEXT_SYSTEM))) {
                 $blogsurls = new moodle_url('/blog/index.php', array('courseid' => $filterselect));
-                $participants->add(get_string('blogs','blog'), $blogsurls->out());
+                $participants->add(get_string('blogscourse','blog'), $blogsurls->out());
             }
             if (!empty($CFG->enablenotes) && (has_capability('moodle/notes:manage', $this->page->context) || has_capability('moodle/notes:view', $this->page->context))) {
                 $participants->add(get_string('notes','notes'), new moodle_url('/notes/index.php', array('filtertype'=>'course', 'filterselect'=>$course->id)));
@@ -2417,7 +2417,7 @@ class global_navigation extends navigation_node {
           and ($CFG->bloglevel == BLOG_GLOBAL_LEVEL or ($CFG->bloglevel == BLOG_SITE_LEVEL and (isloggedin() and !isguestuser())))
           and has_capability('moodle/blog:view', get_context_instance(CONTEXT_SYSTEM))) {
             $blogsurls = new moodle_url('/blog/index.php', array('courseid' => $filterselect));
-            $coursenode->add(get_string('blogs','blog'), $blogsurls->out());
+            $coursenode->add(get_string('blogssite','blog'), $blogsurls->out());
         }
 
         // Notes
index 9d53be7..a862c42 100644 (file)
@@ -416,6 +416,12 @@ class theme_config {
         if (is_readable($rendererfile)) {
             // may contain core and plugin renderers and renderer factory
             include_once($rendererfile);
+        } else {
+            // check if renderers.php file is missnamed renderer.php
+            if (is_readable($this->dir.'/renderer.php')) {
+                debugging('Developer hint: '.$this->dir.'/renderer.php should be renamed to ' . $this->dir."/renderers.php.
+                    See: http://docs.moodle.org/dev/Output_renderers#Theme_renderers.", DEBUG_DEVELOPER);
+            }
         }
 
         // cascade all layouts properly
@@ -1343,4 +1349,4 @@ class xhtml_container_stack {
     protected function output_log() {
         return '<ul>' . implode("\n", $this->log) . '</ul>';
     }
-}
\ No newline at end of file
+}
index 75baa49..c9512e9 100644 (file)
@@ -359,14 +359,14 @@ function search_generate_text_SQL($parsetree, $datafield, $metafield, $mainidfie
 
 /// First of all, search for reasons to switch to standard SQL generation
 /// Only mysql are supported for now
-    if ($DB->get_db_family() != 'mysql') {
+    if ($DB->get_dbfamily() != 'mysql') {
         return search_generate_SQL($parsetree, $datafield, $metafield, $mainidfield, $useridfield,
                                    $userfirstnamefield, $userlastnamefield, $timefield, $instancefield);
     }
 
 /// Some languages don't have "word separators" and MySQL FULLTEXT doesn't perform well with them, so
 /// switch to standard SQL search generation
-    if ($DB->get_db_family() == 'mysql') {
+    if ($DB->get_dbfamily() == 'mysql') {
         $nonseparatedlangs = array('ja', 'th', 'zh_cn', 'zh_tw');
         if (in_array(current_language(), $nonseparatedlangs)) {
             return search_generate_SQL($parsetree, $datafield, $metafield, $mainidfield, $useridfield,
@@ -445,12 +445,12 @@ function search_generate_text_SQL($parsetree, $datafield, $metafield, $mainidfie
                 $text_sql_string .= ', ' . $metafield;
             }
         /// Begin with the AGAINST clause
-            $text_sql_string .= ') AGAINST (' . "'";
+            $text_sql_string .= ') AGAINST (';
         /// Add the search terms
             $text_sql_string .= ':sgt'.$p;
             $params['sgt'.$p++] = trim($datasearch_clause);
         /// Close AGAINST clause
-            $text_sql_string .= "' IN BOOLEAN MODE)";
+            $text_sql_string .= " IN BOOLEAN MODE)";
         }
     }
 /// Now add the metasearch_clause
@@ -463,12 +463,12 @@ function search_generate_text_SQL($parsetree, $datafield, $metafield, $mainidfie
             }
             $text_sql_string .= 'MATCH (' . $metafield;
         /// Begin with the AGAINST clause
-            $text_sql_string .= ') AGAINST (' . "'";
+            $text_sql_string .= ') AGAINST (';
         /// Add the search terms
             $text_sql_string .= ':sgt'.$p;
             $params['sgt'.$p++] = trim($metasearch_clause);
         /// Close AGAINST clause
-            $text_sql_string .= "' IN BOOLEAN MODE)";
+            $text_sql_string .= " IN BOOLEAN MODE)";
         }
     }
 /// Finally add the non-text conditions
index ccbcad6..e217d9a 100644 (file)
@@ -853,7 +853,11 @@ function setup_get_remote_url() {
         //obscure name found on some servers - this is definitely not supported
         $rurl['fullpath'] = $_SERVER['REQUEST_URI']; // TODO: verify this is always properly encoded
 
-     } else {
+    } else if (strpos($_SERVER['SERVER_SOFTWARE'], 'PHP') === 0) {
+        // built-in PHP Development Server
+        $rurl['fullpath'] = $_SERVER['REQUEST_URI'];
+
+    } else {
         throw new moodle_exception('unsupportedwebserver', 'error', '', $_SERVER['SERVER_SOFTWARE']);
     }
 
index 9cabdc2..c0b2cb4 100644 (file)
@@ -30,12 +30,9 @@ $course = optional_param('course', SITEID, PARAM_INT);   // course id (defaults
 $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) {
-    $url->param('id', $userid);
-}
-if ($course != SITEID) {
-    $url->param('course', $course);
-}
+$url->param('id', $userid);
+$url->param('course', $course);
+
 $PAGE->set_url($url);
 
 if (!$course = $DB->get_record('course', array('id' => $course))) {
index c3801e1..6fd8a46 100644 (file)
@@ -813,6 +813,12 @@ function message_print_recent_conversations($user=null, $showicontext=false) {
 
     $conversations = message_get_recent_conversations($user);
 
+    // Attach context url information to create the "View this conversation" type links
+    foreach($conversations as $conversation) {
+        $conversation->contexturl = new moodle_url("/message/index.php?user2={$conversation->id}");
+        $conversation->contexturlname = get_string('thisconversation', 'message');
+    }
+
     $showotheruser = true;
     message_print_recent_messages_table($conversations, $user, $showotheruser, $showicontext);
 }
index 3c39187..73d3145 100644 (file)
@@ -39,6 +39,18 @@ $capabilities = array(
         )
     ),
 
+    'mod/assignment:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/assignment:submit' => array(
 
         'captype' => 'write',
index bef1da4..725983f 100644 (file)
@@ -32,6 +32,7 @@ $string['allownotes_help'] = 'If enabled, students may enter notes into a text a
 $string['allowresubmit'] = 'Allow resubmitting';
 $string['allowresubmit_help'] = 'If enabled, students will be allowed to resubmit assignments after they have been graded (for them to be re-graded).';
 $string['alreadygraded'] = 'Your assignment has already been graded and resubmission is not allowed.';
+$string['assignment:addinstance'] = 'Add a new assignment';
 $string['assignmentdetails'] = 'Assignment details';
 $string['assignment:exportownsubmission'] = 'Export own submission';
 $string['assignment:exportsubmission'] = 'Export submission';
index 4b787e7..544b8a8 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_assignment'; // Full name of the plugin (used for diagnostics)
 $module->cron      = 60;
index 2d6e5d0..90e4e01 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/chat:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/chat:chat' => array(
 
         'riskbitmask' => RISK_SPAM,
@@ -92,5 +104,3 @@ $capabilities = array(
     ),
 
 );
-
-
index 5a02544..34bfc47 100644 (file)
@@ -47,6 +47,7 @@ $string['explaingeneralconfig'] = 'These settings are <strong>always</strong> us
 $string['explainmethoddaemon'] = 'These settings matter <strong>only</strong> if you have selected "Chat server daemon" for chat_method';
 $string['explainmethodnormal'] = 'These settings matter <strong>only</strong> if you have selected "Normal method" for chat_method';
 $string['generalconfig'] = 'General configuration';
+$string['chat:addinstance'] = 'Add a new chat';
 $string['chat:deletelog'] = 'Delete chat logs';
 $string['chat:exportparticipatedsession'] = 'Export chat session which you took part in';
 $string['chat:exportsession'] = 'Export any chat session';
index 48dba99..3342dc6 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_chat';       // Full name of the plugin (used for diagnostics)
 $module->cron      = 300;
index cf3dfb8..1f5d597 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/choice:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/choice:choose' => array(
 
         'captype' => 'write',
index c069dc1..c1be25c 100644 (file)
@@ -35,6 +35,7 @@ $string['atleastoneoption'] = 'You need to provide at least one possible answer.
 $string['full'] = '(Full)';
 $string['havetologin'] = 'You have to log in before you can submit your choice';
 $string['choice'] = 'Choice';
+$string['choice:addinstance'] = 'Add a new choice';
 $string['choiceclose'] = 'Until';
 $string['choice:deleteresponses'] = 'Delete responses';
 $string['choice:downloadresponses'] = 'Download responses';
index 672932d..fb9ef04 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_choice';     // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 87035f3..652c7c4 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/data:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/data:viewentry' => array(
 
         'captype' => 'read',
index 8abba58..0740288 100644 (file)
@@ -72,6 +72,7 @@ $string['csvfile'] = 'CSV file';
 $string['csvimport'] = 'CSV file import';
 $string['csvimport_help'] = 'Entries may be imported via a plain text file with a list of field names as the first line, then the data, with one record per line.';
 $string['csvwithselecteddelimiter'] = '<acronym title="Comma Separated Values">CSV</acronym> text with selected delimiter:';
+$string['data:addinstance'] = 'Add a new database';
 $string['data:approve'] = 'Approve unapproved entries';
 $string['data:comment'] = 'Write comments';
 $string['data:exportallentries'] = 'Export all database entries';
index 1add7a1..d31fbf0 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_data';       // Full name of the plugin (used for diagnostics)
 $module->cron      = 60;
index fa628d3..30c309a 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/feedback:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/feedback:view' => array(
 
         'captype' => 'read',
index a687ed2..57f2490 100644 (file)
@@ -106,6 +106,7 @@ You can view it <a href="{$a->url}">here</a>.';
 $string['entries_saved'] = 'Your answers have been saved. Thank you.';
 $string['export_questions'] = 'Export questions';
 $string['export_to_excel'] = 'Export to Excel';
+$string['feedback:addinstance'] = 'Add a new feedback';
 $string['feedbackclose'] = 'Close the feedback at';
 $string['feedbackcloses'] = 'Feedback closes';
 $string['feedback:complete'] = 'Complete a feedback';
index 542d14a..e301079 100644 (file)
@@ -25,8 +25,8 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_feedback';   // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
 
index e6b2c10..3900004 100644 (file)
 defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
+
+    'mod/folder:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/folder:view' => array(
         'captype' => 'read',
         'contextlevel' => CONTEXT_MODULE,
index dc66f94..161745c 100644 (file)
@@ -58,6 +58,7 @@ if ($mform->is_cancelled()) {
 
 } else if ($formdata = $mform->get_data()) {
     $formdata = file_postupdate_standard_filemanager($formdata, 'files', $options, $context, 'mod_folder', 'content', 0);
+    $DB->set_field('folder', 'revision', $folder->revision+1, array('id'=>$folder->id));
     redirect(new moodle_url('/mod/folder/view.php', array('id'=>$cm->id)));
 }
 
index 790d7b5..3a55366 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 $string['contentheader'] = 'Content';
+$string['folder:addinstance'] = 'Add a new folder';
 $string['folder:managefiles'] = 'Manage files in folder module';
 $string['folder:view'] = 'View folder content';
 $string['foldercontent'] = 'Files and subfolders';
index eb10fa2..3be807f 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_folder';     // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 2c5aa42..a92df57 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/forum:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/forum:viewdiscussion' => array(
 
         'captype' => 'read',
index 88ab2a8..457ebf0 100644 (file)
@@ -149,6 +149,7 @@ $string['existingsubscribers'] = 'Existing subscribers';
 $string['exportdiscussion'] = 'Export whole discussion';
 $string['forcessubscribe'] = 'This forum forces everyone to be subscribed';
 $string['forum'] = 'Forum';
+$string['forum:addinstance'] = 'Add a new forum';
 $string['forum:addnews'] = 'Add news';
 $string['forum:addquestion'] = 'Add question';
 $string['forumauthorhidden'] = 'Author (hidden)';
index 4f142a7..bce4b6a 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_forum';      // Full name of the plugin (used for diagnostics)
 $module->cron      = 60;
index 98b67fc..36f27f7 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/glossary:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/glossary:write' => array(
 
         'riskbitmask' => RISK_SPAM,
index 78d61fa..7112327 100644 (file)
@@ -170,6 +170,7 @@ $string['fillfields'] = 'Concept and definition are mandatory fields.';
 $string['filtername'] = 'Glossary auto-linking';
 $string['fullmatch'] = 'Match whole words only';
 $string['fullmatch_help'] = 'This setting specifies whether only whole words will be linked, for example, a glossary entry named "construct" will not create a link inside the word "constructivism".';
+$string['glossary:addinstance'] = 'Add a new glossary';
 $string['glossary:approve'] = 'Approve unapproved entries';
 $string['glossary:comment'] = 'Create comments';
 $string['glossary:export'] = 'Export entries';
index 1cf903e..f6ed006 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2012022000;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_glossary';   // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 0b92baf..31c4d09 100644 (file)
@@ -34,6 +34,18 @@ $capabilities = array(
         )
     ),
 
+    'mod/imscp:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
 /* TODO: review public portfolio API first!
     'mod/imscp:portfolioexport' => array(
 
index d7dd234..278d033 100644 (file)
@@ -30,6 +30,7 @@ $string['contentheader'] = 'Content';
 $string['deploymenterror'] = 'Content package error!';
 $string['keepold'] = 'Archive packages';
 $string['keepoldexplain'] = 'How many packages should be archived?';
+$string['imscp:addinstance'] = 'Add a new IMS content package';
 $string['imscp:view'] = 'View IMS content';
 $string['modulename'] = 'IMS content package';
 $string['modulename_help'] = 'An IMS content package allows for packages created according to the IMS Content Packaging specification to be displayed in the course.';
index 2676022..e0887ef 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_imscp';      // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
diff --git a/mod/label/db/access.php b/mod/label/db/access.php
new file mode 100644 (file)
index 0000000..57677e6
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Capability definitions for the label module.
+ *
+ * @package    mod_label
+ * @copyright  2012 The Open University
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or late
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$capabilities = array(
+
+    'mod/label:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
+);
index cbcbe73..dcdedb0 100644 (file)
@@ -24,6 +24,7 @@
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
+$string['label:addinstance'] = 'Add a new label';
 $string['labeltext'] = 'Label text';
 $string['modulename'] = 'Label';
 $string['modulename_help'] = 'A label enables text and images to be inserted among the activity links on the course page.';
index 01f4976..6822156 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_label'; // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index d78341c..4da9931 100644 (file)
@@ -28,6 +28,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/lesson:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/lesson:edit' => array(
 
         'riskbitmask' => RISK_XSS, // we want flash and JS in question pages
index 7898e78..017c10d 100644 (file)
@@ -208,6 +208,7 @@ $string['jumps_help'] = 'Each answer (for questions) or description (for content
 $string['jumpsto'] = 'Jumps to <em>{$a}</em>';
 $string['leftduringtimed'] = 'You have left during a timed lesson.<br />Please click on Continue to restart the lesson.';
 $string['leftduringtimednoretake'] = 'You have left during a timed lesson and you are<br />not allowed to retake or continue the lesson.';
+$string['lesson:addinstance'] = 'Add a new lesson';
 $string['lessonattempted'] = 'Lesson attempted';
 $string['lessonclosed'] = 'This lesson closed on {$a}.';
 $string['lessoncloses'] = 'Lesson closes';
index c65af96..f5ba245 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_lesson'; // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 5f4edc8..51c676d 100644 (file)
@@ -43,6 +43,18 @@ $capabilities = array(
         )
     ),
 
+    'mod/lti:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/lti:grade' => array(
         'riskbitmask' => RISK_XSS,
 
index 1ad131a..60df1ee 100644 (file)
@@ -219,6 +219,7 @@ real estate to the tool, and others provide a more integrated feel with the Mood
         It is possible that browsers will prevent the new window from opening.';
 $string['launchoptions'] = 'Launch Options';
 $string['lti'] = 'LTI';
+$string['lti:addinstance'] = 'Add a new LTI activity';
 $string['lti:addcoursetool'] = 'Grade LTI activities';
 $string['lti:grade'] = 'Grade LTI activities';
 $string['lti:manage'] = 'Edit LTI activities';
index 16fbb7a..fb6d5ed 100644 (file)
@@ -49,7 +49,7 @@
 
 defined('MOODLE_INTERNAL') || die;
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_lti';        // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 247d014..54b4739 100644 (file)
@@ -34,6 +34,19 @@ $capabilities = array(
         )
     ),
 
+    'mod/page:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
+
 /* TODO: review public portfolio API first!
     'mod/page:portfolioexport' => array(
 
index e24dd4e..98af5a6 100644 (file)
@@ -38,6 +38,7 @@ $string['modulenameplural'] = 'Pages';
 $string['neverseen'] = 'Never seen';
 $string['optionsheader'] = 'Options';
 $string['page-mod-page-x'] = 'Any page module page';
+$string['page:addinstance'] = 'Add a new page resource';
 $string['page:view'] = 'View page content';
 $string['pluginadministration'] = 'Page module administration';
 $string['pluginname'] = 'Page';
index 5fb8f80..744c4ee 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_page';       // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index ee7bf4a..57f0e7d 100644 (file)
@@ -40,6 +40,19 @@ $capabilities = array(
         )
     ),
 
+    // Ability to add a new quiz to the course.
+    'mod/quiz:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     // Ability to do the quiz as a 'student'.
     'mod/quiz:attempt' => array(
         'riskbitmask' => RISK_SPAM,
index c8306db..cdbc997 100644 (file)
@@ -540,6 +540,7 @@ $string['questiontext'] = 'Question text';
 $string['questiontextisempty'] = '[Empty question text]';
 $string['questiontype'] = 'Question type {$a}';
 $string['questiontypesetupoptions'] = 'Setup options for question types:';
+$string['quiz:addinstance'] = 'Add a new quiz';
 $string['quiz:attempt'] = 'Attempt quizzes';
 $string['quizavailable'] = 'The quiz is available until: {$a}';
 $string['quizclose'] = 'Close the quiz';
index 63c44d6..3ac6032 100644 (file)
@@ -143,6 +143,29 @@ M.mod_quiz.nav.init = function(Y) {
 
     var form = Y.one('#responseform');
     if (form) {
+        function find_enabled_submit() {
+            // This is rather inelegant, but the CSS3 selector
+            //     return form.one('input[type=submit]:enabled');
+            // does not work in IE7, 8 or 9 for me.
+            var enabledsubmit = null;
+            form.all('input[type=submit]').each(function(submit) {
+                if (!enabledsubmit && !submit.get('disabled')) {
+                    enabledsubmit = submit;
+                }
+            });
+            return enabledsubmit;
+        }
+
+        function nav_to_page(pageno) {
+            Y.one('#followingpage').set('value', pageno);
+
+            // Automatically submit the form. We do it this strange way because just
+            // calling form.submit() does not run the form's submit event handlers.
+            var submit = find_enabled_submit();
+            submit.set('name', '');
+            submit.getDOMNode().click();
+        };
+
         Y.delegate('click', function(e) {
             if (this.hasClass('thispage')) {
                 return;
@@ -157,22 +180,20 @@ M.mod_quiz.nav.init = function(Y) {
             } else {
                 pageno = 0;
             }
-            Y.one('#followingpage').set('value', pageno);
 
             var questionidmatch = this.get('href').match(/#q(\d+)/);
             if (questionidmatch) {
                 form.set('action', form.get('action') + '#q' + questionidmatch[1]);
             }
 
-            form.submit();
+            nav_to_page(pageno);
         }, document.body, '.qnbutton');
     }
 
     if (Y.one('a.endtestlink')) {
         Y.on('click', function(e) {
             e.preventDefault();
-            Y.one('#followingpage').set('value', -1);
-            Y.one('#responseform').submit();
+            nav_to_page(-1);
         }, 'a.endtestlink');
     }
 
index 578958f..25dba1a 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011120703;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030900;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_quiz';       // Full name of the plugin (used for diagnostics)
 $module->cron      = 60;
index 54453da..4f729c6 100644 (file)
@@ -34,6 +34,18 @@ $capabilities = array(
         )
     ),
 
+    'mod/resource:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
 /* TODO: review public portfolio API first!
     'mod/resource:portfolioexport' => array(
 
index d675cc4..ae0ef79 100644 (file)
@@ -81,6 +81,7 @@ $string['printheading'] = 'Display resource name';
 $string['printheadingexplain'] = 'Display resource name above content? Some display types may not display resource name even if enabled.';
 $string['printintro'] = 'Display resource description';
 $string['printintroexplain'] = 'Display resource description below content? Some display types may not display description even if enabled.';
+$string['resource:addinstance'] = 'Add a new resource';
 $string['resourcecontent'] = 'Files and subfolders';
 $string['resourcedetails_sizetype'] = '{$a->size} {$a->type}';
 $string['resource:exportresource'] = 'Export resource';
index cdb37cb..1f3a9c9 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_resource'; // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 101da76..8efc9ae 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/scorm:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/scorm:viewreport' => array(
 
         'captype' => 'read',
index b5ad5d5..9aa0f00 100644 (file)
@@ -253,6 +253,7 @@ $string['review'] = 'Review';
 $string['reviewmode'] = 'Review mode';
 $string['scoes'] = 'Learning objects';
 $string['score'] = 'Score';
+$string['scorm:addinstance'] = 'Add a new SCORM package';
 $string['scormclose'] = 'Until';
 $string['scormcourse'] = 'Learning course';
 $string['scorm:deleteresponses'] = 'Delete SCORM attempts';
index 374b9b4..78b3562 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112901;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_scorm'; // Full name of the plugin (used for diagnostics)
 $module->cron      = 300;
index 212d71c..57e04da 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/survey:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/survey:participate' => array(
 
         'captype' => 'read',
index 9c61c58..699f5a0 100644 (file)
@@ -234,6 +234,7 @@ $string['scaletimes5'] = 'Almost never,Seldom,Sometimes,Often,Almost always';
 $string['seemoredetail'] = 'Click here to see more detail';
 $string['selectedquestions'] = 'Selected questions from a scale, all students';
 $string['summary'] = 'Summary';
+$string['survey:addinstance'] = 'Add a new survey';
 $string['surveycompleted'] = 'You\'ve completed this survey.  The graph below shows a summary of your results compared to the class averages.';
 $string['survey:download'] = 'Download responses';
 $string['surveygraph'] = 'Survey graph';
index 531e5bb..d1f3c8a 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_survey';     // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 23e666b..62b3918 100644 (file)
@@ -2,6 +2,13 @@ This files describes API changes in /mod/* - activity modules,
 information provided here is intended especially for developers.
 
 
+=== 2.3 ===
+
+required changes in code:
+* define the capability mod/xxx:addinstance (and the corresponding lang string)
+  (unless your mod is a MOD_ARCHETYPE_SYSTEM).
+
+
 === 2.2 ===
 
 required changes in code:
index c0d4d81..2706365 100644 (file)
@@ -34,6 +34,18 @@ $capabilities = array(
         )
     ),
 
+    'mod/url:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
 /* TODO: review public portfolio API first!
     'mod/url:portfolioexport' => array(
 
index b152259..dacfb0c 100644 (file)
@@ -67,4 +67,5 @@ $string['printintro'] = 'Display URL description';
 $string['printintroexplain'] = 'Display URL description below content? Some display types may not display description even if enabled.';
 $string['rolesinparams'] = 'Include role names in parameters';
 $string['serverurl'] = 'Server URL';
+$string['url:addinstance'] = 'Add a new URL resource';
 $string['url:view'] = 'View URL';
index 28c0ee4..66357e0 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_url';        // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index 1b8ea47..b2b720b 100644 (file)
@@ -58,7 +58,8 @@ require_login($course->id, true, $cm);
 
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:managewiki', $context);
-add_to_log($course->id, "wiki", "admin", "admin.php?id=$cm->id", "$wiki->id");
+
+add_to_log($course->id, "wiki", "admin", "admin.php?pageid=".$page->id, $page->id, $cm->id);
 
 //Delete page if a page ID to delete was supplied
 if (!empty($delete) && confirm_sesskey()) {
index a269904..3032dba 100644 (file)
@@ -59,7 +59,7 @@ $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST)
 
 require_login($course->id, true, $cm);
 
-add_to_log($course->id, 'wiki', 'comments', 'comments.php?id=' . $cm->id, $wiki->id);
+add_to_log($course->id, 'wiki', 'comments', "comments.php?pageid=".$pageid, $pageid, $cm->id);
 
 /// Print the page header
 $wikipage = new page_wiki_comments($wiki, $subwiki, $cm);
index 19e571f..d9e8d2d 100644 (file)
@@ -66,8 +66,6 @@ $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST)
 
 require_login($course->id, true, $cm);
 
-add_to_log($course->id, 'createpage', 'createpage', 'view.php?id=' . $cm->id, $wiki->id);
-
 $wikipage = new page_wiki_create($wiki, $subwiki, $cm);
 
 if (!empty($swid)) {
@@ -80,22 +78,25 @@ if (!empty($swid)) {
     $wikipage->set_uid($uid);
 }
 
-if (!empty($title)) {
-    $wikipage->set_title($title);
-} else {
-    $wikipage->set_title(get_string('newpage', 'wiki'));
+if (empty($title)) {
+    $title = get_string('newpage', 'wiki');
 }
+$wikipage->set_title($title);
 
 // set page action, and initialise moodle form
 $wikipage->set_action($action);
 
 switch ($action) {
 case 'create':
-    $wikipage->create_page($title);
+    $newpageid = $wikipage->create_page($title);
+    add_to_log($course->id, 'wiki', 'add page', "view.php?pageid=".$newpageid, $newpageid, $cm->id);
+    redirect($CFG->wwwroot . '/mod/wiki/edit.php?pageid='.$newpageid);
     break;
 case 'new':
     if ((int)$wiki->forceformat == 1 && !empty($title)) {
-        $wikipage->create_page($title);
+        $newpageid = $wikipage->create_page($title);
+        add_to_log($course->id, 'wiki', 'add page', "view.php?pageid=".$newpageid, $newpageid, $cm->id);
+        redirect($CFG->wwwroot . '/mod/wiki/edit.php?pageid='.$newpageid);
     } else {
         // create link from moodle navigation block without pagetitle
         $wikipage->print_header();
index 40b0d26..d295aba 100644 (file)
@@ -26,6 +26,18 @@ defined('MOODLE_INTERNAL') || die();
 
 $capabilities = array(
 
+    'mod/wiki:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     'mod/wiki:viewpage' => array(
 
         'captype' => 'read',
index cf62096..c5eed89 100644 (file)
@@ -67,13 +67,14 @@ if ($compare >= $comparewith) {
 }
 
 require_login($course->id, true, $cm);
-add_to_log($course->id, "wiki", "diff", "diff.php?id=$cm->id", "$wiki->id");
 
 $wikipage = new page_wiki_diff($wiki, $subwiki, $cm);
 
 $wikipage->set_page($page);
 $wikipage->set_comparison($compare, $comparewith);
 
+add_to_log($course->id, "wiki", "diff", "diff.php?pageid=".$pageid."&comparewith=".$comparewith."&compare=".$compare, $pageid, $cm->id);
+
 $wikipage->print_header();
 
 $wikipage->print_content();
index f750718..7be82af 100644 (file)
@@ -77,8 +77,6 @@ require_login($course, true, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:editpage', $context);
 
-add_to_log($course->id, 'wiki', 'edit', "edit.php?id=$cm->id", "$wiki->id");
-
 if ($option == get_string('save', 'wiki')) {
     if (!confirm_sesskey()) {
         print_error(get_string('invalidsesskey', 'wiki'));
@@ -87,6 +85,7 @@ if ($option == get_string('save', 'wiki')) {
     $wikipage->set_page($page);
     $wikipage->set_newcontent($newcontent);
     $wikipage->set_upload(true);
+    add_to_log($course->id, 'wiki', 'edit', "view.php?pageid=".$pageid, $pageid, $cm->id);
 } else {
     if ($option == get_string('preview')) {
         if (!confirm_sesskey()) {
index 3b8a344..59851b1 100644 (file)
@@ -61,7 +61,7 @@ $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST)
 require_login($course->id, true, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:viewpage', $context);
-add_to_log($course->id, 'wiki', 'history', 'history.php?id=' . $cm->id, $wiki->id);
+add_to_log($course->id, 'wiki', 'history', "history.php?pageid=".$pageid, $pageid, $cm->id);
 
 /// Print the page header
 $wikipage = new page_wiki_history($wiki, $subwiki, $cm);
index d1db74a..7f13ee2 100644 (file)
@@ -45,7 +45,7 @@ require_login($course->id, true);
 $PAGE->set_pagelayout('incourse');
 $context = get_context_instance(CONTEXT_COURSE, $course->id);
 
-add_to_log($course->id, 'wiki', 'view all', "index.php?id=$course->id", "");
+add_to_log($course->id, 'wiki', 'view', "index.php?id=".$id, "");
 
 /// Get all required stringswiki
 $strwikis = get_string("modulenameplural", "wiki");
index 80aa427..4467b17 100644 (file)
@@ -94,12 +94,12 @@ if ($action == 'delete') {
 
     if ($action == 'edit') {
         $comm->set_action($action, $id, $content);
-
     } else {
         $action = 'add';
         $comm->set_action($action, 0, $content);
     }
 }
+add_to_log($course->id, 'wiki', 'comment', "comments.php?pageid=".$pageid, $pageid, $cm->id);
 
 $comm->print_header();
 $comm->print_content();
index 09a6c58..f778f02 100644 (file)
@@ -225,6 +225,7 @@ $string['wikinowikitext'] = 'No wiki text';
 $string['wikiorderedlist'] = 'Ordered list';
 $string['wikisettings'] = 'Wiki settings';
 $string['wikiunorderedlist'] = 'Unordered list';
+$string['wiki:addinstance'] = 'Add a new wiki';
 $string['wiki:createpage'] = 'Create new wiki pages';
 $string['wiki:editcomment'] = 'Add comments to pages';
 $string['wiki:editpage'] = 'Save wiki pages';
index 562aabf..d82a0f0 100644 (file)
@@ -71,8 +71,6 @@ require_login($course->id, false, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:editpage', $context);
 
-//add_to_log($course->id, "wiki", "lock", "lock.php?id=$cm->id", "$wiki->id");
-
 $wikipage = new page_wiki_lock($wiki, $subwiki, $cm);
 $wikipage->set_page($page);
 
index 341667b..edd49d1 100644 (file)
@@ -56,13 +56,11 @@ if (!$wiki = wiki_get_wiki($subwiki->wikiid)) {
 require_login($course->id, true, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:viewpage', $context);
-add_to_log($course->id, "wiki", "map", "map.php?id=$cm->id", "$wiki->id");
 
-/// Print page header
-
-/// Finish the page
 $wikipage = new page_wiki_map($wiki, $subwiki, $cm);
+add_to_log($course->id, "wiki", "map", "map.php?pageid=".$pageid, $pageid, $cm->id);
 
+// Print page header
 $wikipage->set_view($option);
 $wikipage->set_page($page);
 $wikipage->print_header();
index e4c5164..f725976 100644 (file)
@@ -67,8 +67,6 @@ require_login($course->id, true, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:overridelock', $context);
 
-add_to_log($course->id, "wiki", "overridelocks", "overridelocks.php?id=$cm->id", "$wiki->id");
-
 if (!confirm_sesskey()) {
     print_error(get_string('invalidsesskey', 'wiki'));
 }
@@ -79,6 +77,7 @@ $wikipage->set_page($page);
 if (!empty($section)) {
     $wikipage->set_section($sectioncontent, $section);
 }
+add_to_log($course->id, "wiki", "overridelocks", "view.php?pageid=".$pageid, $pageid, $cm->id);
 
 $wikipage->print_header();
 
index d14c92b..ecf3ff3 100644 (file)
@@ -935,11 +935,14 @@ class page_wiki_create extends page_wiki {
             $this->subwiki = wiki_get_subwiki($swid);
         }
         if ($data) {
+            $this->set_title($data->pagetitle);
             $id = wiki_create_page($this->subwiki->id, $data->pagetitle, $data->pageformat, $USER->id);
         } else {
+            $this->set_title($pagetitle);
             $id = wiki_create_page($this->subwiki->id, $pagetitle, $PAGE->activityrecord->defaultformat, $USER->id);
         }
-        redirect($CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $id);
+        $this->page = $id;
+        return $id;
     }
 }
 
index 30a19ea..6556ed7 100644 (file)
@@ -56,11 +56,10 @@ require_login($course->id, true, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:viewpage', $context);
 
-add_to_log($course->id, "wiki", "view", "prettyview.php?pageid=$pageid", "$wiki->id");
-
 $wikipage = new page_wiki_prettyview($wiki, $subwiki, $cm);
 
 $wikipage->set_page($page);
+add_to_log($course->id, "wiki", "view", "prettyview.php?pageid=".$pageid, $pageid, $cm->id);
 
 $wikipage->print_header();
 $wikipage->print_content();
index a959b32..eba4e23 100644 (file)
@@ -60,8 +60,6 @@ $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST)
 
 require_login($course->id, true, $cm);
 
-add_to_log($course->id, "restore", "restore", "view.php?id=$cm->id", "$wiki->id");
-
 if ($confirm) {
     if (!confirm_sesskey()) {
         print_error(get_string('invalidsesskey', 'wiki'));
@@ -77,6 +75,7 @@ if ($confirm) {
     $wikipage->set_versionid($versionid);
 
 }
+add_to_log($course->id, "wiki", "restore", "view.php?pageid=".$pageid, $pageid, $cm->id);
 
 $wikipage->print_header();
 $wikipage->print_content();
index b289545..c17672b 100644 (file)
@@ -33,7 +33,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_wiki';       // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index c29bfec..85e81e8 100644 (file)
@@ -269,8 +269,6 @@ require_login($course, true, $cm);
 $context = get_context_instance(CONTEXT_MODULE, $cm->id);
 require_capability('mod/wiki:viewpage', $context);
 
-add_to_log($course->id, 'wiki', 'view', 'view.php?id=' . $cm->id, $wiki->id);
-
 // Update 'viewed' state if required by completion system
 require_once($CFG->libdir . '/completionlib.php');
 $completion = new completion_info($course);
@@ -294,6 +292,14 @@ if ($id) {
 $wikipage->set_gid($currentgroup);
 $wikipage->set_page($page);
 
+if($pageid) {
+    add_to_log($course->id, 'wiki', 'view', "view.php?pageid=".$pageid, $pageid, $cm->id);
+} else if($id) {
+    add_to_log($course->id, 'wiki', 'view', "view.php?id=".$id, $id, $cm->id);
+} else if($wid && $title) {
+    add_to_log($course->id, 'wiki', 'view', "view.php?wid=".$wid."&title=".$title, $wid, $cm->id);
+}
+
 $wikipage->print_header();
 $wikipage->print_content();
 
index ca420d2..fb36789 100644 (file)
@@ -59,14 +59,15 @@ if (!$cm = get_coursemodule_from_instance('wiki', $wiki->id)) {
 $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
 
 require_login($course->id, true, $cm);
-add_to_log($course->id, "wiki", "history", "history.php?id=$cm->id", "$wiki->id");
 
-/// Print the page header
 $wikipage = new page_wiki_viewversion($wiki, $subwiki, $cm);
 
 $wikipage->set_page($page);
 $wikipage->set_versionid($versionid);
 
+add_to_log($course->id, "wiki", "history", "viewversion.php?pageid=".$pageid."&versionid=".$versionid, $pageid, $cm->id);
+
+// Print the page header
 $wikipage->print_header();
 $wikipage->print_content();
 
index d1e38e8..59ae764 100644 (file)
@@ -40,6 +40,19 @@ $capabilities = array(
         )
     ),
 
+    // Ability to add a new workshop to the course.
+    'mod/workshop:addinstance' => array(
+        'riskbitmask' => RISK_XSS,
+
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:manageactivities'
+    ),
+
     // Ability to change the current phase (stage) of the workshop, for example
     // allow submitting, start assessment period, close workshop etc.
     'mod/workshop:switchphase' => array(
index f51361f..844d0c7 100644 (file)
@@ -251,6 +251,7 @@ $string['useselfassessment_help'] = 'If enabled, a user may be allocated their o
 $string['useselfassessment_desc'] = 'Students may assess their own work';
 $string['weightinfo'] = 'Weight: {$a}';
 $string['withoutsubmission'] = 'Reviewer without own submission';
+$string['workshop:addinstance'] = 'Add a new workshop';
 $string['workshop:allocate'] = 'Allocate submissions for review';
 $string['workshop:editdimensions'] = 'Edit assessment forms';
 $string['workshopfeatures'] = 'Workshop features';
index 9fd8a8c..28505d5 100644 (file)
@@ -25,7 +25,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$module->version   = 2011112900;       // The current module version (Date: YYYYMMDDXX)
-$module->requires  = 2011112900;       // Requires this Moodle version
+$module->version   = 2012030700;       // The current module version (Date: YYYYMMDDXX)
+$module->requires  = 2012030100.04;    // Requires this Moodle version
 $module->component = 'mod_workshop';   // Full name of the plugin (used for diagnostics)
 $module->cron      = 0;
index b027b16..06ba39f 100644 (file)
@@ -1430,9 +1430,7 @@ class question_bank_view {
         if ($question->id == $this->lastchangedid) {
             $classes[] ='highlight';
         }
-        if (!empty($this->extrarows)) {
-            $classes[] = 'r' . ($rowcount % 2);
-        }
+        $classes[] = 'r' . ($rowcount % 2);
         return $classes;
     }
 
index bde5115..4a2253e 100644 (file)
@@ -884,10 +884,10 @@ class question_attempt {
             case self::PARAM_MARK:
                 // Special case to work around PARAM_NUMBER converting '' to 0.
                 $mark = $this->get_submitted_var($name, PARAM_RAW_TRIMMED, $postdata);
-                if ($mark === '') {
+                if ($mark === '' || is_null($mark)) {
                     return $mark;
                 } else {
-                    return $this->get_submitted_var($name, PARAM_NUMBER, $postdata);
+                    return clean_param(str_replace(',', '.', $mark), PARAM_NUMBER);
                 }
 
             case self::PARAM_FILES:
index 84a4d46..b4fe736 100644 (file)
@@ -123,6 +123,16 @@ class question_attempt_test extends UnitTestCase {
                 'name', question_attempt::PARAM_MARK, array('name' => '123')));
     }
 
+    public function test_get_submitted_var_param_mark_number_uk_decimal() {
+        $this->assertIdentical(123.45, $this->qa->get_submitted_var(
+                'name', question_attempt::PARAM_MARK, array('name' => '123.45')));
+    }
+
+    public function test_get_submitted_var_param_mark_number_eu_decimal() {
+        $this->assertIdentical(123.45, $this->qa->get_submitted_var(
+                'name', question_attempt::PARAM_MARK, array('name' => '123,45')));
+    }
+
     public function test_get_submitted_var_param_mark_invalid() {
         $this->assertIdentical(0.0, $this->qa->get_submitted_var(
                 'name', question_attempt::PARAM_MARK, array('name' => 'frog')));
index 69cf07f..5f82f53 100644 (file)
@@ -44,7 +44,7 @@ question_bank = {
         question_bank.firstcheckbox = document.getElementById(firstcbid);
 
         // Add the event handler.
-        YAHOO.util.Event.addListener(question_bank.headercheckbox, 'change', question_bank.header_checkbox_click);
+        YAHOO.util.Event.addListener(question_bank.headercheckbox, 'click', question_bank.header_checkbox_click);
     },
 
     header_checkbox_click: function() {
index 4b499f3..c1ca119 100644 (file)
@@ -23,7 +23,7 @@ if ($hascustommenu) {
 if (!empty($PAGE->theme->settings->tagline)) {
     $tagline = $PAGE->theme->settings->tagline;
 } else {
-    $tagline = "Another Moodle Theme";
+    $tagline = '<!-- There was no custom tagline set -->';
 }
 
 if (!empty($PAGE->theme->settings->footertext)) {
@@ -49,90 +49,90 @@ echo $OUTPUT->doctype() ?>
   <div id="page-wrap1">
     <div id="page-wrap2">
 
-       <div id="wrapper" class="clearfix">
+    <div id="wrapper" class="clearfix">
 
 <!-- START OF HEADER -->
 
-           <div id="page-header">
-                       <div id="page-header-wrapper" class="wrapper clearfix">
+        <div id="page-header">
+            <div id="page-header-wrapper" class="wrapper clearfix">
 
-                   <div id="headermenus" class="clearfix">
-                       <div class="headermenu clearfix">
-                                       <?php
-                                       echo $OUTPUT->lang_menu();
-                                       echo $OUTPUT->login_info();
-                                   echo $PAGE->headingmenu;
-                                   ?>
-                               </div>
-                           <?php if ($hascustommenu) { ?>
-                                               <div id="custommenu"><?php echo $custommenu; ?></div>
-                                       <?php } else { ?>
-                                               <div id="custommenu" style="line-height:1em;">&nbsp;</div> <!-- temporary until I find a better fix -->
-                                       <?php } ?>
+                <div id="headermenus" class="clearfix">
+                    <div class="headermenu clearfix">
+                        <?php
+                            echo $OUTPUT->lang_menu();
+                            echo $OUTPUT->login_info();
+                            echo $PAGE->headingmenu;
+                        ?>
+                    </div>
+                    <?php if ($hascustommenu) { ?>
+                        <div id="custommenu"><?php echo $custommenu; ?></div>
+                    <?php } else { ?>
+                        <div id="custommenu" style="line-height:1em;">&nbsp;</div> <!-- temporary until I find a better fix -->
+                    <?php } ?>
 
-                       </div>
+                </div>
 
-               </div>
-           </div>
+            </div>
+        </div>
 
 <!-- END OF HEADER -->
 
 <!-- START OF CONTENT -->
 
-               <div id="page-content-wrapper" class="wrapper clearfix">
-                   <div id="page-content">
-                   <div id="region-main-box">
-                           <div id="region-post-box">
-
-                           <div id="region-main-wrap">
-                                   <div id="region-main">
-                                   <div class="region-content">
-
-                                                                       <div id="region-header">
-                                                                   <h1 class="headermain"><?php echo $PAGE->heading ?></h1>
-                                                                   <p class="tagline"><?php echo $tagline ?></p>
-                                                               </div>
-
-                                           <?php echo $OUTPUT->main_content() ?>
-
-                                       </div>
-                               </div>
-                               </div>
-
-                       <?php if ($hassidepost) { ?>
-                           <div id="region-post" class="block-region">
-                               <div id="region-post-wrap-1">
-                                       <div id="region-post-wrap-2">
-                                           <div class="region-content">
-                                                   <?php echo $OUTPUT->blocks_for_region('side-post') ?>
-                                               </div>
-                                               </div>
-                                       </div>
-                               </div>
-                           <?php } ?>
-
-                       </div>
-                   </div>
-               </div>
-       </div>
+        <div id="page-content-wrapper" class="wrapper clearfix">
+            <div id="page-content">
+                <div id="region-main-box">
+                    <div id="region-post-box">
+
+                        <div id="region-main-wrap">
+                            <div id="region-main">
+                                <div class="region-content">
+
+                                    <div id="region-header">
+                                        <h1 class="headermain"><?php echo $PAGE->heading ?></h1>
+                                        <p class="tagline"><?php echo $tagline ?></p>
+                                    </div>
+
+                                    <?php echo $OUTPUT->main_content() ?>
+
+                                </div>
+                            </div>
+                        </div>
+
+                        <?php if ($hassidepost) { ?>
+                        <div id="region-post" class="block-region">
+                            <div id="region-post-wrap-1">
+                                <div id="region-post-wrap-2">
+                                    <div class="region-content">
+                                        <?php echo $OUTPUT->blocks_for_region('side-post') ?>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <?php } ?>
+
+                    </div>
+                </div>
+            </div>
+        </div>
 
 <!-- END OF CONTENT -->
 
-       </div> <!-- END #wrapper -->
+    </div> <!-- END #wrapper -->
 
-               </div>
-       </div>
+        </div>
+    </div>
 
 <!-- START OF FOOTER -->
     <div id="page-footer" class="wrapper clearfix">
     <?php echo $footnote ?>
-           <p class="helplink"><?php echo page_doc_link(get_string('moodledocslink')) ?></p>
+        <p class="helplink"><?php echo page_doc_link(get_string('moodledocslink')) ?></p>
         <?php
-                   echo $OUTPUT->login_info();
-                       echo $OUTPUT->home_link();
-               echo $OUTPUT->standard_footer_html();
-           ?>
-       </div>
+            echo $OUTPUT->login_info();
+            echo $OUTPUT->home_link();
+            echo $OUTPUT->standard_footer_html();
+        ?>
+    </div>
 
 <!-- END OF FOOTER -->
 
@@ -141,4 +141,4 @@ echo $OUTPUT->doctype() ?>
 
 <?php echo $OUTPUT->standard_end_of_body_html() ?>
 </body>
-</html>
\ No newline at end of file
+</html>
index bd94d71..d96a89f 100644 (file)
@@ -4,35 +4,34 @@ defined('MOODLE_INTERNAL') || die;
 
 if ($ADMIN->fulltree) {
 
-// link color setting
-$name = 'theme_fusion/linkcolor';
-$title = get_string('linkcolor','theme_fusion');
-$description = get_string('linkcolordesc', 'theme_fusion');
-$default = '#2d83d5';
-$previewconfig = NULL;
-$setting = new admin_setting_configcolourpicker($name, $title, $description, $default, $previewconfig);
-$settings->add($setting);
-
-
-// Tag line setting
-$name = 'theme_fusion/tagline';
-$title = get_string('tagline','theme_fusion');
-$description = get_string('taglinedesc', 'theme_fusion');
-$setting = new admin_setting_configtextarea($name, $title, $description, '');
-$settings->add($setting);
-
-// Foot note setting
-$name = 'theme_fusion/footertext';
-$title = get_string('footertext','theme_fusion');
-$description = get_string('footertextdesc', 'theme_fusion');
-$setting = new admin_setting_confightmleditor($name, $title, $description, '');
-$settings->add($setting);
-
-// Custom CSS file
-$name = 'theme_fusion/customcss';
-$title = get_string('customcss','theme_fusion');
-$description = get_string('customcssdesc', 'theme_fusion');
-$setting = new admin_setting_configtextarea($name, $title, $description, '');
-$settings->add($setting);
-
-}
\ No newline at end of file
+    // link color setting
+    $name = 'theme_fusion/linkcolor';
+    $title = get_string('linkcolor','theme_fusion');
+    $description = get_string('linkcolordesc', 'theme_fusion');
+    $default = '#2d83d5';
+    $previewconfig = NULL;
+    $setting = new admin_setting_configcolourpicker($name, $title, $description, $default, $previewconfig);
+    $settings->add($setting);
+
+    // Tag line setting
+    $name = 'theme_fusion/tagline';
+    $title = get_string('tagline','theme_fusion');
+    $description = get_string('taglinedesc', 'theme_fusion');
+    $setting = new admin_setting_configtext($name, $title, $description, '');
+    $settings->add($setting);
+
+    // Foot note setting
+    $name = 'theme_fusion/footertext';
+    $title = get_string('footertext','theme_fusion');
+    $description = get_string('footertextdesc', 'theme_fusion');
+    $setting = new admin_setting_confightmleditor($name, $title, $description, '');
+    $settings->add($setting);
+
+    // Custom CSS file
+    $name = 'theme_fusion/customcss';
+    $title = get_string('customcss','theme_fusion');
+    $description = get_string('customcssdesc', 'theme_fusion');
+    $setting = new admin_setting_configtextarea($name, $title, $description, '');
+    $settings->add($setting);
+
+}
index 892a933..25e2d18 100644 (file)
@@ -30,7 +30,7 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$version  = 2012031500.00;              // YYYYMMDD      = weekly release date of this DEV branch
+$version  = 2012031500.04;              // YYYYMMDD      = weekly release date of this DEV branch
                                         //         RR    = release increments - 00 in DEV branches
                                         //           .XX = incremental changes