]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-7028 rewritten course reset + forum role_unassign cleanup fixes; merged from...
authorskodak <skodak>
Thu, 29 Nov 2007 14:43:04 +0000 (14:43 +0000)
committerskodak <skodak>
Thu, 29 Nov 2007 14:43:04 +0000 (14:43 +0000)
39 files changed:
course/reset.php
course/reset_form.php [new file with mode: 0644]
group/groupings.php
group/lib.php
lang/en_utf8/assignment.php
lang/en_utf8/calendar.php
lang/en_utf8/chat.php
lang/en_utf8/choice.php
lang/en_utf8/data.php
lang/en_utf8/forum.php
lang/en_utf8/glossary.php
lang/en_utf8/grades.php
lang/en_utf8/group.php
lang/en_utf8/lesson.php
lang/en_utf8/moodle.php
lang/en_utf8/notes.php
lang/en_utf8/quiz.php
lang/en_utf8/role.php
lang/en_utf8/scorm.php
lang/en_utf8/survey.php
lib/gradelib.php
lib/moodlelib.php
mod/assignment/lib.php
mod/assignment/type/offline/assignment.class.php
mod/assignment/type/online/assignment.class.php
mod/assignment/type/upload/assignment.class.php
mod/assignment/type/uploadsingle/assignment.class.php
mod/chat/lib.php
mod/choice/lib.php
mod/data/lib.php
mod/forum/lib.php
mod/glossary/lib.php
mod/label/lib.php
mod/lesson/lib.php
mod/quiz/lib.php
mod/resource/lib.php
mod/scorm/lib.php
mod/survey/lib.php
notes/lib.php

index 4f078f139bc62a5cabf46565bef3620c2ec8c61c..cf165cd51ccc05dfde25097fe69d2690435df9fc 100755 (executable)
@@ -7,101 +7,78 @@ of general course data like students, teachers, logs, events and groups as well
 specific data.  Each module must be modified to take advantage of this new feature.
 The feature will also reset the start date of the course if necessary.
 */
-    require('../config.php');
 
-    $id = required_param('id', PARAM_INT);
+require('../config.php');
+require_once('reset_form.php');
 
-    if (! $course = get_record('course', 'id', $id)) {
-        error("Course is misconfigured");
-    }
-
-    require_login($course->id);
+$id = required_param('id', PARAM_INT);
 
-    require_capability('moodle/course:update', get_context_instance(CONTEXT_COURSE, $course->id));
+if (!$course = get_record('course', 'id', $id)) {
+    error("Course is misconfigured");
+}
 
-    $strreset = get_string('reset');
-    $strresetcourse = get_string('resetcourse');
-    $strremove = get_string('remove');
+require_login($course);
+require_capability('moodle/course:update', get_context_instance(CONTEXT_COURSE, $course->id));
 
-    $navlinks = array();
-    $navlinks[] = array('name' => $strresetcourse, 'link' => null, 'type' => 'misc');
-    $navigation = build_navigation($navlinks);
+$strreset       = get_string('reset');
+$strresetcourse = get_string('resetcourse');
+$strremove      = get_string('remove');
 
-    print_header($course->fullname.': '.$strresetcourse, $course->fullname.': '.$strresetcourse, $navigation);
+$navlinks = array(array('name' => $strresetcourse, 'link' => null, 'type' => 'misc'));
+$navigation = build_navigation($navlinks);
 
-    print_simple_box_start();
+$mform = new course_reset_form();
 
