diff --git a/add_form.php b/add_form.php index a1c6b69..439408f 100644 --- a/add_form.php +++ b/add_form.php @@ -125,6 +125,11 @@ class mod_attendance_add_form extends moodleform { array('maxfiles' => EDITOR_UNLIMITED_FILES, 'noclean' => true, 'context' => $modcontext)); $mform->setType('sdescription', PARAM_RAW); + $mform->addElement('checkbox', 'calendarevent', '', get_string('calendarevent', 'attendance')); + $mform->addHelpButton('calendarevent', 'calendarevent', 'attendance'); + // XXX - this should be modified to use a different config setting if we keep enablecalendar's current meaning + $mform->setDefault('calendarevent', get_config('attendance', 'enablecalendar')); + // If warnings allow selector for reporting. if (!empty(get_config('attendance', 'enablewarnings'))) { $mform->addElement('checkbox', 'absenteereport', '', get_string('includeabsentee', 'attendance')); diff --git a/classes/calendar_helpers.php b/classes/calendar_helpers.php index 1e3c5f0..ce9472e 100644 --- a/classes/calendar_helpers.php +++ b/classes/calendar_helpers.php @@ -38,8 +38,8 @@ function attendance_create_calendar_event(&$session) { if ($session->caleventid) { return $session->caleventid; } - if (empty(get_config('attendance', 'enablecalendar'))) { - // Calendar events are not used. + if (empty(get_config('attendance', 'enablecalendar')) || $session->calendarevent === 0) { + // Calendar events are not used, or event not required for this session. return true; } @@ -98,18 +98,42 @@ function attendance_create_calendar_events($sessionsids) { /** * Update calendar event duration and date * - * @param int $caleventid calendar event id - * @param int $timeduration duration of the event - * @param int $timestart start time of the event + * @param stdClass $session Session data * @return bool result of updating */ -function attendance_update_calendar_event($caleventid, $timeduration, $timestart) { +function attendance_update_calendar_event($session) { + global $DB; + + $caleventid = $session->caleventid; + $timeduration = $session->duration; + $timestart = $session->sessdate; if (empty(get_config('attendance', 'enablecalendar'))) { // Calendar events are not used. return true; } + // Should there even be an event? + if ($session->calendarevent == 0) { + if ($session->caleventid != 0) { + // There is an existing event we should delete + // (calendarevent option just got turned off) + $DB->delete_records_list('event', 'id', array($caleventid)); + $session->caleventid = 0; + $DB->update_record('attendance_sessions', $session); + return true; + } else { + // This should be the common case when session does not want event + return true; + } + } + + // Do we need new event (calendarevent option has just been turned on)? + if ($session->caleventid == 0) { + return attendance_create_calendar_event($session); + } + + // Boring update $caleventdata = new stdClass(); $caleventdata->timeduration = $timeduration; $caleventdata->timestart = $timestart; diff --git a/classes/import/sessions.php b/classes/import/sessions.php index 74b9dcf..1e99a7a 100644 --- a/classes/import/sessions.php +++ b/classes/import/sessions.php @@ -109,7 +109,8 @@ class sessions { get_string('autoassignstatus', 'attendance'), get_string('absenteereport', 'attendance'), get_string('preventsharedip', 'attendance'), - get_string('preventsharediptime', 'attendance') + get_string('preventsharediptime', 'attendance'), + get_string('calendarevent', 'attendance') ); } @@ -148,6 +149,7 @@ class sessions { 'absenteereport' => $data->header15, 'preventsharedip' => $data->header16, 'preventsharediptime' => $data->header17, + 'calendarevent' => $data->header18 ); } else { return array( @@ -168,7 +170,8 @@ class sessions { 'autoassignstatus' => 14, 'absenteereport' => 15, 'preventsharedip' => 16, - 'preventsharediptime' => 17 + 'preventsharediptime' => 17, + 'calendarevent' => 18 ); } } diff --git a/classes/structure.php b/classes/structure.php index 2863bf6..1df808a 100644 --- a/classes/structure.php +++ b/classes/structure.php @@ -534,6 +534,7 @@ class mod_attendance_structure { array('subdirs' => false, 'maxfiles' => -1, 'maxbytes' => 0), $formdata->sdescription['text']); $sess->description = $description; $sess->descriptionformat = $formdata->sdescription['format']; + $sess->calendarevent = empty($formdata->calendarevent) ? 0 : $formdata->calendarevent; $sess->studentscanmark = 0; $sess->autoassignstatus = 0; @@ -579,7 +580,7 @@ class mod_attendance_structure { // This shouldn't really happen, but just in case to prevent fatal error. attendance_create_calendar_event($sess); } else { - attendance_update_calendar_event($sess->caleventid, $sess->duration, $sess->sessdate); + attendance_update_calendar_event($sess); } $info = construct_session_full_date_time($sess->sessdate, $sess->duration); @@ -1200,7 +1201,7 @@ class mod_attendance_structure { $sess->timemodified = $now; $DB->update_record('attendance_sessions', $sess); if ($sess->caleventid) { - attendance_update_calendar_event($sess->caleventid, $duration, $sess->sessdate); + attendance_update_calendar_event($sess); } $event = \mod_attendance\event\session_duration_updated::create(array( 'objectid' => $this->id, diff --git a/db/install.xml b/db/install.xml index e83a161..89c5ab0 100644 --- a/db/install.xml +++ b/db/install.xml @@ -48,6 +48,7 @@ + diff --git a/db/upgrade.php b/db/upgrade.php index e306234..26810fd 100644 --- a/db/upgrade.php +++ b/db/upgrade.php @@ -511,5 +511,15 @@ function xmldb_attendance_upgrade($oldversion=0) { upgrade_mod_savepoint(true, 2018050100, 'attendance'); } + if ($oldversion < 2018072700) { + $table = new xmldb_table('attendance_sessions'); + $field = new xmldb_field('calendarevent', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, + XMLDB_NOTNULL, null, '1', 'caleventid'); + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + upgrade_mod_savepoint(true, 2018072700, 'attendance'); + } + return $result; } diff --git a/lang/en/attendance.php b/lang/en/attendance.php index a1243f0..88b5b78 100644 --- a/lang/en/attendance.php +++ b/lang/en/attendance.php @@ -78,6 +78,9 @@ $string['autorecorded'] = 'system auto recorded'; $string['averageattendance'] = 'Average attendance'; $string['averageattendancegraded'] = 'Average attendance'; $string['calclose'] = 'Close'; +$string['calendarevent'] = 'Create calendar event for session'; +$string['calendarevent_help'] = 'If enabled, a calendar event will be created for this session. +If disabled, any existing calendar event for this session will be deleted.'; $string['caleventcreated'] = 'Calendar event for session successfully created'; $string['caleventdeleted'] = 'Calendar event for session successfully deleted'; $string['calmonths'] = 'January,February,March,April,May,June,July,August,September,October,November,December'; diff --git a/locallib.php b/locallib.php index 519513a..d7acd12 100644 --- a/locallib.php +++ b/locallib.php @@ -575,6 +575,11 @@ function attendance_construct_sessions_data_for_add($formdata, mod_attendance_st $formdata->studentscanmark = 0; } + $calendarevent = 0; + if (isset($formdata->calendarevent)) { // Calendar event should be created + $calendarevent = 1; + } + $sessions = array(); if (isset($formdata->addmultiply)) { $startdate = $sessiondate; @@ -607,6 +612,7 @@ function attendance_construct_sessions_data_for_add($formdata, mod_attendance_st $sess->descriptionitemid = $formdata->sdescription['itemid']; $sess->description = $formdata->sdescription['text']; $sess->descriptionformat = $formdata->sdescription['format']; + $sess->calendarevent = $calendarevent; $sess->timemodified = $now; $sess->absenteereport = $absenteereport; $sess->studentpassword = ''; @@ -657,6 +663,7 @@ function attendance_construct_sessions_data_for_add($formdata, mod_attendance_st $sess->descriptionitemid = $formdata->sdescription['itemid']; $sess->description = $formdata->sdescription['text']; $sess->descriptionformat = $formdata->sdescription['format']; + $sess->calendarevent = $calendarevent; $sess->timemodified = $now; $sess->studentscanmark = 0; $sess->autoassignstatus = 0; diff --git a/resetcalendar.php b/resetcalendar.php index 63ac20c..2095325 100644 --- a/resetcalendar.php +++ b/resetcalendar.php @@ -47,9 +47,9 @@ $tabmenu = attendance_print_settings_tabs('resetcalendar'); echo $tabmenu; if (get_config('attendance', 'enablecalendar')) { - // Check to see if all sessions have calendar events. + // Check to see if all sessions that need them have calendar events. if ($action == 'create' && confirm_sesskey()) { - $sessions = $DB->get_recordset('attendance_sessions', array('caleventid' => 0)); + $sessions = $DB->get_recordset('attendance_sessions', array('caleventid' => 0, 'calendarevent' => 1)); foreach ($sessions as $session) { attendance_create_calendar_event($session); if ($session->caleventid) { @@ -59,7 +59,7 @@ if (get_config('attendance', 'enablecalendar')) { $sessions->close(); echo $OUTPUT->notification(get_string('eventscreated', 'mod_attendance'), 'notifysuccess'); } else { - if ($DB->record_exists('attendance_sessions', array('caleventid' => 0))) { + if ($DB->record_exists('attendance_sessions', array('caleventid' => 0, 'calendarevent' => 1))) { $createurl = new moodle_url('/mod/attendance/resetcalendar.php', array('action' => 'create')); $returnurl = new moodle_url('/admin/settings.php', array('section' => 'modsettingattendance')); diff --git a/tests/attendance_webservices_test.php b/tests/attendance_webservices_test.php index 4712c15..73fadc3 100644 --- a/tests/attendance_webservices_test.php +++ b/tests/attendance_webservices_test.php @@ -86,6 +86,7 @@ class attendance_webservices_tests extends advanced_testcase { $session->statusset = 0; $session->groupid = 0; $session->absenteereport = 1; + $session->calendarevent = 0; // Creating two sessions. $this->sessions[] = $session; diff --git a/update_form.php b/update_form.php index a9c0623..3dcbc64 100644 --- a/update_form.php +++ b/update_form.php @@ -62,19 +62,22 @@ class mod_attendance_update_form extends moodleform { $endhour = floor($endtime / HOURSECS); $endminute = floor(($endtime - $endhour * HOURSECS) / MINSECS); - $data = array('sessiondate' => $sess->sessdate, - 'sestime' => array('starthour' => $starthour, 'startminute' => $startminute, - 'endhour' => $endhour, 'endminute' => $endminute), - 'sdescription' => $sess->description_editor, - 'studentscanmark' => $sess->studentscanmark, - 'studentpassword' => $sess->studentpassword, - 'autoassignstatus' => $sess->autoassignstatus, - 'subnet' => $sess->subnet, - 'automark' => $sess->automark, - 'absenteereport' => $sess->absenteereport, - 'automarkcompleted' => 0, - 'preventsharedip' => $sess->preventsharedip, - 'preventsharediptime' => $sess->preventsharediptime); + $data = array( + 'sessiondate' => $sess->sessdate, + 'sestime' => array('starthour' => $starthour, 'startminute' => $startminute, + 'endhour' => $endhour, 'endminute' => $endminute), + 'sdescription' => $sess->description_editor, + 'calendarevent' => $sess->calendarevent, + 'studentscanmark' => $sess->studentscanmark, + 'studentpassword' => $sess->studentpassword, + 'autoassignstatus' => $sess->autoassignstatus, + 'subnet' => $sess->subnet, + 'automark' => $sess->automark, + 'absenteereport' => $sess->absenteereport, + 'automarkcompleted' => 0, + 'preventsharedip' => $sess->preventsharedip, + 'preventsharediptime' => $sess->preventsharediptime + ); if ($sess->subnet == $attendancesubnet) { $data['usedefaultsubnet'] = 1; } else { @@ -110,6 +113,11 @@ class mod_attendance_update_form extends moodleform { array('rows' => 1, 'columns' => 80), $defopts); $mform->setType('sdescription', PARAM_RAW); + $mform->addElement('checkbox', 'calendarevent', '', get_string('calendarevent', 'attendance')); + $mform->addHelpButton('calendarevent', 'calendarevent', 'attendance'); + // XXX - this should be modified to use a different config setting if we keep enablecalendar's current meaning + // $mform->setDefault('calendarevent', get_config('attendance', 'enablecalendar')); + // If warnings allow selector for reporting. if (!empty(get_config('attendance', 'enablewarnings'))) { $mform->addElement('checkbox', 'absenteereport', '', get_string('includeabsentee', 'attendance')); @@ -185,7 +193,6 @@ class mod_attendance_update_form extends moodleform { } $mform->setDefaults($data); - $this->add_action_buttons(true); } diff --git a/version.php b/version.php index 06c7d6e..584c9a6 100644 --- a/version.php +++ b/version.php @@ -23,7 +23,7 @@ */ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2018070600; +$plugin->version = 2018072700; $plugin->requires = 2018050800; // Requires 3.5. $plugin->release = '3.5.1'; $plugin->maturity = MATURITY_ALPHA;