From ac069aeb9d647da98eb35f27d51f2eb302261d79 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 844d0c7321c..f1092ee63c6 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 5c44c504569..e03f2745790 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 // //////////////////////////////////////////////////////////////////////////////// @@ -107,6 +109,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; } @@ -156,6 +161,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; } @@ -1397,3 +1405,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 cb48a42adaeeb9b62dacd26f94dcd0c1df4af6c7 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 dd9fb9e514c..af5ebab17c5 100644 --- a/mod/workshop/db/upgrade.php +++ b/mod/workshop/db/upgrade.php @@ -42,5 +42,42 @@ function xmldb_workshop_upgrade($oldversion) { // Moodle v2.2.0 release upgrade line // Put any upgrade step following this + /** + * Remove all workshop calendar events + */ + if ($oldversion < 2011112901) { + 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, 2011112901, 'workshop'); + } + + /** + * Recreate all workshop calendar events + */ + if ($oldversion < 2011112902) { + 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, 2011112902, 'workshop'); + } + return true; } diff --git a/mod/workshop/version.php b/mod/workshop/version.php index 28505d53b0a..9f2b2537af1 100644 --- a/mod/workshop/version.php +++ b/mod/workshop/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); -$module->version = 2012030700; // The current module version (Date: YYYYMMDDXX) +$module->version = 2012041300; // The current module version (Date: YYYYMMDDXX) $module->requires = 2012030100.04; // Requires this Moodle version $module->component = 'mod_workshop'; // Full name of the plugin (used for diagnostics) $module->cron = 0; From 33d0cb3ce14ccb4a872cd019969ba75a36a7a1dd 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 e03f2745790..1ee3e93754d 100644 --- a/mod/workshop/lib.php +++ b/mod/workshop/lib.php @@ -219,6 +219,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));