Skip to content

Commit

Permalink
MDL-57080 completion: Update completion expected date on reset
Browse files Browse the repository at this point in the history
  • Loading branch information
micaherne committed Dec 22, 2016
1 parent 0fbe41f commit 1afea82
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
14 changes: 14 additions & 0 deletions completion/criteria/completion_criteria_date.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,4 +213,18 @@ public function get_details($completion) {
public function get_icon($alt, array $attributes = null) {
return new pix_icon('i/calendar', $alt, 'moodle', $attributes);
}

/**
* Shift the date when resetting course.
*
* @param int $courseid the course id
* @param int $timeshift number of seconds to shift date
* @return boolean was the operation successful?
*/
public static function update_date($courseid, $timeshift) {
if ($criteria = self::fetch(array('course' => $courseid))) {
$criteria->timeend = $criteria->timeend + $timeshift;
$criteria->update();
}
}
}
20 changes: 18 additions & 2 deletions course/tests/courselib_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -3205,14 +3205,24 @@ public function course_enddate_provider() {
* @param int $resultingenddate
*/
public function test_course_dates_reset($startdate, $enddate, $resetstartdate, $resetenddate, $resultingstartdate, $resultingenddate) {
global $DB;
global $CFG, $DB;

require_once($CFG->dirroot.'/completion/criteria/completion_criteria_date.php');

$this->resetAfterTest(true);

$CFG->enablecompletion = true;

$this->setTimezone('UTC');

$record = array('startdate' => $startdate, 'enddate' => $enddate);
$record = array('startdate' => $startdate, 'enddate' => $enddate, 'enablecompletion' => 1);
$originalcourse = $this->getDataGenerator()->create_course($record);
$coursecriteria = new completion_criteria_date(array('course' => $originalcourse->id, 'timeend' => $startdate + DAYSECS));
$coursecriteria->insert();

$activitycompletiondate = $startdate + DAYSECS;
$data = $this->getDataGenerator()->create_module('data', array('course' => $originalcourse->id),
array('completion' => 1, 'completionexpected' => $activitycompletiondate));

$resetdata = new stdClass();
$resetdata->id = $originalcourse->id;
Expand All @@ -3226,6 +3236,12 @@ public function test_course_dates_reset($startdate, $enddate, $resetstartdate, $

$this->assertEquals($resultingstartdate, $course->startdate);
$this->assertEquals($resultingenddate, $course->enddate);

$coursecompletioncriteria = completion_criteria_date::fetch(array('course' => $originalcourse->id));
$this->assertEquals($resultingstartdate + DAYSECS, $coursecompletioncriteria->timeend);

$this->assertEquals($resultingstartdate + DAYSECS, $DB->get_field('course_modules', 'completionexpected',
array('id' => $data->cmid)));
}

/**
Expand Down
22 changes: 22 additions & 0 deletions lib/moodlelib.php
Original file line number Diff line number Diff line change
Expand Up @@ -5180,6 +5180,7 @@ function reset_course_userdata($data) {
global $CFG, $DB;
require_once($CFG->libdir.'/gradelib.php');
require_once($CFG->libdir.'/completionlib.php');
require_once($CFG->dirroot.'/completion/criteria/completion_criteria_date.php');
require_once($CFG->dirroot.'/group/lib.php');

$data->courseid = $data->id;
Expand Down Expand Up @@ -5224,6 +5225,27 @@ function reset_course_userdata($data) {
\availability_date\condition::update_all_dates($data->courseid, $data->timeshift);
}

// Update completion expected dates.
if ($CFG->enablecompletion) {
$modinfo = get_fast_modinfo($data->courseid);
$changed = false;
foreach ($modinfo->get_cms() as $cm) {
if ($cm->completion && !empty($cm->completionexpected)) {
$DB->set_field('course_modules', 'completionexpected', $cm->completionexpected + $data->timeshift,
array('id' => $cm->id));
$changed = true;
}
}

// Clear course cache if changes made.
if ($changed) {
rebuild_course_cache($data->courseid, true);
}

// Update course date completion criteria.
\completion_criteria_date::update_date($data->courseid, $data->timeshift);
}

$status[] = array('component' => $componentstr, 'item' => get_string('datechanged'), 'error' => false);
}

Expand Down

0 comments on commit 1afea82

Please sign in to comment.