diff --git a/mod/workshop/db/upgrade.php b/mod/workshop/db/upgrade.php index c6abee6a79a40..3d9ef323f919b 100644 --- a/mod/workshop/db/upgrade.php +++ b/mod/workshop/db/upgrade.php @@ -319,5 +319,42 @@ function xmldb_workshop_upgrade($oldversion) { upgrade_mod_savepoint(true, 2011061001, 'workshop'); } + /** + * Remove all workshop calendar events + */ + if ($oldversion < 2011061002) { + require_once($CFG->dirroot . '/calendar/lib.php'); + $events = $DB->get_records('event', array('modulename' => 'workshop')); + foreach ($events as $event) { + $event = calendar_event::load($event); + $event->delete(); + } + upgrade_mod_savepoint(true, 2011061002, 'workshop'); + } + + /** + * Recreate all workshop calendar events + */ + if ($oldversion < 2011061003) { + require_once(dirname(dirname(__FILE__)) . '/lib.php'); + + $sql = "SELECT w.id, w.course, w.name, w.intro, w.introformat, w.submissionstart, + w.submissionend, w.assessmentstart, w.assessmentend, + cm.id AS cmid + FROM {workshop} w + JOIN {modules} m ON m.name = 'workshop' + JOIN {course_modules} cm ON (cm.module = m.id AND cm.course = w.course AND cm.instance = w.id)"; + + $rs = $DB->get_recordset_sql($sql); + + foreach ($rs as $workshop) { + $cmid = $workshop->cmid; + unset($workshop->cmid); + workshop_calendar_update($workshop, $cmid); + } + $rs->close(); + upgrade_mod_savepoint(true, 2011061003, 'workshop'); + } + return true; } diff --git a/mod/workshop/lang/en/workshop.php b/mod/workshop/lang/en/workshop.php index f51361fc87514..b9c023fe7fe42 100644 --- a/mod/workshop/lang/en/workshop.php +++ b/mod/workshop/lang/en/workshop.php @@ -49,6 +49,7 @@ $string['assessmentbyyourself'] = 'Your assessment'; $string['assessmentdeleted'] = 'Assessment deallocated'; $string['assessmentend'] = 'Deadline for assessment'; +$string['assessmentendevent'] = '{$a} (assessment deadline)'; $string['assessmentenddatetime'] = 'Assessment deadline: {$a->daydatetime} ({$a->distanceday})'; $string['assessmentform'] = 'Assessment form'; $string['assessmentofsubmission'] = 'Assessment of {$a->submissiontitle}'; @@ -57,6 +58,7 @@ $string['assessmentreferenceneeded'] = 'You have to assess this example submission to provide a reference assessment. Click \'Continue\' button to assess the submission.'; $string['assessmentsettings'] = 'Assessment settings'; $string['assessmentstart'] = 'Open for assessment from'; +$string['assessmentstartevent'] = '{$a} (opens for assessment)'; $string['assessmentstartdatetime'] = 'Open for assessment from {$a->daydatetime} ({$a->distanceday})'; $string['assessmentweight'] = 'Assessment weight'; $string['assignedassessments'] = 'Assigned submissions to assess'; @@ -206,12 +208,14 @@ $string['submissionattachment'] = 'Attachment'; $string['submissioncontent'] = 'Submission content'; $string['submissionend'] = 'Submissions deadline'; +$string['submissionendevent'] = '{$a} (submissions deadline)'; $string['submissionenddatetime'] = 'Submissions deadline: {$a->daydatetime} ({$a->distanceday})'; $string['submissiongrade'] = 'Grade for submission'; $string['submissiongrade_help'] = 'This setting specifies the maximum grade that may be obtained for submitted work.'; $string['submissiongradeof'] = 'Grade for submission (of {$a})'; $string['submissionsettings'] = 'Submission settings'; $string['submissionstart'] = 'Open for submissions from'; +$string['submissionstartevent'] = '{$a} (opens for submissions)'; $string['submissionstartdatetime'] = 'Open for submissions from {$a->daydatetime} ({$a->distanceday})'; $string['submissiontitle'] = 'Title'; $string['subplugintype_workshopallocation'] = 'Submissions allocation method'; diff --git a/mod/workshop/lib.php b/mod/workshop/lib.php index 051da2f184d1b..69f5c8400c6af 100644 --- a/mod/workshop/lib.php +++ b/mod/workshop/lib.php @@ -29,6 +29,8 @@ defined('MOODLE_INTERNAL') || die(); +require_once($CFG->dirroot . '/calendar/lib.php'); + //////////////////////////////////////////////////////////////////////////////// // Moodle core API // //////////////////////////////////////////////////////////////////////////////// @@ -106,6 +108,9 @@ function workshop_add_instance(stdclass $workshop) { workshop_grade_item_update($workshop); workshop_grade_item_category_update($workshop); + // create calendar events + workshop_calendar_update($workshop, $workshop->coursemodule); + return $workshop->id; } @@ -155,6 +160,9 @@ function workshop_update_instance(stdclass $workshop) { workshop_grade_item_update($workshop); workshop_grade_item_category_update($workshop); + // update calendar events + workshop_calendar_update($workshop, $workshop->coursemodule); + return true; } @@ -210,6 +218,13 @@ function workshop_delete_instance($id) { call_user_func($classname.'::delete_instance', $workshop->id); } + // delete the calendar events + $events = $DB->get_records('event', array('modulename' => 'workshop', 'instance' => $workshop->id)); + foreach ($events as $event) { + $event = calendar_event::load($event); + $event->delete(); + } + // finally remove the workshop record itself $DB->delete_records('workshop', array('id' => $workshop->id)); @@ -1386,3 +1401,94 @@ function workshop_page_type_list($pagetype, $parentcontext, $currentcontext) { $module_pagetype = array('mod-workshop-*'=>get_string('page-mod-workshop-x', 'workshop')); return $module_pagetype; } + +//////////////////////////////////////////////////////////////////////////////// +// Calendar API // +//////////////////////////////////////////////////////////////////////////////// + +/** + * Updates the calendar events associated to the given workshop + * + * @param stdClass $workshop the workshop instance record + * @param int $cmid course module id + */ +function workshop_calendar_update(stdClass $workshop, $cmid) { + global $DB; + + // get the currently registered events so that we can re-use their ids + $currentevents = $DB->get_records('event', array('modulename' => 'workshop', 'instance' => $workshop->id)); + + // the common properties for all events + $base = new stdClass(); + $base->description = format_module_intro('workshop', $workshop, $cmid, false); + $base->courseid = $workshop->course; + $base->groupid = 0; + $base->userid = 0; + $base->modulename = 'workshop'; + $base->eventtype = 'pluginname'; + $base->instance = $workshop->id; + $base->visible = instance_is_visible('workshop', $workshop); + $base->timeduration = 0; + + if ($workshop->submissionstart) { + $event = clone($base); + $event->name = get_string('submissionstartevent', 'mod_workshop', $workshop->name); + $event->timestart = $workshop->submissionstart; + if ($reusedevent = array_shift($currentevents)) { + $event->id = $reusedevent->id; + } else { + // should not be set but just in case + unset($event->id); + } + // calendar_event::create will reuse a db record if the id field is set + calendar_event::create($event); + } + + if ($workshop->submissionend) { + $event = clone($base); + $event->name = get_string('submissionendevent', 'mod_workshop', $workshop->name); + $event->timestart = $workshop->submissionend; + if ($reusedevent = array_shift($currentevents)) { + $event->id = $reusedevent->id; + } else { + // should not be set but just in case + unset($event->id); + } + // calendar_event::create will reuse a db record if the id field is set + calendar_event::create($event); + } + + if ($workshop->assessmentstart) { + $event = clone($base); + $event->name = get_string('assessmentstartevent', 'mod_workshop', $workshop->name); + $event->timestart = $workshop->assessmentstart; + if ($reusedevent = array_shift($currentevents)) { + $event->id = $reusedevent->id; + } else { + // should not be set but just in case + unset($event->id); + } + // calendar_event::create will reuse a db record if the id field is set + calendar_event::create($event); + } + + if ($workshop->assessmentend) { + $event = clone($base); + $event->name = get_string('assessmentendevent', 'mod_workshop', $workshop->name); + $event->timestart = $workshop->assessmentend; + if ($reusedevent = array_shift($currentevents)) { + $event->id = $reusedevent->id; + } else { + // should not be set but just in case + unset($event->id); + } + // calendar_event::create will reuse a db record if the id field is set + calendar_event::create($event); + } + + // delete any leftover events + foreach ($currentevents as $oldevent) { + $oldevent = calendar_event::load($oldevent); + $oldevent->delete(); + } +} diff --git a/mod/workshop/version.php b/mod/workshop/version.php index eb8659986afd6..116c90bff7d90 100644 --- a/mod/workshop/version.php +++ b/mod/workshop/version.php @@ -29,6 +29,6 @@ defined('MOODLE_INTERNAL') || die(); -$module->version = 2011061001; +$module->version = 2011061003; $module->requires = 2011020900; // Requires this Moodle version //$module->cron = 60;