Merge branch 'MDL-55158_m32v3' of https://github.com/sbourget/moodle

This commit is contained in:
David Monllao 2016-07-19 00:50:41 +02:00
commit 2f8da1e814
4 changed files with 182 additions and 2 deletions

View File

@ -54,6 +54,8 @@ $string['availabletodatevalidation'] = 'The available to date cannot be before t
$string['blank'] = 'Blank';
$string['buttons'] = 'Actions';
$string['bynameondate'] = 'by {$a->name} - {$a->date}';
$string['calendarend'] = 'Database {$a} closes';
$string['calendarstart'] = 'Database {$a} opens';
$string['cancel'] = 'Cancel';
$string['cannotaccesspresentsother'] = 'You are not allowed to access presets from other users';
$string['cannotadd'] = 'Can not add entries!';

View File

@ -904,7 +904,8 @@ function data_tags_check($dataid, $template) {
* @return int intance id
*/
function data_add_instance($data, $mform = null) {
global $DB;
global $DB, $CFG;
require_once($CFG->dirroot.'/mod/data/locallib.php');
if (empty($data->assessed)) {
$data->assessed = 0;
@ -919,6 +920,9 @@ function data_add_instance($data, $mform = null) {
$data->id = $DB->insert_record('data', $data);
// Add calendar events if necessary.
data_set_events($data);
data_grade_item_update($data);
return $data->id;
@ -932,7 +936,8 @@ function data_add_instance($data, $mform = null) {
* @return bool
*/
function data_update_instance($data) {
global $DB, $OUTPUT;
global $DB, $CFG;
require_once($CFG->dirroot.'/mod/data/locallib.php');
$data->timemodified = time();
$data->id = $data->instance;
@ -952,6 +957,9 @@ function data_update_instance($data) {
$DB->update_record('data', $data);
// Add calendar events if necessary.
data_set_events($data);
data_grade_item_update($data);
return true;
@ -992,6 +1000,13 @@ function data_delete_instance($id) { // takes the dataid
$DB->delete_records('data_records', array('dataid'=>$id));
$DB->delete_records('data_fields', array('dataid'=>$id));
// Remove old calendar events.
$events = $DB->get_records('event', array('modulename' => 'data', 'instance' => $id));
foreach ($events as $event) {
$event = calendar_event::load($event);
$event->delete();
}
// Delete the instance itself
$result = $DB->delete_records('data', array('id'=>$id));
@ -3965,3 +3980,33 @@ function data_process_submission(stdClass $mod, $fields, stdClass $datarecord) {
return $result;
}
/**
* This standard function will check all instances of this module
* and make sure there are up-to-date events created for each of them.
* If courseid = 0, then every data event in the site is checked, else
* only data events belonging to the course specified are checked.
* This function is used, in its new format, by restore_refresh_events()
*
* @param int $courseid
* @return bool
*/
function data_refresh_events($courseid = 0) {
global $DB, $CFG;
require_once($CFG->dirroot.'/mod/data/locallib.php');
if ($courseid) {
if (! $data = $DB->get_records("data", array("course" => $courseid))) {
return true;
}
} else {
if (! $data = $DB->get_records("data")) {
return true;
}
}
foreach ($data as $datum) {
data_set_events($datum);
}
return true;
}

View File

@ -578,3 +578,93 @@ class data_file_info_container extends file_info {
return $this->browser->get_file_info($this->context);
}
}
/**
* This creates new calendar events given as timeavailablefrom and timeclose by $data.
*
* @param stdClass $data
* @return void
*/
function data_set_events($data) {
global $DB, $CFG;
require_once($CFG->dirroot.'/calendar/lib.php');
// Get CMID if not sent as part of $data.
if (!isset($data->coursemodule)) {
$cm = get_coursemodule_from_instance('data', $data->id, $data->course);
$data->coursemodule = $cm->id;
}
// Data start calendar events.
$event = new stdClass();
if ($event->id = $DB->get_field('event', 'id',
array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'open'))) {
if ($data->timeavailablefrom > 0) {
// Calendar event exists so update it.
$event->name = get_string('calendarstart', 'data', $data->name);
$event->description = format_module_intro('data', $data, $data->coursemodule);
$event->timestart = $data->timeavailablefrom;
$event->visible = instance_is_visible('data', $data);
$event->timeduration = 0;
$calendarevent = calendar_event::load($event->id);
$calendarevent->update($event);
} else {
// Calendar event is on longer needed.
$calendarevent = calendar_event::load($event->id);
$calendarevent->delete();
}
} else {
// Event doesn't exist so create one.
if (isset($data->timeavailablefrom) && $data->timeavailablefrom > 0) {
$event->name = get_string('calendarstart', 'data', $data->name);
$event->description = format_module_intro('data', $data, $data->coursemodule);
$event->courseid = $data->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'data';
$event->instance = $data->id;
$event->eventtype = 'open';
$event->timestart = $data->timeavailablefrom;
$event->visible = instance_is_visible('data', $data);
$event->timeduration = 0;
calendar_event::create($event);
}
}
// Data end calendar events.
$event = new stdClass();
if ($event->id = $DB->get_field('event', 'id',
array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'close'))) {
if ($data->timeavailableto > 0) {
// Calendar event exists so update it.
$event->name = get_string('calendarend', 'data', $data->name);
$event->description = format_module_intro('data', $data, $data->coursemodule);
$event->timestart = $data->timeavailableto;
$event->visible = instance_is_visible('data', $data);
$event->timeduration = 0;
$calendarevent = calendar_event::load($event->id);
$calendarevent->update($event);
} else {
// Calendar event is on longer needed.
$calendarevent = calendar_event::load($event->id);
$calendarevent->delete();
}
} else {
// Event doesn't exist so create one.
if (isset($data->timeavailableto) && $data->timeavailableto > 0) {
$event = new stdClass();
$event->name = get_string('calendarend', 'data', $data->name);
$event->description = format_module_intro('data', $data, $data->coursemodule);
$event->courseid = $data->course;
$event->groupid = 0;
$event->userid = 0;
$event->modulename = 'data';
$event->instance = $data->id;
$event->eventtype = 'close';
$event->timestart = $data->timeavailableto;
$event->visible = instance_is_visible('data', $data);
$event->timeduration = 0;
calendar_event::create($event);
}
}
}

View File

@ -623,4 +623,47 @@ class mod_data_lib_testcase extends advanced_testcase {
$this->assertTrue(mod_data_rating_can_see_item_ratings($params1));
}
/**
* Tests for mod_data_refresh_events.
*/
public function test_data_refresh_events() {
global $DB;
$this->resetAfterTest();
$this->setAdminUser();
$timeopen = time();
$timeclose = time() + 86400;
$course = $this->getDataGenerator()->create_course();
$generator = $this->getDataGenerator()->get_plugin_generator('mod_data');
$params['course'] = $course->id;
$params['timeavailablefrom'] = $timeopen;
$params['timeavailableto'] = $timeclose;
$data = $generator->create_instance($params);
// Normal case, with existing course.
$this->assertTrue(data_refresh_events($course->id));
$eventparams = array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'open');
$openevent = $DB->get_record('event', $eventparams, '*', MUST_EXIST);
$this->assertEquals($openevent->timestart, $timeopen);
$eventparams = array('modulename' => 'data', 'instance' => $data->id, 'eventtype' => 'close');
$closeevent = $DB->get_record('event', $eventparams, '*', MUST_EXIST);
$this->assertEquals($closeevent->timestart, $timeclose);
// In case the course ID is passed as a numeric string.
$this->assertTrue(data_refresh_events('' . $course->id));
// Course ID not provided.
$this->assertTrue(data_refresh_events());
$eventparams = array('modulename' => 'data');
$events = $DB->get_records('event', $eventparams);
foreach ($events as $event) {
if ($event->modulename === 'data' && $event->instance === $data->id && $event->eventtype === 'open') {
$this->assertEquals($event->timestart, $timeopen);
}
if ($event->modulename === 'data' && $event->instance === $data->id && $event->eventtype === 'close') {
$this->assertEquals($event->timestart, $timeclose);
}
}
}
}