-    print_heading($strresetcourse);
+if ($mform->is_cancelled()) {
+    redirect($CFG->wwwroot.'/course/view.php?id='.$id);
 
-/// If we have data, then process it.
-    if ($data = data_submitted() and confirm_sesskey()) {
+} else if ($data = $mform->get_data(false)) { // no magic quotes
 
-        $data->courseid = $course->id;
+    if (isset($data->selectdefault)) {
+        $_POST = array();
+        $mform = new course_reset_form();
+        $mform->load_defaults();
 
-        reset_course_userdata($data, true);
+    } else if (isset($data->deselectall)) {
+        $_POST = array();
+        $mform = new course_reset_form();
 
-        if (!empty($data->reset_start_date)) {
-            if (set_field('course', 'startdate',
-                             make_timestamp($data->startyear, $data->startmonth, $data->startday),
-                             'id', $course->id)) {
-                notify(get_string('datechanged'), 'notifysuccess');
-            }
+    } else {
+        print_header($course->fullname.': '.$strresetcourse, $course->fullname.': '.$strresetcourse, $navigation);
+        print_heading($strresetcourse);
+
+        $data->reset_start_date_old = $course->startdate;
+        $status = reset_course_userdata($data);
+
+        $data = array();;
+        foreach ($status as $item) {
+            $line = array();
+            $line[] = $item['component'];
+            $line[] = $item['item'];
+            $line[] = ($item['error']===false) ? get_string('ok') : '<div class="notifyproblem">'.$item['error'].'</div>';
+            $data[] = $line;
         }
+
+        $table = new object();
+        $table->head  = array(get_string('resetcomponent'), get_string('resettask'), get_string('resetstatus'));
+        $table->size  = array('20%', '40%', '40%');
+        $table->align = array('left', 'left', 'left');
+        $table->width = '80%';
+        $table->data  = $data;
+        print_table($table);
+
         print_continue('view.php?id='.$course->id);  // Back to course page
-        print_simple_box_end();
         print_footer($course);
         exit;
     }
+}
 
+print_header($course->fullname.': '.$strresetcourse, $course->fullname.': '.$strresetcourse, $navigation);
+print_heading($strresetcourse);
 
+print_simple_box(get_string('resetinfo'), 'center', '60%');
 
-/// Print forms so the user can make choices about what to delete
-
-    print_simple_box(get_string('resetinfo'), 'center', '60%');
-
-    echo '<form id="reset" action="reset.php" method="POST">';
-
-    print_heading(get_string('course'), 'left', 3);
-
-    echo '<div class="courseinfo">';
-    echo $strremove.':<br />';
-    print_checkbox('reset_teachers', 1, false, get_string('teachers'), '', '');  echo '<br />';
-    print_checkbox('reset_students', 1, true, get_string('students'), '', '');  echo '<br />';
-    print_checkbox('reset_events', 1, true, get_string('courseevents', 'calendar'), '', '');  echo '<br />';
-    print_checkbox('reset_logs', 1, true, get_string('logs'), '', '');  echo '<br />';
-    print_checkbox('reset_groups', 1, true, get_string('groups'), '', '');  echo '<br />';
-    print_checkbox('reset_start_date', 1, true, get_string('startdate'), '', '');
-    print_date_selector('startday', 'startmonth', 'startyear');
-    helpbutton('coursestartdate', get_string('startdate'));
-    echo '</div>';
-
-    // Check each module and see if there is specific data to be removed
-
-    if ($allmods = get_records('modules') ) {
-        foreach ($allmods as $mod) {
-            $modname = $mod->name;
-            $modfile = $CFG->dirroot .'/mod/'. $modname .'/lib.php';
-            $mod_reset_course_form = $modname .'_reset_course_form';
-            if (file_exists($modfile)) {
-                @include_once($modfile);
-                if (function_exists($mod_reset_course_form)) {
-                    print_heading(get_string('modulenameplural', $modname), 'left', 3);
-                    echo '<div class="'.$modname.'info">';
-                    $mod_reset_course_form($course);
-                    echo '</div>';
-                }
-            }
-        }
-    } else {
-        error('No modules are installed!');
-    }
-
-    echo '<input name="id" value="'.$course->id.'" type="hidden" />';
-    echo '<input name="sesskey" value="'.sesskey().'" type="hidden" />';
-    echo '<p align="center"><input name="submit" value="'.$strresetcourse.'" type="submit" /></p>';
-    echo '</form>';
-
-    print_simple_box_end();
-    print_footer($course);
+$mform->display();
+print_footer($course);
 
 ?>
diff --git a/course/reset_form.php b/course/reset_form.php
new file mode 100644 (file)
index 0000000..37b47c0
--- /dev/null
@@ -0,0 +1,124 @@
+<?php // $Id$
+require_once $CFG->libdir.'/formslib.php';
+
+class course_reset_form extends moodleform {
+    function definition (){
+        global $CFG, $COURSE;
+
+        $mform =& $this->_form;
+
+        $mform->addElement('header', 'generalheader', get_string('general'));
+
+        $mform->addElement('date_selector', 'reset_start_date', get_string('startdate'), array('optional'=>true));
+        $mform->setHelpButton('reset_start_date', array('coursestartdate', get_string('startdate')));
+        $mform->addElement('checkbox', 'reset_events', get_string('deleteevents', 'calendar'));
+        $mform->addElement('checkbox', 'reset_logs', get_string('deletelogs'));
+        $mform->addElement('checkbox', 'reset_notes', get_string('deletenotes', 'notes'));
+
+
+        $mform->addElement('header', 'rolesheader', get_string('roles'));
+
+        $roles = get_assignable_roles(get_context_instance(CONTEXT_COURSE, $COURSE->id));
+        $mform->addElement('select', 'reset_roles', get_string('unenrolroleusers'), $roles, array('multiple' => 'multiple'));
+        $mform->addElement('checkbox', 'reset_roles_overrides', get_string('deletecourseoverrides', 'role'));
+        $mform->setAdvanced('reset_roles_overrides');
+        $mform->addElement('checkbox', 'reset_roles_local', get_string('deletelocalroles', 'role'));
+
+
+        $mform->addElement('header', 'gradebookheader', get_string('gradebook', 'grades'));
+
+        $mform->addElement('checkbox', 'reset_gradebook_items', get_string('removeallcourseitems', 'grades'));
+        $mform->addElement('checkbox', 'reset_gradebook_grades', get_string('removeallcoursegrades', 'grades'));
+        $mform->disabledIf('reset_gradebook_grades', 'reset_gradebook_items', 'checked');
+
+
+        $mform->addElement('header', 'groupheader', get_string('groups'));
+
+        $mform->addElement('checkbox', 'reset_groups_remove', get_string('deleteallgroups', 'group'));
+        $mform->setAdvanced('reset_groups_remove');
+        $mform->addElement('checkbox', 'reset_groups_members', get_string('removegroupsmembers', 'group'));
+        $mform->setAdvanced('reset_groups_members');
+        $mform->disabledIf('reset_groups_members', 'reset_groups_remove', 'checked');
+
+        if (!empty($CFG->enablegroupings)) {
+            $mform->addElement('checkbox', 'reset_groupings_remove', get_string('deleteallgroupings', 'group'));
+            $mform->setAdvanced('reset_groupings_remove');
+            $mform->addElement('checkbox', 'reset_groupings_members', get_string('removegroupingsmembers', 'group'));
+            $mform->setAdvanced('reset_groupings_members');
+            $mform->disabledIf('reset_groupings_members', 'reset_groupings_remove', 'checked');
+        }
+
+        $unsupported_mods = array();
+        if ($allmods = get_records('modules') ) {
+            foreach ($allmods as $mod) {
+                $modname = $mod->name;
+                if (!count_records($modname, 'course', $COURSE->id)) {
+                    continue; // skip mods with no instances
+                }
+                $modfile = $CFG->dirroot."/mod/$modname/lib.php";
+                $mod_reset_course_form_definition = $modname.'_reset_course_form_definition';
+                $mod_reset__userdata = $modname.'_reset_userdata';
+                if (file_exists($modfile)) {
+                    include_once($modfile);
+                    if (function_exists($mod_reset_course_form_definition)) {
+                        $mod_reset_course_form_definition($mform);
+                    } else if (!function_exists($mod_reset__userdata)) {
+                        $unsupported_mods[] = $mod;
+                    }
+                } else {
+                    debugging('Missing lib.php in '.$modname.' module');
+                }
+            }
+        }
+        // mention unsupported mods
+        if (!empty($unsupported_mods)) {
+            $mform->addElement('header', 'unsupportedheader', get_string('resetnotimplemented'));
+            foreach($unsupported_mods as $mod) {
+                $mform->addElement('static', 'unsup'.$mod->name, get_string('modulenameplural', $mod->name));
+                $mform->setAdvanced('unsup'.$mod->name);
+            }
+        }
+
+        $mform->addElement('hidden', 'id', $COURSE->id);
+
+        $buttonarray = array();
+        $buttonarray[] = &$mform->createElement('submit', 'submitbutton', get_string('resetcourse'));
+        $buttonarray[] = &$mform->createElement('submit', 'selectdefault', get_string('selectdefault'));
+        $buttonarray[] = &$mform->createElement('submit', 'deselectall', get_string('deselectall'));
+        $buttonarray[] = &$mform->createElement('cancel');
+        $mform->addGroup($buttonarray, 'buttonar', '', array(' '), false);
+        $mform->closeHeaderBefore('buttonar');
+    }
+
+    function load_defaults() {
+        global $CFG, $COURSE;
+
+        $mform =& $this->_form;
+
+        $defaults = array ('reset_events'=>1, 'reset_logs'=>1, 'reset_roles_local'=>1, 'reset_gradebook_grades'=>1, 'reset_notes'=>1);
+
+        if (!empty($COURSE->defaultrole)) {
+            $defaults['reset_roles'] = array($COURSE->defaultrole);
+        } else {
+            $defaults['reset_roles'] = array($CFG->defaultcourseroleid);
+        }
+
+        if ($allmods = get_records('modules') ) {
+            foreach ($allmods as $mod) {
+                $modname = $mod->name;
+                $modfile = $CFG->dirroot."/mod/$modname/lib.php";
+                $mod_reset_course_form_defaults = $modname.'_reset_course_form_defaults';
+                if (file_exists($modfile)) {
+                    @include_once($modfile);
+                    if (function_exists($mod_reset_course_form_defaults)) {
+                        $defaults = $defaults + $mod_reset_course_form_defaults($COURSE);
+                    }
+                }
+            }
+        }
+
+        foreach ($defaults as $element=>$default) {
+            $mform->setDefault($element, $default);
+        }
+    }
+}
index fdab604719b8e55a150c6d95e8d63b3637b11437..0323575963f511ac14637f8cdb9cb3a718df1500 100644 (file)
@@ -67,7 +67,7 @@ if ($groupings = get_records('groupings', 'courseid', $course->id)) {
         $data[] = $line;
     }
 }
-$tabke = new object();
+$table = new object();
 $table->head  = array($strgrouping, $strgroups, $struses, $stredit);
 $table->size  = array('30%', '50%', '10%', '10%');
 $table->align = array('left', 'left', 'center', 'center');
index 7d06010b4a1835b750dca9f9016fa3e003a965d8..84bee7ecc043eff9a78f2342338e55eb19b2dc12 100644 (file)
@@ -163,6 +163,8 @@ function groups_delete_group($groupid) {
         return false;
     }
 
+    // delete group calendar events
+    delete_records('event', 'groupid', $groupid);
     //first delete usage in groupings_groups
     delete_records('groupings_groups', 'groupid', $groupid);
     //delete members
@@ -195,7 +197,7 @@ function groups_delete_grouping($groupingid) {
 }
 
 /**
- * Remove all users from group
+ * Remove all users from all groups in course
  * @param int $courseid
  * @param bool $showfeedback
  * @return bool success
@@ -203,10 +205,9 @@ function groups_delete_grouping($groupingid) {
 function groups_delete_group_members($courseid, $showfeedback=false) {
     global $CFG;
 
-    $sql = "DELETE FROM {$CFG->prefix}groups_members
-             WHERE groupid in (SELECT id FROM {$CFG->prefix}groups g WHERE g.courseid = $courseid)";
+    $groupssql = "SELECT id FROM {$CFG->prefix}groups g WHERE g.courseid = $courseid";
+    delete_records_select('groups_members', "groupid IN ($groupssql)");
 
-    execute_sql($sql, false);
     if ($showfeedback) {
         notify(get_string('deleted').' groups_members');
     }
@@ -214,6 +215,25 @@ function groups_delete_group_members($courseid, $showfeedback=false) {
     return true;
 }
 
+/**
+ * Remove all groups from all groupings in course
+ * @param int $courseid
+ * @param bool $showfeedback
+ * @return bool success
+ */
+function groups_delete_groupings_groups($courseid, $showfeedback=false) {
+    global $CFG;
+
+    $groupssql = "SELECT id FROM {$CFG->prefix}groups g WHERE g.courseid = $courseid";
+    delete_records_select('groupings_groups', "groupid IN ($groupssql)");
+
+    if ($showfeedback) {
+        notify(get_string('deleted').' groupings_groups');
+    }
+
+    return true;
+}
+
 /**
  * Delete all groups from course
  * @param int $courseid
@@ -224,12 +244,11 @@ function groups_delete_groups($courseid, $showfeedback=false) {
     global $CFG;
     require_once($CFG->libdir.'/gdlib.php');
 
-    // delete any uses of groups
-    $sql = "DELETE FROM {$CFG->prefix}groupings_groups
-             WHERE groupid in (SELECT id FROM {$CFG->prefix}groups g WHERE g.courseid = $courseid)";
-    execute_sql($sql, false);
+    $groupssql = "SELECT id FROM {$CFG->prefix}groups g WHERE g.courseid = $courseid";
 
-    groups_delete_group_members($courseid, false);
+    // delete any uses of groups
+    groups_delete_groupings_groups($courseid, $showfeedback);
+    groups_delete_group_members($courseid, $showfeedback);
 
     // delete group pictures
     if ($groups = get_records('groups', 'courseid', $courseid)) {
@@ -238,6 +257,9 @@ function groups_delete_groups($courseid, $showfeedback=false) {
         }
     }
 
+    // delete group calendar events
+    delete_records_select('event', "groupid IN ($groupssql)");
+
     delete_records('groups', 'courseid', $courseid);
     if ($showfeedback) {
         notify(get_string('deleted').' groups');
index 8af0a8c405a8d00c5c85b7a01353b7470325d831..8bbed558392f5c42afff3a7cc6967b89fcf703f2 100644 (file)
@@ -27,6 +27,7 @@ $string['commentinline'] = 'Comment inline';
 $string['configitemstocount'] = 'Nature of items to be counted for student submissions in online assignments.';
 $string['configmaxbytes'] = 'Default maximum assignment size for all assignments on the site (subject to course limits and other local settings)';
 $string['confirmdeletefile'] = 'Are you absolutely sure you want to delete this file?<br /><strong>$a</strong>';
+$string['deleteallsubmissions'] = 'Delete all submissions';
 $string['deletefilefailed'] = 'Deleting of file failed.';
 $string['description'] = 'Description';
 $string['draft'] = 'Draft';
index 6c2162487b2a9ab7b3888feeda351881c4c4d26d..43928ff42759733fc7e2dbf0b6644c7b9edb5c90 100644 (file)
@@ -17,6 +17,7 @@ $string['dayview'] = 'Day View';
 $string['daywithnoevents'] = 'There are no events this day.';
 $string['default'] = 'Default';
 $string['deleteevent'] = 'Delete event';
+$string['deleteevents'] = 'Delete events';
 $string['detailedmonthview'] = 'Detailed Month View';
 $string['durationminutes'] = 'Duration in minutes';
 $string['durationnone'] = 'Without duration';
index c2347a8043cf15d985f3d32bb3d155fc0551f313..37c4c5d8da998fc56b89a463b506c8988e6d6a12 100644 (file)
@@ -48,6 +48,7 @@ $string['nomessages'] = 'No messages yet';
 $string['normalkeepalive'] = 'KeepAlive';
 $string['normalstream'] = 'Stream';
 $string['noscheduledsession'] = 'No scheduled session';
+$string['removemessages'] = 'Remove all messages';
 $string['repeatdaily'] = 'At the same time every day';
 $string['repeatnone'] = 'No repeats - publish the specified time only';
 $string['repeattimes'] = 'Repeat sessions';
index d9daf7c8dfd33745ad95b20a378124bfd6d4e233..bc0a1160f10ff9e6f478b14ac212f9c064cba060 100644 (file)
@@ -38,6 +38,7 @@ $string['publishalways'] = 'Always show results to students';
 $string['publishanonymous'] = 'Publish anonymous results, do not show student names';
 $string['publishnames'] = 'Publish full results, showing names and their choices';
 $string['publishnot'] = 'Do not publish results to students';
+$string['removeresponses'] = 'Remove all responses';
 $string['responses'] = 'Responses';
 $string['responsesto'] = 'Responses to $a';
 $string['savemychoice'] = 'Save my choice';
index 2a6764133321ac5d50df6f7ef9b27925716ef001..4d23c617a5363f1ac2ce1bb8170afb6714b676a5 100644 (file)
@@ -58,7 +58,9 @@ $string['defaultfielddelimiter'] = '(default is the comma character)';
 $string['defaultfieldenclosure'] = '(default is none)';
 $string['defaultsortfield'] = 'Default sort field';
 $string['delete'] = 'Delete';
+$string['deleteallentries'] = 'Delete all entries';
 $string['deletecomment'] = 'Are you sure you want to delete this comment?';
+$string['deletenotenrolled'] = 'Delete entries by users not enrolled';
 $string['deleted'] = 'deleted';
 $string['deletefield'] = 'Delete an existing field';
 $string['deletewarning'] = 'Are you sure you want to delete this preset?';
index ecb41b5112eac2aa98da93848c1d43e7f7b8e3c1..63db37d14ca56da21fcfa2f7d7eea0574e5a544d 100644 (file)
@@ -206,8 +206,10 @@ $string['repliesmany'] = '$a replies so far';
 $string['repliesone'] = '$a reply so far';
 $string['reply'] = 'Reply';
 $string['replyforum'] = 'Reply to forum';
-$string['resetforums'] = 'Remove all posts from these types of forums';
-$string['resetsubscriptions'] = 'Remove forum subscriptions';
+$string['resetforumsall'] = 'Delete all posts';
+$string['resetforums'] = 'Delete posts from';
+$string['resetsubscriptions'] = 'Delete all forum subscriptions';
+$string['resettrackprefs'] = 'Delete all forum tracking preferences';
 $string['rsssubscriberssdiscussions'] = 'Display the RSS feed for \'$a\' discussions';
 $string['rsssubscriberssposts'] = 'Display the RSS feed for \'$a\' posts';
 $string['search'] = 'Search';
index e92bcabd23d0ef9ed62f2cd82e6894ceff12311e..e0e407027144f83993fe60881ed652069b0b0f73 100644 (file)
@@ -52,7 +52,7 @@ $string['commentson'] = 'Comments on';
 $string['commentupdated'] = 'The comment has been updated.';
 $string['concept'] = 'Concept';
 $string['concepts'] = 'Concepts';
-$string['configenablerssfeeds'] = 'This switch will enable the possibility of RSS feeds for all glosaries.  You will still need to turn feeds on manually in the settings for each glossary.';
+$string['configenablerssfeeds'] = 'This switch will enable the possibility of RSS feeds for all glossaries.  You will still need to turn feeds on manually in the settings for each glossary.';
 $string['currentglossary'] = 'Current glossary';
 $string['changeto'] = 'change to $a';
 $string['current']= 'Currently sorted $a';
@@ -69,6 +69,7 @@ $string['defaultsortorder'] = 'Default sort order';
 $string['definition'] = 'Definition';
 $string['definitions'] = 'Definitions';
 $string['deleteentry'] = 'Delete entry';
+$string['deletenotenrolled'] = 'Delete entries by users not enrolled';
 $string['deletingcomment'] = 'Deleting comment';
 $string['deletingnoneemptycategory'] = 'Deleting this category will not delete the entries it contains - they will be marked as uncategorised.';
 $string['descending'] = 'descending';
@@ -172,6 +173,8 @@ $string['ratingsuse'] = 'Use ratings';
 $string['ratingtime'] = 'Restrict ratings to entries with dates in this range:';
 $string['rejectedentries'] = 'Rejected entries';
 $string['rejectionrpt'] = 'Rejection Report';
+$string['resetglossariesall'] = 'Delete entries from all glossaries';
+$string['resetglossaries'] = 'Delete entries from';
 $string['rsssubscriberss'] = 'Display the RSS feed for \'$a\' concepts';
 $string['searchindefinition'] = 'Search full text';
 $string['secondaryglossary'] = 'Secondary glossary';
index c64423dc7bdcd6ec5e2a74a9eb77f34f0d628524..6b2bfa997ebe8a24fd888c87d727f32e9a386bbe 100644 (file)
@@ -375,6 +375,8 @@ $string['rangesdisplaytype'] = 'Range display type';
 $string['rank'] = 'Rank';
 $string['rawpct'] = 'Raw %%';
 $string['real'] = 'Real';
+$string['removeallcoursegrades'] = 'Delete all grades';
+$string['removeallcourseitems'] = 'Delete all items and categories';
 $string['hideforcedsettings'] = 'Hide forced settings';
 $string['report'] = 'Report';
 $string['reportdefault'] = 'Report default ($a)';
index e737bb0ff065db84add8907e1a6044aa8066317a..cd547073badbd859da877f61c51b2c52ff02ec14 100644 (file)
@@ -128,4 +128,9 @@ $string['nousersinrole'] = 'There are no suitable users in the selected role';
 $string['nogroupsassigned'] = 'No groups assigned';
 $string['evenallocation'] = 'Note: To keep group allocation even, the actual number of members per group differs from the number you specified.';
 
+$string['removegroupsmembers'] = 'Remove all group members';
+$string['removegroupingsmembers'] = 'Remove all groups from groupings';
+$string['deleteallgroups'] = 'Delete all groups';
+$string['deleteallgroupings'] = 'Delete all groupings';
+
 ?>
index f4394fcb2d596d81b98bd2880f75e7051d58dcaf..92cb254043412a954bb723c3b615ccdb04054d59 100644 (file)
@@ -223,6 +223,7 @@ $string['previewlesson'] = 'Preview $a';
 $string['previouspage'] = 'Previous page';
 $string['progressbar'] = 'Progress Bar';
 $string['progressbarteacherwarning'] = 'Progress Bar does not display for $a';
+$string['deleteallattempts'] = 'Delete all lesson attempts';
 $string['qtype'] = 'Page type';
 $string['question'] = 'Question';
 $string['questionoption'] = 'Question';
index 48ed419bb535c43407d1f450ecd5da2d2e07a7e9..3a752077cda9aa09e29973a22abfa4c4e37081a2 100644 (file)
@@ -360,6 +360,8 @@ $string['defaultcourseteacherdescription'] = 'Teachers can do anything within a
 $string['defaultcourseteachers'] = 'Teachers';
 $string['delete'] = 'Delete';
 $string['deleteall'] = 'Delete all';
+$string['deleteallcomments'] = 'Delete all comments';
+$string['deleteallratings'] = 'Delete all ratings';
 $string['deletecategorycheck'] = 'Are you absolutely sure you want to completely delete this category <b>\'$a\'</b>?<br />This will move all courses into the parent category if there is one, or into Miscellaneous.';
 $string['deletecheck'] = 'Delete $a ?';
 $string['deletecheckfiles'] = 'Are you absolutely sure you want to delete these files?';
@@ -372,6 +374,7 @@ $string['deleted'] = 'Deleted';
 $string['deletedactivity'] = 'Deleted $a';
 $string['deletedcourse'] = '$a has been completely deleted';
 $string['deletednot'] = 'Could not delete $a !';
+$string['deletelogs'] = 'Delete logs';
 $string['deleteselected'] = 'Delete selected';
 $string['deletingcourse'] = 'Deleting $a';
 $string['deletingexistingcoursedata'] = 'Deleting existing course data';
@@ -1224,6 +1227,10 @@ $string['required'] = 'Required';
 $string['requireskey'] = 'This course requires an enrolment key';
 $string['requirespayment'] = 'This course requires payment for access';
 $string['reset'] = 'Reset';
+$string['resetcomponent'] = 'Component';
+$string['resettask'] = 'Task';
+$string['resetnotimplemented'] = 'Reset not implemented';
+$string['resetstatus'] = 'Status';
 $string['resetcourse'] = 'Reset course';
 $string['resetinfo'] = 'This page allows you to empty a course of user data, while retaining the activities and other settings.  Please be warned that by choosing items below and submitting this page you will delete your chosen user data from this course forever!';
 $string['resetstartdate'] = 'Reset start date';
@@ -1288,6 +1295,7 @@ $string['seealsostats'] = 'See also: stats';
 $string['select'] = 'Select';
 $string['selectacountry'] = 'Select a country';
 $string['selectall'] = 'Select all';
+$string['selectdefault'] = 'Select default';
 $string['selectamodule'] = 'Please select an activity module';
 $string['selectednowmove'] = '$a files selected for moving. Now go to the destination and press \'Move files to here\'';
 $string['selectnos'] = 'Select all \'no\'';
@@ -1467,6 +1475,7 @@ $string['turneditingoff'] = 'Turn editing off';
 $string['turneditingon'] = 'Turn editing on';
 $string['undecided'] = 'Undecided';
 $string['unenrol'] = 'Unenrol';
+$string['unenrolroleusers'] = 'Unenrol users';
 $string['unenrolallstudents'] = 'Unenrol all students';
 $string['unenrolallstudentssure'] = 'Are you sure you want to completely unenrol all students from this course?';
 $string['unenrolme'] = 'Unenrol me from $a';
index 2901e13d1067d3a7e3cc8a91129a4f7825fef72b..b0cb41d7d407e6b5ce63a9518ad83818e6fe31c9 100755 (executable)
@@ -1,25 +1,26 @@
-<?PHP // $Id$\r
-      // note.php \r
-$string['note'] = 'Note';\r
-$string['notes'] = 'Notes';\r
-$string['sitenotes'] = 'Site notes';\r
-$string['coursenotes'] = 'Course notes';\r
-$string['personalnotes'] = 'Personal notes';\r
-$string['created'] = 'created';\r
-$string['nonotes'] = 'There are no notes of this type yet';\r
-$string['notesnotvisible'] = 'You are not allowed to view the notes.';\r
-$string['addnewnote'] = 'Add a new note';\r
-$string['addnewnoteselect'] = 'Select users to write notes about';\r
-$string['groupaddnewnote'] = 'Add a new note for all';\r
-$string['deleteconfirm'] = 'Delete this note?';\r
-$string['content'] = 'Content';\r
-$string['nocontent'] = 'Note content can not be empty';\r
-$string['nouser'] = 'You must select a user';\r
-$string['unknown'] = 'unknown';\r
-$string['bynameondate'] = 'by $a->name - $a->date';\r
-$string['publishstate'] = 'Status';\r
-$string['personal'] = 'personal';\r
-$string['course'] = 'course';\r
-$string['site'] = 'site';\r
-$string['editnote'] = 'Edit note';\r
-?>\r
+<?PHP // $Id$
+      // note.php 
+$string['note'] = 'Note';
+$string['notes'] = 'Notes';
+$string['sitenotes'] = 'Site notes';
+$string['coursenotes'] = 'Course notes';
+$string['personalnotes'] = 'Personal notes';
+$string['created'] = 'created';
+$string['nonotes'] = 'There are no notes of this type yet';
+$string['notesnotvisible'] = 'You are not allowed to view the notes.';
+$string['addnewnote'] = 'Add a new note';
+$string['addnewnoteselect'] = 'Select users to write notes about';
+$string['groupaddnewnote'] = 'Add a new note for all';
+$string['deleteconfirm'] = 'Delete this note?';
+$string['content'] = 'Content';
+$string['nocontent'] = 'Note content can not be empty';
+$string['nouser'] = 'You must select a user';
+$string['unknown'] = 'unknown';
+$string['bynameondate'] = 'by $a->name - $a->date';
+$string['publishstate'] = 'Status';
+$string['personal'] = 'personal';
+$string['course'] = 'course';
+$string['site'] = 'site';
+$string['editnote'] = 'Edit note';
+$string['deletenotes'] = 'Delete all notes';
+?>
index c996ac785aea311c4da74d092aa957b2ab4ecc93..5389bce0c18614a5daceb8b7a1d48b1f26aaf78a 100644 (file)
@@ -455,7 +455,7 @@ $string['regradingquestion'] = 'Regrading \"$a\".';
 $string['regradingquiz'] = 'Regrading Quiz \"$a\"';
 $string['relative'] = 'Relative';
 $string['remove'] = 'Remove';
-$string['removeallquizattempts'] = 'Remove all quiz attempts';
+$string['removeallquizattempts'] = 'Delete all quiz attempts';
 $string['rename'] = 'Rename';
 $string['renderingserverconnectfailed'] = 'The server $a failed to process an RQP request. Check that the URL is correct.';
 $string['reordertool'] = 'Show the reordering tool';
index e90d35f041f1dd07f83f19d54a73ec6eb3db26cb..023d342c1df9941a45978b3a814818d8a5b93e5a 100644 (file)
@@ -46,6 +46,8 @@ $string['course:viewhiddenuserfields'] = 'View hidden user fields';
 $string['course:viewparticipants'] = 'View participants';
 $string['course:viewscales'] = 'View scales';
 $string['course:visibility'] = 'Hide/show courses';
+$string['deletecourseoverrides'] = 'Delete all overrides in course';
+$string['deletelocalroles'] = 'Delete all local role assignments';
 $string['grade:edit'] = 'Edit grades';
 $string['grade:export'] = 'Export grades';
 $string['grade:hide'] = 'Hide/unhide grades or items';
index c73e5c8a02f147ddfbde024f5888117031f2dd5f..cc52787651e7ada53a0aa5c4f1e628e9e5722ce6 100644 (file)
@@ -110,6 +110,7 @@ $string['position_error'] = 'The $a->tag tag can\'t be child of $a->parent tag';
 $string['prev'] = 'Previous';
 $string['raw'] = 'Raw score';
 $string['regular'] = 'Regular Manifest';
+$string['deleteallattempts'] = 'Delete all SCORM attempts';
 $string['report'] = 'Report';
 $string['resizable'] = 'Allow the window to be resized';
 $string['result'] = 'Result';
index e33f3c1494beae878995a2acd4618f7afcc4b04a..6975ac949544d6ec5a87cb4e6e3de5b05ce0a254 100644 (file)
@@ -192,6 +192,8 @@ $string['preferredstudent'] = '$a preferred';
 $string['question'] = 'Question';
 $string['questions'] = 'Questions';
 $string['questionsnotanswered'] = 'Some of the multiple choice questions have not been answered.';
+$string['deleteallanswers'] = 'Delete all survey responses';
+$string['deleteanalysis'] = 'Delete response analysis';
 $string['report'] = 'Survey report';
 $string['responses'] = 'Responses';
 $string['savednotes'] = 'Your notes were saved';
index 58eea0d0ee4f2ff7fc210ae8371bd49011e95138..80afed6c7b8eb4e98457fbef615da08786fc2295 100644 (file)
@@ -1077,32 +1077,35 @@ function grade_update_mod_grades($modinstance, $userid=0) {
                 return false;
             }
 
-            $grades = array();
-            foreach ($oldgrades->grades as $uid=>$usergrade) {
-                if ($userid and $uid != $userid) {
-                    continue;
-                }
-                $grade = new object();
-                $grade->userid = $uid;
+            if (!empty($oldgrades->grades)) {
+                $grades = array();
 
-                if ($usergrade == '-') {
-                    // no grade
-                    $grade->rawgrade = null;
+                foreach ($oldgrades->grades as $uid=>$usergrade) {
+                    if ($userid and $uid != $userid) {
+                        continue;
+                    }
+                    $grade = new object();
+                    $grade->userid = $uid;
 
-                } else if ($scaleid) {
-                    // scale in use, words used
-                    $gradescale = explode(",", $scale->scale);
-                    $grade->rawgrade = array_search($usergrade, $gradescale) + 1;
+                    if ($usergrade == '-') {
+                        // no grade
+                        $grade->rawgrade = null;
 
-                } else {
-                    // good old numeric value
-                    $grade->rawgrade = $usergrade;
+                    } else if ($scaleid) {
+                        // scale in use, words used
+                        $gradescale = explode(",", $scale->scale);
+                        $grade->rawgrade = array_search($usergrade, $gradescale) + 1;
+
+                    } else {
+                        // good old numeric value
+                        $grade->rawgrade = $usergrade;
+                    }
+                    $grades[] = $grade;
                 }
-                $grades[] = $grade;
-            }
 
-            grade_update('legacygrab', $grade_item->courseid, $grade_item->itemtype, $grade_item->itemmodule,
-                         $grade_item->iteminstance, $grade_item->itemnumber, $grades);
+                grade_update('legacygrab', $grade_item->courseid, $grade_item->itemtype, $grade_item->itemmodule,
+                             $grade_item->iteminstance, $grade_item->itemnumber, $grades);
+            }
         }
 
     } else if (function_exists($updategradesfunc) and function_exists($updateitemfunc)) {
index baf87d86477a76bd01135d03dbac0e1b1956524c..afad8738dd6c7c1b01d25c467e5feddf1a87c67a 100644 (file)
@@ -3544,110 +3544,208 @@ function remove_course_contents($courseid, $showfeedback=true) {
     return $result;
 }
 
-
 /**
- * This function will empty a course of USER data as much as
-/// possible. It will retain the activities and the structure
-/// of the course.
- *
- * @uses $USER
- * @uses $SESSION
- * @uses $CFG
- * @param object $data an object containing all the boolean settings and courseid
- * @param bool $showfeedback  if false then do it all silently
- * @return bool
- * @todo Finish documenting this function
+ * Change dates in module - used from course reset.
+ * @param strin $modname forum, assignent, etc
+ * @param array $fields array of date fields from mod table
+ * @param int $timeshift time difference
+ * @return success
  */
-function reset_course_userdata($data, $showfeedback=true) {
+function shift_course_mod_dates($modname, $fields, $timeshift, $courseid) {
+    global $CFG;
+    include_once($CFG->dirroot.'/mod/'.$modname.'/lib.php');
 
-    global $CFG, $USER, $SESSION;
-    require_once($CFG->dirroot.'/group/lib.php');
+    $return = true;
+    foreach ($fields as $field) {
+        $updatesql = "UPDATE {$CFG->prefix}$modname
+                          SET $field = $field + ($timeshift)
+                        WHERE course=$courseid AND $field<>0 AND $field<>0";
+        $return = execute_sql($updatesql, false) && $return;
+    }
 
-    $result = true;
+    $refreshfunction = $modname.'_refresh_events';
+    if (function_exists($refreshfunction)) {
+        $refreshfunction($courseid);
+    }
 
-    $strdeleted = get_string('deleted');
+    return $return;
+}
 
-    // Look in every instance of every module for data to delete
+/**
+ * This function will empty a course of user data.
+ * It will retain the activities and the structure of the course.
+ * @param object $data an object containing all the settings including courseid (without magic quotes)
+ * @return array status array of array component, item, error
+ */
+function reset_course_userdata($data) {
+    global $CFG, $USER;
+    require_once($CFG->libdir.'/gradelib.php');
+    require_once($CFG->dirroot.'/group/lib.php');
 
-    if ($allmods = get_records('modules') ) {
-        foreach ($allmods as $mod) {
-            $modname = $mod->name;
-            $modfile = $CFG->dirroot .'/mod/'. $modname .'/lib.php';
-            $moddeleteuserdata = $modname .'_delete_userdata';   // Function to delete user data
-            if (file_exists($modfile)) {
-                @include_once($modfile);
-                if (function_exists($moddeleteuserdata)) {
-                    $moddeleteuserdata($data, $showfeedback);
-                }
-            }
-        }
+    $data->courseid = $data->id;
+    $context = get_context_instance(CONTEXT_COURSE, $data->courseid);
+
+    // calculate the time shift of dates
+    if (!empty($data->reset_start_date)) {
+        // time part of course startdate should be zero
+        $data->timeshift = $data->reset_start_date - usergetmidnight($data->reset_start_date_old);
     } else {
-        error('No modules are installed!');
+        $data->timeshift = 0;
     }
 
-    // Delete other stuff
-    $context = get_context_instance(CONTEXT_COURSE, $data->courseid);
+    // result array: component, item, error
+    $status = array();
 
-    if (!empty($data->reset_students) or !empty($data->reset_teachers)) {
-        $teachers     = array_keys(get_users_by_capability($context, 'moodle/course:update'));
-        $participants = array_keys(get_users_by_capability($context, 'moodle/course:view'));
-        $students     = array_diff($participants, $teachers);
+    // start the resetting
+    $componentstr = get_string('general');
 
-        if (!empty($data->reset_students)) {
-            foreach ($students as $studentid) {
-                role_unassign(0, $studentid, 0, $context->id);
-            }
-            if ($showfeedback) {
-                notify($strdeleted .' '.get_string('students'), 'notifysuccess');
-            }
+    // move the course start time
+    if (!empty($data->reset_start_date) and $data->timeshift) {
+        // change course start data
+        set_field('course', 'startdate', $data->reset_start_date, 'id', $data->courseid);
+        // update all course and group events - do not move activity events
+        $updatesql = "UPDATE {$CFG->prefix}event
+                         SET timestart = timestart + ({$data->timeshift})
+                       WHERE courseid={$data->courseid} AND instance=0";
+        execute_sql($updatesql, false);
+
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
+    }
+
+    if (!empty($data->reset_logs)) {
+        delete_records('log', 'course', $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deletelogs'), 'error'=>false);
+    }
+
+    if (!empty($data->reset_events)) {
+        delete_records('event', 'courseid', $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteevents', 'calendar'), 'error'=>false);
+    }
 
-            /// Delete group members (but keep the groups)
-            $result = groups_delete_group_members($data->courseid, $showfeedback) && $result;
+    if (!empty($data->reset_notes)) {
+        require_once($CFG->dirroot.'/notes/lib.php');
+        note_delete_all($data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deletenotes', 'notes'), 'error'=>false);
+    }
+
+    $componentstr = get_string('roles');
+
+    if (!empty($data->reset_roles_overrides)) {
+        $children = get_child_contexts($context);
+        foreach ($children as $child) {
+            delete_records('role_capabilities', 'contextid', $child->id);
         }
+        delete_records('role_capabilities', 'contextid', $context->id);
+        //force refresh for logged in users
+        mark_context_dirty($context->path);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deletecourseoverrides', 'role'), 'error'=>false);
+    }
 
-        if (!empty($data->reset_teachers)) {
-            foreach ($teachers as $teacherid) {
-                role_unassign(0, $teacherid, 0, $context->id);
-            }
-            if ($showfeedback) {
-                notify($strdeleted .' '.get_string('teachers'), 'notifysuccess');
+    if (!empty($data->reset_roles_local)) {
+        $children = get_child_contexts($context);
+        foreach ($children as $child) {
+            role_unassign(0, 0, 0, $child->id);
+        }
+        //force refresh for logged in users
+        mark_context_dirty($context->path);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deletelocalroles', 'role'), 'error'=>false);
+    }
+
+    // First unenrol users - this cleans some of related user data too, such as forum subscriptions, tracking, etc.
+    $data->unenrolled = array();
+    if (!empty($data->reset_roles)) {
+        foreach($data->reset_roles as $roleid) {
+            if ($users = get_role_users($roleid, $context, false, 'u.id', 'u.id ASC')) {
+                foreach ($users as $user) {
+                    role_unassign($roleid, $user->id, 0, $context->id);
+                    if (!has_capability('moodle/course:view', $context, $user->id)) {
+                        $data->unenrolled[$user->id] = $user->id;
+                    }
+                }
             }
         }
     }
+    if (!empty($data->unenrolled)) {
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('unenrol').' ('.count($data->unenrolled).')', 'error'=>false);
+    }
 
-    if (!empty($data->reset_groups)) {
-            $result = groups_delete_groupings($data->courseid, $showfeedback) && $result;
-            $result = groups_delete_groups($data->courseid, $showfeedback) && $result;
+
+    $componentstr = get_string('groups');
+
+    // remove all group members
+    if (!empty($data->reset_groups_members)) {
+        groups_delete_group_members($data->courseid, false);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('removegroupsmembers', 'group'), 'error'=>false);
     }
 
-    if (!empty($data->reset_events)) {
-        if (delete_records('event', 'courseid', $data->courseid)) {
-            if ($showfeedback) {
-                notify($strdeleted .' event', 'notifysuccess');
+    // remove all groups
+    if (!empty($data->reset_groups_remove)) {
+        groups_delete_groups($data->courseid, false);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallgroups', 'group'), 'error'=>false);
+    }
+
+    // remove all grouping members
+    if (!empty($data->reset_groupings_members)) {
+        groups_delete_groupings_groups($data->courseid, false);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('removegroupingsmembers', 'group'), 'error'=>false);
+    }
+
+    // remove all groupings
+    if (!empty($data->reset_groupings_remove)) {
+        groups_delete_groupings($data->courseid, false);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallgroupings', 'group'), 'error'=>false);
+    }
+
+    // Look in every instance of every module for data to delete
+    $unsupported_mods = array();
+    if ($allmods = get_records('modules') ) {
+        foreach ($allmods as $mod) {
+            $modname = $mod->name;
+            if (!count_records($modname, 'course', $data->courseid)) {
+                continue; // skip mods with no instances
+            }
+            $modfile = $CFG->dirroot.'/mod/'. $modname.'/lib.php';
+            $moddeleteuserdata = $modname.'_reset_userdata';   // Function to delete user data
+            if (file_exists($modfile)) {
+                include_once($modfile);
+                if (function_exists($moddeleteuserdata)) {
+                    $modstatus = $moddeleteuserdata($data);
+                    if (is_array($modstatus)) {
+                        $status = array_merge($status, $modstatus);
+                    } else {
+                        debugging('Module '.$modname.' returned incorrect staus - must be an array!');
+                    }
+                } else {
+                    $unsupported_mods[] = $mod;
+                }
+            } else {
+                debugging('Missing lib.php in '.$modname.' module!');
             }
-        } else {
-            $result = false;
         }
     }
 
-    if (!empty($data->reset_logs)) {
-        if (delete_records('log', 'course', $data->courseid)) {
-            if ($showfeedback) {
-                notify($strdeleted .' log', 'notifysuccess');
-            }
-        } else {
-            $result = false;
+    // mention unsupported mods
+    if (!empty($unsupported_mods)) {
+        foreach($unsupported_mods as $mod) {
+            $status[] = array('component'=>get_string('modulenameplural', $mod->name), 'item'=>'', 'error'=>get_string('resetnotimplemented'));
         }
     }
 
-    // deletes all role assignments, and local override,
-    // these have no courseid in table and needs separate process
-    delete_records('role_capabilities', 'contextid', $context->id);
 
-    // force accessinfo refresh for users visiting this context...
-    mark_context_dirty($context->path);
+    $componentstr = get_string('gradebook', 'grades');
+    // reset gradebook
+    if (!empty($data->reset_gradebook_items)) {
+        remove_course_grades($data->courseid, false);
+        grade_grab_course_grades($data->courseid);
+        grade_regrade_final_grades($data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('removeallcourseitems', 'grades'), 'error'=>false);
 
-    return $result;
+    } else if (!empty($data->reset_gradebook_grades)) {
+        grade_course_reset($data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('removeallcoursegrades', 'grades'), 'error'=>false);
+    }
+
+    return $status;
 }
 
 function generate_email_processing_address($modid,$modargs) {
index 519faddac7ee93ca77047a4f61972cac250f7298..07d9d7fcdb80dbb8c5169d70d4e457320be1a271 100644 (file)
@@ -32,6 +32,7 @@ class assignment_base {
     var $usehtmleditor;
     var $defaultformat;
     var $context;
+    var $type;
 
     /**
      * Constructor for the base assignment class
@@ -1730,18 +1731,18 @@ class assignment_base {
         }
     }
 
-    
-    /*
+
+    /**
      * Return true if is set description is hidden till available date
      *
-     * This is needed by calendar so that hidden descriptions do not 
+     * This is needed by calendar so that hidden descriptions do not
      * come up in upcoming events.
      *
-     * Check that description is hidden till available date   
+     * Check that description is hidden till available date
      * By default return false
      * Assignments types should implement this method if needed
      * @return boolen
-     */                               
+     */
     function description_is_hidden() {
         return false;
     }
@@ -1851,6 +1852,51 @@ class assignment_base {
         //no plugin cron by default - override if needed
     }
 
+    /**
+     * Reset all submissions
+     */
+    function reset_userdata($data) {
+        global $CFG;
+        require_once($CFG->libdir.'/filelib.php');
+
+        if (!count_records('assignment', 'course', $data->courseid, 'assignmenttype', $this->type)) {
+            return array(); // no assignments of this type present
+        }
+
+        $componentstr = get_string('modulenameplural', 'assignment');
+        $status = array();
+
+        $typestr = get_string('type'.$this->type, 'assignment');
+
+        if (!empty($data->reset_assignment_submissions)) {
+            $assignmentssql = "SELECT a.id
+                                 FROM {$CFG->prefix}assignment a
+                                WHERE a.course={$data->courseid} AND a.assignmenttype='{$this->type}'";
+
+            delete_records_select('assignment_submissions', "assignment IN ($assignmentssql)");
+
+            if ($assignments = get_records_sql($assignmentssql)) {
+                foreach ($assignments as $assignmentid=>$unused) {
+                    fulldelete($CFG->dataroot.'/'.$data->courseid.'/moddata/assignment/'.$assignmentid);
+                }
+            }
+
+            $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallsubmissions','assignment').': '.$typestr, 'error'=>false);
+            
+            if (empty($data->reset_gradebook_grades)) {
+                // remove all grades from gradebook
+                assignment_reset_gradebook($data->courseid, $this->type);
+            }
+        }
+
+        /// updating dates - shift may be negative too
+        if ($data->timeshift) {
+            shift_course_mod_dates('assignment', array('timedue', 'timeavailable'), $data->timeshift, $data->courseid);
+            $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged').': '.$typestr, 'error'=>false);
+        }
+
+        return $status;
+    }
 } ////// End of the assignment_base class
 
 
@@ -2130,7 +2176,7 @@ function assignment_update_grades($assignment=null, $userid=0, $nullifnone=true)
  * Create grade item for given assignment
  *
  * @param object $assignment object with extra cmidnumber
- * @param mixed optional array/object of grade(s)
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return int 0 if ok, error code otherwise
  */
 function assignment_grade_item_update($assignment, $grades=NULL) {
@@ -2158,6 +2204,11 @@ function assignment_grade_item_update($assignment, $grades=NULL) {
         $params['gradetype'] = GRADE_TYPE_NONE;
     }
 
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
     return grade_update('mod/assignment', $assignment->courseid, 'mod', 'assignment', $assignment->id, 0, $grades, $params);
 }
 
@@ -2803,4 +2854,64 @@ function assignment_get_types() {
     return $types;
 }
 
+/**
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
+ */
+function assignment_reset_gradebook($courseid, $type='') {
+    global $CFG;
+
+    $type = $type ? "AND a.assignmenttype='$type'" : '';
+
+    $sql = "SELECT a.*, cm.idnumber as cmidnumber, a.course as courseid
+              FROM {$CFG->prefix}assignment a, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='assignment' AND m.id=cm.module AND cm.instance=a.id AND a.course=$courseid $type";
+
+    if ($assignments = get_records_sql($sql)) {
+        foreach ($assignments as $assignment) {
+            assignment_grade_item_update($assignment, 'reset');
+        }
+    }
+}
+
+/**
+ * This function is used by the reset_course_userdata function in moodlelib.
+ * This function will remove all posts from the specified assignment
+ * and clean up any related data.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function assignment_reset_userdata($data) {
+    global $CFG;
+
+    $status = array();
+
+    foreach (get_list_of_plugins('mod/assignment/type') as $type) {
+        require_once("$CFG->dirroot/mod/assignment/type/$type/assignment.class.php");
+        $assignmentclass = "assignment_$type";
+        $ass = new $assignmentclass();
+        $status = array_merge($status, $ass->reset_userdata($data));
+    }
+
+    return $status;
+}
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the assignment.
+ * @param $mform form passed by reference
+ */
+function assignment_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'assignmentheader', get_string('modulenameplural', 'assignment'));
+    $mform->addElement('advcheckbox', 'reset_assignment_submissions', get_string('deleteallsubmissions','assignment'));
+}
+
+/**
+ * Course reset form defaults.
+ */
+function assignment_reset_course_form_defaults($course) {
+    return array('reset_assignment_submissions'=>1);
+}
+
 ?>
index 9e3f0564b23bab0cf733262a1f3a89dd9959292b..d35ce7a69af331f2bcb19e49cf5ab2a3e84cdd0b 100644 (file)
@@ -8,6 +8,7 @@ class assignment_offline extends assignment_base {
 
     function assignment_offline($cmid='staticonly', $assignment=NULL, $cm=NULL, $course=NULL) {
         parent::assignment_base($cmid, $assignment, $cm, $course);
+        $this->type = 'offline';
     }
 
     function display_lateness($timesubmitted) {
index 4986502816367d3f5fc0dd4d2b938918f5d0e806..e6a3dd66a4ca1053c83b0c559320ffd21ff5b6d0 100644 (file)
@@ -9,6 +9,7 @@ class assignment_online extends assignment_base {
 
     function assignment_online($cmid='staticonly', $assignment=NULL, $cm=NULL, $course=NULL) {
         parent::assignment_base($cmid, $assignment, $cm, $course);
+        $this->type = 'online';
     }
 
     function view() {
index 1ce0894870d09e0b9b6098fede05708e913e6a9a..8bbd9e908db008c57dddc07f373c0a66b9ed1695 100644 (file)
@@ -11,7 +11,7 @@ class assignment_upload extends assignment_base {
 
     function assignment_upload($cmid='staticonly', $assignment=NULL, $cm=NULL, $course=NULL) {
         parent::assignment_base($cmid, $assignment, $cm, $course);
-
+        $this->type = 'upload';
     }
 
     function view() {
index 53d6e48af484d86d163fc35bff052db79cdd6d82..ba4876398775a6b8519062cbe6068adf7f16ca80 100644 (file)
@@ -41,7 +41,7 @@ class assignment_uploadsingle extends assignment_base {
 
     function assignment_uploadsingle($cmid='staticonly', $assignment=NULL, $cm=NULL, $course=NULL) {
         parent::assignment_base($cmid, $assignment, $cm, $course);
-
+        $this->type = 'uploadsingle';
     }
 
     function view() {
index da204e6d5e33a0545e93ce7dcdd6d2308a14b0cc..a2faa7b64c801bacc895c7313b287ed4873022ce 100644 (file)
@@ -686,4 +686,53 @@ function chat_print_overview($courses, &$htmlarray) {
     }
 }
 
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the chat.
+ * @param $mform form passed by reference
+ */
+function chat_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'chatheader', get_string('modulenameplural', 'chat'));
+    $mform->addElement('advcheckbox', 'reset_chat', get_string('removemessages','chat'));
+}
+
+/**
+ * Course reset form defaults.
+ */
+function chat_reset_course_form_defaults($course) {
+    return array('reset_chat'=>1);
+}
+
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * chat messages for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function chat_reset_userdata($data) {
+    global $CFG;
+
+    $componentstr = get_string('modulenameplural', 'chat');
+    $status = array();
+
+    if (!empty($data->reset_chat)) {
+        $chatessql = "SELECT ch.id
+                        FROM {$CFG->prefix}chat ch
+                       WHERE ch.course={$data->courseid}";
+
+        delete_records_select('chat_messages', "chatid IN ($chatessql)");
+        delete_records_select('chat_users', "chatid IN ($chatessql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('removemessages', 'chat'), 'error'=>false);
+    }
+
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('chat', array('chattime'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
+    }
+
+    return $status;
+}
+
 ?>
index de9d6420a9243e9b2951f791899502cbb2ecee94..84525526ea8ca6f762641f2b8b392a6494f734dc 100644 (file)
@@ -668,4 +668,52 @@ function choice_get_post_actions() {
     return array('choose','choose again');
 }
 
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the choice.
+ * @param $mform form passed by reference
+ */
+function choice_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'choiceheader', get_string('modulenameplural', 'choice'));
+    $mform->addElement('advcheckbox', 'reset_choice', get_string('removeresponses','choice'));
+}
+
+/**
+ * Course reset form defaults.
+ */
+function choice_reset_course_form_defaults($course) {
+    return array('reset_choice'=>1);
+}
+
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * choice responses for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function choice_reset_userdata($data) {
+    global $CFG;
+
+    $componentstr = get_string('modulenameplural', 'choice');
+    $status = array();
+
+    if (!empty($data->reset_choice)) {
+        $choicessql = "SELECT ch.id
+                         FROM {$CFG->prefix}choice ch
+                        WHERE ch.course={$data->courseid}";
+
+        delete_records_select('choice_answers', "choiceid IN ($choicessql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('removeresponses', 'choice'), 'error'=>false);
+    }
+
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('choice', array('timeopen', 'timeclose'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
+    }
+
+    return $status;
+}
+
 ?>
index 8e8fb71214ab447bed3bd759b437197f66d6fa71..f0a89b9cc786138194a6af135fc4de206da047bb 100755 (executable)
@@ -796,9 +796,10 @@ function data_update_grades($data=null, $userid=0, $nullifnone=true) {
  * Update/create grade item for given data
  *
  * @param object $data object with extra cmidnumber
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return object grade_item
  */
-function data_grade_item_update($data) {
+function data_grade_item_update($data, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -819,7 +820,12 @@ function data_grade_item_update($data) {
         $params['scaleid']   = -$data->scale;
     }
 
-    return grade_update('mod/data', $data->course, 'mod', 'data', $data->id, 0, NULL, $params);
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
+    return grade_update('mod/data', $data->course, 'mod', 'data', $data->id, 0, $grades, $params);
 }
 
 /**
@@ -2092,4 +2098,156 @@ function data_preset_path($course, $userid, $shortname) {
 
     return 'Does it disturb you that this code will never run?';
 }
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the data.
+ * @param $mform form passed by reference
+ */
+function data_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'dataheader', get_string('modulenameplural', 'data'));
+    $mform->addElement('checkbox', 'reset_data', get_string('deleteallentries','data'));
+
+    $mform->addElement('checkbox', 'reset_data_notenrolled', get_string('deletenotenrolled', 'data'));
+    $mform->disabledIf('reset_data_notenrolled', 'reset_data', 'checked');
+
+    $mform->addElement('checkbox', 'reset_data_ratings', get_string('deleteallratings'));
+    $mform->disabledIf('reset_data_ratings', 'reset_data', 'checked');
+
+    $mform->addElement('checkbox', 'reset_data_comments', get_string('deleteallcomments'));
+    $mform->disabledIf('reset_data_comments', 'reset_data', 'checked');
+}
+
+/**
+ * Course reset form defaults.
+ */
+function data_reset_course_form_defaults($course) {
+    return array('reset_data'=>0, 'reset_data_ratings'=>1, 'reset_data_comments'=>1, 'reset_data_notenrolled'=>0);
+}
+
+/**
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
+ */
+function data_reset_gradebook($courseid, $type='') {
+    global $CFG;
+
+    $sql = "SELECT d.*, cm.idnumber as cmidnumber, d.course as courseid
+              FROM {$CFG->prefix}data d, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='data' AND m.id=cm.module AND cm.instance=d.id AND d.course=$courseid";
+
+    if ($datas = get_records_sql($sql)) {
+        foreach ($datas as $data) {
+            data_grade_item_update($data, 'reset');
+        }
+    }
+}
+
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * data responses for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function data_reset_userdata($data) {
+    global $CFG;
+    require_once($CFG->libdir.'/filelib.php');
+
+    $componentstr = get_string('modulenameplural', 'data');
+    $status = array();
+
+    $allrecordssql = "SELECT r.id
+                        FROM {$CFG->prefix}data_records r
+                             INNER JOIN {$CFG->prefix}data d ON r.dataid = d.id
+                       WHERE d.course = {$data->courseid}";
+
+    $alldatassql = "SELECT d.id
+                      FROM {$CFG->prefix}data d
+                     WHERE d.course={$data->courseid}";
+
+    // delete entries if requested
+    if (!empty($data->reset_data)) {
+        delete_records_select('data_ratings', "recordid IN ($allrecordssql)");
+        delete_records_select('data_comments', "recordid IN ($allrecordssql)");
+        delete_records_select('data_content', "recordid IN ($allrecordssql)");
+        delete_records_select('data_records', "dataid IN ($alldatassql)");
+
+        if ($datas = get_records_sql($alldatassql)) {
+            foreach ($datas as $dataid=>$unused) {
+                fulldelete("$CFG->dataroot/$data->courseid/moddata/data/$dataid");
+            }
+        }
+
+        if (empty($data->reset_gradebook_grades)) {
+            // remove all grades from gradebook
+            data_reset_gradebook($data->courseid);
+        }
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallentries', 'data'), 'error'=>false);
+    }
+
+    // remove entries by users not enrolled into course
+    if (!empty($data->reset_data_notenrolled)) {
+        $recordssql = "SELECT r.id, r.userid, r.dataid, u.id AS userexists, u.deleted AS userdeleted
+                         FROM {$CFG->prefix}data_records r
+                              INNER JOIN {$CFG->prefix}data d ON r.dataid = d.id
+                              LEFT OUTER JOIN {$CFG->prefix}user u ON r.userid = u.id
+                        WHERE d.course = {$data->courseid} AND r.userid > 0";
+
+        $course_context = get_context_instance(CONTEXT_COURSE, $data->courseid);
+        $notenrolled = array();
+        $fields = array();
+        if ($rs = get_recordset_sql($recordssql)) {
+            while ($record = rs_fetch_next_record($rs)) {
+                if (array_key_exists($record->userid, $notenrolled) or !$record->userexists or $record->userdeleted
+                  or !has_capability('moodle/course:view', $course_context , $record->userid)) {
+                    delete_records('data_ratings', 'recordid', $record->id);
+                    delete_records('data_comments', 'recordid', $record->id);
+                    delete_records('data_content', 'recordid', $record->id);
+                    delete_records('data_records', 'id', $record->id);
+                    // HACK: this is ugly - the recordid should be before the fieldid!
+                    if (!array_key_exists($record->dataid, $fields)) {
+                        if ($fs = get_records('data_fields', 'dataid', $record->dataid)) {
+                            $fields[$record->dataid] = array_keys($fs);
+                        } else {
+                            $fields[$record->dataid] = array();
+                        }
+                    }
+                    foreach($fields[$record->dataid] as $fieldid) {
+                        fulldelete("$CFG->dataroot/$data->courseid/moddata/data/$record->dataid/$fieldid/$record->id");
+                    }
+                    $notenrolled[$record->userid] = true;
+                }
+            }
+            rs_close($rs);
+            $status[] = array('component'=>$componentstr, 'item'=>get_string('deletenotenrolled', 'data'), 'error'=>false);
+        }
+    }
+
+    // remove all ratings
+    if (!empty($data->reset_data_ratings)) {
+        delete_records_select('data_ratings', "recordid IN ($allrecordssql)");
+
+        if (empty($data->reset_gradebook_grades)) {
+            // remove all grades from gradebook
+            data_reset_gradebook($data->courseid);
+        }
+
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallratings'), 'error'=>false);
+    }
+
+    // remove all comments
+    if (!empty($data->reset_data_comments)) {
+        delete_records_select('data_comments', "recordid IN ($allrecordssql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallcomments'), 'error'=>false);
+    }
+
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('data', array('timeavailablefrom', 'timeavailableto', 'timeviewfrom', 'timeviewto'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
+    }
+
+    return $status;
+}
 ?>
index ea277a04cef464eab4d49140be1d25ca8731a6c4..bff5f6694e0acc6aa08a6c17a57188f5e7a8596e 100644 (file)
@@ -19,6 +19,9 @@ define('FORUM_TRACKING_ON', 2);
 
 define('FORUM_UNSET_POST_RATING', -999);
 
+// this file may be included from some functions, we must define these as global explicitly
+global $FORUM_LAYOUT_MODES, $FORUM_TYPES, $FORUM_TYPES_ALL, $FORUM_OPEN_MODES;
+
 $FORUM_LAYOUT_MODES = array ( FORUM_MODE_FLATOLDEST => get_string('modeflatoldestfirst', 'forum'),
                               FORUM_MODE_FLATNEWEST => get_string('modeflatnewestfirst', 'forum'),
                               FORUM_MODE_THREADED   => get_string('modethreaded', 'forum'),
@@ -28,8 +31,15 @@ $FORUM_LAYOUT_MODES = array ( FORUM_MODE_FLATOLDEST => get_string('modeflatoldes
 $FORUM_TYPES   = array ('general'    => get_string('generalforum', 'forum'),
                         'eachuser'   => get_string('eachuserforum', 'forum'),
                         'single'     => get_string('singleforum', 'forum'),
-                        'qanda'      => get_string('qandaforum', 'forum')
-                        );
+                        'qanda'      => get_string('qandaforum', 'forum'));
+
+$FORUM_TYPES_ALL = array ('news'       => get_string('namenews','forum'),
+                          'social'     => get_string('namesocial','forum'),
+                          'general'    => get_string('generalforum', 'forum'),
+                          'eachuser'   => get_string('eachuserforum', 'forum'),
+                          'single'     => get_string('singleforum', 'forum'),
+                          'qanda'      => get_string('qandaforum', 'forum'));
+
 
 $FORUM_OPEN_MODES   = array ('2' => get_string('openmode2', 'forum'),
                              '1' => get_string('openmode1', 'forum'),
@@ -905,6 +915,7 @@ function forum_make_mail_html($course, $forum, $discussion, $post, $userfrom, $u
 function forum_user_outline($course, $user, $mod, $forum) {
 
     if ($posts = forum_get_user_posts($forum->id, $user->id)) {
+        $result = new object();
         $result->info = get_string("numposts", "forum", count($posts));
 
         $lastpost = array_pop($posts);
@@ -1189,9 +1200,10 @@ function forum_update_grades($forum=null, $userid=0, $nullifnone=true) {
  * Create/update grade item for given forum
  *
  * @param object $forum object with extra cmidnumber
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return int 0 if ok
  */
-function forum_grade_item_update($forum) {
+function forum_grade_item_update($forum, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -1212,7 +1224,12 @@ function forum_grade_item_update($forum) {
         $params['scaleid']   = -$forum->scale;
     }
 
-    return grade_update('mod/forum', $forum->course, 'mod', 'forum', $forum->id, 0, NULL, $params);
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
+    return grade_update('mod/forum', $forum->course, 'mod', 'forum', $forum->id, 0, $grades, $params);
 }
 
 /**
@@ -2023,6 +2040,7 @@ function forum_get_course_forum($courseid, $type) {
         notify("Could not find forum module!!");
         return false;
     }
+    $mod = new object();
     $mod->course = $courseid;
     $mod->module = $module->id;
     $mod->instance = $forum->id;
@@ -2276,6 +2294,7 @@ function forum_print_post(&$post, $courseid, $ownpost=false, $reply=false, $link
 
     echo '<div class="author">';
     $fullname = fullname($post, has_capability('moodle/site:viewfullnames', $post->modcontext));
+    $by = new object();
     $by->name = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.
                 $post->userid.'&amp;course='.$courseid.'">'.$fullname.'</a>';
     $by->date = userdate($post->modified);
@@ -2577,6 +2596,7 @@ function forum_print_discussion_header(&$post, $forum, $group=-1, $datestring=""
     echo '<td class="lastpost">';
     $usedate = (empty($post->timemodified)) ? $post->modified : $post->timemodified;  // Just in case
     $parenturl = (empty($post->lastpostid)) ? '' : '&amp;parent='.$post->lastpostid;
+    $usermodified = new object();
     $usermodified->id        = $post->usermodified;
     $usermodified->firstname = $post->umfirstname;
     $usermodified->lastname  = $post->umlastname;
@@ -3082,6 +3102,7 @@ function forum_add_discussion($discussion,&$message) {
     // The first post is stored as a real post, and linked
     // to from the discuss entry.
 
+    $post = new object();
     $post->discussion  = 0;
     $post->parent      = 0;
     $post->userid      = $USER->id;
@@ -3254,6 +3275,7 @@ function forum_subscribe($userid, $forumid) {
         return true;
     }
 
+    $sub = new object();
     $sub->userid  = $userid;
     $sub->forum = $forumid;
 
@@ -3285,6 +3307,7 @@ function forum_post_subscription($post) {
         return "";
     }
 
+    $info = new object();
     $info->name  = fullname($USER);
     $info->forum = $forum->name;
 
@@ -4070,6 +4093,7 @@ function forum_print_posts_threaded($parent, $courseid, $depth, $ratings, $reply
                 if (!forum_user_can_see_post($post->forum,$post->discussion,$post)) {
                     continue;
                 }
+                $by = new object();
                 $by->name = fullname($post, $canviewfullnames);
                 $by->date = userdate($post->modified);
 
@@ -4313,7 +4337,7 @@ function forum_role_assign($userid, $context, $roleid) {
 }
 
 
-/*
+/**
  * This function gets run whenever a role is assigned to a user in a context
  *
  * @param integer $userid
@@ -4321,7 +4345,14 @@ function forum_role_assign($userid, $context, $roleid) {
  * @return bool
  */
 function forum_role_unassign($userid, $context) {
-    return forum_remove_user_subscriptions($userid, $context);
+    if (empty($context->contextlevel)) {
+        return false;
+    }
+
+    forum_remove_user_subscriptions($userid, $context);
+    forum_remove_user_tracking($userid, $context);
+
+    return true;
 }
 
 
@@ -4400,9 +4431,9 @@ function forum_add_user_default_subscriptions($userid, $context) {
  * Remove subscriptions for a user in a context
  */
 function forum_remove_user_subscriptions($userid, $context) {
-    
+
     global $CFG;
-    
+
     if (empty($context->contextlevel)) {
         return false;
     }
@@ -4412,14 +4443,12 @@ function forum_remove_user_subscriptions($userid, $context) {
         case CONTEXT_SYSTEM:   // For the whole site
             //if ($courses = get_my_courses($userid)) {
             // find all courses in which this user has a forum subscription
-            if ($courses = get_records_sql("SELECT c.* 
-                                            FROM {$CFG->prefix}course c,
-                                                 {$CFG->prefix}forum_subscriptions fs,
-                                                 {$CFG->prefix}forum f                                               
-                                            WHERE c.id = f.course
-                                            AND   f.id = fs.forum
-                                            AND   fs.userid = $userid")) {
-                    
+            if ($courses = get_records_sql("SELECT c.id
+                                              FROM {$CFG->prefix}course c,
+                                                   {$CFG->prefix}forum_subscriptions fs,
+                                                   {$CFG->prefix}forum f
+                                             WHERE c.id = f.course AND f.id = fs.forum AND fs.userid = $userid")) {
+
                 foreach ($courses as $course) {
                     $subcontext = get_context_instance(CONTEXT_COURSE, $course->id);
                     forum_remove_user_subscriptions($userid, $subcontext);
@@ -4428,13 +4457,13 @@ function forum_remove_user_subscriptions($userid, $context) {
             break;
 
         case CONTEXT_COURSECAT:   // For a whole category
-             if ($courses = get_records('course', 'category', $context->instanceid)) {
+             if ($courses = get_records('course', 'category', $context->instanceid, '', 'id')) {
                  foreach ($courses as $course) {
                      $subcontext = get_context_instance(CONTEXT_COURSE, $course->id);
                      forum_remove_user_subscriptions($userid, $subcontext);
                  }
              }
-             if ($categories = get_records('course_categories', 'parent', $context->instanceid)) {
+             if ($categories = get_records('course_categories', 'parent', $context->instanceid, '', 'id')) {
                  foreach ($categories as $category) {
                      $subcontext = get_context_instance(CONTEXT_COURSECAT, $category->id);
                      forum_remove_user_subscriptions($userid, $subcontext);
@@ -4443,21 +4472,17 @@ function forum_remove_user_subscriptions($userid, $context) {
              break;
 
         case CONTEXT_COURSE:   // For a whole course
-             if ($course = get_record('course', 'id', $context->instanceid)) {
+             if ($course = get_record('course', 'id', $context->instanceid, '', '', '', '', 'id')) {
                 // find all forums in which this user has a subscription, and its coursemodule id
                 if ($forums = get_records_sql("SELECT f.id, cm.id as coursemodule
-                                                FROM {$CFG->prefix}forum f,
-                                                     {$CFG->prefix}modules m,
-                                                     {$CFG->prefix}course_modules cm,
-                                                     {$CFG->prefix}forum_subscriptions fs
-                                                WHERE fs.userid = $userid
-                                                AND   fs.forum = f.id
-                                                AND   f.course = $context->instanceid
-                                                AND   cm.instance = f.id
-                                                AND   cm.module = m.id
-                                                AND   m.name = 'forum'")) {                                                   
-                 
-                 //if ($forums = get_all_instances_in_course('forum', $course, $userid, true)) {
+                                                 FROM {$CFG->prefix}forum f,
+                                                      {$CFG->prefix}modules m,
+                                                      {$CFG->prefix}course_modules cm,
+                                                      {$CFG->prefix}forum_subscriptions fs
+                                                WHERE fs.userid = $userid AND f.course = $context->instanceid
+                                                      AND fs.forum = f.id AND cm.instance = f.id
+                                                      AND cm.module = m.id AND m.name = 'forum'")) {
+
                      foreach ($forums as $forum) {
                          if ($modcontext = get_context_instance(CONTEXT_MODULE, $forum->coursemodule)) {
                              if (!has_capability('mod/forum:viewdiscussion', $modcontext, $userid)) {
@@ -4484,45 +4509,139 @@ function forum_remove_user_subscriptions($userid, $context) {
 }
 
 // Functions to do with read tracking.
+
 /**
- * 
+ * Remove post tracking for a user in a context
  */
-function forum_tp_add_read_record($userid, $postid, $discussionid=-1, $forumid=-1) {
-    if (($readrecord = forum_tp_get_read_records($userid, $postid)) === false) {
+function forum_remove_user_tracking($userid, $context) {
+
+    global $CFG;
+
+    if (empty($context->contextlevel)) {
+        return false;
+    }
+
+    switch ($context->contextlevel) {
+
+        case CONTEXT_SYSTEM:   // For the whole site
+            // find all courses in which this user has tracking info
+            $allcourses = array();
+            if ($courses = get_records_sql("SELECT c.id
+                                              FROM {$CFG->prefix}course c,
+                                                   {$CFG->prefix}forum_read fr,
+                                                   {$CFG->prefix}forum f
+                                             WHERE c.id = f.course AND f.id = fr.forumid AND fr.userid = $userid")) {
+
+                $allcourses = $allcourses + $courses;
+            }
+            if ($courses = get_records_sql("SELECT c.id
+                                              FROM {$CFG->prefix}course c,
+                                                   {$CFG->prefix}forum_track_prefs ft,
+                                                   {$CFG->prefix}forum f
+                                             WHERE c.id = f.course AND f.id = ft.forumid AND ft.userid = $userid")) {
+
+                $allcourses = $allcourses + $courses;
+            }
+            foreach ($allcourses as $course) {
+                $subcontext = get_context_instance(CONTEXT_COURSE, $course->id);
+                forum_remove_user_tracking($userid, $subcontext);
+            }
+            break;
+
+        case CONTEXT_COURSECAT:   // For a whole category
+             if ($courses = get_records('course', 'category', $context->instanceid, '', 'id')) {
+                 foreach ($courses as $course) {
+                     $subcontext = get_context_instance(CONTEXT_COURSE, $course->id);
+                     forum_remove_user_tracking($userid, $subcontext);
+                 }
+             }
+             if ($categories = get_records('course_categories', 'parent', $context->instanceid, '', 'id')) {
+                 foreach ($categories as $category) {
+                     $subcontext = get_context_instance(CONTEXT_COURSECAT, $category->id);
+                     forum_remove_user_tracking($userid, $subcontext);
+                 }
+             }
+             break;
+
+        case CONTEXT_COURSE:   // For a whole course
+             if ($course = get_record('course', 'id', $context->instanceid, '', '', '', '', 'id')) {
+                // find all forums in which this user has reading tracked
+                if ($forums = get_records_sql("SELECT f.id, cm.id as coursemodule
+                                                 FROM {$CFG->prefix}forum f,
+                                                      {$CFG->prefix}modules m,
+                                                      {$CFG->prefix}course_modules cm,
+                                                      {$CFG->prefix}forum_read fr
+                                                WHERE fr.userid = $userid AND f.course = $context->instanceid
+                                                      AND fr.forumid = f.id AND cm.instance = f.id
+                                                      AND cm.module = m.id AND m.name = 'forum'")) {
+
+                     foreach ($forums as $forum) {
+                         if ($modcontext = get_context_instance(CONTEXT_MODULE, $forum->coursemodule)) {
+                             if (!has_capability('mod/forum:viewdiscussion', $modcontext, $userid)) {
+                                forum_tp_delete_read_records($userid, -1, -1, $forum->id);
+                             }
+                         }
+                     }
+                 }
+
+                // find all forums in which this user has a disabled tracking
+                if ($forums = get_records_sql("SELECT f.id, cm.id as coursemodule
+                                                 FROM {$CFG->prefix}forum f,
+                                                      {$CFG->prefix}modules m,
+                                                      {$CFG->prefix}course_modules cm,
+                                                      {$CFG->prefix}forum_track_prefs ft
+                                                WHERE ft.userid = $userid AND f.course = $context->instanceid
+                                                      AND ft.forumid = f.id AND cm.instance = f.id
+                                                      AND cm.module = m.id AND m.name = 'forum'")) {
+
+                     foreach ($forums as $forum) {
+                         if ($modcontext = get_context_instance(CONTEXT_MODULE, $forum->coursemodule)) {
+                             if (!has_capability('mod/forum:viewdiscussion', $modcontext, $userid)) {
+                                delete_records('forum_track_prefs', 'userid', $userid, 'forumid', $forum->id);
+                             }
+                         }
+                     }
+                 }
+             }
+             break;
+
+        case CONTEXT_MODULE:   // Just one forum
+             if ($cm = get_coursemodule_from_id('forum', $context->instanceid)) {
+                 if ($forum = get_record('forum', 'id', $cm->instance)) {
+                     if (!has_capability('mod/forum:viewdiscussion', $context, $userid)) {
+                        delete_records('forum_track_prefs', 'userid', $userid, 'forumid', $forum->id);
+                        forum_tp_delete_read_records($userid, -1, -1, $forum->id);
+                     }
+                 }
+             }
+             break;
+    }
+
+    return true;
+}
+
+/**
+ *
+ */
+function forum_tp_add_read_record($userid, $postid, $discussionid, $forumid) {
+    if (!$readrecords = forum_tp_get_read_records($userid, $postid)) {
         // New read record
-        unset($readrecord);
-        $readrecord->userid = $userid;
-        $readrecord->postid = $postid;
+        $readrecord = new object();
+        $readrecord->userid       = $userid;
+        $readrecord->postid       = $postid;
         $readrecord->discussionid = $discussionid;
-        $readrecord->forumid = $forumid;
-        $readrecord->firstread = time();
-        $readrecord->lastread = $readrecord->firstread;
+        $readrecord->forumid      = $forumid;
+        $readrecord->firstread    = time();
+        $readrecord->lastread     = $readrecord->firstread;
         return insert_record('forum_read', $readrecord, true);
 
     } else {
         // Update read record
-        $readrecord = reset($readrecord);
-        $readrecord->lastread = time();
-
-        $update = NULL;
-        $update->id = $readrecord->id;
-        $update->lastread = $readrecord->lastread;
-
-        // This shouldn't happen, but just in case...
-        if (!$readrecord->firstread) {
-            // Update the 'firstread' field.
-            $update->firstread = $readrecord->lastread;
-        }
-        if ($discussionid > -1) {
-            // Update the 'discussionid' field.
-            $update->discussionid = $discussionid;
-        }
-        if ($forumid > -1) {
-            // Update the 'forumid' field.
-            $update->forumid = $forumid;
-        }
-
-        return update_record('forum_read', $update);
+        $readrecord = reset($readrecords);
+        $readrecord->lastread     = time();
+        $readrecord->discussionid = $discussionid;
+        $readrecord->forumid      = $forumid;
+        return update_record('forum_read', $readrecord);
     }
 }
 
@@ -5042,6 +5161,7 @@ function forum_check_throttling($forum) {
                                   .' ON p.discussion = d.id WHERE d.forum = '.$forum->id
                                   .' AND p.userid = '.$USER->id.' AND p.created > '.$timeafter);
 
+    $a = new object();
     $a->blockafter = $forum->blockafter;
     $a->numposts = $numposts;
     $a->blockperiod = get_string('secondstotime'.$forum->blockperiod);
@@ -5058,106 +5178,180 @@ function forum_check_throttling($forum) {
 
 
 /**
- * This function is used by the remove_course_userdata function in moodlelib.
- * If this function exists, remove_course_userdata will execute it.
- * This function will remove all posts from the specified forum.
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
  */
-function forum_delete_userdata($data, $showfeedback=true) {
+function forum_reset_gradebook($courseid, $type='') {
     global $CFG;
 
-    $sql = "DELETE FROM {$CFG->prefix}forum_posts
-              WHERE discussion IN (
-                SELECT fd.id FROM {$CFG->prefix}forum_discussions fd, {$CFG->prefix}forum f
-                  WHERE f.course={$data->courseid} AND f.id=fd.forum "; // closing ) added bellow
-    
-    $strreset = get_string('reset');
-    
-    $attforumtype = '';
-    $postsarr = array();
-    if (!empty($data->reset_forum_news)) {
-        $select = "$sql AND f.type = 'news' )";
-        $postsarr = forum_get_posts_with_attachments($data->courseid," 'news' ",$postsarr);//select posts from news forum with attachments
-        if (execute_sql($select, false) and $showfeedback) {
-            notify($strreset.': '.get_string('namenews','forum'), 'notifysuccess');
+    $type = $type ? "AND f.type='$type'" : '';
+
+    $sql = "SELECT f.*, cm.idnumber as cmidnumber, f.course as courseid
+              FROM {$CFG->prefix}forum f, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='forum' AND m.id=cm.module AND cm.instance=f.id AND f.course=$courseid $type";
+
+    if ($forums = get_records_sql($sql)) {
+        foreach ($forums as $forum) {
+            forum_grade_item_update($forum, 'reset');
         }
     }
-    if (!empty($data->reset_forum_single)) {
-        $select = "$sql AND f.type = 'single' ) AND parent <> 0 ";
-        $postsarr = forum_get_posts_with_attachments($data->courseid," 'single' AND fp.parent<>0 ",$postsarr);
-        if (execute_sql($select, false) and $showfeedback) {
-            notify($strreset.': '.get_string('singleforum','forum'), 'notifysuccess');
+}
+
+/**
+ * This function is used by the reset_course_userdata function in moodlelib.
+ * This function will remove all posts from the specified forum
+ * and clean up any related data.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function forum_reset_userdata($data) {
+    global $CFG, $FORUM_TYPES_ALL;
+    require_once($CFG->libdir.'/filelib.php');
+
+    $componentstr = get_string('modulenameplural', 'forum');
+    $status = array();
+
+    $removeposts = false;
+    if (!empty($data->reset_forum_all)) {
+        $removeposts = true;
+        $typesql     = "";
+        $typesstr    = get_string('resetforumsall', 'forum');
+        $types       = array();
+
+    } else if (!empty($data->reset_forum_types)){
+        $removeposts = true;
+        $typesql     = "";
+        $types       = array();
+        foreach ($data->reset_forum_types as $type) {
+            if (!array_key_exists($type, $FORUM_TYPES_ALL)) {
+                continue;
+            }
+            $typesql .= " AND f.type='$type'";
+            $types[] = $FORUM_TYPES_ALL[$type];
         }
+        $typesstr = get_string('resetforums', 'forum').': '.implode(', ', $types);
+
     }
-    if (!empty($data->reset_forum_eachuser)) {
-        $select = "$sql AND f.type = 'eachuser' )";
-        $postsarr = forum_get_posts_with_attachments($data->courseid," 'eachuser' ",$postsarr);
-        if (execute_sql($select, false) and $showfeedback) {
-            notify($strreset.': '.get_string('eachuserforum','forum'), 'notifysuccess');
+
+    $alldiscussionssql = "SELECT fd.id
+                            FROM {$CFG->prefix}forum_discussions fd, {$CFG->prefix}forum f
+                           WHERE f.course={$data->courseid} AND f.id=fd.forum";
+
+    $allforumssql      = "SELECT f.id
+                            FROM {$CFG->prefix}forum f
+                           WHERE f.course={$data->courseid}";
+
+    $allpostssql       = "SELECT fp.id
+                            FROM {$CFG->prefix}forum_posts fp, {$CFG->prefix}forum_discussions fd, {$CFG->prefix}forum f
+                           WHERE f.course={$data->courseid} AND f.id=fd.forum AND fd.id=fp.discussion";
+
+    if ($removeposts) {
+        $discussionssql = "$alldiscussionssql $typesql";
+        $forumssql      = "$allforumssql $typesql";
+        $postssql       = "$allpostssql $typesql";
+
+        // first delete all read flags
+        delete_records_select('forum_read', "forumid IN ($forumssql)");
+
+        // remove tracking prefs
+        delete_records_select('forum_track_prefs', "forumid IN ($forumssql)");
+
+        // remove posts from queue
+        delete_records_select('forum_queue', "discussionid IN ($discussionssql)");
+
+        // remove ratings
+        delete_records_select('forum_ratings', "post IN ($postssql)");
+
+        // all posts
+        delete_records_select('forum_posts', "discussion IN ($discussionssql)");
+
+        // finally all discussions
+        delete_records_select('forum_discussions', "forum IN ($forumssql)");
+
+        // now get rid of all attachments
+        if ($forums = get_records_sql($forumssql)) {
+            foreach ($forums as $forumid=>$unused) {
+                fulldelete($CFG->dataroot.'/'.$data->courseid.'/moddata/forum/'.$forumid);
+            }
         }
-    }
-    if (!empty($data->reset_forum_general)) {
-        $select = "$sql AND f.type = 'general' )";
-        $postsarr = forum_get_posts_with_attachments($data->courseid," 'general' ",$postsarr);
-        if (execute_sql($select, false) and $showfeedback) {
-            notify($strreset.': '.get_string('generalforum','forum'), 'notifysuccess');
+
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            if (empty($types)) {
+                forum_reset_gradebook($data->courseid);
+            } else {
+                foreach ($types as $type) {
+                    forum_reset_gradebook($data->courseid, $type);
+                }
+            }
         }
+
+        $status[] = array('component'=>$componentstr, 'item'=>$typesstr, 'error'=>false);
     }
-    
-    //selected posts with attachments to delete attachments files  
-    foreach($postsarr as $post){
-        forum_delete_old_attachments($post); 
+
+    // remove all ratings
+    if (!empty($data->reset_forum_ratings)) {
+        delete_records_select('forum_ratings', "post IN ($allpostssql)");
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            forum_reset_gradebook($data->courseid);
+        }
     }
-    
+
+    // remove all subscriptions unconditionally - even for users still enrolled in course
     if (!empty($data->reset_forum_subscriptions)) {
-        $subscripsql = "DELETE FROM {$CFG->prefix}forum_subscriptions
-                          WHERE forum IN (
-                            SELECT id FROM {$CFG->prefix}forum
-                              WHERE course = {$data->courseid} )";
+        delete_records_select('forum_subscriptions', "forum IN ($allforumssql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('resetsubscriptions','forum'), 'error'=>false);
+    }
 
-        if (execute_sql($subscripsql, false) and $showfeedback) {
-            notify($strreset.': '.get_string('resetsubscriptions','forum'), 'notifysuccess');
-        }
+    // remove all tracking prefs unconditionally - even for users still enrolled in course
+    if (!empty($data->reset_forum_track_prefs)) {
+        delete_records_select('forum_track_prefs', "forumid IN ($allforumssql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('resettrackprefs','forum'), 'error'=>false);
     }
-}
 
-/*
- * Gets posts from selected course and forum type with attachments to delete this attachements files
- * 
- * @param int $courseid  course id
- * @param string $ftype  type of forum
- * @param array $postsarr array of selected posts, we are adding to this array new posts
- * 
- * @return mixed an array of objects, or false if no records were found or an error occured.
- */       
-function forum_get_posts_with_attachments($courseid,$ftype,$postsarr){
-    global $CFG;
-    $attquery = "SELECT fp.*,fd.course,fd.forum 
-                FROM {$CFG->prefix}forum_discussions fd,{$CFG->prefix}forum_posts fp,{$CFG->prefix}forum f
-                WHERE fd.course = $courseid 
-                    AND fd.id = fp.discussion
-                    AND fp.attachment <>''
-                    AND f.id = fd.forum
-                    AND f.type = $ftype ";
-    if ($records = get_records_sql($attquery)){
-        return array_merge((array)$postsarr,$records);
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('forum', array('assesstimestart', 'assesstimefinish'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
     }
-    return $postsarr;    
+
+    return $status;
 }
 
 /**
  * Called by course/reset.php
+ * @param $mform form passed by reference
  */
-function forum_reset_course_form($course) {
-    echo get_string('resetforums', 'forum'); echo ':<br />';
-    print_checkbox('reset_forum_news', 1, true, get_string('namenews','forum'), '', '');  echo '<br />';
-    print_checkbox('reset_forum_single', 1, true, get_string('singleforum','forum'), '', '');  echo '<br />';
-    print_checkbox('reset_forum_eachuser', 1, true, get_string('eachuserforum','forum'), '', '');  echo '<br />';
-    print_checkbox('reset_forum_general', 1, true, get_string('generalforum','forum'), '', '');  echo '<br />';
-    echo '<p>';
-    print_checkbox('reset_forum_subscriptions', 1, true, get_string('resetsubscriptions','forum'), '', '');
-    echo '</p>';
+function forum_reset_course_form_definition(&$mform) {
+    global $FORUM_TYPES_ALL;
+
+    $mform->addElement('header', 'forumheader', get_string('modulenameplural', 'forum'));
+
+    $mform->addElement('checkbox', 'reset_forum_all', get_string('resetforumsall','forum'));
+
+    $mform->addElement('select', 'reset_forum_types', get_string('resetforums', 'forum'), $FORUM_TYPES_ALL, array('multiple' => 'multiple'));
+    $mform->setAdvanced('reset_forum_types');
+    $mform->disabledIf('reset_forum_types', 'reset_forum_all', 'checked');
+
+    $mform->addElement('checkbox', 'reset_forum_subscriptions', get_string('resetsubscriptions','forum'));
+    $mform->setAdvanced('reset_forum_subscriptions');
+
+    $mform->addElement('checkbox', 'reset_forum_track_prefs', get_string('resettrackprefs','forum'));
+    $mform->setAdvanced('reset_forum_track_prefs');
+    $mform->disabledIf('reset_forum_track_prefs', 'reset_forum_all', 'checked');
+
+    $mform->addElement('checkbox', 'reset_forum_ratings', get_string('deleteallratings'));
+    $mform->disabledIf('reset_forum_ratings', 'reset_forum_all', 'checked');
 }
 
+/**
+ * Course reset form defaults.
+ */
+function forum_reset_course_form_defaults($course) {
+    return array('reset_forum_all'=>1, 'reset_forum_subscriptions'=>0, 'reset_forum_track_prefs'=>0, 'reset_forum_ratings'=>1);
+}
 
 /**
  * Converts a forum to use the Roles System
index 83053f8b304441d1bcc8f6f2eed9781432c436ba..f3058c9fff625d1532048e4dcd54f856c7234909 100644 (file)
@@ -373,9 +373,10 @@ function glossary_update_grades($glossary=null, $userid=0, $nullifnone=true) {
  * Create/update grade item for given glossary
  *
  * @param object $glossary object with extra cmidnumber
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return int, 0 if ok, error code otherwise
  */
-function glossary_grade_item_update($glossary) {
+function glossary_grade_item_update($glossary, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -396,7 +397,12 @@ function glossary_grade_item_update($glossary) {
         $params['scaleid']   = -$glossary->scale;
     }
 
-    return grade_update('mod/glossary', $glossary->course, 'mod', 'glossary', $glossary->id, 0, NULL, $params);
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
+    return grade_update('mod/glossary', $glossary->course, 'mod', 'glossary', $glossary->id, 0, $grades, $params);
 }
 
 /**
@@ -2123,4 +2129,203 @@ function glossary_get_post_actions() {
     return array('add category','add comment','add entry','approve entry','delete category','delete comment','delete entry','edit category','update comment','update entry');
 }
 
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the glossary.
+ * @param $mform form passed by reference
+ */
+function glossary_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'glossaryheader', get_string('modulenameplural', 'glossary'));
+    $mform->addElement('checkbox', 'reset_glossary_all', get_string('resetglossariesall','glossary'));
+
+    $mform->addElement('select', 'reset_glossary_types', get_string('resetglossaries', 'glossary'),
+                       array('main'=>get_string('mainglossary', 'glossary'), 'secondary'=>get_string('secondaryglossary', 'glossary')), array('multiple' => 'multiple'));
+    $mform->setAdvanced('reset_glossary_types');
+    $mform->disabledIf('reset_glossary_types', 'reset_glossary_all', 'checked');
+
+    $mform->addElement('checkbox', 'reset_glossary_notenrolled', get_string('deletenotenrolled', 'glossary'));
+    $mform->disabledIf('reset_glossary_notenrolled', 'reset_glossary_all', 'checked');
+
+    $mform->addElement('checkbox', 'reset_glossary_ratings', get_string('deleteallratings'));
+    $mform->disabledIf('reset_glossary_ratings', 'reset_glossary_all', 'checked');
+
+    $mform->addElement('checkbox', 'reset_glossary_comments', get_string('deleteallcomments'));
+    $mform->disabledIf('reset_glossary_comments', 'reset_glossary_all', 'checked');
+}
+
+/**
+ * Course reset form defaults.
+ */
+function glossary_reset_course_form_defaults($course) {
+    return array('reset_glossary_all'=>0, 'reset_glossary_ratings'=>1, 'reset_glossary_comments'=>1, 'reset_glossary_notenrolled'=>0);
+}
+
+/**
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
+ */
+function glossary_reset_gradebook($courseid, $type='') {
+    global $CFG;
+
+    switch ($type) {
+        case 'main'      : $type = "AND g.mainglossary=1"; break;
+        case 'secondary' : $type = "AND g.mainglossary=0"; break;
+        default          : $type = ""; //all
+    }
+
+    $sql = "SELECT g.*, cm.idnumber as cmidnumber, g.course as courseid
+              FROM {$CFG->prefix}glossary g, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='glossary' AND m.id=cm.module AND cm.instance=g.id AND g.course=$courseid $type";
+
+    if ($glossarys = get_records_sql($sql)) {
+        foreach ($glossarys as $glossary) {
+            glossary_grade_item_update($glossary, 'reset');
+        }
+    }
+}
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * glossary responses for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function glossary_reset_userdata($data) {
+    global $CFG;
+    require_once($CFG->libdir.'/filelib.php');
+
+    $componentstr = get_string('modulenameplural', 'glossary');
+    $status = array();
+
+    $allentriessql = "SELECT e.id
+                        FROM {$CFG->prefix}glossary_entries e
+                             INNER JOIN {$CFG->prefix}glossary g ON e.glossaryid = g.id
+                       WHERE g.course = {$data->courseid}";
+
+    $allglossariessql = "SELECT g.id
+                            FROM {$CFG->prefix}glossary g
+                           WHERE g.course={$data->courseid}";
+
+    // delete entries if requested
+    if (!empty($data->reset_glossary_all)
+         or (!empty($data->reset_glossary_types) and in_array('main', $data->reset_glossary_types) and in_array('secondary', $data->reset_glossary_types))) {
+
+        delete_records_select('glossary_ratings', "entryid IN ($allentriessql)");
+        delete_records_select('glossary_comments', "entryid IN ($allentriessql)");
+        delete_records_select('glossary_entries', "glossaryid IN ($allglossariessql)");
+
+        if ($glossaries = get_records_sql($allglossariessql)) {
+            foreach ($glossaries as $glossaryid=>$unused) {
+                fulldelete($CFG->dataroot."/$data->courseid/moddata/glossary/$glossaryid");
+            }
+        }
+
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            glossary_reset_gradebook($data->courseid);
+        }
+
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('resetglossariesall', 'glossary'), 'error'=>false);
+
+    } else if (!empty($data->reset_glossary_types)) {
+        $mainentriessql         = "$allentries AND g.mainglossary=1";
+        $secondaryentriessql    = "$allentries AND g.mainglossary=0";
+
+        $mainglossariessql      = "$allglossariessql AND g.mainglossary=1";
+        $secondaryglossariessql = "$allglossariessql AND g.mainglossary=0";
+
+        if (in_array('main', $data->reset_glossary_types)) {
+            delete_records_select('glossary_ratings', "entryid IN ($mainentriessql)");
+            delete_records_select('glossary_comments', "entryid IN ($mainentriessql)");
+            delete_records_select('glossary_entries', "glossaryid IN ($mainglossariessql)");
+
+            if ($glossaries = get_records_sql($mainglossariessql)) {
+                foreach ($glossaries as $glossaryid=>$unused) {
+                    fulldelete("$CFG->dataroot/$data->courseid/moddata/glossary/$glossaryid");
+                }
+            }
+
+            // remove all grades from gradebook
+            if (empty($data->reset_gradebook_grades)) {
+                glossary_reset_gradebook($data->courseid, 'main');
+            }
+
+            $status[] = array('component'=>$componentstr, 'item'=>get_string('resetglossaries', 'glossary'), 'error'=>false);
+
+        } else if (in_array('secondary', $data->reset_glossary_types)) {
+            delete_records_select('glossary_ratings', "entryid IN ($secondaryentriessql)");
+            delete_records_select('glossary_comments', "entryid IN ($secondaryentriessql)");
+            delete_records_select('glossary_entries', "glossaryid IN ($secondaryglossariessql)");
+            // remove exported source flag from entries in main glossary
+            execute_sql("UPDATE {$CFG->prefix}glossary_entries
+                            SET sourceglossaryid=0
+                          WHERE glossaryid IN ($mainglossariessql)", false);
+
+            if ($glossaries = get_records_sql($secondaryglossariessql)) {
+                foreach ($glossaries as $glossaryid=>$unused) {
+                    fulldelete("$CFG->dataroot/$data->courseid/moddata/glossary/$glossaryid");
+                }
+            }
+
+            // remove all grades from gradebook
+            if (empty($data->reset_gradebook_grades)) {
+                glossary_reset_gradebook($data->courseid, 'secondary');
+            }
+
+            $status[] = array('component'=>$componentstr, 'item'=>get_string('resetglossaries', 'glossary').': '.get_string('secondaryglossary', 'glossary'), 'error'=>false);
+        }
+    }
+
+    // remove entries by users not enrolled into course
+    if (!empty($data->reset_glossary_notenrolled)) {
+        $entriessql = "SELECT e.id, e.userid, e.glossaryid, u.id AS userexists, u.deleted AS userdeleted
+                         FROM {$CFG->prefix}glossary_entries e
+                              INNER JOIN {$CFG->prefix}glossary g ON e.glossaryid = g.id
+                              LEFT OUTER JOIN {$CFG->prefix}user u ON e.userid = u.id
+                        WHERE g.course = {$data->courseid} AND e.userid > 0";
+
+        $course_context = get_context_instance(CONTEXT_COURSE, $data->courseid);
+        $notenrolled = array();
+        if ($rs = get_recordset_sql($entriessql)) {
+            while ($entry = rs_fetch_next_record($rs)) {
+                if (array_key_exists($entry->userid, $notenrolled) or !$entry->userexists or $entry->userdeleted
+                  or !has_capability('moodle/course:view', $course_context , $entry->userid)) {
+                    delete_records('glossary_ratings', 'entryid', $entry->id);
+                    delete_records('glossary_comments', 'entryid', $entry->id);
+                    delete_records('glossary_entries', 'id', $entry->id);
+                    fulldelete("$CFG->dataroot/$data->courseid/moddata/glossary/$entry->glossaryid");
+                    $notenrolled[$entry->userid] = true;
+                }
+            }
+            rs_close($rs);
+            $status[] = array('component'=>$componentstr, 'item'=>get_string('deletenotenrolled', 'glossary'), 'error'=>false);
+        }
+    }
+
+    // remove all ratings
+    if (!empty($data->reset_glossary_ratings)) {
+        delete_records_select('glossary_ratings', "entryid IN ($allentriessql)");
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            glossary_reset_gradebook($data->courseid);
+        }
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallratings'), 'error'=>false);
+    }
+
+    // remove all comments
+    if (!empty($data->reset_glossary_comments)) {
+        delete_records_select('glossary_comments', "entryid IN ($allentriessql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallcomments'), 'error'=>false);
+    }
+
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('glossary', array('assesstimestart', 'assesstimefinish'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
+    }
+
+    return $status;
+}
+
 ?>
index b55a66055e051075a0defc08150d4263ba94d4a0..58c7fcb22f749db97823996b255dba0ae47434c1 100644 (file)
@@ -99,4 +99,14 @@ function label_get_types() {
 
     return $types;
 }
+
+/**
+ * This function is used by the reset_course_userdata function in moodlelib.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function label_reset_userdata($data) {
+    return array();
+}
+
 ?>
index 43450948941520fedfc564ab4e5c4c747ac63f79..7b479ee057d02ef186b1ab953531674294635fb0 100644 (file)
@@ -407,9 +407,10 @@ function lesson_update_grades($lesson=null, $userid=0, $nullifnone=true) {
  * Create grade item for given lesson
  *
  * @param object $lesson object with extra cmidnumber
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return int 0 if ok, error code otherwise
  */
-function lesson_grade_item_update($lesson) {
+function lesson_grade_item_update($lesson, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -432,7 +433,12 @@ function lesson_grade_item_update($lesson) {
         $params['multfactor'] = 1.0;
     }
 
-    return grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, NULL, $params);
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
+    return grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, $grades, $params);
 }
 
 /**
@@ -580,4 +586,81 @@ function lesson_process_post_save(&$lesson) {
     }
 }
 
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the lesson.
+ * @param $mform form passed by reference
+ */
+function lesson_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'lessonheader', get_string('modulenameplural', 'lesson'));
+    $mform->addElement('advcheckbox', 'reset_lesson', get_string('deleteallattempts','lesson'));
+}
+
+/**
+ * Course reset form defaults.
+ */
+function lesson_reset_course_form_defaults($course) {
+    return array('reset_lesson'=>1);
+}
+
+/**
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
+ */
+function lesson_reset_gradebook($courseid, $type='') {
+    global $CFG;
+
+    $sql = "SELECT l.*, cm.idnumber as cmidnumber, l.course as courseid
+              FROM {$CFG->prefix}lesson l, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='lesson' AND m.id=cm.module AND cm.instance=l.id AND l.course=$courseid";
+
+    if ($lessons = get_records_sql($sql)) {
+        foreach ($lessons as $lesson) {
+            lesson_grade_item_update($lesson, 'reset');
+        }
+    }
+}
+
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * lesson attempts for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function lesson_reset_userdata($data) {
+    global $CFG;
+
+    $componentstr = get_string('modulenameplural', 'lesson');
+    $status = array();
+
+    if (!empty($data->reset_lesson)) {
+        $lessonssql = "SELECT l.id
+                         FROM {$CFG->prefix}lesson l
+                        WHERE l.course={$data->courseid}";
+
+
+        delete_records_select('lesson_timer', "lessonid IN ($lessonssql)");
+        delete_records_select('lesson_high_scores', "lessonid IN ($lessonssql)");
+        delete_records_select('lesson_grades', "lessonid IN ($lessonssql)");
+        delete_records_select('lesson_attempts', "lessonid IN ($lessonssql)");
+
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            lesson_reset_gradebook($data->courseid);
+        }
+
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallattempts', 'lesson'), 'error'=>false);
+    }
+
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('lesson', array('available', 'deadline'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false);
+    }
+
+    return $status;
+}
+
 ?>
index be430cd6249910777a0f46bd1425d7d2d0df1ae7..ad45148aa1610cfeab9615450fb5a3f91f229b6d 100644 (file)
@@ -322,7 +322,7 @@ function quiz_update_grades($quiz=null, $userid=0, $nullifnone=true) {
  * Create grade item for given quiz
  *
  * @param object $quiz object with extra cmidnumber
- * @param mixed optional array/object of grade(s)
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return int 0 if ok, error code otherwise
  */
 function quiz_grade_item_update($quiz, $grades=NULL) {
@@ -370,6 +370,11 @@ function quiz_grade_item_update($quiz, $grades=NULL) {
         $params['hidden'] = 0;
     }
 
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
     return grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, $grades, $params);
 }
 
@@ -896,12 +901,37 @@ function quiz_question_list_instances($questionid) {
 /**
  * Implementation of the function for printing the form elements that control
  * whether the course reset functionality affects the quiz.
- * @param $course The course id of the course the user is thinking of resetting.
+ * @param $mform form passed by reference
+ */
+function quiz_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'forumheader', get_string('modulenameplural', 'quiz'));
+    $mform->addElement('advcheckbox', 'reset_quiz_attempts', get_string('removeallquizattempts','quiz'));
+}
+
+/**
+ * Course reset form defaults.
+ */
+function quiz_reset_course_form_defaults($course) {
+    return array('reset_quiz_attempts'=>1);
+}
+
+/**
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
  */
-function quiz_reset_course_form($course) {
-    echo '<p>';
-    print_checkbox('reset_quiz_attempts', 1, true, get_string('removeallquizattempts','quiz'));
-    echo '</p>';
+function quiz_reset_gradebook($courseid, $type='') {
+    global $CFG;
+
+    $sql = "SELECT q.*, cm.idnumber as cmidnumber, q.course as courseid
+              FROM {$CFG->prefix}quiz q, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='quiz' AND m.id=cm.module AND cm.instance=q.id AND q.course=$courseid";
+
+    if ($quizs = get_records_sql($sql)) {
+        foreach ($quizs as $quiz) {
+            quiz_grade_item_update($quiz, 'reset');
+        }
+    }
 }
 
 /**
@@ -910,73 +940,63 @@ function quiz_reset_course_form($course) {
  * set and true.
  *
  * Also, move the quiz open and close dates, if the course start date is changing.
- *
- * @param $data the data submitted from the reset course forum.
- * @param $showfeedback whether to output progress information as the reset
- *      progresses.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
  */
-function quiz_delete_userdata($data, $showfeedback=true) {
-    global $CFG;
+function quiz_reset_userdata($data) {
+    global $CFG, $QTYPES;
+
+    $componentstr = get_string('modulenameplural', 'quiz');
+    $status = array();
 
     /// Delete attempts.
     if (!empty($data->reset_quiz_attempts)) {
-        $conditiononquizids = 'quiz IN (SELECT id FROM ' .
-                $CFG->prefix . 'quiz q WHERE q.course = ' . $data->courseid . ')';
-    
-        $attemptids = get_records_select('quiz_attempts', $conditiononquizids, '', 'id, uniqueid');
-        if ($attemptids) {
-            if ($showfeedback) {
-                echo '<div class="notifysuccess">', get_string('deletingquestionattempts', 'quiz');
-                $divider = ': ';
-            }
-            foreach ($attemptids as $attemptid) {
-                delete_attempt($attemptid->uniqueid);
-                if ($showfeedback) {
-                    echo $divider, $attemptid->uniqueid;
-                    $divider = ', ';
-                }
-            }
-            if ($showfeedback) {
-                echo "</div><br />\n";
+
+        $stateslistsql = "SELECT s.id
+                            FROM {$CFG->prefix}question_states s
+                                 INNER JOIN {$CFG->prefix}quiz_attempts qza ON s.attempt=qza.uniqueid
+                                 INNER JOIN {$CFG->prefix}quiz q ON qza.quiz=q.id
+                           WHERE q.course={$data->courseid}";
+
+        $attemptssql   = "SELECT a.uniqueid
+                            FROM {$CFG->prefix}quiz_attempts a, {$CFG->prefix}quiz q
+                           WHERE q.course={$data->courseid} AND a.quiz=q.id";
+
+        $quizessql     = "SELECT q.id
+                            FROM {$CFG->prefix}quiz q
+                           WHERE q.course={$data->courseid}";
+
+        if ($states = get_records_sql($stateslistsql)) {
+            //TODO: not sure if this works
+            $stateslist = implode(',', array_keys($states));
+            foreach ($QTYPES as $qtype) {
+                $qtype->delete_states($stateslist);
             }
         }
-        if (delete_records_select('quiz_grades', $conditiononquizids) && $showfeedback) {
-            notify(get_string('gradesdeleted','quiz'), 'notifysuccess');
-        }
-        if (delete_records_select('quiz_attempts', $conditiononquizids) && $showfeedback) {
-            notify(get_string('attemptsdeleted','quiz'), 'notifysuccess');
+
+        delete_records_select('question_states', "attempt IN ($attemptssql)");
+        delete_records_select('question_sessions', "attemptid IN ($attemptssql)");
+        delete_records_select('question_attempts', "id IN ($attemptssql)");
+
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            quiz_reset_gradebook($data->courseid);
         }
+
+        delete_records_select('quiz_grades', "quiz IN ($quizessql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('gradesdeleted','quiz'), 'error'=>false);
+
+        delete_records_select('quiz_attempts', "quiz IN ($quizessql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('attemptsdeleted','quiz'), 'error'=>false);
     }
 
-    /// Update open and close dates
-    if (!empty($data->reset_start_date)) {
-        /// Work out offset.
-        $olddate = get_field('course', 'startdate', 'id', $data->courseid);
-        $olddate = usergetmidnight($olddate); // time part of $olddate should be zero
-        $newdate = make_timestamp($data->startyear, $data->startmonth, $data->startday);
-        $interval = $newdate - $olddate;
-        
-        /// Apply it to quizzes with an open or close date.
-        $success = true;
-        begin_sql();
-        $success = $success && execute_sql(
-                "UPDATE {$CFG->prefix}quiz
-                    SET timeopen = timeopen + $interval
-                    WHERE course = {$data->courseid} AND timeopen <> 0", false);
-        $success = $success && execute_sql(
-                "UPDATE {$CFG->prefix}quiz
-                    SET timeclose = timeclose + $interval
-                    WHERE course = {$data->courseid} AND timeclose <> 0", false);
-
-        if ($success) {
-            commit_sql();
-            if ($showfeedback) {
-                notify(get_string('openclosedatesupdated', 'quiz'), 'notifysuccess');
-            }
-        } else {
-            rollback_sql();
-        }
+    /// updating dates - shift may be negative too
+    if ($data->timeshift) {
+        shift_course_mod_dates('quiz', array('timeopen', 'timeclose'), $data->timeshift, $data->courseid);
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('openclosedatesupdated', 'quiz'), 'error'=>false);
     }
+
+    return $status;
 }
 
 /**
index 080f3ea52889366f74281c2a6b373dcbae6dd842..73631dd87f8cb16ea86f34992ddd43622230ce46 100644 (file)
@@ -667,4 +667,12 @@ function resource_delete_warning($course, $files) {
     }
 }
 
+/**
+ * This function is used by the reset_course_userdata function in moodlelib.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function resource_reset_userdata($data) {
+    return array();
+}
 ?>
index dfc90c19d35883ce6040fa83d148ab4a6f15dae1..f2048534e5f9e093b35857bc43da7f06a156f858 100755 (executable)
@@ -488,9 +488,10 @@ function scorm_update_grades($scorm=null, $userid=0, $nullifnone=true) {
  * Update/create grade item for given scorm
  *
  * @param object $scorm object with extra cmidnumber
+ * @param mixed optional array/object of grade(s); 'reset' means reset grades in gradebook
  * @return object grade_item
  */
-function scorm_grade_item_update($scorm) {
+function scorm_grade_item_update($scorm, $grades=NULL) {
     global $CFG;
     if (!function_exists('grade_update')) { //workaround for buggy PHP versions
         require_once($CFG->libdir.'/gradelib.php');
@@ -512,7 +513,12 @@ function scorm_grade_item_update($scorm) {
         $params['grademin']  = 0;
     }
 
-    return grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, NULL, $params);
+    if ($grades  === 'reset') {
+        $params['reset'] = true;
+        $grades = NULL;
+    }
+
+    return grade_update('mod/scorm', $scorm->course, 'mod', 'scorm', $scorm->id, 0, $grades, $params);
 }
 
 /**
@@ -559,4 +565,72 @@ function scorm_option2text($scorm) {
     return $scorm;
 }
 
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the scorm.
+ * @param $mform form passed by reference
+ */
+function scorm_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'scormheader', get_string('modulenameplural', 'scorm'));
+    $mform->addElement('advcheckbox', 'reset_scorm', get_string('deleteallattempts','scorm'));
+}
+
+/**
+ * Course reset form defaults.
+ */
+function scorm_reset_course_form_defaults($course) {
+    return array('reset_scorm'=>1);
+}
+
+/**
+ * Removes all grades from gradebook
+ * @param int $courseid
+ * @param string optional type
+ */
+function scorm_reset_gradebook($courseid, $type='') {
+    global $CFG;
+
+    $sql = "SELECT s.*, cm.idnumber as cmidnumber, s.course as courseid
+              FROM {$CFG->prefix}scorm s, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+             WHERE m.name='scorm' AND m.id=cm.module AND cm.instance=s.id AND s.course=$courseid";
+
+    if ($scorms = get_records_sql($sql)) {
+        foreach ($scorms as $scorm) {
+            scorm_grade_item_update($scorm, 'reset');
+        }
+    }
+}
+
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * scorm attempts for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function scorm_reset_userdata($data) {
+    global $CFG;
+
+    $componentstr = get_string('modulenameplural', 'scorm');
+    $status = array();
+
+    if (!empty($data->reset_scorm)) {
+        $scormssql = "SELECT s.id
+                         FROM {$CFG->prefix}scorm s
+                        WHERE s.course={$data->courseid}";
+
+        delete_records_select('scorm_scoes_track', "scormid IN ($scormssql)");
+
+        // remove all grades from gradebook
+        if (empty($data->reset_gradebook_grades)) {
+            scorm_reset_gradebook($data->courseid);
+        }
+
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallattempts', 'scorm'), 'error'=>false);
+    }
+
+    // no dates to shift here
+
+    return $status;
+}
+
 ?>
index 5db869e9a1d9a05abe31316fa6135f6972a25350..f3d66d23a55fcfb00b6ea3c197e9cfdd1eece974 100644 (file)
@@ -510,4 +510,55 @@ function survey_get_post_actions() {
     return array('submit');
 }
 
+
+/**
+ * Implementation of the function for printing the form elements that control
+ * whether the course reset functionality affects the survey.
+ * @param $mform form passed by reference
+ */
+function survey_reset_course_form_definition(&$mform) {
+    $mform->addElement('header', 'surveyheader', get_string('modulenameplural', 'survey'));
+    $mform->addElement('checkbox', 'reset_survey_answers', get_string('deleteallanswers','survey'));
+    $mform->addElement('checkbox', 'reset_survey_analysis', get_string('deleteanalysis','survey'));
+    $mform->disabledIf('reset_survey_analysis', 'reset_survey_answers', 'checked');
+}
+
+/**
+ * Course reset form defaults.
+ */
+function survey_reset_course_form_defaults($course) {
+    return array('reset_survey_answers'=>1, 'reset_survey_analysis'=>1);
+}
+
+/**
+ * Actual implementation of the rest coures functionality, delete all the
+ * survey responses for course $data->courseid.
+ * @param $data the data submitted from the reset course.
+ * @return array status array
+ */
+function survey_reset_userdata($data) {
+    global $CFG;
+
+    $componentstr = get_string('modulenameplural', 'survey');
+    $status = array();
+
+    $surveyssql = "SELECT ch.id
+                     FROM {$CFG->prefix}survey ch
+                    WHERE ch.course={$data->courseid}";
+
+    if (!empty($data->reset_survey_answers)) {
+        delete_records_select('survey_answers', "survey IN ($surveyssql)");
+        delete_records_select('survey_analysis', "survey IN ($surveyssql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallanswers', 'survey'), 'error'=>false);
+    }
+
+    if (!empty($data->reset_survey_analysis)) {
+        delete_records_select('survey_analysis', "survey IN ($surveyssql)");
+        $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallanswers', 'survey'), 'error'=>false);
+    }
+
+    // no date shifting
+    return $status;
+}
+
 ?>
index ca9a372ec831d893e3ac97b75ef84eb1b15bbfc1..cf71631ece8c31ffac3381db346e6d90ef1286f2 100644 (file)
@@ -254,4 +254,12 @@ function note_print_notes($header, $addcourseid = 0, $viewnotes = true, $coursei
     }
 }
 
+/**
+ * Delete all notes about users in course-
+ * @param int $courseid
+ * @return bool success
+ */
+function note_delete_all($courseid) {
+    return delete_records('post', 'module', 'notes', 'courseid', $courseid);
+}
 ?>