From 5f05ebc40fb1da424d53dad9f6c9eb6da19fe9de Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Fri, 13 Apr 2012 03:26:28 +0200 Subject: [PATCH 1/3] MDL-25660 workshop registers events in the calendar --- mod/workshop/lang/en/workshop.php | 4 ++ mod/workshop/lib.php | 99 +++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/mod/workshop/lang/en/workshop.php b/mod/workshop/lang/en/workshop.php index f51361fc875..b9c023fe7fe 100644 --- a/mod/workshop/lang/en/workshop.php +++ b/mod/workshop/lang/en/workshop.php @@ -49,6 +49,7 @@ $string['assessmentbyfullname'] = 'Assessment by {$a}'; $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['assessmentreferenceconflict'] = 'It is not possible to assess an exampl $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['submissionby'] = 'Submission by {$a}'; $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 051da2f184d..b4e3415034d 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; } @@ -1386,3 +1394,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(); + } +} From 3108a0f862e4a080dba839b14086f129d5411f9d Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Fri, 13 Apr 2012 04:40:29 +0200 Subject: [PATCH 2/3] MDL-25660 recreate all workshop calendar events Due to complex workshop upgrade path from 1.9 and missing calendar events support in 2.x, the only safe way to get rid of potentially invalid calendar events (such as those reported in MDL-26687) is to remove all current workshop events and recreate them from scratch. --- mod/workshop/db/upgrade.php | 37 +++++++++++++++++++++++++++++++++++++ mod/workshop/version.php | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/mod/workshop/db/upgrade.php b/mod/workshop/db/upgrade.php index c6abee6a79a..3d9ef323f91 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/version.php b/mod/workshop/version.php index eb8659986af..116c90bff7d 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; From f58b7c2f4ae92fd32fb9472958390ec3f6de17df Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Fri, 13 Apr 2012 13:10:04 +0200 Subject: [PATCH 3/3] MDL-25660 workshop removes its calendar events on instance deletion --- mod/workshop/lib.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mod/workshop/lib.php b/mod/workshop/lib.php index b4e3415034d..69f5c8400c6 100644 --- a/mod/workshop/lib.php +++ b/mod/workshop/lib.php @@ -218,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));