Diss
9 years ago
14 changed files with 353 additions and 14 deletions
@ -0,0 +1,136 @@ |
|||||
|
<?php |
||||
|
// This file is part of Moodle - http://moodle.org/ |
||||
|
// |
||||
|
// Moodle is free software: you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation, either version 3 of the License, or |
||||
|
// (at your option) any later version. |
||||
|
// |
||||
|
// Moodle is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License for more details. |
||||
|
// |
||||
|
// You should have received a copy of the GNU General Public License |
||||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
||||
|
/** |
||||
|
* Calendar related functions |
||||
|
* |
||||
|
* @package mod_attendance |
||||
|
* @copyright 2016 Vyacheslav Strelkov |
||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
||||
|
*/ |
||||
|
|
||||
|
require_once(dirname(__FILE__).'/../../../calendar/lib.php'); |
||||
|
|
||||
|
/** |
||||
|
* Create single calendar event bases on session data. |
||||
|
* |
||||
|
* @param stdClass $session initial sessions to take data from |
||||
|
* @return bool result of calendar event creation |
||||
|
*/ |
||||
|
function create_calendar_event(&$session) { |
||||
|
// We don't want to create multiple calendar events for 1 session. |
||||
|
if ($session->caleventid) { |
||||
|
return $session->caleventid; |
||||
|
} |
||||
|
|
||||
|
global $DB; |
||||
|
$attendance = $DB->get_record('attendance', array('id' => $session->attendanceid)); |
||||
|
|
||||
|
$caleventdata = new stdClass(); |
||||
|
$caleventdata->name = $attendance->name; |
||||
|
$caleventdata->courseid = $attendance->course; |
||||
|
$caleventdata->groupid = $session->groupid; |
||||
|
$caleventdata->instance = $session->attendanceid; |
||||
|
$caleventdata->timestart = $session->sessdate; |
||||
|
$caleventdata->timeduration = $session->duration; |
||||
|
$caleventdata->eventtype = 'attendance'; |
||||
|
$caleventdata->timemodified = time(); |
||||
|
$caleventdata->modulename = 'attendance'; |
||||
|
|
||||
|
$calevent = new stdClass(); |
||||
|
if ($calevent = calendar_event::create($caleventdata, false)) { |
||||
|
$session->caleventid = $calevent->id; |
||||
|
$DB->set_field('attendance_sessions', 'caleventid', $session->caleventid, array('id' => $session->id)); |
||||
|
return true; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Create multiple calendar events based on sessions data. |
||||
|
* |
||||
|
* @param array %sessionsids array of sessions ids |
||||
|
*/ |
||||
|
function create_calendar_events($sessionsids) { |
||||
|
global $DB; |
||||
|
$sessions = $DB->get_recordset_list('attendance_sessions', 'id', $sessionsids); |
||||
|
|
||||
|
foreach ($sessions as $session) { |
||||
|
create_calendar_event($session); |
||||
|
if ($session->caleventid) { |
||||
|
$DB->update_record('attendance_sessions', $session); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update calendar event duration and date |
||||
|
* |
||||
|
* @param $caleventid int calendar event id |
||||
|
* @param $timeduration int duration of the event |
||||
|
* @param $timestart int start time of the event |
||||
|
* @return bool result of updating |
||||
|
*/ |
||||
|
function update_calendar_event($caleventid, $timeduration, $timestart = null) { |
||||
|
$caleventdata = new stdClass(); |
||||
|
$caleventdata->timeduration = $timeduration; |
||||
|
$caleventdata->timestart = $timestart; |
||||
|
$caleventdata->timemodified = time(); |
||||
|
|
||||
|
$calendarevent = calendar_event::load($caleventid); |
||||
|
if ($calendarevent) { |
||||
|
return $calendarevent->update($caleventdata) ? true : false; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Delete calendar events for sessions |
||||
|
* |
||||
|
* @param array %sessionsids array of sessions ids |
||||
|
* @return bool result of updating |
||||
|
*/ |
||||
|
function delete_calendar_events($sessionsids) { |
||||
|
global $DB; |
||||
|
$caleventsids = existing_calendar_events_ids($sessionsids); |
||||
|
if ($caleventsids) { |
||||
|
$DB->delete_records_list('event', 'id', $caleventsids); |
||||
|
} |
||||
|
|
||||
|
$sessions = $DB->get_recordset_list('attendance_sessions', 'id', $sessionsids); |
||||
|
foreach ($sessions as $session) { |
||||
|
$session->caleventid = 0; |
||||
|
$DB->update_record('attendance_sessions', $session); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Check if calendar events are created for given sessions |
||||
|
* |
||||
|
* @param array $sessionsids of sessions ids |
||||
|
* @return array | bool array of existing calendar events or false if none found |
||||
|
*/ |
||||
|
function existing_calendar_events_ids($sessionsids) { |
||||
|
global $DB; |
||||
|
$caleventsids = array_keys($DB->get_records_list('attendance_sessions', 'id', $sessionsids, '', 'caleventid')); |
||||
|
$existingcaleventsids = array_filter($caleventsids); |
||||
|
if (! empty($existingcaleventsids)) { |
||||
|
return $existingcaleventsids; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} |
@ -0,0 +1,50 @@ |
|||||
|
<?php |
||||
|
// This file is part of Moodle - http://moodle.org/ |
||||
|
// |
||||
|
// Moodle is free software: you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation, either version 3 of the License, or |
||||
|
// (at your option) any later version. |
||||
|
// |
||||
|
// Moodle is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License for more details. |
||||
|
// |
||||
|
// You should have received a copy of the GNU General Public License |
||||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
||||
|
|
||||
|
/** |
||||
|
* Helper functions to keep upgrade.php clean. |
||||
|
* |
||||
|
* @package mod_attendance |
||||
|
* @copyright 2016 Vyacheslav Strelkov <strelkov.vo@gmail.com> |
||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
||||
|
*/ |
||||
|
|
||||
|
function create_calendar_events() { |
||||
|
global $DB; |
||||
|
|
||||
|
$attendances = $DB->get_records('attendance', null, null, 'id, name, course'); |
||||
|
foreach ($attendances as $att) { |
||||
|
$sessionsdata = $DB->get_records('attendance_sessions', array('attendanceid' => $att->id), null, |
||||
|
'id, groupid, sessdate, duration, description, descriptionformat'); |
||||
|
foreach ($sessionsdata as $session) { |
||||
|
$calevent = new stdClass(); |
||||
|
$calevent->name = $att->name; |
||||
|
$calevent->courseid = $att->course; |
||||
|
$calevent->groupid = $session->groupid; |
||||
|
$calevent->instance = $att->id; |
||||
|
$calevent->timestart = $session->sessdate; |
||||
|
$calevent->timeduration = $session->duration; |
||||
|
$calevent->eventtype = 'attendance'; |
||||
|
$calevent->timemodified = time(); |
||||
|
$calevent->modulename = 'attendance'; |
||||
|
$calevent->description = $session->description; |
||||
|
$calevent->format = $session->descriptionformat; |
||||
|
|
||||
|
$caleventid = $DB->insert_record('event', $calevent); |
||||
|
$DB->set_field('attendance_sessions', 'caleventid', $caleventid, array('id' => $session->id)); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,81 @@ |
|||||
|
@mod @mod_attendance @javascript |
||||
|
Feature: Test the calendar related features in the attendance module |
||||
|
|
||||
|
Background: |
||||
|
Given the following "courses" exist: |
||||
|
| fullname | shortname | |
||||
|
| Course 1 | C1 | |
||||
|
And the following "users" exist: |
||||
|
| username | firstname | lastname | email | |
||||
|
| teacher1 | Teacher | 1 | teacher1@example.com | |
||||
|
| student1 | Student | 1 | student1@example.com | |
||||
|
And the following "course enrolments" exist: |
||||
|
| course | user | role | |
||||
|
| C1 | teacher1 | editingteacher | |
||||
|
| C1 | student1 | student | |
||||
|
And I log in as "teacher1" |
||||
|
And I follow "Course 1" |
||||
|
And I turn editing mode on |
||||
|
And I add a "Attendance" to section "1" and I fill the form with: |
||||
|
| Name | Test attendance | |
||||
|
And I log out |
||||
|
|
||||
|
Scenario: Calendar events can be created automatically with sessions creation |
||||
|
When I log in as "teacher1" |
||||
|
And I follow "Course 1" |
||||
|
And I follow "Test attendance" |
||||
|
And I follow "Add session" |
||||
|
And I set the following fields to these values: |
||||
|
| id_sestime_starthour | 01 | |
||||
|
| id_sestime_endhour | 02 | |
||||
|
And I click on "id_submitbutton" "button" |
||||
|
And I follow "Course 1" |
||||
|
And I follow "Go to calendar" |
||||
|
Then I should see "Test attendance" |
||||
|
And I log out |
||||
|
And I log in as "student1" |
||||
|
And I follow "Go to calendar" |
||||
|
Then I should see "Test attendance" |
||||
|
|
||||
|
Scenario: Teacher can delete and create calendar events for sessions |
||||
|
When I log in as "teacher1" |
||||
|
And I follow "Course 1" |
||||
|
And I follow "Test attendance" |
||||
|
And I follow "Add session" |
||||
|
And I set the following fields to these values: |
||||
|
| id_sestime_starthour | 01 | |
||||
|
| id_sestime_endhour | 02 | |
||||
|
And I click on "id_submitbutton" "button" |
||||
|
And I set the following fields to these values: |
||||
|
| cb_selector | 1 | |
||||
|
| menuaction | Delete calendar events | |
||||
|
And I click on "OK" "button" |
||||
|
And I click on "Continue" "button" |
||||
|
And I follow "Course 1" |
||||
|
And I follow "Go to calendar" |
||||
|
Then I should not see "Test attendance" |
||||
|
And I log out |
||||
|
And I log in as "student1" |
||||
|
And I follow "Go to calendar" |
||||
|
Then I should not see "Test attendance" |
||||
|
And I log out |
||||
|
And I log in as "teacher1" |
||||
|
And I follow "Course 1" |
||||
|
And I follow "Test attendance" |
||||
|
And I follow "Add session" |
||||
|
And I set the following fields to these values: |
||||
|
| id_sestime_starthour | 01 | |
||||
|
| id_sestime_endhour | 02 | |
||||
|
And I click on "id_submitbutton" "button" |
||||
|
And I set the following fields to these values: |
||||
|
| cb_selector | 1 | |
||||
|
| menuaction | Create calendar events | |
||||
|
And I click on "OK" "button" |
||||
|
And I click on "Continue" "button" |
||||
|
And I follow "Course 1" |
||||
|
And I follow "Go to calendar" |
||||
|
Then I should see "Test attendance" |
||||
|
And I log out |
||||
|
And I log in as "student1" |
||||
|
And I follow "Go to calendar" |
||||
|
Then I should see "Test attendance" |
Loading…
Reference in new issue